0,0 → 1,370 |
/*++ |
|
Copyright (c) 1998 Intel Corporation |
|
Module Name: |
|
str.c |
|
Abstract: |
|
|
|
|
Revision History |
|
--*/ |
|
#include "lib.h" |
|
|
INTN |
StrCmp ( |
IN CHAR16 *s1, |
IN CHAR16 *s2 |
) |
// compare strings |
{ |
return RtStrCmp(s1, s2); |
} |
|
INTN |
StrnCmp ( |
IN CHAR16 *s1, |
IN 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 |
LibStubStriCmp ( |
IN EFI_UNICODE_COLLATION_INTERFACE *This, |
IN CHAR16 *s1, |
IN CHAR16 *s2 |
) |
{ |
return StrCmp (s1, s2); |
} |
|
VOID |
LibStubStrLwrUpr ( |
IN EFI_UNICODE_COLLATION_INTERFACE *This, |
IN CHAR16 *Str |
) |
{ |
} |
|
INTN |
StriCmp ( |
IN CHAR16 *s1, |
IN CHAR16 *s2 |
) |
// compare strings |
{ |
return UnicodeInterface->StriColl(UnicodeInterface, s1, s2); |
} |
|
VOID |
StrLwr ( |
IN CHAR16 *Str |
) |
// lwoer case string |
{ |
UnicodeInterface->StrLwr(UnicodeInterface, Str); |
} |
|
VOID |
StrUpr ( |
IN CHAR16 *Str |
) |
// upper case string |
{ |
UnicodeInterface->StrUpr(UnicodeInterface, Str); |
} |
|
VOID |
StrCpy ( |
IN CHAR16 *Dest, |
IN CHAR16 *Src |
) |
// copy strings |
{ |
RtStrCpy (Dest, Src); |
} |
|
VOID |
StrCat ( |
IN CHAR16 *Dest, |
IN CHAR16 *Src |
) |
{ |
RtStrCat(Dest, Src); |
} |
|
UINTN |
StrLen ( |
IN CHAR16 *s1 |
) |
// string length |
{ |
return RtStrLen(s1); |
} |
|
UINTN |
StrSize ( |
IN CHAR16 *s1 |
) |
// string size |
{ |
return RtStrSize(s1); |
} |
|
CHAR16 * |
StrDuplicate ( |
IN 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 CHAR8 *s1 |
) |
// string length |
{ |
UINTN len; |
|
for (len=0; *s1; s1+=1, len+=1) ; |
return len; |
} |
|
UINTN |
strcmpa ( |
IN CHAR8 *s1, |
IN CHAR8 *s2 |
) |
// compare strings |
{ |
while (*s1) { |
if (*s1 != *s2) { |
break; |
} |
|
s1 += 1; |
s2 += 1; |
} |
|
return *s1 - *s2; |
} |
|
UINTN |
strncmpa ( |
IN CHAR8 *s1, |
IN 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 ( |
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 ( |
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 |
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 |
) |
{ |
return UnicodeInterface->MetaiMatch(UnicodeInterface, String, Pattern); |
} |