X-Git-Url: https://code.delx.au/refind/blobdiff_plain/bdcf7904f98139ec9e632669cd43005ca527d11c..83e356eff90bc8d5b4de9796e86df286991b2e3a:/refind/mystrings.c diff --git a/refind/mystrings.c b/refind/mystrings.c index a5c5823..539aba2 100644 --- a/refind/mystrings.c +++ b/refind/mystrings.c @@ -238,14 +238,29 @@ BOOLEAN LimitStringLength(CHAR16 *TheString, UINTN Limit) { // 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; + UINTN i, StartOfElement = 0, EndOfElement = 0, CopyLength; CHAR16 *Found = NULL; if (InString == 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')) { @@ -255,6 +270,7 @@ CHAR16 *FindNumbers(IN CHAR16 *InString) { EndOfElement = i; } // if } // for + // Extract the target element if (EndOfElement > 0) { if (EndOfElement >= StartOfElement) { @@ -267,6 +283,19 @@ CHAR16 *FindNumbers(IN CHAR16 *InString) { 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 @@ -335,6 +364,34 @@ BOOLEAN IsInSubstring(IN CHAR16 *BigString, IN CHAR16 *List) { 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) { @@ -456,3 +513,15 @@ EFI_GUID StringAsGuid(CHAR16 * InString) { 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()