|
|
/*++
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); }
|