1/* $NetBSD: str.c,v 1.1.1.3 2021/09/30 18:50:09 jmcneill Exp $ */ 2 3/*++ 4 5Copyright (c) 1998 Intel Corporation 6 7Module Name: 8 9 str.c 10 11Abstract: 12 13 14 15 16Revision History 17 18--*/ 19 20#include "lib.h" 21 22 23INTN 24StrCmp ( 25 IN CONST CHAR16 *s1, 26 IN CONST CHAR16 *s2 27 ) 28// compare strings 29{ 30 return RtStrCmp(s1, s2); 31} 32 33INTN 34StrnCmp ( 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 55INTN EFIAPI 56LibStubStriCmp ( 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 65VOID EFIAPI 66LibStubStrLwrUpr ( 67 IN EFI_UNICODE_COLLATION_INTERFACE *This EFI_UNUSED, 68 IN CHAR16 *Str EFI_UNUSED 69 ) 70{ 71} 72 73INTN 74StriCmp ( 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 86VOID 87StrLwr ( 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 97VOID 98StrUpr ( 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 108VOID 109StrCpy ( 110 IN CHAR16 *Dest, 111 IN CONST CHAR16 *Src 112 ) 113// copy strings 114{ 115 RtStrCpy (Dest, Src); 116} 117 118VOID 119StrnCpy ( 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 129CHAR16 * 130StpCpy ( 131 IN CHAR16 *Dest, 132 IN CONST CHAR16 *Src 133 ) 134// copy strings 135{ 136 return RtStpCpy (Dest, Src); 137} 138 139CHAR16 * 140StpnCpy ( 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 150VOID 151StrCat ( 152 IN CHAR16 *Dest, 153 IN CONST CHAR16 *Src 154 ) 155{ 156 RtStrCat(Dest, Src); 157} 158 159VOID 160StrnCat ( 161 IN CHAR16 *Dest, 162 IN CONST CHAR16 *Src, 163 IN UINTN Len 164 ) 165{ 166 RtStrnCat(Dest, Src, Len); 167} 168 169 170UINTN 171StrnLen ( 172 IN CONST CHAR16 *s1, 173 IN UINTN Len 174 ) 175// string length 176{ 177 return RtStrnLen(s1, Len); 178} 179 180UINTN 181StrLen ( 182 IN CONST CHAR16 *s1 183 ) 184// string length 185{ 186 return RtStrLen(s1); 187} 188 189UINTN 190StrSize ( 191 IN CONST CHAR16 *s1 192 ) 193// string size 194{ 195 return RtStrSize(s1); 196} 197 198CHAR16 * 199StrDuplicate ( 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 215UINTN 216strlena ( 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 227UINTN 228strcmpa ( 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 246UINTN 247strncmpa ( 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 269UINTN 270xtoi ( 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 300UINTN 301Atoi ( 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 327BOOLEAN 328MetaMatch ( 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 414BOOLEAN EFIAPI 415LibStubMetaiMatch ( 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 425BOOLEAN 426MetaiMatch ( 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