]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Universal/EbcDxe/EbcDebugger/EdbSupportString.c
MdeModulePkg/EbcDxe: Make the variable name follow rules
[mirror_edk2.git] / MdeModulePkg / Universal / EbcDxe / EbcDebugger / EdbSupportString.c
CommitLineData
e8a5ac7c 1/** @file\r
748edcd5 2\r
e8a5ac7c
DB
3Copyright (c) 2007 - 2016, Intel Corporation All rights reserved.<BR>\r
4This program and the accompanying materials\r
748edcd5
PB
5are licensed and made available under the terms and conditions of the BSD License\r
6which accompanies this distribution. The full text of the license may be found at\r
7http://opensource.org/licenses/bsd-license.php\r
8\r
9THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
10WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
11\r
748edcd5 12\r
e8a5ac7c 13**/\r
748edcd5 14\r
e8a5ac7c 15#include "Edb.h"\r
748edcd5 16\r
e8a5ac7c 17/**\r
748edcd5 18\r
e8a5ac7c 19 Convert hex string to uint.\r
748edcd5 20\r
3e118ea8 21 @param Str - The string\r
748edcd5 22\r
e8a5ac7c 23**/\r
748edcd5
PB
24UINTN\r
25EFIAPI\r
26Xtoi (\r
3e118ea8 27 CHAR16 *Str\r
748edcd5 28 )\r
748edcd5 29{\r
3e118ea8
DB
30 UINTN RetVal;\r
31 CHAR16 TempChar;\r
32 UINTN MaxVal;\r
748edcd5 33\r
3e118ea8 34 ASSERT (Str != NULL);\r
748edcd5 35\r
3e118ea8 36 MaxVal = (UINTN) -1 >> 4;\r
748edcd5
PB
37 //\r
38 // skip preceeding white space\r
39 //\r
3e118ea8
DB
40 while (*Str && *Str == ' ') {\r
41 Str += 1;\r
748edcd5
PB
42 }\r
43 //\r
44 // skip preceeding zeros\r
45 //\r
3e118ea8
DB
46 while (*Str && *Str == '0') {\r
47 Str += 1;\r
748edcd5
PB
48 }\r
49 //\r
50 // skip preceeding white space\r
51 //\r
3e118ea8
DB
52 if (*Str && (*Str == 'x' || *Str == 'X')) {\r
53 Str += 1;\r
748edcd5
PB
54 }\r
55 //\r
56 // convert hex digits\r
57 //\r
3e118ea8
DB
58 RetVal = 0;\r
59 TempChar = *(Str++);\r
60 while (TempChar) {\r
61 if (TempChar >= 'a' && TempChar <= 'f') {\r
62 TempChar -= 'a' - 'A';\r
748edcd5
PB
63 }\r
64\r
3e118ea8
DB
65 if ((TempChar >= '0' && TempChar <= '9') || (TempChar >= 'A' && TempChar <= 'F')) {\r
66 if (RetVal > MaxVal) {\r
748edcd5
PB
67 return (UINTN) -1;\r
68 }\r
69\r
3e118ea8 70 RetVal = (RetVal << 4) | (TempChar - (TempChar >= 'A' ? 'A' - 10 : '0'));\r
748edcd5
PB
71 } else {\r
72 break;\r
73 }\r
74\r
3e118ea8 75 TempChar = *(Str++);\r
748edcd5
PB
76 }\r
77\r
3e118ea8 78 return RetVal;\r
748edcd5
PB
79}\r
80\r
e8a5ac7c
DB
81/**\r
82\r
83 Convert hex string to uint.\r
84\r
3e118ea8 85 @param Str - The string\r
e8a5ac7c
DB
86\r
87**/\r
88\r
748edcd5
PB
89UINT64\r
90EFIAPI\r
91LXtoi (\r
3e118ea8 92 CHAR16 *Str\r
748edcd5 93 )\r
748edcd5 94{\r
3e118ea8
DB
95 UINT64 RetVal;\r
96 CHAR16 TempChar;\r
97 UINT64 MaxVal;\r
748edcd5 98\r
3e118ea8 99 ASSERT (Str != NULL);\r
748edcd5 100\r
3e118ea8 101 MaxVal = RShiftU64 ((UINT64) -1, 4);\r
748edcd5
PB
102 //\r
103 // skip preceeding white space\r
104 //\r
3e118ea8
DB
105 while (*Str && *Str == ' ') {\r
106 Str += 1;\r
748edcd5
PB
107 }\r
108 //\r
109 // skip preceeding zeros\r
110 //\r
3e118ea8
DB
111 while (*Str && *Str == '0') {\r
112 Str += 1;\r
748edcd5
PB
113 }\r
114 //\r
115 // skip preceeding white space\r
116 //\r
3e118ea8
DB
117 if (*Str && (*Str == 'x' || *Str == 'X')) {\r
118 Str += 1;\r
748edcd5
PB
119 }\r
120 //\r
121 // convert hex digits\r
122 //\r
3e118ea8
DB
123 RetVal = 0;\r
124 TempChar = *(Str++);\r
125 while (TempChar) {\r
126 if (TempChar >= 'a' && TempChar <= 'f') {\r
127 TempChar -= 'a' - 'A';\r
748edcd5
PB
128 }\r
129\r
3e118ea8
DB
130 if ((TempChar >= '0' && TempChar <= '9') || (TempChar >= 'A' && TempChar <= 'F')) {\r
131 if (RetVal > MaxVal) {\r
748edcd5
PB
132 return (UINT64) -1;\r
133 }\r
134\r
3e118ea8
DB
135 RetVal = LShiftU64 (RetVal, 4);\r
136 RetVal = RetVal + (TempChar - (TempChar >= 'A' ? 'A' - 10 : '0'));\r
748edcd5
PB
137 } else {\r
138 break;\r
139 }\r
140\r
3e118ea8 141 TempChar = *(Str++);\r
748edcd5
PB
142 }\r
143\r
3e118ea8 144 return RetVal;\r
748edcd5
PB
145}\r
146\r
e8a5ac7c
DB
147/**\r
148\r
149 Convert hex string to uint.\r
150\r
3e118ea8 151 @param Str - The string\r
e8a5ac7c
DB
152\r
153**/\r
748edcd5
PB
154UINTN\r
155EFIAPI\r
156Atoi (\r
3e118ea8 157 CHAR16 *Str\r
748edcd5 158 )\r
748edcd5 159{\r
3e118ea8
DB
160 UINTN RetVal;\r
161 CHAR16 TempChar;\r
162 UINTN MaxVal;\r
163 UINTN ResteVal;\r
748edcd5 164\r
3e118ea8 165 ASSERT (Str != NULL);\r
748edcd5 166\r
3e118ea8
DB
167 MaxVal = (UINTN) -1 / 10;\r
168 ResteVal = (UINTN) -1 % 10;\r
748edcd5
PB
169 //\r
170 // skip preceeding white space\r
171 //\r
3e118ea8
DB
172 while (*Str && *Str == ' ') {\r
173 Str += 1;\r
748edcd5
PB
174 }\r
175 //\r
176 // convert digits\r
177 //\r
3e118ea8
DB
178 RetVal = 0;\r
179 TempChar = *(Str++);\r
180 while (TempChar) {\r
181 if (TempChar >= '0' && TempChar <= '9') {\r
182 if (RetVal > MaxVal || (RetVal == MaxVal && TempChar - '0' > (INTN) ResteVal)) {\r
748edcd5
PB
183 return (UINTN) -1;\r
184 }\r
185\r
3e118ea8 186 RetVal = (RetVal * 10) + TempChar - '0';\r
748edcd5
PB
187 } else {\r
188 break;\r
189 }\r
190\r
3e118ea8 191 TempChar = *(Str++);\r
748edcd5
PB
192 }\r
193\r
3e118ea8 194 return RetVal;\r
748edcd5
PB
195}\r
196\r
e8a5ac7c
DB
197/**\r
198\r
199 Convert hex string to uint.\r
200\r
3e118ea8 201 @param Str - The string\r
e8a5ac7c
DB
202\r
203**/\r
748edcd5
PB
204UINTN\r
205EFIAPI\r
206AsciiXtoi (\r
3e118ea8 207 CHAR8 *Str\r
748edcd5 208 )\r
748edcd5 209{\r
3e118ea8
DB
210 UINTN RetVal;\r
211 CHAR8 TempChar;\r
212 UINTN MaxVal;\r
748edcd5 213\r
3e118ea8 214 ASSERT (Str != NULL);\r
748edcd5 215\r
3e118ea8 216 MaxVal = (UINTN) -1 >> 4;\r
748edcd5
PB
217 //\r
218 // skip preceeding white space\r
219 //\r
3e118ea8
DB
220 while (*Str && *Str == ' ') {\r
221 Str += 1;\r
748edcd5
PB
222 }\r
223 //\r
224 // skip preceeding zeros\r
225 //\r
3e118ea8
DB
226 while (*Str && *Str == '0') {\r
227 Str += 1;\r
748edcd5
PB
228 }\r
229 //\r
230 // skip preceeding white space\r
231 //\r
3e118ea8
DB
232 if (*Str && (*Str == 'x' || *Str == 'X')) {\r
233 Str += 1;\r
748edcd5
PB
234 }\r
235 //\r
236 // convert hex digits\r
237 //\r
3e118ea8
DB
238 RetVal = 0;\r
239 TempChar = *(Str++);\r
240 while (TempChar) {\r
241 if (TempChar >= 'a' && TempChar <= 'f') {\r
242 TempChar -= 'a' - 'A';\r
748edcd5
PB
243 }\r
244\r
3e118ea8
DB
245 if ((TempChar >= '0' && TempChar <= '9') || (TempChar >= 'A' && TempChar <= 'F')) {\r
246 if (RetVal > MaxVal) {\r
748edcd5
PB
247 return (UINTN) -1;\r
248 }\r
249\r
3e118ea8 250 RetVal = (RetVal << 4) | (TempChar - (TempChar >= 'A' ? 'A' - 10 : '0'));\r
748edcd5
PB
251 } else {\r
252 break;\r
253 }\r
254\r
3e118ea8 255 TempChar = *(Str++);\r
748edcd5
PB
256 }\r
257\r
3e118ea8 258 return RetVal;\r
748edcd5
PB
259}\r
260\r
e8a5ac7c
DB
261/**\r
262\r
263 Convert hex string to uint.\r
264\r
3e118ea8 265 @param Str - The string\r
e8a5ac7c
DB
266\r
267**/\r
748edcd5
PB
268UINTN\r
269EFIAPI\r
270AsciiAtoi (\r
3e118ea8 271 CHAR8 *Str\r
748edcd5 272 )\r
748edcd5 273{\r
3e118ea8
DB
274 UINTN RetVal;\r
275 CHAR8 TempChar;\r
276 UINTN MaxVal;\r
277 UINTN ResteVal;\r
748edcd5 278\r
3e118ea8 279 ASSERT (Str != NULL);\r
748edcd5 280\r
3e118ea8
DB
281 MaxVal = (UINTN) -1 / 10;\r
282 ResteVal = (UINTN) -1 % 10;\r
748edcd5
PB
283 //\r
284 // skip preceeding white space\r
285 //\r
3e118ea8
DB
286 while (*Str && *Str == ' ') {\r
287 Str += 1;\r
748edcd5
PB
288 }\r
289 //\r
290 // convert digits\r
291 //\r
3e118ea8
DB
292 RetVal = 0;\r
293 TempChar = *(Str++);\r
294 while (TempChar) {\r
295 if (TempChar >= '0' && TempChar <= '9') {\r
296 if (RetVal > MaxVal || (RetVal == MaxVal && TempChar - '0' > (INTN) ResteVal)) {\r
748edcd5
PB
297 return (UINTN) -1;\r
298 }\r
299\r
3e118ea8 300 RetVal = (RetVal * 10) + TempChar - '0';\r
748edcd5
PB
301 } else {\r
302 break;\r
303 }\r
304\r
3e118ea8 305 TempChar = *(Str++);\r
748edcd5
PB
306 }\r
307\r
3e118ea8 308 return RetVal;\r
748edcd5
PB
309}\r
310\r
311STATIC\r
312CHAR16\r
313UnicodeToUpper (\r
314 IN CHAR16 Chr\r
315 )\r
316{\r
317 return (Chr >= L'a' && Chr <= L'z') ? Chr - (L'a' - L'A') : Chr;\r
318}\r
319\r
320STATIC\r
321CHAR8\r
322AsciiToUpper (\r
323 IN CHAR8 Chr\r
324 )\r
325{\r
326 return (Chr >= 'a' && Chr <= 'z') ? Chr - ('a' - 'A') : Chr;\r
327}\r
328\r
e8a5ac7c 329/**\r
748edcd5
PB
330 Compare the Unicode and Ascii string pointed by String to the string pointed by String2.\r
331\r
e8a5ac7c 332 @param String - Unicode String to process\r
748edcd5 333\r
e8a5ac7c 334 @param String2 - Ascii string to process\r
748edcd5 335\r
e8a5ac7c 336 @return Return a positive integer if String is lexicall greater than String2; Zero if\r
748edcd5
PB
337 the two strings are identical; and a negative interger if String is lexically\r
338 less than String2.\r
339\r
e8a5ac7c
DB
340**/\r
341INTN\r
342EFIAPI\r
343StrCmpUnicodeAndAscii (\r
344 IN CHAR16 *String,\r
345 IN CHAR8 *String2\r
346 )\r
748edcd5
PB
347{\r
348 while (*String) {\r
349 if (*String != (CHAR16)*String2) {\r
350 break;\r
351 }\r
352\r
353 String += 1;\r
354 String2 += 1;\r
355 }\r
356\r
357 return (*String - (CHAR16)*String2);\r
358}\r
359\r
e8a5ac7c 360/**\r
748edcd5 361\r
748edcd5
PB
362 Compare the Unicode string pointed by String to the string pointed by String2.\r
363\r
e8a5ac7c
DB
364 @param String - Unicode String to process\r
365 @param String2 - Unicode string to process\r
748edcd5 366\r
e8a5ac7c 367 @return Return a positive integer if String is lexically greater than String2; Zero if\r
748edcd5
PB
368 the two strings are identical; and a negative integer if String is lexically\r
369 less than String2.\r
370\r
e8a5ac7c
DB
371**/\r
372INTN\r
373EFIAPI\r
374StriCmp (\r
375 IN CHAR16 *String,\r
376 IN CHAR16 *String2\r
377 )\r
748edcd5
PB
378{\r
379 while ((*String != L'\0') &&\r
380 (UnicodeToUpper (*String) == UnicodeToUpper (*String2))) {\r
381 String++;\r
382 String2++;\r
383 }\r
384\r
385 return UnicodeToUpper (*String) - UnicodeToUpper (*String2);\r
386}\r
387\r
e8a5ac7c 388/**\r
748edcd5 389\r
748edcd5
PB
390 Compare the Unicode and Ascii string pointed by String to the string pointed by String2.\r
391\r
e8a5ac7c
DB
392 @param String - Unicode String to process\r
393 @param String2 - Ascii string to process\r
748edcd5 394\r
e8a5ac7c 395 @return Return a positive integer if String is lexically greater than String2; Zero if\r
748edcd5
PB
396 the two strings are identical; and a negative integer if String is lexically\r
397 less than String2.\r
398\r
e8a5ac7c
DB
399**/\r
400INTN\r
401EFIAPI\r
402StriCmpUnicodeAndAscii (\r
403 IN CHAR16 *String,\r
404 IN CHAR8 *String2\r
405 )\r
748edcd5
PB
406{\r
407 while ((*String != L'\0') &&\r
408 (UnicodeToUpper (*String) == (CHAR16)AsciiToUpper (*String2))) {\r
409 String++;\r
410 String2++;\r
411 }\r
412\r
413 return UnicodeToUpper (*String) - (CHAR16)AsciiToUpper (*String2);\r
414}\r
415\r
e8a5ac7c
DB
416/**\r
417\r
418 Verify if the string is end with the sub string.\r
419\r
420 @param Str - The string where to search the sub string\r
421 @param SubStr - The substring.\r
422\r
423**/\r
748edcd5
PB
424BOOLEAN\r
425EFIAPI\r
426StrEndWith (\r
427 IN CHAR16 *Str,\r
428 IN CHAR16 *SubStr\r
429 )\r
748edcd5
PB
430{\r
431 CHAR16 *Temp;\r
432\r
433 if ((Str == NULL) || (SubStr == NULL) || (StrLen(Str) < StrLen(SubStr))) {\r
434 return FALSE;\r
435 }\r
436\r
437 Temp = Str + StrLen(Str) - StrLen(SubStr);\r
438\r
439 //\r
440 // Compare\r
441 //\r
442 if (StriCmp (Temp, SubStr) == 0) {\r
443 return TRUE;\r
444 } else {\r
445 return FALSE;\r
446 }\r
447}\r
448\r
e8a5ac7c
DB
449/**\r
450 Duplicate a string.\r
451\r
452 @param Src The string to be duplicated.\r
453\r
454**/\r
748edcd5
PB
455CHAR16 *\r
456EFIAPI\r
457StrDuplicate (\r
458 IN CHAR16 *Src\r
459 )\r
748edcd5
PB
460{\r
461 CHAR16 *Dest;\r
462 UINTN Size;\r
463\r
464 Size = (StrLen(Src) + 1) * sizeof(CHAR16);\r
465 Dest = AllocateZeroPool (Size);\r
466 if (Dest) {\r
467 CopyMem (Dest, Src, Size);\r
468 }\r
469 return Dest;\r
470}\r
471\r
472\r
473CHAR16 *mLineBuffer = NULL;\r
474CHAR16 *mFieldBuffer = NULL;\r
475\r
e8a5ac7c
DB
476/**\r
477\r
478 Find the first substring.\r
479\r
480 @param String Point to the string where to find the substring.\r
481 @param CharSet Point to the string to be found.\r
482\r
483**/\r
748edcd5
PB
484UINTN\r
485EFIAPI\r
486StrSpn (\r
487 IN CHAR16 *String,\r
488 IN CHAR16 *CharSet\r
489 )\r
748edcd5
PB
490{\r
491 UINTN Count;\r
492 CHAR16 *Str1;\r
493 CHAR16 *Str2;\r
494\r
495 Count = 0;\r
496\r
497 for (Str1 = String; *Str1 != L'\0'; Str1 ++) {\r
498 for (Str2 = CharSet; *Str2 != L'\0'; Str2 ++) {\r
499 if (*Str1 == *Str2) {\r
500 break;\r
501 }\r
502 }\r
503\r
504 if (*Str2 == L'\0') {\r
505 return Count;\r
506 }\r
507\r
508 Count ++;\r
509 }\r
510\r
511 return Count;\r
512}\r
513\r
e8a5ac7c
DB
514/**\r
515\r
516 Searches a string for the first occurrence of a character contained in a\r
517 specified buffer.\r
518\r
519 @param String Point to the string where to find the substring.\r
520 @param CharSet Point to the string to be found.\r
521\r
522**/\r
748edcd5
PB
523\r
524CHAR16 *\r
525EFIAPI\r
526StrBrk (\r
527 IN CHAR16 *String,\r
528 IN CHAR16 *CharSet\r
529 )\r
748edcd5
PB
530{\r
531 CHAR16 *Str1;\r
532 CHAR16 *Str2;\r
533\r
534 for (Str1 = String; *Str1 != L'\0'; Str1 ++) {\r
535 for (Str2 = CharSet; *Str2 != L'\0'; Str2 ++) {\r
536 if (*Str1 == *Str2) {\r
537 return (CHAR16 *) Str1;\r
538 }\r
539 }\r
540 }\r
541\r
542 return NULL;\r
543}\r
544\r
e8a5ac7c
DB
545/**\r
546\r
547 Find the next token after one or more specified characters.\r
548\r
549 @param String Point to the string where to find the substring.\r
550 @param CharSet Point to the string to be found.\r
551\r
552**/\r
748edcd5
PB
553CHAR16 *\r
554EFIAPI\r
555StrTokenLine (\r
556 IN CHAR16 *String OPTIONAL,\r
557 IN CHAR16 *CharSet\r
558 )\r
748edcd5
PB
559{\r
560 CHAR16 *Begin;\r
561 CHAR16 *End;\r
562\r
563 Begin = (String == NULL) ? mLineBuffer : String;\r
564 if (Begin == NULL) {\r
565 return NULL;\r
566 }\r
567\r
568 Begin += StrSpn (Begin, CharSet);\r
569 if (*Begin == L'\0') {\r
570 mLineBuffer = NULL;\r
571 return NULL;\r
572 }\r
573\r
574 End = StrBrk (Begin, CharSet);\r
575 if ((End != NULL) && (*End != L'\0')) {\r
576 *End = L'\0';\r
577 End ++;\r
578 }\r
579\r
580 mLineBuffer = End;\r
581 return Begin;\r
582}\r
583\r
e8a5ac7c
DB
584/**\r
585\r
586 Find the next token after one specificed characters.\r
587\r
588 @param String Point to the string where to find the substring.\r
589 @param CharSet Point to the string to be found.\r
590\r
591**/\r
748edcd5
PB
592\r
593CHAR16 *\r
594EFIAPI\r
595StrTokenField (\r
596 IN CHAR16 *String OPTIONAL,\r
597 IN CHAR16 *CharSet\r
598 )\r
748edcd5
PB
599{\r
600 CHAR16 *Begin;\r
601 CHAR16 *End;\r
602\r
603\r
604 Begin = (String == NULL) ? mFieldBuffer : String;\r
605 if (Begin == NULL) {\r
606 return NULL;\r
607 }\r
608\r
609 if (*Begin == L'\0') {\r
610 mFieldBuffer = NULL;\r
611 return NULL;\r
612 }\r
613\r
614 End = StrBrk (Begin, CharSet);\r
615 if ((End != NULL) && (*End != L'\0')) {\r
616 *End = L'\0';\r
617 End ++;\r
618 }\r
619\r
620 mFieldBuffer = End;\r
621 return Begin;\r
622}\r
623\r
624CHAR16 *\r
625EFIAPI\r
626StrGetNewTokenLine (\r
627 IN CHAR16 *String,\r
628 IN CHAR16 *CharSet\r
629 )\r
630{\r
631 return StrTokenLine (String, CharSet);\r
632}\r
633\r
634CHAR16 *\r
635EFIAPI\r
636StrGetNextTokenLine (\r
637 IN CHAR16 *CharSet\r
638 )\r
639{\r
640 return StrTokenLine (NULL, CharSet);\r
641}\r
642\r
643CHAR16 *\r
644EFIAPI\r
645StrGetNewTokenField (\r
646 IN CHAR16 *String,\r
647 IN CHAR16 *CharSet\r
648 )\r
649{\r
650 return StrTokenField (String, CharSet);\r
651}\r
652\r
653CHAR16 *\r
654EFIAPI\r
655StrGetNextTokenField (\r
656 IN CHAR16 *CharSet\r
657 )\r
658{\r
659 return StrTokenField (NULL, CharSet);\r
660}\r
661\r
662VOID\r
663EFIAPI\r
664PatchForStrTokenAfter (\r
665 IN CHAR16 *Buffer,\r
666 IN CHAR16 Patch\r
667 )\r
668{\r
669 CHAR16 *Str;\r
670\r
671 if (Buffer == NULL) {\r
672 return ;\r
673 }\r
674\r
675 Str = Buffer;\r
676 while (*Str != 0) {\r
677 Str ++;\r
678 }\r
679 *Str = Patch;\r
680\r
681 while (*(Str ++)) {\r
682 if (*Str == 0) {\r
683 *Str = Patch;\r
684 } else {\r
685 break;\r
686 }\r
687 }\r
688\r
689 return ;\r
690}\r
691\r
692VOID\r
693EFIAPI\r
694PatchForStrTokenBefore (\r
695 IN CHAR16 *Buffer,\r
696 IN CHAR16 Patch\r
697 )\r
698{\r
699 CHAR16 *Str;\r
700\r
701 if (Buffer == NULL) {\r
702 return ;\r
703 }\r
704\r
705 Str = Buffer;\r
706 while (*(Str --)) {\r
707 if ((*Str == 0) || (*Str == Patch)) {\r
708 *Str = Patch;\r
709 } else {\r
710 break;\r
711 }\r
712 }\r
713\r
714 return ;\r
715}\r
716\r
717CHAR8 *mAsciiLineBuffer = NULL;\r
718CHAR8 *mAsciiFieldBuffer = NULL;\r
719\r
e8a5ac7c
DB
720/**\r
721\r
722 Find the first substring.\r
723\r
724 @param String Point to the string where to find the substring.\r
725 @param CharSet Point to the string to be found.\r
726\r
727**/\r
748edcd5
PB
728UINTN\r
729EFIAPI\r
730AsciiStrSpn (\r
731 IN CHAR8 *String,\r
732 IN CHAR8 *CharSet\r
733 )\r
748edcd5
PB
734{\r
735 UINTN Count;\r
736 CHAR8 *Str1;\r
737 CHAR8 *Str2;\r
738\r
739 Count = 0;\r
740\r
741 for (Str1 = String; *Str1 != '\0'; Str1 ++) {\r
742 for (Str2 = CharSet; *Str2 != '\0'; Str2 ++) {\r
743 if (*Str1 == *Str2) {\r
744 break;\r
745 }\r
746 }\r
747\r
748 if (*Str2 == '\0') {\r
749 return Count;\r
750 }\r
751\r
752 Count ++;\r
753 }\r
754\r
755 return Count;\r
756}\r
757\r
e8a5ac7c
DB
758/**\r
759 Searches a string for the first occurrence of a character contained in a\r
760 specified buffer.\r
761\r
762 @param String Point to the string where to find the substring.\r
763 @param CharSet Point to the string to be found.\r
748edcd5 764\r
e8a5ac7c 765**/\r
748edcd5
PB
766CHAR8 *\r
767EFIAPI\r
768AsciiStrBrk (\r
769 IN CHAR8 *String,\r
770 IN CHAR8 *CharSet\r
771 )\r
748edcd5
PB
772{\r
773 CHAR8 *Str1;\r
774 CHAR8 *Str2;\r
775\r
776 for (Str1 = String; *Str1 != '\0'; Str1 ++) {\r
777 for (Str2 = CharSet; *Str2 != '\0'; Str2 ++) {\r
778 if (*Str1 == *Str2) {\r
779 return (CHAR8 *) Str1;\r
780 }\r
781 }\r
782 }\r
783\r
784 return NULL;\r
785}\r
786\r
e8a5ac7c
DB
787/**\r
788\r
789 Find the next token after one or more specified characters.\r
790\r
791 @param String Point to the string where to find the substring.\r
792 @param CharSet Point to the string to be found.\r
793\r
794**/\r
748edcd5
PB
795CHAR8 *\r
796EFIAPI\r
797AsciiStrTokenLine (\r
798 IN CHAR8 *String OPTIONAL,\r
799 IN CHAR8 *CharSet\r
800 )\r
748edcd5
PB
801{\r
802 CHAR8 *Begin;\r
803 CHAR8 *End;\r
804\r
805 Begin = (String == NULL) ? mAsciiLineBuffer : String;\r
806 if (Begin == NULL) {\r
807 return NULL;\r
808 }\r
809\r
810 Begin += AsciiStrSpn (Begin, CharSet);\r
811 if (*Begin == '\0') {\r
812 mAsciiLineBuffer = NULL;\r
813 return NULL;\r
814 }\r
815\r
816 End = AsciiStrBrk (Begin, CharSet);\r
817 if ((End != NULL) && (*End != '\0')) {\r
818 *End = '\0';\r
819 End ++;\r
820 }\r
821\r
822 mAsciiLineBuffer = End;\r
823 return Begin;\r
824}\r
825\r
e8a5ac7c
DB
826/**\r
827\r
828 Find the next token after one specificed characters.\r
829\r
830 @param String Point to the string where to find the substring.\r
831 @param CharSet Point to the string to be found.\r
832\r
833**/\r
748edcd5
PB
834\r
835CHAR8 *\r
836EFIAPI\r
837AsciiStrTokenField (\r
838 IN CHAR8 *String OPTIONAL,\r
839 IN CHAR8 *CharSet\r
840 )\r
748edcd5
PB
841{\r
842 CHAR8 *Begin;\r
843 CHAR8 *End;\r
844\r
845\r
846 Begin = (String == NULL) ? mAsciiFieldBuffer : String;\r
847 if (Begin == NULL) {\r
848 return NULL;\r
849 }\r
850\r
45b18ce5 851 if (*Begin == '\0') {\r
748edcd5
PB
852 mAsciiFieldBuffer = NULL;\r
853 return NULL;\r
854 }\r
855\r
856 End = AsciiStrBrk (Begin, CharSet);\r
857 if ((End != NULL) && (*End != '\0')) {\r
858 *End = '\0';\r
859 End ++;\r
860 }\r
861\r
862 mAsciiFieldBuffer = End;\r
863 return Begin;\r
864}\r
865\r
866CHAR8 *\r
867EFIAPI\r
868AsciiStrGetNewTokenLine (\r
869 IN CHAR8 *String,\r
870 IN CHAR8 *CharSet\r
871 )\r
872{\r
873 return AsciiStrTokenLine (String, CharSet);\r
874}\r
875\r
876CHAR8 *\r
877EFIAPI\r
878AsciiStrGetNextTokenLine (\r
879 IN CHAR8 *CharSet\r
880 )\r
881{\r
882 return AsciiStrTokenLine (NULL, CharSet);\r
883}\r
884\r
885CHAR8 *\r
886EFIAPI\r
887AsciiStrGetNewTokenField (\r
888 IN CHAR8 *String,\r
889 IN CHAR8 *CharSet\r
890 )\r
891{\r
892 return AsciiStrTokenField (String, CharSet);\r
893}\r
894\r
895CHAR8 *\r
896EFIAPI\r
897AsciiStrGetNextTokenField (\r
898 IN CHAR8 *CharSet\r
899 )\r
900{\r
901 return AsciiStrTokenField (NULL, CharSet);\r
902}\r
903\r
904VOID\r
905EFIAPI\r
906PatchForAsciiStrTokenAfter (\r
907 IN CHAR8 *Buffer,\r
908 IN CHAR8 Patch\r
909 )\r
910{\r
911 CHAR8 *Str;\r
912\r
913 if (Buffer == NULL) {\r
914 return ;\r
915 }\r
916\r
917 Str = Buffer;\r
918 while (*Str != 0) {\r
919 Str ++;\r
920 }\r
921 *Str = Patch;\r
922\r
923 while (*(Str ++)) {\r
924 if (*Str == 0) {\r
925 *Str = Patch;\r
926 } else {\r
927 break;\r
928 }\r
929 }\r
930\r
931 return ;\r
932}\r
933\r
934VOID\r
935EFIAPI\r
936PatchForAsciiStrTokenBefore (\r
937 IN CHAR8 *Buffer,\r
938 IN CHAR8 Patch\r
939 )\r
940{\r
941 CHAR8 *Str;\r
942\r
943 if (Buffer == NULL) {\r
944 return ;\r
945 }\r
946\r
947 Str = Buffer;\r
948 while (*(Str --)) {\r
949 if ((*Str == 0) || (*Str == Patch)) {\r
950 *Str = Patch;\r
951 } else {\r
952 break;\r
953 }\r
954 }\r
955\r
956 return ;\r
957}\r