21 CONST CHAR8 *FirstString,
22 CONST CHAR8 *FirstStringEnd,
23 CONST CHAR8 *SecondString,
24 CONST CHAR8 *SecondStringEnd
27 ASSERT (FirstString != NULL);
28 ASSERT (SecondString != NULL);
29 ASSERT (FirstStringEnd >= FirstString);
30 ASSERT (SecondStringEnd >= SecondString);
32 while ((FirstString != FirstStringEnd) &&
33 (SecondString != SecondStringEnd) &&
34 (*FirstString == *SecondString))
40 if (FirstString == FirstStringEnd) {
41 if (SecondString == SecondStringEnd) {
44 return -*SecondString;
48 if (SecondString == SecondStringEnd) {
52 return *FirstString - *SecondString;
59 OUT CONST CHAR8 **FragmentStart,
60 OUT CONST CHAR8 **FragmentEnd,
61 OUT BOOLEAN *IsAlphaFragment,
62 OUT BOOLEAN *IsSectionBreak,
63 OUT CHAR8 *SectionChar
70 ASSERT (FragmentStart != NULL);
71 ASSERT (FragmentEnd != NULL);
72 ASSERT (IsAlphaFragment != NULL);
73 ASSERT (IsSectionBreak != NULL);
74 ASSERT (SectionChar != NULL);
78 *IsSectionBreak = TRUE;
87 *IsSectionBreak = FALSE;
88 *FragmentStart = *
Pos;
97 *IsAlphaFragment = TRUE;
131 IN CONST CHAR8 *Version1,
132 IN CONST CHAR8 *Version2
138 CONST CHAR8 *FragmentStart1;
139 CONST CHAR8 *FragmentEnd1;
140 CONST CHAR8 *FragmentStart2;
141 CONST CHAR8 *FragmentEnd2;
142 UINTN VersionFragment1;
143 UINTN VersionFragment2;
144 BOOLEAN IsAlphaFragment1;
145 BOOLEAN IsAlphaFragment2;
146 BOOLEAN IsSectionBreak1;
147 BOOLEAN IsSectionBreak2;
155 ASSERT (Version1 != NULL);
156 ASSERT (Version2 != NULL);
157 if ((Version1 == NULL) || (Version2 == NULL)) {
166 IsRescue1 = AsciiStrStr (Version1,
"rescue") != NULL;
167 IsRescue2 = AsciiStrStr (Version2,
"rescue") != NULL;
169 if (IsRescue1 != IsRescue2) {
170 return IsRescue2 ? +1 : -1;
177 GetNextFragment (&Pos1, &FragmentStart1, &FragmentEnd1, &IsAlphaFragment1, &IsSectionBreak1, &SectionChar1);
178 GetNextFragment (&Pos2, &FragmentStart2, &FragmentEnd2, &IsAlphaFragment2, &IsSectionBreak2, &SectionChar2);
180 if (IsSectionBreak1 != IsSectionBreak2) {
181 return IsSectionBreak2 ? +1 : -1;
182 }
else if (IsSectionBreak1) {
183 if (SectionChar1 != SectionChar2) {
184 if ((SectionChar1 ==
'-') || (SectionChar2 ==
'~')) {
188 if ((SectionChar1 ==
'~') || (SectionChar2 ==
'-')) {
196 if (SectionChar1 ==
'\0') {
200 if ((IsAlphaFragment1 == IsAlphaFragment2) && !IsAlphaFragment1) {
201 ChSave = *FragmentEnd1;
202 *((CHAR8 *)FragmentEnd1) =
'\0';
203 Status = AsciiStrDecimalToUintnS (FragmentStart1, NULL, &VersionFragment1);
204 *((CHAR8 *)FragmentEnd1) = ChSave;
205 ASSERT_EFI_ERROR (Status);
207 ChSave = *FragmentEnd2;
208 *((CHAR8 *)FragmentEnd2) =
'\0';
209 Status = AsciiStrDecimalToUintnS (FragmentStart2, NULL, &VersionFragment2);
210 *((CHAR8 *)FragmentEnd2) = ChSave;
211 ASSERT_EFI_ERROR (Status);
213 Compare = VersionFragment1 - VersionFragment2;
215 Compare =
BoundedAsciiStrCmp (FragmentStart1, FragmentEnd1, FragmentStart2, FragmentEnd2);
STATIC VOID GetNextFragment(IN CONST CHAR8 **Pos, OUT CONST CHAR8 **FragmentStart, OUT CONST CHAR8 **FragmentEnd, OUT BOOLEAN *IsAlphaFragment, OUT BOOLEAN *IsSectionBreak, OUT CHAR8 *SectionChar)