17#include <Library/BaseLib.h>
18#include <Library/BaseMemoryLib.h>
19#include <Library/BaseOverflowLib.h>
20#include <Library/DebugLib.h>
22#include <Library/PrintLib.h>
23#include <Library/PcdLib.h>
24#include <Library/SortLib.h>
29 IN CONST CHAR16 *FirstString,
30 IN CONST CHAR16 *SecondString
33 CHAR16 UpperFirstString;
34 CHAR16 UpperSecondString;
39 ASSERT (StrSize (FirstString) != 0);
40 ASSERT (StrSize (SecondString) != 0);
42 UpperFirstString = CharToUpper (*FirstString);
43 UpperSecondString = CharToUpper (*SecondString);
44 while ((*FirstString !=
'\0') && (*SecondString !=
'\0') && (UpperFirstString == UpperSecondString)) {
47 UpperFirstString = CharToUpper (*FirstString);
48 UpperSecondString = CharToUpper (*SecondString);
51 return UpperFirstString - UpperSecondString;
57 IN CONST CHAR16 *FirstString,
58 IN CONST CHAR16 *SecondString,
62 CHAR16 UpperFirstString;
63 CHAR16 UpperSecondString;
73 ASSERT (StrSize (FirstString) != 0);
74 ASSERT (StrSize (SecondString) != 0);
76 UpperFirstString = CharToUpper (*FirstString);
77 UpperSecondString = CharToUpper (*SecondString);
78 while ((*FirstString != L
'\0') &&
79 (*SecondString != L
'\0') &&
80 (UpperFirstString == UpperSecondString) &&
85 UpperFirstString = CharToUpper (*FirstString);
86 UpperSecondString = CharToUpper (*SecondString);
90 return UpperFirstString - UpperSecondString;
96 IN CONST CHAR16 *String,
97 IN CONST CHAR16 *SearchString
100 CONST CHAR16 *FirstMatch;
101 CONST CHAR16 *SearchStringTmp;
107 ASSERT (StrSize (String) != 0);
108 ASSERT (StrSize (SearchString) != 0);
110 if (*SearchString == L
'\0') {
111 return (CHAR16 *)String;
114 while (*String != L
'\0') {
115 SearchStringTmp = SearchString;
118 while ( (CharToUpper (*String) == CharToUpper (*SearchStringTmp))
119 && (*String != L
'\0'))
125 if (*SearchStringTmp == L
'\0') {
126 return (CHAR16 *)FirstMatch;
129 if (*String == L
'\0') {
133 String = FirstMatch + 1;
141 CONST CHAR16 *String,
143 CONST CHAR16 *SearchString,
144 UINTN SearchStringLength
158 if ( (SearchStringLength > StringLength)
159 || (SearchStringLength == 0)
160 || (StringLength == 0))
165 if (SearchStringLength > 1) {
168 Y = (CONST CHAR16 *)String;
169 X = (CONST CHAR16 *)SearchString;
179 while (Index <= StringLength - SearchStringLength) {
180 if (X[1] != Y[Index+1]) {
183 CmpResult =
CompareMem (X+2, Y+Index+2, (SearchStringLength - 2) *
sizeof (*SearchString));
184 if ((CmpResult == 0) && (X[0] == Y[Index])) {
192 return ScanMem16 (String, StringLength *
sizeof (*SearchString), *SearchString);
201 IN CONST CHAR16 *String,
205 ASSERT (StrSize (String) != 0);
207 while (*String !=
'\0') {
211 if (*String == Char) {
212 return (CHAR16 *)String;
224 IN CONST CHAR16 *String,
230 ASSERT (StrSize (String) != 0);
234 while (*String !=
'\0') {
238 if (*String == Char) {
239 Save = (CHAR16 *)String;
250 IN OUT CHAR16 *String
256 while ((Needle = StrStr (Needle, L
"/")) != NULL) {
263 IN OUT CHAR16 *String
273 if ((String[0] ==
'\\') || (String[0] ==
'/')) {
274 CopyMem (&String[0], &String[1],
Length *
sizeof (String[0]));
288 if ((String[
Length - 1] ==
'\\') || (String[
Length - 1] ==
'/')) {
301 while (String[
Length - 1] !=
'\\' && String[
Length - 1] !=
'/') {
316 String[
Length - 1] =
'\0';
322 IN OUT CHAR16 *String,
323 IN BOOLEAN SingleLine
326 while (*String != L
'\0') {
327 if ((*String & 0x7FU) != *String) {
332 }
else if (SingleLine && ((*String == L
'\r') || (*String == L
'\n'))) {
338 }
else if ((*String < 0x20) || (*String == 0x7F)) {
351 IN CONST CHAR16 *String,
352 IN BOOLEAN SingleLine
355 while (*String != L
'\0') {
356 if ((*String & 0x7FU) != *String) {
360 if (SingleLine && ((*String == L
'\r') || (*String == L
'\n'))) {
364 if ((*String < 0x20) || (*String == 0x7F)) {
377 OUT CHAR16 *StartOfBuffer,
379 IN CONST CHAR16 *FormatString,
386 UINTN NumberOfPrinted;
388 ASSERT (StartOfBuffer != NULL);
390 ASSERT (FormatString != NULL);
392 VA_START (Marker, FormatString);
394 VA_COPY (Marker2, Marker);
395 NumberOfPrinted = SPrintLength (FormatString, Marker2);
398 if (BufferSize - 1 >= NumberOfPrinted) {
399 UnicodeVSPrint (StartOfBuffer, BufferSize, FormatString, Marker);
400 Status = EFI_SUCCESS;
402 Status = EFI_OUT_OF_RESOURCES;
413 IN CONST CHAR16 *String,
414 IN CONST CHAR16 *SearchString,
415 IN BOOLEAN CaseInsensitiveMatch
419 UINTN SearchStringLength;
422 ASSERT (SearchString != NULL);
424 StringLength = StrLen (String);
425 SearchStringLength = StrLen (SearchString);
427 if (CaseInsensitiveMatch) {
428 return StringLength >= SearchStringLength
429 &&
OcStrniCmp (&String[StringLength - SearchStringLength], SearchString, SearchStringLength) == 0;
432 return StringLength >= SearchStringLength
433 && StrnCmp (&String[StringLength - SearchStringLength], SearchString, SearchStringLength) == 0;
439 IN CONST CHAR16 *String,
440 IN CONST CHAR16 *SearchString,
441 IN BOOLEAN CaseInsensitiveMatch
448 ASSERT (SearchString != NULL);
452 Second = *SearchString++;
453 if (Second ==
'\0') {
461 if (CaseInsensitiveMatch) {
462 First = CharToUpper (First);
463 Second = CharToUpper (Second);
466 if (First != Second) {
474 IN CONST CHAR16 *String
479 UINTN GuidLength = GUID_STRING_LENGTH;
482 if (
Length < GuidLength) {
486 for (Index = 0; Index < GuidLength; ++Index) {
487 if ((Index == 8) || (Index == 13) || (Index == 18) || (Index == 23)) {
488 if (String[Index] !=
'-') {
491 }
else if ( !((String[Index] >= L
'0') && (String[Index] <= L
'9'))
492 && !((String[Index] >= L
'A') && (String[Index] <= L
'F'))
493 && !((String[Index] >= L
'a') && (String[Index] <= L
'f')))
504 IN CONST CHAR16 *FirstString,
505 IN CONST CHAR8 *SecondString
508 while (*FirstString !=
'\0' && *FirstString == *SecondString) {
513 return *FirstString - *SecondString;
519 IN CONST VOID *Buffer1,
520 IN CONST VOID *Buffer2
523 return -StringCompare (Buffer1, Buffer2);
531 return (Ch == L
' ') || (Ch == L
'\t') || (Ch == L
'\r') || (Ch == L
'\n') || (Ch == L
'\v') || (Ch == L
'\f');
539 return (Ch == CHAR_NULL) ||
OcIsSpace (Ch);
INTN MixedStrCmp(IN CONST CHAR16 *FirstString, IN CONST CHAR8 *SecondString)
CHAR16 *EFIAPI OcStrChr(IN CONST CHAR16 *String, IN CHAR16 Char)
CHAR16 *EFIAPI OcStrrChr(IN CONST CHAR16 *String, IN CHAR16 Char)
INTN EFIAPI OcStrniCmp(IN CONST CHAR16 *FirstString, IN CONST CHAR16 *SecondString, IN UINTN Length)
BOOLEAN UnicodeIsFilteredString(IN CONST CHAR16 *String, IN BOOLEAN SingleLine)
VOID UnicodeUefiSlashes(IN OUT CHAR16 *String)
BOOLEAN OcIsSpace(CHAR16 Ch)
BOOLEAN HasValidGuidStringPrefix(IN CONST CHAR16 *String)
CHAR16 *EFIAPI OcStriStr(IN CONST CHAR16 *String, IN CONST CHAR16 *SearchString)
INTN EFIAPI OcStriCmp(IN CONST CHAR16 *FirstString, IN CONST CHAR16 *SecondString)
BOOLEAN UnicodeGetParentDirectory(IN OUT CHAR16 *String)
INTN EFIAPI OcReverseStringCompare(IN CONST VOID *Buffer1, IN CONST VOID *Buffer2)
EFI_STATUS EFIAPI OcUnicodeSafeSPrint(OUT CHAR16 *StartOfBuffer, IN UINTN BufferSize, IN CONST CHAR16 *FormatString,...)
VOID UnicodeFilterString(IN OUT CHAR16 *String, IN BOOLEAN SingleLine)
CONST CHAR16 * OcStrStrLength(CONST CHAR16 *String, UINTN StringLength, CONST CHAR16 *SearchString, UINTN SearchStringLength)
BOOLEAN EFIAPI OcUnicodeStartsWith(IN CONST CHAR16 *String, IN CONST CHAR16 *SearchString, IN BOOLEAN CaseInsensitiveMatch)
BOOLEAN EFIAPI OcUnicodeEndsWith(IN CONST CHAR16 *String, IN CONST CHAR16 *SearchString, IN BOOLEAN CaseInsensitiveMatch)
BOOLEAN OcIsSpaceOrNull(CHAR16 Ch)
VOID *EFIAPI ScanMem16(IN CONST VOID *Buffer, IN UINTN Length, IN UINT16 Value)
INTN EFIAPI CompareMem(IN CONST VOID *DestinationBuffer, IN CONST VOID *SourceBuffer, IN UINTN Length)
VOID *EFIAPI CopyMem(OUT VOID *DestinationBuffer, IN CONST VOID *SourceBuffer, IN UINTN Length)