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