// non-digit characters. For instance, if InString is "foo-3.3.4-7.img",
// this function returns "3.3.4-7". If InString contains no digits,
// the return value is NULL.
+// As a special case for Arch Linux the strings "linux" and "linux-lts"
+// are considered to be digits.
CHAR16 *FindNumbers(IN CHAR16 *InString) {
UINTN i, StartOfElement, EndOfElement = 0, CopyLength;
CHAR16 *Found = NULL;
return NULL;
StartOfElement = StrLen(InString);
+
+ // Find "linux-lts" or "linux"
+ Found = MyStrStr(InString, L"linux-lts");
+ if (Found != NULL) {
+ StartOfElement = Found - InString;
+ EndOfElement = StartOfElement + StrLen(L"linux-lts") - 1;
+ } else {
+ Found = MyStrStr(InString, L"linux");
+ if (Found != NULL) {
+ StartOfElement = Found - InString;
+ EndOfElement = StartOfElement + StrLen(L"linux") - 1;
+ } // if
+ } // if/else
+ Found = NULL;
+
// Find start & end of target element
for (i = 0; InString[i] != L'\0'; i++) {
if ((InString[i] >= L'0') && (InString[i] <= L'9')) {
EndOfElement = i;
} // if
} // for
+
// Extract the target element
if (EndOfElement > 0) {
if (EndOfElement >= StartOfElement) {
return (Found);
} // CHAR16 *FindNumbers()
+// Returns the number of characters that are in common between
+// String1 and String2 before they diverge. For instance, if
+// String1 is "FooBar" and String2 is "FoodiesBar", this function
+// will return "3", since they both start with "Foo".
+UINTN NumCharsInCommon(IN CHAR16* String1, IN CHAR16* String2) {
+ UINTN Count = 0;
+ if ((String1 == NULL) || (String2 == NULL))
+ return 0;
+ while ((String1[Count] != L'\0') && (String2[Count] != L'\0') && (String1[Count] == String2[Count]))
+ Count++;
+ return Count;
+} // UINTN NumCharsInCommon()
+
// Find the #Index element (numbered from 0) in a comma-delimited string
// of elements.
// Returns the found element, or NULL if Index is out of range or InString
return Found;
} // BOOLEAN IsSubstringIn()
+// Replace *SearchString in **MainString with *ReplString -- but if *SearchString
+// is preceded by "%", instead remove that character.
+// Returns TRUE if replacement was done, FALSE otherwise.
+BOOLEAN ReplaceSubstring(IN OUT CHAR16 **MainString, IN CHAR16 *SearchString, IN CHAR16 *ReplString) {
+ BOOLEAN WasReplaced = FALSE;
+ CHAR16 *FoundSearchString, *NewString, *EndString;
+
+ FoundSearchString = MyStrStr(*MainString, SearchString);
+ if (FoundSearchString) {
+ NewString = AllocateZeroPool(sizeof(CHAR16) * StrLen(*MainString));
+ if (NewString) {
+ EndString = &(FoundSearchString[StrLen(SearchString)]);
+ FoundSearchString[0] = L'\0';
+ if ((FoundSearchString > *MainString) && (FoundSearchString[-1] == L'%')) {
+ FoundSearchString[-1] = L'\0';
+ ReplString = SearchString;
+ } // if
+ StrCpy(NewString, *MainString);
+ MergeStrings(&NewString, ReplString, L'\0');
+ MergeStrings(&NewString, EndString, L'\0');
+ MyFreePool(MainString);
+ *MainString = NewString;
+ WasReplaced = TRUE;
+ } // if
+ } // if
+ return WasReplaced;
+} // BOOLEAN ReplaceSubstring()
+
// Returns TRUE if *Input contains nothing but valid hexadecimal characters,
// FALSE otherwise. Note that a leading "0x" is NOT acceptable in the input!
BOOLEAN IsValidHex(CHAR16 *Input) {
return Guid;
} // EFI_GUID StringAsGuid()
+
+// Delete the STRING_LIST pointed to by *StringList.
+VOID DeleteStringList(STRING_LIST *StringList) {
+ STRING_LIST *Current = StringList, *Previous;
+
+ while (Current != NULL) {
+ MyFreePool(Current->Value);
+ Previous = Current;
+ Current = Current->Next;
+ MyFreePool(Previous);
+ }
+} // VOID DeleteStringList()