| /*++ |
| |
| Copyright (c) 1998 Intel Corporation |
| |
| Module Name: |
| |
| str.c |
| |
| Abstract: |
| |
| |
| |
| |
| Revision History |
| |
| --*/ |
| |
| #include "lib.h" |
| |
| |
| INTN |
| StrCmp ( |
| IN CONST CHAR16 *s1, |
| IN CONST CHAR16 *s2 |
| ) |
| // compare strings |
| { |
| return RtStrCmp(s1, s2); |
| } |
| |
| INTN |
| StrnCmp ( |
| IN CONST CHAR16 *s1, |
| IN CONST CHAR16 *s2, |
| IN UINTN len |
| ) |
| // compare strings |
| { |
| while (*s1 && len) { |
| if (*s1 != *s2) { |
| break; |
| } |
| |
| s1 += 1; |
| s2 += 1; |
| len -= 1; |
| } |
| |
| return len ? *s1 - *s2 : 0; |
| } |
| |
| |
| INTN EFIAPI |
| LibStubStriCmp ( |
| IN EFI_UNICODE_COLLATION_INTERFACE *This, |
| IN CHAR16 *s1, |
| IN CHAR16 *s2 |
| ) |
| { |
| return StrCmp (s1, s2); |
| } |
| |
| VOID EFIAPI |
| LibStubStrLwrUpr ( |
| IN EFI_UNICODE_COLLATION_INTERFACE *This, |
| IN CHAR16 *Str |
| ) |
| { |
| } |
| |
| INTN |
| StriCmp ( |
| IN CONST CHAR16 *s1, |
| IN CONST CHAR16 *s2 |
| ) |
| // compare strings |
| { |
| if (UnicodeInterface == &LibStubUnicodeInterface) |
| return UnicodeInterface->StriColl(UnicodeInterface, (CHAR16 *)s1, (CHAR16 *)s2); |
| else |
| return uefi_call_wrapper(UnicodeInterface->StriColl, 3, UnicodeInterface, (CHAR16 *)s1, (CHAR16 *)s2); |
| } |
| |
| VOID |
| StrLwr ( |
| IN CHAR16 *Str |
| ) |
| // lwoer case string |
| { |
| if (UnicodeInterface == &LibStubUnicodeInterface) |
| UnicodeInterface->StrLwr(UnicodeInterface, Str); |
| else uefi_call_wrapper(UnicodeInterface->StrLwr, 2, UnicodeInterface, Str); |
| } |
| |
| VOID |
| StrUpr ( |
| IN CHAR16 *Str |
| ) |
| // upper case string |
| { |
| if (UnicodeInterface == &LibStubUnicodeInterface) |
| UnicodeInterface->StrUpr(UnicodeInterface, Str); |
| else uefi_call_wrapper(UnicodeInterface->StrUpr, 2, UnicodeInterface, Str); |
| } |
| |
| VOID |
| StrCpy ( |
| IN CHAR16 *Dest, |
| IN CONST CHAR16 *Src |
| ) |
| // copy strings |
| { |
| RtStrCpy (Dest, Src); |
| } |
| |
| VOID |
| StrCat ( |
| IN CHAR16 *Dest, |
| IN CONST CHAR16 *Src |
| ) |
| { |
| RtStrCat(Dest, Src); |
| } |
| |
| UINTN |
| StrLen ( |
| IN CONST CHAR16 *s1 |
| ) |
| // string length |
| { |
| return RtStrLen(s1); |
| } |
| |
| UINTN |
| StrSize ( |
| IN CONST CHAR16 *s1 |
| ) |
| // string size |
| { |
| return RtStrSize(s1); |
| } |
| |
| CHAR16 * |
| StrDuplicate ( |
| IN CONST CHAR16 *Src |
| ) |
| // duplicate a string |
| { |
| CHAR16 *Dest; |
| UINTN Size; |
| |
| Size = StrSize(Src); |
| Dest = AllocatePool (Size); |
| if (Dest) { |
| CopyMem (Dest, Src, Size); |
| } |
| return Dest; |
| } |
| |
| UINTN |
| strlena ( |
| IN CONST CHAR8 *s1 |
| ) |
| // string length |
| { |
| UINTN len; |
| |
| for (len=0; *s1; s1+=1, len+=1) ; |
| return len; |
| } |
| |
| UINTN |
| strcmpa ( |
| IN CONST CHAR8 *s1, |
| IN CONST CHAR8 *s2 |
| ) |
| // compare strings |
| { |
| while (*s1) { |
| if (*s1 != *s2) { |
| break; |
| } |
| |
| s1 += 1; |
| s2 += 1; |
| } |
| |
| return *s1 - *s2; |
| } |
| |
| UINTN |
| strncmpa ( |
| IN CONST CHAR8 *s1, |
| IN CONST CHAR8 *s2, |
| IN UINTN len |
| ) |
| // compare strings |
| { |
| while (*s1 && len) { |
| if (*s1 != *s2) { |
| break; |
| } |
| |
| s1 += 1; |
| s2 += 1; |
| len -= 1; |
| } |
| |
| return len ? *s1 - *s2 : 0; |
| } |
| |
| |
| |
| UINTN |
| xtoi ( |
| CONST CHAR16 *str |
| ) |
| // convert hex string to uint |
| { |
| UINTN u; |
| CHAR16 c; |
| |
| // skip preceeding white space |
| while (*str && *str == ' ') { |
| str += 1; |
| } |
| |
| // convert hex digits |
| u = 0; |
| while ((c = *(str++))) { |
| if (c >= 'a' && c <= 'f') { |
| c -= 'a' - 'A'; |
| } |
| |
| if ((c >= '0' && c <= '9') || (c >= 'A' && c <= 'F')) { |
| u = (u << 4) | (c - (c >= 'A' ? 'A'-10 : '0')); |
| } else { |
| break; |
| } |
| } |
| |
| return u; |
| } |
| |
| UINTN |
| Atoi ( |
| CONST CHAR16 *str |
| ) |
| // convert hex string to uint |
| { |
| UINTN u; |
| CHAR16 c; |
| |
| // skip preceeding white space |
| while (*str && *str == ' ') { |
| str += 1; |
| } |
| |
| // convert digits |
| u = 0; |
| while ((c = *(str++))) { |
| if (c >= '0' && c <= '9') { |
| u = (u * 10) + c - '0'; |
| } else { |
| break; |
| } |
| } |
| |
| return u; |
| } |
| |
| BOOLEAN |
| MetaMatch ( |
| IN CHAR16 *String, |
| IN CHAR16 *Pattern |
| ) |
| { |
| CHAR16 c, p, l; |
| |
| for (; ;) { |
| p = *Pattern; |
| Pattern += 1; |
| |
| switch (p) { |
| case 0: |
| // End of pattern. If end of string, TRUE match |
| return *String ? FALSE : TRUE; |
| |
| case '*': |
| // Match zero or more chars |
| while (*String) { |
| if (MetaMatch (String, Pattern)) { |
| return TRUE; |
| } |
| String += 1; |
| } |
| return MetaMatch (String, Pattern); |
| |
| case '?': |
| // Match any one char |
| if (!*String) { |
| return FALSE; |
| } |
| String += 1; |
| break; |
| |
| case '[': |
| // Match char set |
| c = *String; |
| if (!c) { |
| return FALSE; // syntax problem |
| } |
| |
| l = 0; |
| while ((p = *Pattern++)) { |
| if (p == ']') { |
| return FALSE; |
| } |
| |
| if (p == '-') { // if range of chars, |
| p = *Pattern; // get high range |
| if (p == 0 || p == ']') { |
| return FALSE; // syntax problem |
| } |
| |
| if (c >= l && c <= p) { // if in range, |
| break; // it's a match |
| } |
| } |
| |
| l = p; |
| if (c == p) { // if char matches |
| break; // move on |
| } |
| } |
| |
| // skip to end of match char set |
| while (p && p != ']') { |
| p = *Pattern; |
| Pattern += 1; |
| } |
| |
| String += 1; |
| break; |
| |
| default: |
| c = *String; |
| if (c != p) { |
| return FALSE; |
| } |
| |
| String += 1; |
| break; |
| } |
| } |
| } |
| |
| |
| BOOLEAN EFIAPI |
| LibStubMetaiMatch ( |
| IN EFI_UNICODE_COLLATION_INTERFACE *This, |
| IN CHAR16 *String, |
| IN CHAR16 *Pattern |
| ) |
| { |
| return MetaMatch (String, Pattern); |
| } |
| |
| |
| BOOLEAN |
| MetaiMatch ( |
| IN CHAR16 *String, |
| IN CHAR16 *Pattern |
| ) |
| { |
| if (UnicodeInterface == &LibStubUnicodeInterface) |
| return UnicodeInterface->MetaiMatch(UnicodeInterface, String, Pattern); |
| else return uefi_call_wrapper(UnicodeInterface->MetaiMatch, 3, UnicodeInterface, String, Pattern); |
| } |