1 /*++
2 
3 Copyright (c) 2004 - 2006, Intel Corporation. All rights reserved.<BR>
4 This program and the accompanying materials
5 are licensed and made available under the terms and conditions of the BSD License
6 which accompanies this distribution.  The full text of the license may be found at
7 http://opensource.org/licenses/bsd-license.php
8 
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
11 
12 
13 Module Name:
14 
15   String.c
16 
17 Abstract:
18 
19   Unicode string primatives.
20 
21 --*/
22 
23 #include "BaseLibInternals.h"
24 
25 /**
26   Copies one Null-terminated Unicode string to another Null-terminated Unicode
27   string and returns the new Unicode string.
28 
29   This function copies the contents of the Unicode string Source to the Unicode
30   string Destination, and returns Destination. If Source and Destination
31   overlap, then the results are undefined.
32 
33   If Destination is NULL, then ASSERT().
34   If Destination is not aligned on a 16-bit boundary, then ASSERT().
35   If Source is NULL, then ASSERT().
36   If Source is not aligned on a 16-bit boundary, then ASSERT().
37   If Source and Destination overlap, then ASSERT().
38   If PcdMaximumUnicodeStringLength is not zero, and Source contains more than
39   PcdMaximumUnicodeStringLength Unicode characters not including the
40   Null-terminator, then ASSERT().
41 
42   @param  Destination Pointer to a Null-terminated Unicode string.
43   @param  Source      Pointer to a Null-terminated Unicode string.
44 
45   @return Destiantion
46 
47 **/
48 CHAR16 *
49 EFIAPI
GlueStrCpy(OUT CHAR16 * Destination,IN CONST CHAR16 * Source)50 GlueStrCpy (
51   OUT     CHAR16                    *Destination,
52   IN      CONST CHAR16              *Source
53   )
54 {
55   CHAR16                            *ReturnValue;
56 
57   //
58   // Destination cannot be NULL
59   //
60   ASSERT (Destination != NULL);
61   ASSERT (((UINTN) Destination & 0x01) == 0);
62 
63   //
64   // Destination and source cannot overlap
65   //
66   ASSERT ((UINTN)(Destination - Source) > StrLen (Source));
67   ASSERT ((UINTN)(Source - Destination) > StrLen (Source));
68 
69   ReturnValue = Destination;
70   while (*Source) {
71     *(Destination++) = *(Source++);
72   }
73   *Destination = 0;
74   return ReturnValue;
75 }
76 
77 /**
78   Copies one Null-terminated Unicode string with a maximum length to another
79   Null-terminated Unicode string with a maximum length and returns the new
80   Unicode string.
81 
82   This function copies the contents of the Unicode string Source to the Unicode
83   string Destination, and returns Destination. At most, Length Unicode
84   characters are copied from Source to Destination. If Length is 0, then
85   Destination is returned unmodified. If Length is greater that the number of
86   Unicode characters in Source, then Destination is padded with Null Unicode
87   characters. If Source and Destination overlap, then the results are
88   undefined.
89 
90   If Length > 0 and Destination is NULL, then ASSERT().
91   If Length > 0 and Destination is not aligned on a 16-bit boundary, then ASSERT().
92   If Length > 0 and Source is NULL, then ASSERT().
93   If Length > 0 and Source is not aligned on a 16-bit bounadry, then ASSERT().
94   If Source and Destination overlap, then ASSERT().
95   If PcdMaximumUnicodeStringLength is not zero, and Length is greater than
96   PcdMaximumUnicodeStringLength, then ASSERT().
97   If PcdMaximumUnicodeStringLength is not zero, and Source contains more than
98   PcdMaximumUnicodeStringLength Unicode characters, not including the Null-terminator,
99   then ASSERT().
100 
101   @param  Destination Pointer to a Null-terminated Unicode string.
102   @param  Source      Pointer to a Null-terminated Unicode string.
103   @param  Length      Maximum number of Unicode characters to copy.
104 
105   @return Destination
106 
107 **/
108 CHAR16 *
109 EFIAPI
GlueStrnCpy(OUT CHAR16 * Destination,IN CONST CHAR16 * Source,IN UINTN Length)110 GlueStrnCpy (
111   OUT     CHAR16                    *Destination,
112   IN      CONST CHAR16              *Source,
113   IN      UINTN                     Length
114   )
115 {
116   CHAR16                            *ReturnValue;
117 
118   if (Length == 0) {
119     return Destination;
120   }
121 
122   //
123   // Destination cannot be NULL if Length is not zero
124   //
125   ASSERT (Destination != NULL);
126   ASSERT (((UINTN) Destination & 0x01) == 0);
127 
128   //
129   // Destination and source cannot overlap
130   // Q: Does Source have to be NULL-terminated?
131   //
132   ASSERT ((UINTN)(Destination - Source) > StrLen (Source));
133   ASSERT ((UINTN)(Source - Destination) >= Length);
134 
135   ReturnValue = Destination;
136 
137   while ((*Source != L'\0') && (Length > 0)) {
138     *(Destination++) = *(Source++);
139     Length--;
140   }
141 
142   ZeroMem (Destination, Length * sizeof (*Destination));
143   return ReturnValue;
144 }
145 
146 /**
147   Returns the length of a Null-terminated Unicode string.
148 
149   This function returns the number of Unicode characters in the Null-terminated
150   Unicode string specified by String.
151 
152   If String is NULL, then ASSERT().
153   If String is not aligned on a 16-bit boundary, then ASSERT().
154   If PcdMaximumUnicodeStringLength is not zero, and String contains more than
155   PcdMaximumUnicodeStringLength Unicode characters not including the
156   Null-terminator, then ASSERT().
157 
158   @param  String  Pointer to a Null-terminated Unicode string.
159 
160   @return The length of String.
161 
162 **/
163 UINTN
164 EFIAPI
GlueStrLen(IN CONST CHAR16 * String)165 GlueStrLen (
166   IN      CONST CHAR16              *String
167   )
168 {
169   UINTN                             Length;
170 
171   ASSERT (String != NULL);
172   ASSERT (((UINTN) String & 0x01) == 0);
173 
174   for (Length = 0; *String != L'\0'; String++, Length++) {
175     //
176     // If PcdMaximumUnicodeStringLength is not zero,
177     // length should not more than PcdMaximumUnicodeStringLength
178     //
179     if (PcdGet32 (PcdMaximumUnicodeStringLength) != 0) {
180       ASSERT (Length < PcdGet32 (PcdMaximumUnicodeStringLength));
181     }
182   }
183   return Length;
184 }
185 
186 /**
187   Returns the size of a Null-terminated Unicode string in bytes, including the
188   Null terminator.
189 
190   This function returns the size, in bytes, of the Null-terminated Unicode
191   string specified by String.
192 
193   If String is NULL, then ASSERT().
194   If String is not aligned on a 16-bit boundary, then ASSERT().
195   If PcdMaximumUnicodeStringLength is not zero, and String contains more than
196   PcdMaximumUnicodeStringLength Unicode characters not including the
197   Null-terminator, then ASSERT().
198 
199   @param  String  Pointer to a Null-terminated Unicode string.
200 
201   @return The size of String.
202 
203 **/
204 UINTN
205 EFIAPI
GlueStrSize(IN CONST CHAR16 * String)206 GlueStrSize (
207   IN      CONST CHAR16              *String
208   )
209 {
210   return (StrLen (String) + 1) * sizeof (*String);
211 }
212 
213 /**
214   Compares two Null-terminated Unicode strings, and returns the difference
215   between the first mismatched Unicode characters.
216 
217   This function compares the Null-terminated Unicode string FirstString to the
218   Null-terminated Unicode string SecondString. If FirstString is identical to
219   SecondString, then 0 is returned. Otherwise, the value returned is the first
220   mismatched Unicode character in SecondString subtracted from the first
221   mismatched Unicode character in FirstString.
222 
223   If FirstString is NULL, then ASSERT().
224   If FirstString is not aligned on a 16-bit boundary, then ASSERT().
225   If SecondString is NULL, then ASSERT().
226   If SecondString is not aligned on a 16-bit boundary, then ASSERT().
227   If PcdMaximumUnicodeStringLength is not zero, and FirstString contains more
228   than PcdMaximumUnicodeStringLength Unicode characters not including the
229   Null-terminator, then ASSERT().
230   If PcdMaximumUnicodeStringLength is not zero, and SecondString contains more
231   than PcdMaximumUnicodeStringLength Unicode characters not including the
232   Null-terminator, then ASSERT().
233 
234   @param  FirstString   Pointer to a Null-terminated Unicode string.
235   @param  SecondString  Pointer to a Null-terminated Unicode string.
236 
237   @retval 0   FirstString is identical to SecondString.
238   @retval !=0 FirstString is not identical to SecondString.
239 
240 **/
241 INTN
242 EFIAPI
GlueStrCmp(IN CONST CHAR16 * FirstString,IN CONST CHAR16 * SecondString)243 GlueStrCmp (
244   IN      CONST CHAR16              *FirstString,
245   IN      CONST CHAR16              *SecondString
246   )
247 {
248   //
249   // ASSERT both strings are less long than PcdMaximumUnicodeStringLength
250   //
251   ASSERT (StrSize (FirstString) != 0);
252   ASSERT (StrSize (SecondString) != 0);
253 
254   while ((*FirstString != L'\0') && (*FirstString == *SecondString)) {
255     FirstString++;
256     SecondString++;
257   }
258   return *FirstString - *SecondString;
259 }
260 
261 /**
262   Compares two Null-terminated Unicode strings with maximum lengths, and
263   returns the difference between the first mismatched Unicode characters.
264 
265   This function compares the Null-terminated Unicode string FirstString to the
266   Null-terminated Unicode string SecondString. At most, Length Unicode
267   characters will be compared. If Length is 0, then 0 is returned. If
268   FirstString is identical to SecondString, then 0 is returned. Otherwise, the
269   value returned is the first mismatched Unicode character in SecondString
270   subtracted from the first mismatched Unicode character in FirstString.
271 
272   If Length > 0 and FirstString is NULL, then ASSERT().
273   If Length > 0 and FirstString is not aligned on a 16-bit bounadary, then ASSERT().
274   If Length > 0 and SecondString is NULL, then ASSERT().
275   If Length > 0 and SecondString is not aligned on a 16-bit bounadary, then ASSERT().
276   If PcdMaximumUnicodeStringLength is not zero, and Length is greater than
277   PcdMaximumUnicodeStringLength, then ASSERT().
278   If PcdMaximumUnicodeStringLength is not zero, and FirstString contains more than
279   PcdMaximumUnicodeStringLength Unicode characters, not including the Null-terminator,
280   then ASSERT().
281   If PcdMaximumUnicodeStringLength is not zero, and SecondString contains more than
282   PcdMaximumUnicodeStringLength Unicode characters, not including the Null-terminator,
283   then ASSERT().
284 
285   @param  FirstString   Pointer to a Null-terminated Unicode string.
286   @param  SecondString  Pointer to a Null-terminated Unicode string.
287   @param  Length        Maximum number of Unicode characters to compare.
288 
289   @retval 0   FirstString is identical to SecondString.
290   @retval !=0 FirstString is not identical to SecondString.
291 
292 **/
293 INTN
294 EFIAPI
GlueStrnCmp(IN CONST CHAR16 * FirstString,IN CONST CHAR16 * SecondString,IN UINTN Length)295 GlueStrnCmp (
296   IN      CONST CHAR16              *FirstString,
297   IN      CONST CHAR16              *SecondString,
298   IN      UINTN                     Length
299   )
300 {
301   if (Length == 0) {
302     return 0;
303   }
304 
305   //
306   // ASSERT both strings are less long than PcdMaximumUnicodeStringLength.
307   // Length tests are performed inside StrLen().
308   //
309   ASSERT (StrSize (FirstString) != 0);
310   ASSERT (StrSize (SecondString) != 0);
311 
312   while ((*FirstString != L'\0') &&
313          (*FirstString == *SecondString) &&
314          (Length > 1)) {
315     FirstString++;
316     SecondString++;
317     Length--;
318   }
319 
320   return *FirstString - *SecondString;
321 }
322 
323 /**
324   Concatenates one Null-terminated Unicode string to another Null-terminated
325   Unicode string, and returns the concatenated Unicode string.
326 
327   This function concatenates two Null-terminated Unicode strings. The contents
328   of Null-terminated Unicode string Source are concatenated to the end of
329   Null-terminated Unicode string Destination. The Null-terminated concatenated
330   Unicode String is returned. If Source and Destination overlap, then the
331   results are undefined.
332 
333   If Destination is NULL, then ASSERT().
334   If Source is NULL, then ASSERT().
335   If Source and Destination overlap, then ASSERT().
336   If PcdMaximumUnicodeStringLength is not zero, and Destination contains more
337   than PcdMaximumUnicodeStringLength Unicode characters not including the
338   Null-terminator, then ASSERT().
339   If PcdMaximumUnicodeStringLength is not zero, and Source contains more than
340   PcdMaximumUnicodeStringLength Unicode characters not including the
341   Null-terminator, then ASSERT().
342   If PcdMaximumUnicodeStringLength is not zero, and concatenating Destination
343   and Source results in a Unicode string with more than
344   PcdMaximumUnicodeStringLength Unicode characters not including the
345   Null-terminator, then ASSERT().
346 
347   @param  Destination Pointer to a Null-terminated Unicode string.
348   @param  Source      Pointer to a Null-terminated Unicode string.
349 
350   @return Destination
351 
352 **/
353 CHAR16 *
354 EFIAPI
GlueStrCat(IN OUT CHAR16 * Destination,IN CONST CHAR16 * Source)355 GlueStrCat (
356   IN OUT  CHAR16                    *Destination,
357   IN      CONST CHAR16              *Source
358   )
359 {
360   StrCpy (Destination + StrLen (Destination), Source);
361 
362   //
363   // Size of the resulting string should never be zero.
364   // PcdMaximumUnicodeStringLength is tested inside StrLen().
365   //
366   ASSERT (StrSize (Destination) != 0);
367   return Destination;
368 }
369 
370 /**
371   Concatenates one Null-terminated Unicode string with a maximum length to the
372   end of another Null-terminated Unicode string, and returns the concatenated
373   Unicode string.
374 
375   This function concatenates two Null-terminated Unicode strings. The contents
376   of Null-terminated Unicode string Source are concatenated to the end of
377   Null-terminated Unicode string Destination, and Destination is returned. At
378   most, Length Unicode characters are concatenated from Source to the end of
379   Destination, and Destination is always Null-terminated. If Length is 0, then
380   Destination is returned unmodified. If Source and Destination overlap, then
381   the results are undefined.
382 
383   If Destination is NULL, then ASSERT().
384   If Length > 0 and Destination is not aligned on a 16-bit boundary, then ASSERT().
385   If Length > 0 and Source is NULL, then ASSERT().
386   If Length > 0 and Source is not aligned on a 16-bit boundary, then ASSERT().
387   If Source and Destination overlap, then ASSERT().
388   If PcdMaximumUnicodeStringLength is not zero, and Length is greater than
389   PcdMaximumUnicodeStringLength, then ASSERT().
390   If PcdMaximumUnicodeStringLength is not zero, and Destination contains more
391   than PcdMaximumUnicodeStringLength Unicode characters, not including the
392   Null-terminator, then ASSERT().
393   If PcdMaximumUnicodeStringLength is not zero, and Source contains more than
394   PcdMaximumUnicodeStringLength Unicode characters, not including the
395   Null-terminator, then ASSERT().
396   If PcdMaximumUnicodeStringLength is not zero, and concatenating Destination
397   and Source results in a Unicode string with more than PcdMaximumUnicodeStringLength
398   Unicode characters, not including the Null-terminator, then ASSERT().
399 
400   @param  Destination Pointer to a Null-terminated Unicode string.
401   @param  Source      Pointer to a Null-terminated Unicode string.
402   @param  Length      Maximum number of Unicode characters to concatenate from
403                       Source.
404 
405   @return Destination
406 
407 **/
408 CHAR16 *
409 EFIAPI
GlueStrnCat(IN OUT CHAR16 * Destination,IN CONST CHAR16 * Source,IN UINTN Length)410 GlueStrnCat (
411   IN OUT  CHAR16                    *Destination,
412   IN      CONST CHAR16              *Source,
413   IN      UINTN                     Length
414   )
415 {
416   StrnCpy (Destination + StrLen (Destination), Source, Length);
417 
418   //
419   // Size of the resulting string should never be zero.
420   // PcdMaximumUnicodeStringLength is tested inside StrLen().
421   //
422   ASSERT (StrSize (Destination) != 0);
423   return Destination;
424 }
425 
426 /**
427   Returns the first occurance of a Null-terminated Unicode sub-string
428   in a Null-terminated Unicode string.
429 
430   This function scans the contents of the Null-terminated Unicode string
431   specified by String and returns the first occurrence of SearchString.
432   If SearchString is not found in String, then NULL is returned.  If
433   the length of SearchString is zero, then String is
434   returned.
435 
436   If String is NULL, then ASSERT().
437   If String is not aligned on a 16-bit boundary, then ASSERT().
438   If SearchString is NULL, then ASSERT().
439   If SearchString is not aligned on a 16-bit boundary, then ASSERT().
440 
441   If PcdMaximumUnicodeStringLength is not zero, and SearchString
442   or String contains more than PcdMaximumUnicodeStringLength Unicode
443   characters not including the Null-terminator, then ASSERT().
444 
445   @param  String				  Pointer to a Null-terminated Unicode string.
446   @param  SearchString	Pointer to a Null-terminated Unicode string to search for.
447 
448   @retval NULL            If the SearchString does not appear in String.
449   @retval !NULL           If there is a match.
450 
451 **/
452 CHAR16 *
453 EFIAPI
StrStr(IN CONST CHAR16 * String,IN CONST CHAR16 * SearchString)454 StrStr (
455   IN      CONST CHAR16      	      *String,
456   IN      CONST CHAR16      	      *SearchString
457   )
458 {
459   CONST CHAR16 *FirstMatch;
460   CONST CHAR16 *SearchStringTmp;
461 
462   ASSERT (String != NULL);
463   ASSERT (((UINTN) String & 0x01) == 0);
464   ASSERT (SearchString != NULL);
465   ASSERT (((UINTN) SearchString & 0x01) == 0);
466 
467   //
468   // If PcdMaximumUnicodeStringLength is not zero,
469   // length of String should not more than PcdMaximumUnicodeStringLength
470   //
471   if (PcdGet32 (PcdMaximumUnicodeStringLength) != 0) {
472     ASSERT (StrLen (String) < PcdGet32 (PcdMaximumUnicodeStringLength));
473   }
474 
475   //
476   // If PcdMaximumUnicodeStringLength is not zero,
477   // length of SearchString should not more than PcdMaximumUnicodeStringLength
478   //
479   if (PcdGet32 (PcdMaximumUnicodeStringLength) != 0) {
480     ASSERT (StrLen (SearchString) < PcdGet32 (PcdMaximumAsciiStringLength));
481   }
482 
483   while (*String != '\0') {
484     SearchStringTmp = SearchString;
485     FirstMatch = String;
486 
487     while ((*String == *SearchStringTmp)
488             && (*SearchStringTmp != '\0')
489             && (*String != '\0')) {
490       String++;
491       SearchStringTmp++;
492     }
493 
494     if (*SearchStringTmp == '\0') {
495       return (CHAR16 *) FirstMatch;
496     }
497 
498     if (SearchStringTmp == SearchString) {
499       //
500       // If no character from SearchString match,
501       // move the pointer to the String under search
502       // by one character.
503       //
504       String++;
505     }
506   }
507 
508   return NULL;
509 }
510 
511 /**
512   Check if a Unicode character is a decimal character.
513 
514   This internal function checks if a Unicode character is a
515   decimal character. The valid decimal character is from
516   L'0' to L'9'.
517 
518 
519   @param  Char  The character to check against.
520 
521   @retval TRUE  If the Char is a decmial character.
522   @retval FALSE Otherwise.
523 
524 **/
525 STATIC
526 BOOLEAN
InternalIsDecimalDigitCharacter(IN CHAR16 Char)527 InternalIsDecimalDigitCharacter (
528   IN      CHAR16                    Char
529   )
530 {
531   return (BOOLEAN) (Char >= L'0' && Char <= L'9');
532 }
533 
534 /**
535   Convert a Unicode character to upper case only if
536   it maps to a valid small-case ASCII character.
537 
538   This internal function only deal with Unicode character
539   which maps to a valid small-case ASII character, i.e.
540   L'a' to L'z'. For other Unicode character, the input character
541   is returned directly.
542 
543 
544   @param  Char  The character to convert.
545 
546   @retval LowerCharacter   If the Char is with range L'a' to L'z'.
547   @retval Unchanged        Otherwise.
548 
549 **/
550 STATIC
551 CHAR16
InternalCharToUpper(IN CHAR16 Char)552 InternalCharToUpper (
553   IN      CHAR16                    Char
554   )
555 {
556   if (Char >= L'a' && Char <= L'z') {
557     return (CHAR16) (Char - (L'a' - L'A'));
558   }
559 
560   return Char;
561 }
562 
563 /**
564   Convert a Unicode character to numerical value.
565 
566   This internal function only deal with Unicode character
567   which maps to a valid hexadecimal ASII character, i.e.
568   L'0' to L'9', L'a' to L'f' or L'A' to L'F'. For other
569   Unicode character, the value returned does not make sense.
570 
571   @param  Char  The character to convert.
572 
573   @retval UINTN   The numerical value converted.
574 
575 **/
576 STATIC
577 UINTN
InternalHexCharToUintn(IN CHAR16 Char)578 InternalHexCharToUintn (
579   IN      CHAR16                    Char
580   )
581 {
582   if (InternalIsDecimalDigitCharacter (Char)) {
583     return Char - L'0';
584   }
585 
586   return (UINTN) (10 + InternalCharToUpper (Char) - L'A');
587 }
588 
589 /**
590   Check if a Unicode character is a hexadecimal character.
591 
592   This internal function checks if a Unicode character is a
593   decimal character.  The valid hexadecimal character is
594   L'0' to L'9', L'a' to L'f', or L'A' to L'F'.
595 
596 
597   @param  Char  The character to check against.
598 
599   @retval TRUE  If the Char is a hexadecmial character.
600   @retval FALSE Otherwise.
601 
602 **/
603 STATIC
604 BOOLEAN
InternalIsHexaDecimalDigitCharacter(IN CHAR16 Char)605 InternalIsHexaDecimalDigitCharacter (
606   IN      CHAR16                    Char
607   )
608 {
609 
610   return (BOOLEAN) (InternalIsDecimalDigitCharacter (Char) ||
611     (Char >= L'A' && Char <= L'F') ||
612     (Char >= L'a' && Char <= L'f'));
613 }
614 
615 /**
616   Convert a Null-terminated Unicode decimal string to a value of
617   type UINTN.
618 
619   This function returns a value of type UINTN by interpreting the contents
620   of the Unicode string specified by String as a decimal number. The format
621   of the input Unicode string String is:
622 
623                   [spaces] [decimal digits].
624 
625   The valid decimal digit character is in the range [0-9]. The
626   function will ignore the pad space, which includes spaces or
627   tab characters, before [decimal digits]. The running zero in the
628   beginning of [decimal digits] will be ignored. Then, the function
629   stops at the first character that is a not a valid decimal character
630   or a Null-terminator, whichever one comes first.
631 
632   If String is NULL, then ASSERT().
633   If String is not aligned in a 16-bit boundary, then ASSERT().
634   If String has only pad spaces, then 0 is returned.
635   If String has no pad spaces or valid decimal digits,
636   then 0 is returned.
637   If the number represented by String overflows according
638   to the range defined by UINTN, then ASSERT().
639 
640   If PcdMaximumUnicodeStringLength is not zero, and String contains
641   more than PcdMaximumUnicodeStringLength Unicode characters not including
642   the Null-terminator, then ASSERT().
643 
644   @param  String			    Pointer to a Null-terminated Unicode string.
645 
646   @retval UINTN
647 
648 **/
649 UINTN
650 EFIAPI
StrDecimalToUintn(IN CONST CHAR16 * String)651 StrDecimalToUintn (
652   IN      CONST CHAR16      	      *String
653   )
654 {
655   UINTN     Result;
656 
657   ASSERT (String != NULL);
658   ASSERT (((UINTN) String & 0x01) == 0);
659   ASSERT (StrLen (String) < PcdGet32 (PcdMaximumUnicodeStringLength));
660 
661   //
662   // Ignore the pad spaces (space or tab)
663   //
664   while ((*String == L' ') || (*String == L'\t')) {
665     String++;
666   }
667 
668   //
669   // Ignore leading Zeros after the spaces
670   //
671   while (*String == L'0') {
672     String++;
673   }
674 
675   Result = 0;
676 
677   while (InternalIsDecimalDigitCharacter (*String)) {
678     //
679     // If the number represented by String overflows according
680     // to the range defined by UINTN, then ASSERT().
681     //
682     ASSERT ((Result < QUIENT_MAX_UINTN_DIVIDED_BY_10) ||
683       ((Result == QUIENT_MAX_UINTN_DIVIDED_BY_10) &&
684       (*String - L'0') <= REMINDER_MAX_UINTN_DIVIDED_BY_10)
685       );
686 
687     Result = Result * 10 + (*String - L'0');
688     String++;
689   }
690 
691   return Result;
692 }
693 
694 
695 /**
696   Convert a Null-terminated Unicode decimal string to a value of
697   type UINT64.
698 
699   This function returns a value of type UINT64 by interpreting the contents
700   of the Unicode string specified by String as a decimal number. The format
701   of the input Unicode string String is:
702 
703                   [spaces] [decimal digits].
704 
705   The valid decimal digit character is in the range [0-9]. The
706   function will ignore the pad space, which includes spaces or
707   tab characters, before [decimal digits]. The running zero in the
708   beginning of [decimal digits] will be ignored. Then, the function
709   stops at the first character that is a not a valid decimal character
710   or a Null-terminator, whichever one comes first.
711 
712   If String is NULL, then ASSERT().
713   If String is not aligned in a 16-bit boundary, then ASSERT().
714   If String has only pad spaces, then 0 is returned.
715   If String has no pad spaces or valid decimal digits,
716   then 0 is returned.
717   If the number represented by String overflows according
718   to the range defined by UINT64, then ASSERT().
719 
720   If PcdMaximumUnicodeStringLength is not zero, and String contains
721   more than PcdMaximumUnicodeStringLength Unicode characters not including
722   the Null-terminator, then ASSERT().
723 
724   @param  String			    Pointer to a Null-terminated Unicode string.
725 
726   @retval UINT64
727 
728 **/
729 UINT64
730 EFIAPI
StrDecimalToUint64(IN CONST CHAR16 * String)731 StrDecimalToUint64 (
732   IN      CONST CHAR16      	      *String
733   )
734 {
735   UINT64     Result;
736 
737   ASSERT (String != NULL);
738   ASSERT (((UINTN) String & 0x01) == 0);
739   ASSERT (StrLen (String) < PcdGet32 (PcdMaximumUnicodeStringLength));
740 
741   //
742   // Ignore the pad spaces (space or tab)
743   //
744   while ((*String == L' ') || (*String == L'\t')) {
745     String++;
746   }
747 
748   //
749   // Ignore leading Zeros after the spaces
750   //
751   while (*String == L'0') {
752     String++;
753   }
754 
755   Result = 0;
756 
757   while (InternalIsDecimalDigitCharacter (*String)) {
758     //
759     // If the number represented by String overflows according
760     // to the range defined by UINTN, then ASSERT().
761     //
762     ASSERT ((Result < QUIENT_MAX_UINT64_DIVIDED_BY_10) ||
763       ((Result == QUIENT_MAX_UINT64_DIVIDED_BY_10) &&
764       (*String - L'0') <= REMINDER_MAX_UINT64_DIVIDED_BY_10)
765       );
766 
767     Result = MultU64x32 (Result, 10) + (*String - L'0');
768     String++;
769   }
770 
771   return Result;
772 }
773 
774 /**
775   Convert a Null-terminated Unicode hexadecimal string to a value of type UINTN.
776 
777   This function returns a value of type UINTN by interpreting the contents
778   of the Unicode string specified by String as a hexadecimal number.
779   The format of the input Unicode string String is:
780 
781                   [spaces][zeros][x][hexadecimal digits].
782 
783   The valid hexadecimal digit character is in the range [0-9], [a-f] and [A-F].
784   The prefix "0x" is optional. Both "x" and "X" is allowed in "0x" prefix.
785   If "x" appears in the input string, it must be prefixed with at least one 0.
786   The function will ignore the pad space, which includes spaces or tab characters,
787   before [zeros], [x] or [hexadecimal digit]. The running zero before [x] or
788   [hexadecimal digit] will be ignored. Then, the decoding starts after [x] or the
789   first valid hexadecimal digit. Then, the function stops at the first character that is
790   a not a valid hexadecimal character or NULL, whichever one comes first.
791 
792   If String is NULL, then ASSERT().
793   If String is not aligned in a 16-bit boundary, then ASSERT().
794   If String has only pad spaces, then zero is returned.
795   If String has no leading pad spaces, leading zeros or valid hexadecimal digits,
796   then zero is returned.
797   If the number represented by String overflows according to the range defined by
798   UINTN, then ASSERT().
799 
800   If PcdMaximumUnicodeStringLength is not zero, and String contains more than
801   PcdMaximumUnicodeStringLength Unicode characters not including the Null-terminator,
802   then ASSERT().
803 
804   @param  String			    Pointer to a Null-terminated Unicode string.
805 
806   @retval UINTN
807 
808 **/
809 UINTN
810 EFIAPI
StrHexToUintn(IN CONST CHAR16 * String)811 StrHexToUintn (
812   IN      CONST CHAR16      	      *String
813   )
814 {
815   UINTN     Result;
816 
817   ASSERT (String != NULL);
818   ASSERT (((UINTN) String & 0x01) == 0);
819   ASSERT (StrLen (String) < PcdGet32 (PcdMaximumUnicodeStringLength));
820 
821   //
822   // Ignore the pad spaces (space or tab)
823   //
824   while ((*String == L' ') || (*String == L'\t')) {
825     String++;
826   }
827 
828   //
829   // Ignore leading Zeros after the spaces
830   //
831   while (*String == L'0') {
832     String++;
833   }
834 
835   if (InternalCharToUpper (*String) == L'X') {
836     ASSERT (*(String - 1)  == L'0');
837     if (*(String - 1)  != L'0') {
838       return 0;
839     }
840     //
841     // Skip the 'X'
842     //
843     String++;
844   }
845 
846   Result = 0;
847 
848   while (InternalIsHexaDecimalDigitCharacter (*String)) {
849     //
850     // If the Hex Number represented by String overflows according
851     // to the range defined by UINTN, then ASSERT().
852     //
853     ASSERT ((Result < QUIENT_MAX_UINTN_DIVIDED_BY_16) ||
854       ((Result == QUIENT_MAX_UINTN_DIVIDED_BY_16) &&
855       (InternalHexCharToUintn (*String) <= REMINDER_MAX_UINTN_DIVIDED_BY_16))
856       );
857 
858     Result = (Result << 4) + InternalHexCharToUintn (*String);
859     String++;
860   }
861 
862   return Result;
863 }
864 
865 
866 /**
867   Convert a Null-terminated Unicode hexadecimal string to a value of type UINT64.
868 
869   This function returns a value of type UINT64 by interpreting the contents
870   of the Unicode string specified by String as a hexadecimal number.
871   The format of the input Unicode string String is
872 
873                   [spaces][zeros][x][hexadecimal digits].
874 
875   The valid hexadecimal digit character is in the range [0-9], [a-f] and [A-F].
876   The prefix "0x" is optional. Both "x" and "X" is allowed in "0x" prefix.
877   If "x" appears in the input string, it must be prefixed with at least one 0.
878   The function will ignore the pad space, which includes spaces or tab characters,
879   before [zeros], [x] or [hexadecimal digit]. The running zero before [x] or
880   [hexadecimal digit] will be ignored. Then, the decoding starts after [x] or the
881   first valid hexadecimal digit. Then, the function stops at the first character that is
882   a not a valid hexadecimal character or NULL, whichever one comes first.
883 
884   If String is NULL, then ASSERT().
885   If String is not aligned in a 16-bit boundary, then ASSERT().
886   If String has only pad spaces, then zero is returned.
887   If String has no leading pad spaces, leading zeros or valid hexadecimal digits,
888   then zero is returned.
889   If the number represented by String overflows according to the range defined by
890   UINT64, then ASSERT().
891 
892   If PcdMaximumUnicodeStringLength is not zero, and String contains more than
893   PcdMaximumUnicodeStringLength Unicode characters not including the Null-terminator,
894   then ASSERT().
895 
896   @param  String			    Pointer to a Null-terminated Unicode string.
897 
898   @retval UINT64
899 
900 **/
901 UINT64
902 EFIAPI
StrHexToUint64(IN CONST CHAR16 * String)903 StrHexToUint64 (
904   IN      CONST CHAR16      	      *String
905   )
906 {
907   UINT64    Result;
908 
909   ASSERT (String != NULL);
910   ASSERT (((UINTN) String & 0x01) == 0);
911   ASSERT (StrLen (String) < PcdGet32 (PcdMaximumUnicodeStringLength));
912 
913   //
914   // Ignore the pad spaces (space or tab)
915   //
916   while ((*String == L' ') || (*String == L'\t')) {
917     String++;
918   }
919 
920   //
921   // Ignore leading Zeros after the spaces
922   //
923   while (*String == L'0') {
924     String++;
925   }
926 
927   if (InternalCharToUpper (*String) == L'X') {
928     ASSERT (*(String - 1)  == L'0');
929     if (*(String - 1)  != L'0') {
930       return 0;
931     }
932     //
933     // Skip the 'X'
934     //
935     String++;
936   }
937 
938   Result = 0;
939 
940   while (InternalIsHexaDecimalDigitCharacter (*String)) {
941     //
942     // If the Hex Number represented by String overflows according
943     // to the range defined by UINTN, then ASSERT().
944     //
945     ASSERT ((Result < QUIENT_MAX_UINT64_DIVIDED_BY_16)||
946       ((Result == QUIENT_MAX_UINT64_DIVIDED_BY_16) &&
947       (InternalHexCharToUintn (*String) <= REMINDER_MAX_UINT64_DIVIDED_BY_16))
948       );
949 
950     Result = LShiftU64 (Result, 4);
951     Result = Result + InternalHexCharToUintn (*String);
952     String++;
953   }
954 
955   return Result;
956 }
957 
958 /**
959   Check if a ASCII character is a decimal character.
960 
961   This internal function checks if a Unicode character is a
962   decimal character. The valid decimal character is from
963   '0' to '9'.
964 
965   @param  Char  The character to check against.
966 
967   @retval TRUE  If the Char is a decmial character.
968   @retval FALSE Otherwise.
969 
970 **/
971 STATIC
972 BOOLEAN
InternalAsciiIsDecimalDigitCharacter(IN CHAR8 Char)973 InternalAsciiIsDecimalDigitCharacter (
974   IN      CHAR8                     Char
975   )
976 {
977   return (BOOLEAN) (Char >= '0' && Char <= '9');
978 }
979 
980 /**
981   Check if a ASCII character is a hexadecimal character.
982 
983   This internal function checks if a ASCII character is a
984   decimal character.  The valid hexadecimal character is
985   L'0' to L'9', L'a' to L'f', or L'A' to L'F'.
986 
987 
988   @param  Char  The character to check against.
989 
990   @retval TRUE  If the Char is a hexadecmial character.
991   @retval FALSE Otherwise.
992 
993 **/
994 STATIC
995 BOOLEAN
InternalAsciiIsHexaDecimalDigitCharacter(IN CHAR8 Char)996 InternalAsciiIsHexaDecimalDigitCharacter (
997   IN      CHAR8                    Char
998   )
999 {
1000 
1001   return (BOOLEAN) (InternalAsciiIsDecimalDigitCharacter (Char) ||
1002     (Char >= 'A' && Char <= 'F') ||
1003     (Char >= 'a' && Char <= 'f'));
1004 }
1005 
1006 /**
1007   Convert a Null-terminated Unicode string to a Null-terminated
1008   ASCII string and returns the ASCII string.
1009 
1010   This function converts the content of the Unicode string Source
1011   to the ASCII string Destination by copying the lower 8 bits of
1012   each Unicode character. It returns Destination. The function terminates
1013   the ASCII string Destination  by appending a Null-terminator character
1014   at the end. The caller is responsible to make sure Destination points
1015   to a buffer with size equal or greater than (StrLen (Source) + 1) in bytes.
1016 
1017   If Destination is NULL, then ASSERT().
1018   If Source is NULL, then ASSERT().
1019   If Source is not aligned on a 16-bit boundary, then ASSERT().
1020   If Source and Destination overlap, then ASSERT().
1021 
1022   If any Unicode characters in Source contain non-zero value in
1023   the upper 8 bits, then ASSERT().
1024 
1025   If PcdMaximumUnicodeStringLength is not zero, and Source contains
1026   more than PcdMaximumUnicodeStringLength Unicode characters not including
1027   the Null-terminator, then ASSERT().
1028 
1029   If PcdMaximumAsciiStringLength is not zero, and Source contains more
1030   than PcdMaximumAsciiStringLength Unicode characters not including the
1031   Null-terminator, then ASSERT().
1032 
1033   @param  Source        Pointer to a Null-terminated Unicode string.
1034   @param  Destination   Pointer to a Null-terminated ASCII string.
1035 
1036   @reture Destination
1037 
1038 **/
1039 CHAR8 *
1040 EFIAPI
UnicodeStrToAsciiStr(IN CONST CHAR16 * Source,OUT CHAR8 * Destination)1041 UnicodeStrToAsciiStr (
1042   IN      CONST CHAR16      	      *Source,
1043   OUT 	  CHAR8  	                  *Destination
1044   )
1045 {
1046   ASSERT (Destination != NULL);
1047   ASSERT (Source != NULL);
1048   ASSERT (((UINTN) Source & 0x01) == 0);
1049 
1050   //
1051   // Source and Destination should not overlap
1052   //
1053   ASSERT ((UINTN) ((CHAR16 *) Destination -  Source) > StrLen (Source));
1054   ASSERT ((UINTN) ((CHAR8 *) Source - Destination) > StrLen (Source));
1055 
1056   //
1057   // If PcdMaximumUnicodeStringLength is not zero,
1058   // length of Source should not more than PcdMaximumUnicodeStringLength
1059   //
1060   if (PcdGet32 (PcdMaximumUnicodeStringLength) != 0) {
1061     ASSERT (StrLen (Source) < PcdGet32 (PcdMaximumUnicodeStringLength));
1062   }
1063 
1064   while (*Source != '\0') {
1065     //
1066     // If any Unicode characters in Source contain
1067     // non-zero value in the upper 8 bits, then ASSERT().
1068     //
1069     ASSERT (*Source < 0x100);
1070     *(Destination++) = (CHAR8) *(Source++);
1071   }
1072 
1073   *Destination = '\0';
1074 
1075   return Destination;
1076 }
1077 
1078 
1079 /**
1080   Copies one Null-terminated ASCII string to another Null-terminated ASCII
1081   string and returns the new ASCII string.
1082 
1083   This function copies the contents of the ASCII string Source to the ASCII
1084   string Destination, and returns Destination. If Source and Destination
1085   overlap, then the results are undefined.
1086 
1087   If Destination is NULL, then ASSERT().
1088   If Source is NULL, then ASSERT().
1089   If Source and Destination overlap, then ASSERT().
1090   If PcdMaximumAsciiStringLength is not zero and Source contains more than
1091   PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,
1092   then ASSERT().
1093 
1094   @param  Destination Pointer to a Null-terminated ASCII string.
1095   @param  Source      Pointer to a Null-terminated ASCII string.
1096 
1097   @return Destination
1098 
1099 **/
1100 CHAR8 *
1101 EFIAPI
AsciiStrCpy(OUT CHAR8 * Destination,IN CONST CHAR8 * Source)1102 AsciiStrCpy (
1103   OUT     CHAR8                     *Destination,
1104   IN      CONST CHAR8               *Source
1105   )
1106 {
1107   CHAR8                             *ReturnValue;
1108 
1109   //
1110   // Destination cannot be NULL
1111   //
1112   ASSERT (Destination != NULL);
1113 
1114   //
1115   // Destination and source cannot overlap
1116   //
1117   ASSERT ((UINTN)(Destination - Source) > AsciiStrLen (Source));
1118   ASSERT ((UINTN)(Source - Destination) > AsciiStrLen (Source));
1119 
1120   ReturnValue = Destination;
1121   while (*Source) {
1122     *(Destination++) = *(Source++);
1123   }
1124   *Destination = 0;
1125   return ReturnValue;
1126 }
1127 
1128 /**
1129   Copies one Null-terminated ASCII string with a maximum length to another
1130   Null-terminated ASCII string with a maximum length and returns the new ASCII
1131   string.
1132 
1133   This function copies the contents of the ASCII string Source to the ASCII
1134   string Destination, and returns Destination. At most, Length ASCII characters
1135   are copied from Source to Destination. If Length is 0, then Destination is
1136   returned unmodified. If Length is greater that the number of ASCII characters
1137   in Source, then Destination is padded with Null ASCII characters. If Source
1138   and Destination overlap, then the results are undefined.
1139 
1140   If Destination is NULL, then ASSERT().
1141   If Source is NULL, then ASSERT().
1142   If Source and Destination overlap, then ASSERT().
1143   If PcdMaximumAsciiStringLength is not zero, and Length is greater than
1144   PcdMaximumAsciiStringLength, then ASSERT().
1145   If PcdMaximumAsciiStringLength is not zero, and Source contains more than
1146   PcdMaximumAsciiStringLength ASCII characters, not including the Null-terminator,
1147   then ASSERT().
1148 
1149   @param  Destination Pointer to a Null-terminated ASCII string.
1150   @param  Source      Pointer to a Null-terminated ASCII string.
1151   @param  Length      Maximum number of ASCII characters to copy.
1152 
1153   @return Destination
1154 
1155 **/
1156 CHAR8 *
1157 EFIAPI
AsciiStrnCpy(OUT CHAR8 * Destination,IN CONST CHAR8 * Source,IN UINTN Length)1158 AsciiStrnCpy (
1159   OUT     CHAR8                     *Destination,
1160   IN      CONST CHAR8               *Source,
1161   IN      UINTN                     Length
1162   )
1163 {
1164   CHAR8                             *ReturnValue;
1165 
1166   if (Length == 0) {
1167     return Destination;
1168   }
1169 
1170   //
1171   // Destination cannot be NULL
1172   //
1173   ASSERT (Destination != NULL);
1174 
1175   //
1176   // Destination and source cannot overlap
1177   //
1178   ASSERT ((UINTN)(Destination - Source) > AsciiStrLen (Source));
1179   ASSERT ((UINTN)(Source - Destination) >= Length);
1180 
1181   ReturnValue = Destination;
1182 
1183   while (*Source && Length > 0) {
1184     *(Destination++) = *(Source++);
1185     Length--;
1186   }
1187 
1188   ZeroMem (Destination, Length * sizeof (*Destination));
1189   return ReturnValue;
1190 }
1191 
1192 /**
1193   Returns the length of a Null-terminated ASCII string.
1194 
1195   This function returns the number of ASCII characters in the Null-terminated
1196   ASCII string specified by String.
1197 
1198   If String is NULL, then ASSERT().
1199   If PcdMaximumAsciiStringLength is not zero and String contains more than
1200   PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,
1201   then ASSERT().
1202 
1203   @param  String  Pointer to a Null-terminated ASCII string.
1204 
1205   @return The length of String.
1206 
1207 **/
1208 UINTN
1209 EFIAPI
AsciiStrLen(IN CONST CHAR8 * String)1210 AsciiStrLen (
1211   IN      CONST CHAR8               *String
1212   )
1213 {
1214   UINTN                             Length;
1215 
1216   ASSERT (String != NULL);
1217 
1218   for (Length = 0; *String != '\0'; String++, Length++) {
1219     //
1220     // If PcdMaximumUnicodeStringLength is not zero,
1221     // length should not more than PcdMaximumUnicodeStringLength
1222     //
1223     if (PcdGet32 (PcdMaximumAsciiStringLength) != 0) {
1224       ASSERT (Length < PcdGet32 (PcdMaximumAsciiStringLength));
1225     }
1226   }
1227   return Length;
1228 }
1229 
1230 /**
1231   Returns the size of a Null-terminated ASCII string in bytes, including the
1232   Null terminator.
1233 
1234   This function returns the size, in bytes, of the Null-terminated ASCII string
1235   specified by String.
1236 
1237   If String is NULL, then ASSERT().
1238   If PcdMaximumAsciiStringLength is not zero and String contains more than
1239   PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,
1240   then ASSERT().
1241 
1242   @param  String  Pointer to a Null-terminated ASCII string.
1243 
1244   @return The size of String.
1245 
1246 **/
1247 UINTN
1248 EFIAPI
AsciiStrSize(IN CONST CHAR8 * String)1249 AsciiStrSize (
1250   IN      CONST CHAR8               *String
1251   )
1252 {
1253   return (AsciiStrLen (String) + 1) * sizeof (*String);
1254 }
1255 
1256 /**
1257   Compares two Null-terminated ASCII strings, and returns the difference
1258   between the first mismatched ASCII characters.
1259 
1260   This function compares the Null-terminated ASCII string FirstString to the
1261   Null-terminated ASCII string SecondString. If FirstString is identical to
1262   SecondString, then 0 is returned. Otherwise, the value returned is the first
1263   mismatched ASCII character in SecondString subtracted from the first
1264   mismatched ASCII character in FirstString.
1265 
1266   If FirstString is NULL, then ASSERT().
1267   If SecondString is NULL, then ASSERT().
1268   If PcdMaximumAsciiStringLength is not zero and FirstString contains more than
1269   PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,
1270   then ASSERT().
1271   If PcdMaximumAsciiStringLength is not zero and SecondString contains more
1272   than PcdMaximumAsciiStringLength ASCII characters not including the
1273   Null-terminator, then ASSERT().
1274 
1275   @param  FirstString   Pointer to a Null-terminated ASCII string.
1276   @param  SecondString  Pointer to a Null-terminated ASCII string.
1277 
1278   @retval 0   FirstString is identical to SecondString.
1279   @retval !=0 FirstString is not identical to SecondString.
1280 
1281 **/
1282 INTN
1283 EFIAPI
AsciiStrCmp(IN CONST CHAR8 * FirstString,IN CONST CHAR8 * SecondString)1284 AsciiStrCmp (
1285   IN      CONST CHAR8               *FirstString,
1286   IN      CONST CHAR8               *SecondString
1287   )
1288 {
1289   //
1290   // ASSERT both strings are less long than PcdMaximumAsciiStringLength
1291   //
1292   ASSERT (AsciiStrSize (FirstString));
1293   ASSERT (AsciiStrSize (SecondString));
1294 
1295   while ((*FirstString != '\0') && (*FirstString == *SecondString)) {
1296     FirstString++;
1297     SecondString++;
1298   }
1299 
1300   return *FirstString - *SecondString;
1301 }
1302 
1303 /**
1304   Converts a lowercase Ascii character to upper one
1305 
1306   If Chr is lowercase Ascii character, then converts it to upper one.
1307 
1308   If Value >= 0xA0, then ASSERT().
1309   If (Value & 0x0F) >= 0x0A, then ASSERT().
1310 
1311   @param  chr   one Ascii character
1312 
1313   @return The uppercase value of Ascii character
1314 
1315 **/
1316 STATIC
1317 CHAR8
AsciiToUpper(IN CHAR8 Chr)1318 AsciiToUpper (
1319   IN      CHAR8                     Chr
1320   )
1321 {
1322   return (UINT8) ((Chr >= 'a' && Chr <= 'z') ? Chr - ('a' - 'A') : Chr);
1323 }
1324 
1325 /**
1326   Convert a ASCII character to numerical value.
1327 
1328   This internal function only deal with Unicode character
1329   which maps to a valid hexadecimal ASII character, i.e.
1330   '0' to '9', 'a' to 'f' or 'A' to 'F'. For other
1331   ASCII character, the value returned does not make sense.
1332 
1333   @param  Char  The character to convert.
1334 
1335   @retval UINTN   The numerical value converted.
1336 
1337 **/
1338 STATIC
1339 UINTN
InternalAsciiHexCharToUintn(IN CHAR8 Char)1340 InternalAsciiHexCharToUintn (
1341   IN      CHAR8                    Char
1342   )
1343 {
1344   if (InternalIsDecimalDigitCharacter (Char)) {
1345     return Char - '0';
1346   }
1347 
1348   return (UINTN) (10 + AsciiToUpper (Char) - 'A');
1349 }
1350 
1351 
1352 /**
1353   Performs a case insensitive comparison of two Null-terminated ASCII strings,
1354   and returns the difference between the first mismatched ASCII characters.
1355 
1356   This function performs a case insensitive comparison of the Null-terminated
1357   ASCII string FirstString to the Null-terminated ASCII string SecondString. If
1358   FirstString is identical to SecondString, then 0 is returned. Otherwise, the
1359   value returned is the first mismatched lower case ASCII character in
1360   SecondString subtracted from the first mismatched lower case ASCII character
1361   in FirstString.
1362 
1363   If FirstString is NULL, then ASSERT().
1364   If SecondString is NULL, then ASSERT().
1365   If PcdMaximumAsciiStringLength is not zero and FirstString contains more than
1366   PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,
1367   then ASSERT().
1368   If PcdMaximumAsciiStringLength is not zero and SecondString contains more
1369   than PcdMaximumAsciiStringLength ASCII characters not including the
1370   Null-terminator, then ASSERT().
1371 
1372   @param  FirstString   Pointer to a Null-terminated ASCII string.
1373   @param  SecondString  Pointer to a Null-terminated ASCII string.
1374 
1375   @retval 0   FirstString is identical to SecondString using case insensitive
1376               comparisons.
1377   @retval !=0 FirstString is not identical to SecondString using case
1378               insensitive comparisons.
1379 
1380 **/
1381 INTN
1382 EFIAPI
AsciiStriCmp(IN CONST CHAR8 * FirstString,IN CONST CHAR8 * SecondString)1383 AsciiStriCmp (
1384   IN      CONST CHAR8               *FirstString,
1385   IN      CONST CHAR8               *SecondString
1386   )
1387 {
1388   CHAR8  UpperFirstString;
1389   CHAR8  UpperSecondString;
1390 
1391   //
1392   // ASSERT both strings are less long than PcdMaximumAsciiStringLength
1393   //
1394   ASSERT (AsciiStrSize (FirstString));
1395   ASSERT (AsciiStrSize (SecondString));
1396 
1397   UpperFirstString  = AsciiToUpper (*FirstString);
1398   UpperSecondString = AsciiToUpper (*SecondString);
1399   while ((*FirstString != '\0') && (UpperFirstString == UpperSecondString)) {
1400     FirstString++;
1401     SecondString++;
1402     UpperFirstString  = AsciiToUpper (*FirstString);
1403     UpperSecondString = AsciiToUpper (*SecondString);
1404   }
1405 
1406   return UpperFirstString - UpperSecondString;
1407 }
1408 
1409 /**
1410   Compares two Null-terminated ASCII strings with maximum lengths, and returns
1411   the difference between the first mismatched ASCII characters.
1412 
1413   This function compares the Null-terminated ASCII string FirstString to the
1414   Null-terminated ASCII  string SecondString. At most, Length ASCII characters
1415   will be compared. If Length is 0, then 0 is returned. If FirstString is
1416   identical to SecondString, then 0 is returned. Otherwise, the value returned
1417   is the first mismatched ASCII character in SecondString subtracted from the
1418   first mismatched ASCII character in FirstString.
1419 
1420   If FirstString is NULL, then ASSERT().
1421   If SecondString is NULL, then ASSERT().
1422   If PcdMaximumAsciiStringLength is not zero, and Length is greater than
1423   PcdMaximumAsciiStringLength, then ASSERT().
1424   If PcdMaximumAsciiStringLength is not zero, and FirstString contains more than
1425   PcdMaximumAsciiStringLength ASCII characters, not including the Null-terminator,
1426   then ASSERT().
1427   If PcdMaximumAsciiStringLength is not zero, and SecondString contains more than
1428   PcdMaximumAsciiStringLength ASCII characters, not including the Null-terminator,
1429   then ASSERT().
1430 
1431   @param  FirstString   Pointer to a Null-terminated ASCII string.
1432   @param  SecondString  Pointer to a Null-terminated ASCII string.
1433 
1434   @retval 0   FirstString is identical to SecondString.
1435   @retval !=0 FirstString is not identical to SecondString.
1436 
1437 **/
1438 INTN
1439 EFIAPI
AsciiStrnCmp(IN CONST CHAR8 * FirstString,IN CONST CHAR8 * SecondString,IN UINTN Length)1440 AsciiStrnCmp (
1441   IN      CONST CHAR8               *FirstString,
1442   IN      CONST CHAR8               *SecondString,
1443   IN      UINTN                     Length
1444   )
1445 {
1446   if (Length == 0) {
1447     return 0;
1448   }
1449 
1450   //
1451   // ASSERT both strings are less long than PcdMaximumAsciiStringLength
1452   //
1453   ASSERT (AsciiStrSize (FirstString));
1454   ASSERT (AsciiStrSize (SecondString));
1455 
1456   while ((*FirstString != '\0') &&
1457          (*FirstString == *SecondString) &&
1458          (Length > 1)) {
1459     FirstString++;
1460     SecondString++;
1461     Length--;
1462   }
1463   return *FirstString - *SecondString;
1464 }
1465 
1466 /**
1467   Concatenates one Null-terminated ASCII string to another Null-terminated
1468   ASCII string, and returns the concatenated ASCII string.
1469 
1470   This function concatenates two Null-terminated ASCII strings. The contents of
1471   Null-terminated ASCII string Source are concatenated to the end of Null-
1472   terminated ASCII string Destination. The Null-terminated concatenated ASCII
1473   String is returned.
1474 
1475   If Destination is NULL, then ASSERT().
1476   If Source is NULL, then ASSERT().
1477   If PcdMaximumAsciiStringLength is not zero and Destination contains more than
1478   PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,
1479   then ASSERT().
1480   If PcdMaximumAsciiStringLength is not zero and Source contains more than
1481   PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,
1482   then ASSERT().
1483   If PcdMaximumAsciiStringLength is not zero and concatenating Destination and
1484   Source results in a ASCII string with more than PcdMaximumAsciiStringLength
1485   ASCII characters, then ASSERT().
1486 
1487   @param  Destination Pointer to a Null-terminated ASCII string.
1488   @param  Source      Pointer to a Null-terminated ASCII string.
1489 
1490   @return Destination
1491 
1492 **/
1493 CHAR8 *
1494 EFIAPI
AsciiStrCat(IN OUT CHAR8 * Destination,IN CONST CHAR8 * Source)1495 AsciiStrCat (
1496   IN OUT CHAR8    *Destination,
1497   IN CONST CHAR8  *Source
1498   )
1499 {
1500   AsciiStrCpy (Destination + AsciiStrLen (Destination), Source);
1501 
1502   //
1503   // Size of the resulting string should never be zero.
1504   // PcdMaximumUnicodeStringLength is tested inside StrLen().
1505   //
1506   ASSERT (AsciiStrSize (Destination) != 0);
1507   return Destination;
1508 }
1509 
1510 /**
1511   Concatenates one Null-terminated ASCII string with a maximum length to the
1512   end of another Null-terminated ASCII string, and returns the concatenated
1513   ASCII string.
1514 
1515   This function concatenates two Null-terminated ASCII strings. The contents
1516   of Null-terminated ASCII string Source are concatenated to the end of Null-
1517   terminated ASCII string Destination, and Destination is returned. At most,
1518   Length ASCII characters are concatenated from Source to the end of
1519   Destination, and Destination is always Null-terminated. If Length is 0, then
1520   Destination is returned unmodified. If Source and Destination overlap, then
1521   the results are undefined.
1522 
1523   If Destination is NULL, then ASSERT().
1524   If Source is NULL, then ASSERT().
1525   If Source and Destination overlap, then ASSERT().
1526   If PcdMaximumAsciiStringLength is not zero, and Length is greater than
1527   PcdMaximumAsciiStringLength, then ASSERT().
1528   If PcdMaximumAsciiStringLength is not zero, and Destination contains more than
1529   PcdMaximumAsciiStringLength ASCII characters, not including the Null-terminator,
1530   then ASSERT().
1531   If PcdMaximumAsciiStringLength is not zero, and Source contains more than
1532   PcdMaximumAsciiStringLength ASCII characters, not including the Null-terminator,
1533   then ASSERT().
1534   If PcdMaximumAsciiStringLength is not zero, and concatenating Destination and
1535   Source results in a ASCII string with more than PcdMaximumAsciiStringLength
1536   ASCII characters, not including the Null-terminator, then ASSERT().
1537 
1538   @param  Destination Pointer to a Null-terminated ASCII string.
1539   @param  Source      Pointer to a Null-terminated ASCII string.
1540   @param  Length      Maximum number of ASCII characters to concatenate from
1541                       Source.
1542 
1543   @return Destination
1544 
1545 **/
1546 CHAR8 *
1547 EFIAPI
AsciiStrnCat(IN OUT CHAR8 * Destination,IN CONST CHAR8 * Source,IN UINTN Length)1548 AsciiStrnCat (
1549   IN OUT  CHAR8                     *Destination,
1550   IN      CONST CHAR8               *Source,
1551   IN      UINTN                     Length
1552   )
1553 {
1554   AsciiStrnCpy (Destination + AsciiStrLen (Destination), Source, Length);
1555 
1556   //
1557   // Size of the resulting string should never be zero.
1558   // PcdMaximumUnicodeStringLength is tested inside StrLen().
1559   //
1560   ASSERT (AsciiStrSize (Destination) != 0);
1561   return Destination;
1562 }
1563 
1564 /**
1565   Returns the first occurance of a Null-terminated ASCII sub-string
1566   in a Null-terminated ASCII string.
1567 
1568   This function scans the contents of the ASCII string specified by String
1569   and returns the first occurrence of SearchString. If SearchString is not
1570   found in String, then NULL is returned. If the length of SearchString is zero,
1571   then String is returned.
1572 
1573   If String is NULL, then ASSERT().
1574   If SearchString is NULL, then ASSERT().
1575 
1576   If PcdMaximumAsciiStringLength is not zero, and SearchString or
1577   String contains more than PcdMaximumAsciiStringLength Unicode characters
1578   not including the Null-terminator, then ASSERT().
1579 
1580   @param  String				  Pointer to a Null-terminated ASCII string.
1581   @param  SearchString	  Pointer to a Null-terminated ASCII string to search for.
1582 
1583   @retval NULL            If the SearchString does not appear in String.
1584   @retval !NULL           If there is a match.
1585 
1586 **/
1587 CHAR8 *
1588 EFIAPI
AsciiStrStr(IN CONST CHAR8 * String,IN CONST CHAR8 * SearchString)1589 AsciiStrStr (
1590   IN      CONST CHAR8      	      *String,
1591   IN      CONST CHAR8             *SearchString
1592   )
1593 {
1594   CONST CHAR8 *FirstMatch;
1595   CONST CHAR8 *SearchStringTmp;
1596 
1597   ASSERT (String != NULL);
1598   ASSERT (SearchString != NULL);
1599 
1600   //
1601   // If PcdMaximumUnicodeStringLength is not zero,
1602   // length of String should not more than PcdMaximumUnicodeStringLength
1603   //
1604   if (PcdGet32 (PcdMaximumAsciiStringLength) != 0) {
1605     ASSERT (AsciiStrLen (String) < PcdGet32 (PcdMaximumAsciiStringLength));
1606   }
1607 
1608   //
1609   // If PcdMaximumUnicodeStringLength is not zero,
1610   // length of SearchString should not more than PcdMaximumUnicodeStringLength
1611   //
1612   if (PcdGet32 (PcdMaximumAsciiStringLength) != 0) {
1613     ASSERT (AsciiStrLen (SearchString) < PcdGet32 (PcdMaximumAsciiStringLength));
1614   }
1615 
1616   while (*String != '\0') {
1617     SearchStringTmp = SearchString;
1618     FirstMatch = String;
1619 
1620     while ((*String == *SearchStringTmp)
1621             && (*SearchStringTmp != '\0')
1622             && (*String != '\0')) {
1623       String++;
1624       SearchStringTmp++;
1625     }
1626 
1627     if (*SearchStringTmp == '\0') {
1628       return (CHAR8 *) FirstMatch;
1629     }
1630 
1631     if (SearchStringTmp == SearchString) {
1632       //
1633       // If no character from SearchString match,
1634       // move the pointer to the String under search
1635       // by one character.
1636       //
1637       String++;
1638     }
1639 
1640   }
1641 
1642   return NULL;
1643 }
1644 
1645 /**
1646   Convert a Null-terminated ASCII decimal string to a value of type
1647   UINTN.
1648 
1649   This function returns a value of type UINTN by interpreting the contents
1650   of the ASCII string String as a decimal number. The format of the input
1651   ASCII string String is:
1652 
1653                     [spaces] [decimal digits].
1654 
1655   The valid decimal digit character is in the range [0-9]. The function will
1656   ignore the pad space, which includes spaces or tab characters, before the digits.
1657   The running zero in the beginning of [decimal digits] will be ignored. Then, the
1658   function stops at the first character that is a not a valid decimal character or
1659   Null-terminator, whichever on comes first.
1660 
1661   If String has only pad spaces, then 0 is returned.
1662   If String has no pad spaces or valid decimal digits, then 0 is returned.
1663   If the number represented by String overflows according to the range defined by
1664   UINTN, then ASSERT().
1665   If String is NULL, then ASSERT().
1666   If PcdMaximumAsciiStringLength is not zero, and String contains more than
1667   PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,
1668   then ASSERT().
1669 
1670   @param  String			    Pointer to a Null-terminated ASCII string.
1671 
1672   @retval UINTN
1673 
1674 **/
1675 UINTN
1676 EFIAPI
AsciiStrDecimalToUintn(IN CONST CHAR8 * String)1677 AsciiStrDecimalToUintn (
1678   IN      CONST CHAR8      	        *String
1679   )
1680 {
1681   UINTN     Result;
1682 
1683   ASSERT (String != NULL);
1684   ASSERT (AsciiStrLen (String) < PcdGet32 (PcdMaximumAsciiStringLength));
1685 
1686   //
1687   // Ignore the pad spaces (space or tab)
1688   //
1689   while ((*String == ' ') || (*String == '\t')) {
1690     String++;
1691   }
1692 
1693   //
1694   // Ignore leading Zeros after the spaces
1695   //
1696   while (*String == '0') {
1697     String++;
1698   }
1699 
1700   Result = 0;
1701 
1702   while (InternalAsciiIsDecimalDigitCharacter (*String)) {
1703     //
1704     // If the number represented by String overflows according
1705     // to the range defined by UINTN, then ASSERT().
1706     //
1707     ASSERT ((Result < QUIENT_MAX_UINTN_DIVIDED_BY_10) ||
1708       ((Result == QUIENT_MAX_UINTN_DIVIDED_BY_10) &&
1709       (*String - '0') <= REMINDER_MAX_UINTN_DIVIDED_BY_10)
1710       );
1711 
1712     Result = Result * 10 + (*String - '0');
1713     String++;
1714   }
1715 
1716   return Result;
1717 }
1718 
1719 
1720 /**
1721   Convert a Null-terminated ASCII decimal string to a value of type
1722   UINT64.
1723 
1724   This function returns a value of type UINT64 by interpreting the contents
1725   of the ASCII string String as a decimal number. The format of the input
1726   ASCII string String is:
1727 
1728                     [spaces] [decimal digits].
1729 
1730   The valid decimal digit character is in the range [0-9]. The function will
1731   ignore the pad space, which includes spaces or tab characters, before the digits.
1732   The running zero in the beginning of [decimal digits] will be ignored. Then, the
1733   function stops at the first character that is a not a valid decimal character or
1734   Null-terminator, whichever on comes first.
1735 
1736   If String has only pad spaces, then 0 is returned.
1737   If String has no pad spaces or valid decimal digits, then 0 is returned.
1738   If the number represented by String overflows according to the range defined by
1739   UINT64, then ASSERT().
1740   If String is NULL, then ASSERT().
1741   If PcdMaximumAsciiStringLength is not zero, and String contains more than
1742   PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,
1743   then ASSERT().
1744 
1745   @param  String			    Pointer to a Null-terminated ASCII string.
1746 
1747   @retval UINT64
1748 
1749 **/
1750 UINT64
1751 EFIAPI
AsciiStrDecimalToUint64(IN CONST CHAR8 * String)1752 AsciiStrDecimalToUint64 (
1753   IN      CONST CHAR8      	      *String
1754   )
1755 {
1756   UINT64     Result;
1757 
1758   ASSERT (String != NULL);
1759   ASSERT (AsciiStrLen (String) < PcdGet32 (PcdMaximumAsciiStringLength));
1760 
1761   //
1762   // Ignore the pad spaces (space or tab)
1763   //
1764   while ((*String == ' ') || (*String == '\t')) {
1765     String++;
1766   }
1767 
1768   //
1769   // Ignore leading Zeros after the spaces
1770   //
1771   while (*String == '0') {
1772     String++;
1773   }
1774 
1775   Result = 0;
1776 
1777   while (InternalAsciiIsDecimalDigitCharacter (*String)) {
1778     //
1779     // If the number represented by String overflows according
1780     // to the range defined by UINTN, then ASSERT().
1781     //
1782     ASSERT ((Result < QUIENT_MAX_UINT64_DIVIDED_BY_10) ||
1783       ((Result == QUIENT_MAX_UINT64_DIVIDED_BY_10) &&
1784       (*String - '0') <= REMINDER_MAX_UINT64_DIVIDED_BY_10)
1785       );
1786 
1787     Result = MultU64x32 (Result, 10) + (*String - '0');
1788     String++;
1789   }
1790 
1791   return Result;
1792 }
1793 
1794 /**
1795   Convert a Null-terminated ASCII hexadecimal string to a value of type UINTN.
1796 
1797   This function returns a value of type UINTN by interpreting the contents of
1798   the ASCII string String as a hexadecimal number. The format of the input ASCII
1799   string String is:
1800 
1801                   [spaces][zeros][x][hexadecimal digits].
1802 
1803   The valid hexadecimal digit character is in the range [0-9], [a-f] and [A-F].
1804   The prefix "0x" is optional. Both "x" and "X" is allowed in "0x" prefix. If "x"
1805   appears in the input string, it must be prefixed with at least one 0. The function
1806   will ignore the pad space, which includes spaces or tab characters, before [zeros],
1807   [x] or [hexadecimal digits]. The running zero before [x] or [hexadecimal digits]
1808   will be ignored. Then, the decoding starts after [x] or the first valid hexadecimal
1809   digit. Then, the function stops at the first character that is a not a valid
1810   hexadecimal character or Null-terminator, whichever on comes first.
1811 
1812   If String has only pad spaces, then 0 is returned.
1813   If String has no leading pad spaces, leading zeros or valid hexadecimal digits, then
1814   0 is returned.
1815 
1816   If the number represented by String overflows according to the range defined by UINTN,
1817   then ASSERT().
1818   If String is NULL, then ASSERT().
1819   If PcdMaximumAsciiStringLength is not zero,
1820   and String contains more than PcdMaximumAsciiStringLength ASCII characters not including
1821   the Null-terminator, then ASSERT().
1822 
1823   @param  String			    Pointer to a Null-terminated ASCII string.
1824 
1825   @retval UINTN
1826 
1827 **/
1828 UINTN
1829 EFIAPI
AsciiStrHexToUintn(IN CONST CHAR8 * String)1830 AsciiStrHexToUintn (
1831   IN      CONST CHAR8      	      *String
1832   )
1833 {
1834   UINTN     Result;
1835 
1836   ASSERT (String != NULL);
1837   ASSERT (AsciiStrLen (String) < PcdGet32 (PcdMaximumAsciiStringLength));
1838 
1839   //
1840   // Ignore the pad spaces (space or tab)
1841   //
1842   while ((*String == ' ') || (*String == '\t')) {
1843     String++;
1844   }
1845 
1846   //
1847   // Ignore leading Zeros after the spaces
1848   //
1849   while (*String == '0') {
1850     String++;
1851   }
1852 
1853   if (AsciiToUpper (*String) == 'X') {
1854     ASSERT (*(String - 1)  == '0');
1855     if (*(String - 1)  != '0') {
1856       return 0;
1857     }
1858     //
1859     // Skip the 'X'
1860     //
1861     String++;
1862   }
1863 
1864   Result = 0;
1865 
1866   while (InternalAsciiIsHexaDecimalDigitCharacter (*String)) {
1867     //
1868     // If the Hex Number represented by String overflows according
1869     // to the range defined by UINTN, then ASSERT().
1870     //
1871      ASSERT ((Result < QUIENT_MAX_UINTN_DIVIDED_BY_16) ||
1872        ((Result == QUIENT_MAX_UINTN_DIVIDED_BY_16) &&
1873        (InternalAsciiHexCharToUintn (*String) <= REMINDER_MAX_UINTN_DIVIDED_BY_16))
1874        );
1875 
1876     Result = (Result << 4) + InternalAsciiHexCharToUintn (*String);
1877     String++;
1878   }
1879 
1880   return Result;
1881 }
1882 
1883 
1884 /**
1885   Convert a Null-terminated ASCII hexadecimal string to a value of type UINT64.
1886 
1887   This function returns a value of type UINT64 by interpreting the contents of
1888   the ASCII string String as a hexadecimal number. The format of the input ASCII
1889   string String is:
1890 
1891                   [spaces][zeros][x][hexadecimal digits].
1892 
1893   The valid hexadecimal digit character is in the range [0-9], [a-f] and [A-F].
1894   The prefix "0x" is optional. Both "x" and "X" is allowed in "0x" prefix. If "x"
1895   appears in the input string, it must be prefixed with at least one 0. The function
1896   will ignore the pad space, which includes spaces or tab characters, before [zeros],
1897   [x] or [hexadecimal digits]. The running zero before [x] or [hexadecimal digits]
1898   will be ignored. Then, the decoding starts after [x] or the first valid hexadecimal
1899   digit. Then, the function stops at the first character that is a not a valid
1900   hexadecimal character or Null-terminator, whichever on comes first.
1901 
1902   If String has only pad spaces, then 0 is returned.
1903   If String has no leading pad spaces, leading zeros or valid hexadecimal digits, then
1904   0 is returned.
1905 
1906   If the number represented by String overflows according to the range defined by UINT64,
1907   then ASSERT().
1908   If String is NULL, then ASSERT().
1909   If PcdMaximumAsciiStringLength is not zero,
1910   and String contains more than PcdMaximumAsciiStringLength ASCII characters not including
1911   the Null-terminator, then ASSERT().
1912 
1913   @param  String			    Pointer to a Null-terminated ASCII string.
1914 
1915   @retval UINT64
1916 
1917 **/
1918 UINT64
1919 EFIAPI
AsciiStrHexToUint64(IN CONST CHAR8 * String)1920 AsciiStrHexToUint64 (
1921   IN      CONST CHAR8      	      *String
1922   )
1923 {
1924   UINT64    Result;
1925 
1926   ASSERT (String != NULL);
1927   ASSERT (AsciiStrLen (String) < PcdGet32 (PcdMaximumUnicodeStringLength));
1928 
1929   //
1930   // Ignore the pad spaces (space or tab) and leading Zeros
1931   //
1932   //
1933   // Ignore the pad spaces (space or tab)
1934   //
1935   while ((*String == ' ') || (*String == '\t')) {
1936     String++;
1937   }
1938 
1939   //
1940   // Ignore leading Zeros after the spaces
1941   //
1942   while (*String == '0') {
1943     String++;
1944   }
1945 
1946   if (AsciiToUpper (*String) == 'X') {
1947     ASSERT (*(String - 1)  == '0');
1948     if (*(String - 1)  != '0') {
1949       return 0;
1950     }
1951     //
1952     // Skip the 'X'
1953     //
1954     String++;
1955   }
1956 
1957   Result = 0;
1958 
1959   while (InternalAsciiIsHexaDecimalDigitCharacter (*String)) {
1960     //
1961     // If the Hex Number represented by String overflows according
1962     // to the range defined by UINTN, then ASSERT().
1963     //
1964     ASSERT ((Result < QUIENT_MAX_UINT64_DIVIDED_BY_16) ||
1965       ((Result == QUIENT_MAX_UINT64_DIVIDED_BY_16) &&
1966       (InternalAsciiHexCharToUintn (*String) <= REMINDER_MAX_UINT64_DIVIDED_BY_16))
1967       );
1968 
1969     Result = LShiftU64 (Result, 4);
1970     Result = Result + InternalAsciiHexCharToUintn (*String);
1971     String++;
1972   }
1973 
1974   return Result;
1975 }
1976 
1977 
1978 /**
1979   Convert one Null-terminated ASCII string to a Null-terminated
1980   Unicode string and returns the Unicode string.
1981 
1982   This function converts the contents of the ASCII string Source to the Unicode
1983   string Destination, and returns Destination.  The function terminates the
1984   Unicode string Destination by appending a Null-terminator character at the end.
1985   The caller is responsible to make sure Destination points to a buffer with size
1986   equal or greater than ((AsciiStrLen (Source) + 1) * sizeof (CHAR16)) in bytes.
1987 
1988   If Destination is NULL, then ASSERT().
1989   If Destination is not aligned on a 16-bit boundary, then ASSERT().
1990   If Source is NULL, then ASSERT().
1991   If Source and Destination overlap, then ASSERT().
1992   If PcdMaximumAsciiStringLength is not zero, and Source contains more than
1993   PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,
1994   then ASSERT().
1995   If PcdMaximumUnicodeStringLength is not zero, and Source contains more than
1996   PcdMaximumUnicodeStringLength ASCII characters not including the
1997   Null-terminator, then ASSERT().
1998 
1999   @param  Source        Pointer to a Null-terminated ASCII string.
2000   @param  Destination   Pointer to a Null-terminated Unicode string.
2001 
2002   @reture Destination
2003 
2004 **/
2005 CHAR16 *
2006 EFIAPI
AsciiStrToUnicodeStr(IN CONST CHAR8 * Source,OUT CHAR16 * Destination)2007 AsciiStrToUnicodeStr (
2008   IN      CONST CHAR8       	      *Source,
2009   OUT 	  CHAR16  	                *Destination
2010   )
2011 {
2012   ASSERT (Destination != NULL);
2013   ASSERT (Source != NULL);
2014 
2015   //
2016   // Source and Destination should not overlap
2017   //
2018   ASSERT ((UINTN) ((CHAR8 *) Destination - Source) > AsciiStrLen (Source));
2019   ASSERT ((UINTN) (Source - (CHAR8 *) Destination) > (AsciiStrLen (Source) * sizeof (CHAR16)));
2020 
2021   //
2022   // If PcdMaximumAsciiStringLength is not zero,
2023   // length of Source should not more than PcdMaximumUnicodeStringLength
2024   //
2025   if (PcdGet32 (PcdMaximumAsciiStringLength) != 0) {
2026     ASSERT (AsciiStrLen (Source) < PcdGet32 (PcdMaximumAsciiStringLength));
2027   }
2028 
2029   while (*Source != '\0') {
2030     *(Destination++) = (CHAR16) *(Source++);
2031   }
2032   //
2033   // End the Destination with a NULL.
2034   //
2035   *Destination = '\0';
2036 
2037   return Destination;
2038 }
2039 
2040 /**
2041   Converts an 8-bit value to an 8-bit BCD value.
2042 
2043   Converts the 8-bit value specified by Value to BCD. The BCD value is
2044   returned.
2045 
2046   If Value >= 100, then ASSERT().
2047 
2048   @param  Value The 8-bit value to convert to BCD. Range 0..99.
2049 
2050   @return The BCD value
2051 
2052 **/
2053 UINT8
2054 EFIAPI
DecimalToBcd8(IN UINT8 Value)2055 DecimalToBcd8 (
2056   IN      UINT8                     Value
2057   )
2058 {
2059   ASSERT (Value < 100);
2060   return (UINT8) (((Value / 10) << 4) | (Value % 10));
2061 }
2062 
2063 /**
2064   Converts an 8-bit BCD value to an 8-bit value.
2065 
2066   Converts the 8-bit BCD value specified by Value to an 8-bit value. The 8-bit
2067   value is returned.
2068 
2069   If Value >= 0xA0, then ASSERT().
2070   If (Value & 0x0F) >= 0x0A, then ASSERT().
2071 
2072   @param  Value The 8-bit BCD value to convert to an 8-bit value.
2073 
2074   @return The 8-bit value is returned.
2075 
2076 **/
2077 UINT8
2078 EFIAPI
BcdToDecimal8(IN UINT8 Value)2079 BcdToDecimal8 (
2080   IN      UINT8                     Value
2081   )
2082 {
2083   ASSERT (Value < 0xa0);
2084   ASSERT ((Value & 0xf) < 0xa);
2085   return (UINT8) ((Value >> 4) * 10 + (Value & 0xf));
2086 }
2087 
2088 
2089