1 /* $NetBSD: str.c,v 1.1.1.2 2018/08/16 18:17:47 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 && *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) | (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 && *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