Home | History | Annotate | Line # | Download | only in lib
      1 /*	$NetBSD: str.c,v 1.1.1.3 2021/09/30 18:50:09 jmcneill Exp $	*/
      2 
      3 /*++
      4 
      5 Copyright (c) 1998  Intel Corporation
      6 
      7 Module Name:
      8 
      9     str.c
     10 
     11 Abstract:
     12 
     13 
     14 
     15 
     16 Revision History
     17 
     18 --*/
     19 
     20 #include "lib.h"
     21 
     22 
     23 INTN
     24 StrCmp (
     25     IN CONST CHAR16   *s1,
     26     IN CONST CHAR16   *s2
     27     )
     28 // compare strings
     29 {
     30     return RtStrCmp(s1, s2);
     31 }
     32 
     33 INTN
     34 StrnCmp (
     35     IN CONST CHAR16   *s1,
     36     IN CONST CHAR16   *s2,
     37     IN UINTN    len
     38     )
     39 // compare strings
     40 {
     41     while (*s1  &&  len) {
     42         if (*s1 != *s2) {
     43             break;
     44         }
     45 
     46         s1  += 1;
     47         s2  += 1;
     48         len -= 1;
     49     }
     50 
     51     return len ? *s1 - *s2 : 0;
     52 }
     53 
     54 
     55 INTN EFIAPI
     56 LibStubStriCmp (
     57     IN EFI_UNICODE_COLLATION_INTERFACE  *This EFI_UNUSED,
     58     IN CHAR16                           *s1,
     59     IN CHAR16                           *s2
     60     )
     61 {
     62     return StrCmp (s1, s2);
     63 }
     64 
     65 VOID EFIAPI
     66 LibStubStrLwrUpr (
     67     IN EFI_UNICODE_COLLATION_INTERFACE  *This EFI_UNUSED,
     68     IN CHAR16                           *Str EFI_UNUSED
     69     )
     70 {
     71 }
     72 
     73 INTN
     74 StriCmp (
     75     IN CONST CHAR16   *s1,
     76     IN CONST CHAR16   *s2
     77     )
     78 // compare strings
     79 {
     80     if (UnicodeInterface == &LibStubUnicodeInterface)
     81     	return UnicodeInterface->StriColl(UnicodeInterface, (CHAR16 *)s1, (CHAR16 *)s2);
     82     else
     83 	return uefi_call_wrapper(UnicodeInterface->StriColl, 3, UnicodeInterface, (CHAR16 *)s1, (CHAR16 *)s2);
     84 }
     85 
     86 VOID
     87 StrLwr (
     88     IN CHAR16   *Str
     89     )
     90 // lwoer case string
     91 {
     92     if (UnicodeInterface == &LibStubUnicodeInterface)
     93     	UnicodeInterface->StrLwr(UnicodeInterface, Str);
     94     else uefi_call_wrapper(UnicodeInterface->StrLwr, 2, UnicodeInterface, Str);
     95 }
     96 
     97 VOID
     98 StrUpr (
     99     IN CHAR16   *Str
    100     )
    101 // upper case string
    102 {
    103     if (UnicodeInterface == &LibStubUnicodeInterface)
    104         UnicodeInterface->StrUpr(UnicodeInterface, Str);
    105     else uefi_call_wrapper(UnicodeInterface->StrUpr, 2, UnicodeInterface, Str);
    106 }
    107 
    108 VOID
    109 StrCpy (
    110     IN CHAR16   *Dest,
    111     IN CONST CHAR16   *Src
    112     )
    113 // copy strings
    114 {
    115     RtStrCpy (Dest, Src);
    116 }
    117 
    118 VOID
    119 StrnCpy (
    120     IN CHAR16   *Dest,
    121     IN CONST CHAR16   *Src,
    122     IN UINTN     Len
    123     )
    124 // copy strings
    125 {
    126     RtStrnCpy (Dest, Src, Len);
    127 }
    128 
    129 CHAR16 *
    130 StpCpy (
    131     IN CHAR16   *Dest,
    132     IN CONST CHAR16   *Src
    133     )
    134 // copy strings
    135 {
    136     return RtStpCpy (Dest, Src);
    137 }
    138 
    139 CHAR16 *
    140 StpnCpy (
    141     IN CHAR16   *Dest,
    142     IN CONST CHAR16   *Src,
    143     IN UINTN     Len
    144     )
    145 // copy strings
    146 {
    147     return RtStpnCpy (Dest, Src, Len);
    148 }
    149 
    150 VOID
    151 StrCat (
    152     IN CHAR16   *Dest,
    153     IN CONST CHAR16   *Src
    154     )
    155 {
    156     RtStrCat(Dest, Src);
    157 }
    158 
    159 VOID
    160 StrnCat (
    161     IN CHAR16   *Dest,
    162     IN CONST CHAR16   *Src,
    163     IN UINTN     Len
    164     )
    165 {
    166     RtStrnCat(Dest, Src, Len);
    167 }
    168 
    169 
    170 UINTN
    171 StrnLen (
    172     IN CONST CHAR16   *s1,
    173     IN UINTN           Len
    174     )
    175 // string length
    176 {
    177     return RtStrnLen(s1, Len);
    178 }
    179 
    180 UINTN
    181 StrLen (
    182     IN CONST CHAR16   *s1
    183     )
    184 // string length
    185 {
    186     return RtStrLen(s1);
    187 }
    188 
    189 UINTN
    190 StrSize (
    191     IN CONST CHAR16   *s1
    192     )
    193 // string size
    194 {
    195     return RtStrSize(s1);
    196 }
    197 
    198 CHAR16 *
    199 StrDuplicate (
    200     IN CONST CHAR16   *Src
    201     )
    202 // duplicate a string
    203 {
    204     CHAR16      *Dest;
    205     UINTN       Size;
    206 
    207     Size = StrSize(Src);
    208     Dest = AllocatePool (Size);
    209     if (Dest) {
    210         CopyMem (Dest, Src, Size);
    211     }
    212     return Dest;
    213 }
    214 
    215 UINTN
    216 strlena (
    217     IN CONST CHAR8    *s1
    218     )
    219 // string length
    220 {
    221     UINTN        len;
    222 
    223     for (len=0; *s1; s1+=1, len+=1) ;
    224     return len;
    225 }
    226 
    227 UINTN
    228 strcmpa (
    229     IN CONST CHAR8    *s1,
    230     IN CONST CHAR8    *s2
    231     )
    232 // compare strings
    233 {
    234     while (*s1) {
    235         if (*s1 != *s2) {
    236             break;
    237         }
    238 
    239         s1 += 1;
    240         s2 += 1;
    241     }
    242 
    243     return *s1 - *s2;
    244 }
    245 
    246 UINTN
    247 strncmpa (
    248     IN CONST CHAR8    *s1,
    249     IN CONST CHAR8    *s2,
    250     IN UINTN    len
    251     )
    252 // compare strings
    253 {
    254     while (*s1  &&  len) {
    255         if (*s1 != *s2) {
    256             break;
    257         }
    258 
    259         s1  += 1;
    260         s2  += 1;
    261         len -= 1;
    262     }
    263 
    264     return len ? *s1 - *s2 : 0;
    265 }
    266 
    267 
    268 
    269 UINTN
    270 xtoi (
    271     CONST CHAR16  *str
    272     )
    273 // convert hex string to uint
    274 {
    275     UINTN       u;
    276     CHAR16      c;
    277 
    278     // skip preceeding white space
    279     while (*str == ' ') {
    280         str += 1;
    281     }
    282 
    283     // convert hex digits
    284     u = 0;
    285     while ((c = *(str++))) {
    286         if (c >= 'a'  &&  c <= 'f') {
    287             c -= 'a' - 'A';
    288         }
    289 
    290         if ((c >= '0'  &&  c <= '9')  ||  (c >= 'A'  &&  c <= 'F')) {
    291             u = (u << 4)  |  ((UINTN)c - (c >= 'A' ? 'A'-10 : '0'));
    292         } else {
    293             break;
    294         }
    295     }
    296 
    297     return u;
    298 }
    299 
    300 UINTN
    301 Atoi (
    302     CONST CHAR16  *str
    303     )
    304 // convert hex string to uint
    305 {
    306     UINTN       u;
    307     CHAR16      c;
    308 
    309     // skip preceeding white space
    310     while (*str == ' ') {
    311         str += 1;
    312     }
    313 
    314     // convert digits
    315     u = 0;
    316     while ((c = *(str++))) {
    317         if (c >= '0' && c <= '9') {
    318             u = (u * 10) + c - '0';
    319         } else {
    320             break;
    321         }
    322     }
    323 
    324     return u;
    325 }
    326 
    327 BOOLEAN
    328 MetaMatch (
    329     IN CHAR16   *String,
    330     IN CHAR16   *Pattern
    331     )
    332 {
    333     CHAR16  c, p, l;
    334 
    335     for (; ;) {
    336         p = *Pattern;
    337         Pattern += 1;
    338 
    339         switch (p) {
    340         case 0:
    341             // End of pattern.  If end of string, TRUE match
    342             return *String ? FALSE : TRUE;
    343 
    344         case '*':
    345             // Match zero or more chars
    346             while (*String) {
    347                 if (MetaMatch (String, Pattern)) {
    348                     return TRUE;
    349                 }
    350                 String += 1;
    351             }
    352             return MetaMatch (String, Pattern);
    353 
    354         case '?':
    355             // Match any one char
    356             if (!*String) {
    357                 return FALSE;
    358             }
    359             String += 1;
    360             break;
    361 
    362         case '[':
    363             // Match char set
    364             c = *String;
    365             if (!c) {
    366                 return FALSE;                       // syntax problem
    367             }
    368 
    369             l = 0;
    370             while ((p = *Pattern++)) {
    371                 if (p == ']') {
    372                     return FALSE;
    373                 }
    374 
    375                 if (p == '-') {                     // if range of chars,
    376                     p = *Pattern;                   // get high range
    377                     if (p == 0 || p == ']') {
    378                         return FALSE;               // syntax problem
    379                     }
    380 
    381                     if (c >= l && c <= p) {         // if in range,
    382                         break;                      // it's a match
    383                     }
    384                 }
    385 
    386                 l = p;
    387                 if (c == p) {                       // if char matches
    388                     break;                          // move on
    389                 }
    390             }
    391 
    392             // skip to end of match char set
    393             while (p && p != ']') {
    394                 p = *Pattern;
    395                 Pattern += 1;
    396             }
    397 
    398             String += 1;
    399             break;
    400 
    401         default:
    402             c = *String;
    403             if (c != p) {
    404                 return FALSE;
    405             }
    406 
    407             String += 1;
    408             break;
    409         }
    410     }
    411 }
    412 
    413 
    414 BOOLEAN EFIAPI
    415 LibStubMetaiMatch (
    416     IN EFI_UNICODE_COLLATION_INTERFACE  *This EFI_UNUSED,
    417     IN CHAR16                           *String,
    418     IN CHAR16                           *Pattern
    419     )
    420 {
    421     return MetaMatch (String, Pattern);
    422 }
    423 
    424 
    425 BOOLEAN
    426 MetaiMatch (
    427     IN CHAR16   *String,
    428     IN CHAR16   *Pattern
    429     )
    430 {
    431     if (UnicodeInterface == &LibStubUnicodeInterface)
    432     	return UnicodeInterface->MetaiMatch(UnicodeInterface, String, Pattern);
    433     else return uefi_call_wrapper(UnicodeInterface->MetaiMatch, 3, UnicodeInterface, String, Pattern);
    434 }
    435