From 83e356eff90bc8d5b4de9796e86df286991b2e3a Mon Sep 17 00:00:00 2001 From: James Bunton Date: Mon, 13 Mar 2017 20:48:00 +1100 Subject: [PATCH] Support Arch Linux kernel naming by treating "linux" and "linux-lts" as digits --- refind/mystrings.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/refind/mystrings.c b/refind/mystrings.c index 645511c..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) { -- 2.39.2