123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432 |
- /*++
- 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 EFI_UNUSED,
- IN CHAR16 *s1,
- IN CHAR16 *s2
- )
- {
- return StrCmp (s1, s2);
- }
- VOID EFIAPI
- LibStubStrLwrUpr (
- IN EFI_UNICODE_COLLATION_INTERFACE *This EFI_UNUSED,
- IN CHAR16 *Str EFI_UNUSED
- )
- {
- }
- 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
- StrnCpy (
- IN CHAR16 *Dest,
- IN CONST CHAR16 *Src,
- IN UINTN Len
- )
- // copy strings
- {
- RtStrnCpy (Dest, Src, Len);
- }
- CHAR16 *
- StpCpy (
- IN CHAR16 *Dest,
- IN CONST CHAR16 *Src
- )
- // copy strings
- {
- return RtStpCpy (Dest, Src);
- }
- CHAR16 *
- StpnCpy (
- IN CHAR16 *Dest,
- IN CONST CHAR16 *Src,
- IN UINTN Len
- )
- // copy strings
- {
- return RtStpnCpy (Dest, Src, Len);
- }
- VOID
- StrCat (
- IN CHAR16 *Dest,
- IN CONST CHAR16 *Src
- )
- {
- RtStrCat(Dest, Src);
- }
- VOID
- StrnCat (
- IN CHAR16 *Dest,
- IN CONST CHAR16 *Src,
- IN UINTN Len
- )
- {
- RtStrnCat(Dest, Src, Len);
- }
- UINTN
- StrnLen (
- IN CONST CHAR16 *s1,
- IN UINTN Len
- )
- // string length
- {
- return RtStrnLen(s1, Len);
- }
- 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, (void *)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 += 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) | ((UINTN)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 += 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 EFI_UNUSED,
- 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);
- }
|