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