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