1/*++ 2 3Copyright (c) 1998 Intel Corporation 4 5Module Name: 6 7 str.c 8 9Abstract: 10 11 12 13 14Revision History 15 16--*/ 17 18#include "lib.h" 19 20 21INTN 22StrCmp ( 23 IN CONST CHAR16 *s1, 24 IN CONST CHAR16 *s2 25 ) 26// compare strings 27{ 28 return RtStrCmp(s1, s2); 29} 30 31INTN 32StrnCmp ( 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 53INTN EFIAPI 54LibStubStriCmp ( 55 IN EFI_UNICODE_COLLATION_INTERFACE *This, 56 IN CHAR16 *s1, 57 IN CHAR16 *s2 58 ) 59{ 60 return StrCmp (s1, s2); 61} 62 63VOID EFIAPI 64LibStubStrLwrUpr ( 65 IN EFI_UNICODE_COLLATION_INTERFACE *This, 66 IN CHAR16 *Str 67 ) 68{ 69} 70 71INTN 72StriCmp ( 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 84VOID 85StrLwr ( 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 95VOID 96StrUpr ( 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 106VOID 107StrCpy ( 108 IN CHAR16 *Dest, 109 IN CONST CHAR16 *Src 110 ) 111// copy strings 112{ 113 RtStrCpy (Dest, Src); 114} 115 116VOID 117StrCat ( 118 IN CHAR16 *Dest, 119 IN CONST CHAR16 *Src 120 ) 121{ 122 RtStrCat(Dest, Src); 123} 124 125UINTN 126StrLen ( 127 IN CONST CHAR16 *s1 128 ) 129// string length 130{ 131 return RtStrLen(s1); 132} 133 134UINTN 135StrSize ( 136 IN CONST CHAR16 *s1 137 ) 138// string size 139{ 140 return RtStrSize(s1); 141} 142 143CHAR16 * 144StrDuplicate ( 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 160UINTN 161strlena ( 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 172UINTN 173strcmpa ( 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 191UINTN 192strncmpa ( 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 214UINTN 215xtoi ( 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 245UINTN 246Atoi ( 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 272BOOLEAN 273MetaMatch ( 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 359BOOLEAN EFIAPI 360LibStubMetaiMatch ( 361 IN EFI_UNICODE_COLLATION_INTERFACE *This, 362 IN CHAR16 *String, 363 IN CHAR16 *Pattern 364 ) 365{ 366 return MetaMatch (String, Pattern); 367} 368 369 370BOOLEAN 371MetaiMatch ( 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