• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /** @file
2   Base Print Library instance implementation.
3 
4   Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>
5   Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
6   This program and the accompanying materials
7   are licensed and made available under the terms and conditions of the BSD License
8   which accompanies this distribution.  The full text of the license may be found at
9   http://opensource.org/licenses/bsd-license.php.
10 
11   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
13 
14 **/
15 
16 #include "PrintLibInternal.h"
17 
18 //
19 // Declare a VA_LIST global variable that is used in calls to BasePrintLibSPrintMarker()
20 // when the BASE_LIST parameter is valid and the VA_LIST parameter is ignored.
21 // A NULL VA_LIST can not be passed into  BasePrintLibSPrintMarker() because some
22 // compilers define VA_LIST to be a structure.
23 //
24 VA_LIST gNullVaList;
25 
26 #define ASSERT_UNICODE_BUFFER(Buffer) ASSERT ((((UINTN) (Buffer)) & 0x01) == 0)
27 
28 /**
29   Produces a Null-terminated Unicode string in an output buffer based on
30   a Null-terminated Unicode format string and a VA_LIST argument list
31 
32   Produces a Null-terminated Unicode string in the output buffer specified by StartOfBuffer
33   and BufferSize.
34   The Unicode string is produced by parsing the format string specified by FormatString.
35   Arguments are pulled from the variable argument list specified by Marker based on the
36   contents of the format string.
37   The number of Unicode characters in the produced output buffer is returned not including
38   the Null-terminator.
39   If BufferSize is 0 or 1, then no output buffer is produced and 0 is returned.
40 
41   If BufferSize > 1 and StartOfBuffer is NULL, then ASSERT().
42   If BufferSize > 1 and StartOfBuffer is not aligned on a 16-bit boundary, then ASSERT().
43   If BufferSize > 1 and FormatString is NULL, then ASSERT().
44   If BufferSize > 1 and FormatString is not aligned on a 16-bit boundary, then ASSERT().
45   If PcdMaximumUnicodeStringLength is not zero, and FormatString contains more than
46   PcdMaximumUnicodeStringLength Unicode characters not including the Null-terminator, then
47   ASSERT().
48   If PcdMaximumUnicodeStringLength is not zero, and produced Null-terminated Unicode string
49   contains more than PcdMaximumUnicodeStringLength Unicode characters not including the
50   Null-terminator, then ASSERT().
51 
52   @param  StartOfBuffer   A pointer to the output buffer for the produced Null-terminated
53                           Unicode string.
54   @param  BufferSize      The size, in bytes, of the output buffer specified by StartOfBuffer.
55   @param  FormatString    A Null-terminated Unicode format string.
56   @param  Marker          VA_LIST marker for the variable argument list.
57 
58   @return The number of Unicode characters in the produced output buffer not including the
59           Null-terminator.
60 
61 **/
62 UINTN
63 EFIAPI
UnicodeVSPrint(OUT CHAR16 * StartOfBuffer,IN UINTN BufferSize,IN CONST CHAR16 * FormatString,IN VA_LIST Marker)64 UnicodeVSPrint (
65   OUT CHAR16        *StartOfBuffer,
66   IN  UINTN         BufferSize,
67   IN  CONST CHAR16  *FormatString,
68   IN  VA_LIST       Marker
69   )
70 {
71   ASSERT_UNICODE_BUFFER (StartOfBuffer);
72   ASSERT_UNICODE_BUFFER (FormatString);
73   return BasePrintLibSPrintMarker ((CHAR8 *)StartOfBuffer, BufferSize >> 1, FORMAT_UNICODE | OUTPUT_UNICODE, (CHAR8 *)FormatString, Marker, NULL);
74 }
75 
76 /**
77   Produces a Null-terminated Unicode string in an output buffer based on
78   a Null-terminated Unicode format string and a BASE_LIST argument list
79 
80   Produces a Null-terminated Unicode string in the output buffer specified by StartOfBuffer
81   and BufferSize.
82   The Unicode string is produced by parsing the format string specified by FormatString.
83   Arguments are pulled from the variable argument list specified by Marker based on the
84   contents of the format string.
85   The number of Unicode characters in the produced output buffer is returned not including
86   the Null-terminator.
87   If BufferSize is 0 or 1, then no output buffer is produced and 0 is returned.
88 
89   If BufferSize > 1 and StartOfBuffer is NULL, then ASSERT().
90   If BufferSize > 1 and StartOfBuffer is not aligned on a 16-bit boundary, then ASSERT().
91   If BufferSize > 1 and FormatString is NULL, then ASSERT().
92   If BufferSize > 1 and FormatString is not aligned on a 16-bit boundary, then ASSERT().
93   If PcdMaximumUnicodeStringLength is not zero, and FormatString contains more than
94   PcdMaximumUnicodeStringLength Unicode characters not including the Null-terminator, then
95   ASSERT().
96   If PcdMaximumUnicodeStringLength is not zero, and produced Null-terminated Unicode string
97   contains more than PcdMaximumUnicodeStringLength Unicode characters not including the
98   Null-terminator, then ASSERT().
99 
100   @param  StartOfBuffer   A pointer to the output buffer for the produced Null-terminated
101                           Unicode string.
102   @param  BufferSize      The size, in bytes, of the output buffer specified by StartOfBuffer.
103   @param  FormatString    A Null-terminated Unicode format string.
104   @param  Marker          BASE_LIST marker for the variable argument list.
105 
106   @return The number of Unicode characters in the produced output buffer not including the
107           Null-terminator.
108 
109 **/
110 UINTN
111 EFIAPI
UnicodeBSPrint(OUT CHAR16 * StartOfBuffer,IN UINTN BufferSize,IN CONST CHAR16 * FormatString,IN BASE_LIST Marker)112 UnicodeBSPrint (
113   OUT CHAR16        *StartOfBuffer,
114   IN  UINTN         BufferSize,
115   IN  CONST CHAR16  *FormatString,
116   IN  BASE_LIST     Marker
117   )
118 {
119   ASSERT_UNICODE_BUFFER (StartOfBuffer);
120   ASSERT_UNICODE_BUFFER (FormatString);
121   return BasePrintLibSPrintMarker ((CHAR8 *)StartOfBuffer, BufferSize >> 1, FORMAT_UNICODE | OUTPUT_UNICODE, (CHAR8 *)FormatString, gNullVaList, Marker);
122 }
123 
124 /**
125   Produces a Null-terminated Unicode string in an output buffer based on a Null-terminated
126   Unicode format string and variable argument list.
127 
128   Produces a Null-terminated Unicode string in the output buffer specified by StartOfBuffer
129   and BufferSize.
130   The Unicode string is produced by parsing the format string specified by FormatString.
131   Arguments are pulled from the variable argument list based on the contents of the format string.
132   The number of Unicode characters in the produced output buffer is returned not including
133   the Null-terminator.
134   If BufferSize is 0 or 1, then no output buffer is produced and 0 is returned.
135 
136   If BufferSize > 1 and StartOfBuffer is NULL, then ASSERT().
137   If BufferSize > 1 and StartOfBuffer is not aligned on a 16-bit boundary, then ASSERT().
138   If BufferSize > 1 and FormatString is NULL, then ASSERT().
139   If BufferSize > 1 and FormatString is not aligned on a 16-bit boundary, then ASSERT().
140   If PcdMaximumUnicodeStringLength is not zero, and FormatString contains more than
141   PcdMaximumUnicodeStringLength Unicode characters not including the Null-terminator, then
142   ASSERT().
143   If PcdMaximumUnicodeStringLength is not zero, and produced Null-terminated Unicode string
144   contains more than PcdMaximumUnicodeStringLength Unicode characters not including the
145   Null-terminator, then ASSERT().
146 
147   @param  StartOfBuffer   A pointer to the output buffer for the produced Null-terminated
148                           Unicode string.
149   @param  BufferSize      The size, in bytes, of the output buffer specified by StartOfBuffer.
150   @param  FormatString    A Null-terminated Unicode format string.
151   @param  ...             Variable argument list whose contents are accessed based on the
152                           format string specified by FormatString.
153 
154   @return The number of Unicode characters in the produced output buffer not including the
155           Null-terminator.
156 
157 **/
158 UINTN
159 EFIAPI
UnicodeSPrint(OUT CHAR16 * StartOfBuffer,IN UINTN BufferSize,IN CONST CHAR16 * FormatString,...)160 UnicodeSPrint (
161   OUT CHAR16        *StartOfBuffer,
162   IN  UINTN         BufferSize,
163   IN  CONST CHAR16  *FormatString,
164   ...
165   )
166 {
167   VA_LIST Marker;
168   UINTN   NumberOfPrinted;
169 
170   VA_START (Marker, FormatString);
171   NumberOfPrinted = UnicodeVSPrint (StartOfBuffer, BufferSize, FormatString, Marker);
172   VA_END (Marker);
173   return NumberOfPrinted;
174 }
175 
176 /**
177   Produces a Null-terminated Unicode string in an output buffer based on a Null-terminated
178   ASCII format string and a VA_LIST argument list
179 
180   Produces a Null-terminated Unicode string in the output buffer specified by StartOfBuffer
181   and BufferSize.
182   The Unicode string is produced by parsing the format string specified by FormatString.
183   Arguments are pulled from the variable argument list specified by Marker based on the
184   contents of the format string.
185   The number of Unicode characters in the produced output buffer is returned not including
186   the Null-terminator.
187   If BufferSize is 0 or 1, then no output buffer is produced and 0 is returned.
188 
189   If BufferSize > 1 and StartOfBuffer is NULL, then ASSERT().
190   If BufferSize > 1 and StartOfBuffer is not aligned on a 16-bit boundary, then ASSERT().
191   If BufferSize > 1 and FormatString is NULL, then ASSERT().
192   If PcdMaximumAsciiStringLength is not zero, and FormatString contains more than
193   PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator, then
194   ASSERT().
195   If PcdMaximumUnicodeStringLength is not zero, and produced Null-terminated Unicode string
196   contains more than PcdMaximumUnicodeStringLength Unicode characters not including the
197   Null-terminator, then ASSERT().
198 
199   @param  StartOfBuffer   A pointer to the output buffer for the produced Null-terminated
200                           Unicode string.
201   @param  BufferSize      The size, in bytes, of the output buffer specified by StartOfBuffer.
202   @param  FormatString    A Null-terminated ASCII format string.
203   @param  Marker          VA_LIST marker for the variable argument list.
204 
205   @return The number of Unicode characters in the produced output buffer not including the
206           Null-terminator.
207 
208 **/
209 UINTN
210 EFIAPI
UnicodeVSPrintAsciiFormat(OUT CHAR16 * StartOfBuffer,IN UINTN BufferSize,IN CONST CHAR8 * FormatString,IN VA_LIST Marker)211 UnicodeVSPrintAsciiFormat (
212   OUT CHAR16       *StartOfBuffer,
213   IN  UINTN        BufferSize,
214   IN  CONST CHAR8  *FormatString,
215   IN  VA_LIST      Marker
216   )
217 {
218   ASSERT_UNICODE_BUFFER (StartOfBuffer);
219   return BasePrintLibSPrintMarker ((CHAR8 *)StartOfBuffer, BufferSize >> 1, OUTPUT_UNICODE, FormatString, Marker, NULL);
220 }
221 
222 /**
223   Produces a Null-terminated Unicode string in an output buffer based on a Null-terminated
224   ASCII format string and a BASE_LIST argument list
225 
226   Produces a Null-terminated Unicode string in the output buffer specified by StartOfBuffer
227   and BufferSize.
228   The Unicode string is produced by parsing the format string specified by FormatString.
229   Arguments are pulled from the variable argument list specified by Marker based on the
230   contents of the format string.
231   The number of Unicode characters in the produced output buffer is returned not including
232   the Null-terminator.
233   If BufferSize is 0 or 1, then no output buffer is produced and 0 is returned.
234 
235   If BufferSize > 1 and StartOfBuffer is NULL, then ASSERT().
236   If BufferSize > 1 and StartOfBuffer is not aligned on a 16-bit boundary, then ASSERT().
237   If BufferSize > 1 and FormatString is NULL, then ASSERT().
238   If PcdMaximumAsciiStringLength is not zero, and FormatString contains more than
239   PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator, then
240   ASSERT().
241   If PcdMaximumUnicodeStringLength is not zero, and produced Null-terminated Unicode string
242   contains more than PcdMaximumUnicodeStringLength Unicode characters not including the
243   Null-terminator, then ASSERT().
244 
245   @param  StartOfBuffer   A pointer to the output buffer for the produced Null-terminated
246                           Unicode string.
247   @param  BufferSize      The size, in bytes, of the output buffer specified by StartOfBuffer.
248   @param  FormatString    A Null-terminated ASCII format string.
249   @param  Marker          BASE_LIST marker for the variable argument list.
250 
251   @return The number of Unicode characters in the produced output buffer not including the
252           Null-terminator.
253 
254 **/
255 UINTN
256 EFIAPI
UnicodeBSPrintAsciiFormat(OUT CHAR16 * StartOfBuffer,IN UINTN BufferSize,IN CONST CHAR8 * FormatString,IN BASE_LIST Marker)257 UnicodeBSPrintAsciiFormat (
258   OUT CHAR16       *StartOfBuffer,
259   IN  UINTN        BufferSize,
260   IN  CONST CHAR8  *FormatString,
261   IN  BASE_LIST    Marker
262   )
263 {
264   ASSERT_UNICODE_BUFFER (StartOfBuffer);
265   return BasePrintLibSPrintMarker ((CHAR8 *)StartOfBuffer, BufferSize >> 1, OUTPUT_UNICODE, FormatString, gNullVaList, Marker);
266 }
267 
268 /**
269   Produces a Null-terminated Unicode string in an output buffer based on a Null-terminated
270   ASCII format string and  variable argument list.
271 
272   Produces a Null-terminated Unicode string in the output buffer specified by StartOfBuffer
273   and BufferSize.
274   The Unicode string is produced by parsing the format string specified by FormatString.
275   Arguments are pulled from the variable argument list based on the contents of the
276   format string.
277   The number of Unicode characters in the produced output buffer is returned not including
278   the Null-terminator.
279   If BufferSize is 0 or 1, then no output buffer is produced and 0 is returned.
280 
281   If BufferSize > 1 and StartOfBuffer is NULL, then ASSERT().
282   If BufferSize > 1 and StartOfBuffer is not aligned on a 16-bit boundary, then ASSERT().
283   If BufferSize > 1 and FormatString is NULL, then ASSERT().
284   If PcdMaximumAsciiStringLength is not zero, and FormatString contains more than
285   PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator, then
286   ASSERT().
287   If PcdMaximumUnicodeStringLength is not zero, and produced Null-terminated Unicode string
288   contains more than PcdMaximumUnicodeStringLength Unicode characters not including the
289   Null-terminator, then ASSERT().
290 
291   @param  StartOfBuffer   A pointer to the output buffer for the produced Null-terminated
292                           Unicode string.
293   @param  BufferSize      The size, in bytes, of the output buffer specified by StartOfBuffer.
294   @param  FormatString    A Null-terminated ASCII format string.
295   @param  ...             Variable argument list whose contents are accessed based on the
296                           format string specified by FormatString.
297 
298   @return The number of Unicode characters in the produced output buffer not including the
299           Null-terminator.
300 
301 **/
302 UINTN
303 EFIAPI
UnicodeSPrintAsciiFormat(OUT CHAR16 * StartOfBuffer,IN UINTN BufferSize,IN CONST CHAR8 * FormatString,...)304 UnicodeSPrintAsciiFormat (
305   OUT CHAR16       *StartOfBuffer,
306   IN  UINTN        BufferSize,
307   IN  CONST CHAR8  *FormatString,
308   ...
309   )
310 {
311   VA_LIST Marker;
312   UINTN   NumberOfPrinted;
313 
314   VA_START (Marker, FormatString);
315   NumberOfPrinted = UnicodeVSPrintAsciiFormat (StartOfBuffer, BufferSize, FormatString, Marker);
316   VA_END (Marker);
317   return NumberOfPrinted;
318 }
319 
320 /**
321   Converts a decimal value to a Null-terminated Unicode string.
322 
323   Converts the decimal number specified by Value to a Null-terminated Unicode
324   string specified by Buffer containing at most Width characters. No padding of spaces
325   is ever performed. If Width is 0 then a width of MAXIMUM_VALUE_CHARACTERS is assumed.
326   The number of Unicode characters in Buffer is returned not including the Null-terminator.
327   If the conversion contains more than Width characters, then only the first
328   Width characters are returned, and the total number of characters
329   required to perform the conversion is returned.
330   Additional conversion parameters are specified in Flags.
331 
332   The Flags bit LEFT_JUSTIFY is always ignored.
333   All conversions are left justified in Buffer.
334   If Width is 0, PREFIX_ZERO is ignored in Flags.
335   If COMMA_TYPE is set in Flags, then PREFIX_ZERO is ignored in Flags, and commas
336   are inserted every 3rd digit starting from the right.
337   If RADIX_HEX is set in Flags, then the output buffer will be
338   formatted in hexadecimal format.
339   If Value is < 0 and RADIX_HEX is not set in Flags, then the fist character in Buffer is a '-'.
340   If PREFIX_ZERO is set in Flags and PREFIX_ZERO is not being ignored,
341   then Buffer is padded with '0' characters so the combination of the optional '-'
342   sign character, '0' characters, digit characters for Value, and the Null-terminator
343   add up to Width characters.
344   If both COMMA_TYPE and RADIX_HEX are set in Flags, then ASSERT().
345   If Buffer is NULL, then ASSERT().
346   If Buffer is not aligned on a 16-bit boundary, then ASSERT().
347   If unsupported bits are set in Flags, then ASSERT().
348   If both COMMA_TYPE and RADIX_HEX are set in Flags, then ASSERT().
349   If Width >= MAXIMUM_VALUE_CHARACTERS, then ASSERT()
350 
351   @param  Buffer  The pointer to the output buffer for the produced Null-terminated
352                   Unicode string.
353   @param  Flags   The bitmask of flags that specify left justification, zero pad, and commas.
354   @param  Value   The 64-bit signed value to convert to a string.
355   @param  Width   The maximum number of Unicode characters to place in Buffer, not including
356                   the Null-terminator.
357 
358   @return The number of Unicode characters in Buffer not including the Null-terminator.
359 
360 **/
361 UINTN
362 EFIAPI
UnicodeValueToString(IN OUT CHAR16 * Buffer,IN UINTN Flags,IN INT64 Value,IN UINTN Width)363 UnicodeValueToString (
364   IN OUT CHAR16  *Buffer,
365   IN UINTN       Flags,
366   IN INT64       Value,
367   IN UINTN       Width
368   )
369 {
370   ASSERT_UNICODE_BUFFER(Buffer);
371   return BasePrintLibConvertValueToString ((CHAR8 *)Buffer, Flags, Value, Width, 2);
372 }
373 
374 /**
375   Produces a Null-terminated ASCII string in an output buffer based on a Null-terminated
376   ASCII format string and a VA_LIST argument list.
377 
378   Produces a Null-terminated ASCII string in the output buffer specified by StartOfBuffer
379   and BufferSize.
380   The ASCII string is produced by parsing the format string specified by FormatString.
381   Arguments are pulled from the variable argument list specified by Marker based on
382   the contents of the format string.
383   The number of ASCII characters in the produced output buffer is returned not including
384   the Null-terminator.
385   If BufferSize is 0, then no output buffer is produced and 0 is returned.
386 
387   If BufferSize > 0 and StartOfBuffer is NULL, then ASSERT().
388   If BufferSize > 0 and FormatString is NULL, then ASSERT().
389   If PcdMaximumAsciiStringLength is not zero, and FormatString contains more than
390   PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator, then
391   ASSERT().
392   If PcdMaximumAsciiStringLength is not zero, and produced Null-terminated ASCII string
393   contains more than PcdMaximumAsciiStringLength ASCII characters not including the
394   Null-terminator, then ASSERT().
395 
396   @param  StartOfBuffer   A pointer to the output buffer for the produced Null-terminated
397                           ASCII string.
398   @param  BufferSize      The size, in bytes, of the output buffer specified by StartOfBuffer.
399   @param  FormatString    A Null-terminated ASCII format string.
400   @param  Marker          VA_LIST marker for the variable argument list.
401 
402   @return The number of ASCII characters in the produced output buffer not including the
403           Null-terminator.
404 
405 **/
406 UINTN
407 EFIAPI
AsciiVSPrint(OUT CHAR8 * StartOfBuffer,IN UINTN BufferSize,IN CONST CHAR8 * FormatString,IN VA_LIST Marker)408 AsciiVSPrint (
409   OUT CHAR8         *StartOfBuffer,
410   IN  UINTN         BufferSize,
411   IN  CONST CHAR8   *FormatString,
412   IN  VA_LIST       Marker
413   )
414 {
415   return BasePrintLibSPrintMarker (StartOfBuffer, BufferSize, 0, FormatString, Marker, NULL);
416 }
417 
418 /**
419   Produces a Null-terminated ASCII string in an output buffer based on a Null-terminated
420   ASCII format string and a BASE_LIST argument list.
421 
422   Produces a Null-terminated ASCII string in the output buffer specified by StartOfBuffer
423   and BufferSize.
424   The ASCII string is produced by parsing the format string specified by FormatString.
425   Arguments are pulled from the variable argument list specified by Marker based on
426   the contents of the format string.
427   The number of ASCII characters in the produced output buffer is returned not including
428   the Null-terminator.
429   If BufferSize is 0, then no output buffer is produced and 0 is returned.
430 
431   If BufferSize > 0 and StartOfBuffer is NULL, then ASSERT().
432   If BufferSize > 0 and FormatString is NULL, then ASSERT().
433   If PcdMaximumAsciiStringLength is not zero, and FormatString contains more than
434   PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator, then
435   ASSERT().
436   If PcdMaximumAsciiStringLength is not zero, and produced Null-terminated ASCII string
437   contains more than PcdMaximumAsciiStringLength ASCII characters not including the
438   Null-terminator, then ASSERT().
439 
440   @param  StartOfBuffer   A pointer to the output buffer for the produced Null-terminated
441                           ASCII string.
442   @param  BufferSize      The size, in bytes, of the output buffer specified by StartOfBuffer.
443   @param  FormatString    A Null-terminated ASCII format string.
444   @param  Marker          BASE_LIST marker for the variable argument list.
445 
446   @return The number of ASCII characters in the produced output buffer not including the
447           Null-terminator.
448 
449 **/
450 UINTN
451 EFIAPI
AsciiBSPrint(OUT CHAR8 * StartOfBuffer,IN UINTN BufferSize,IN CONST CHAR8 * FormatString,IN BASE_LIST Marker)452 AsciiBSPrint (
453   OUT CHAR8         *StartOfBuffer,
454   IN  UINTN         BufferSize,
455   IN  CONST CHAR8   *FormatString,
456   IN  BASE_LIST     Marker
457   )
458 {
459   return BasePrintLibSPrintMarker (StartOfBuffer, BufferSize, 0, FormatString, gNullVaList, Marker);
460 }
461 
462 /**
463   Produces a Null-terminated ASCII string in an output buffer based on a Null-terminated
464   ASCII format string and  variable argument list.
465 
466   Produces a Null-terminated ASCII string in the output buffer specified by StartOfBuffer
467   and BufferSize.
468   The ASCII string is produced by parsing the format string specified by FormatString.
469   Arguments are pulled from the variable argument list based on the contents of the
470   format string.
471   The number of ASCII characters in the produced output buffer is returned not including
472   the Null-terminator.
473   If BufferSize is 0, then no output buffer is produced and 0 is returned.
474 
475   If BufferSize > 0 and StartOfBuffer is NULL, then ASSERT().
476   If BufferSize > 0 and FormatString is NULL, then ASSERT().
477   If PcdMaximumAsciiStringLength is not zero, and FormatString contains more than
478   PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator, then
479   ASSERT().
480   If PcdMaximumAsciiStringLength is not zero, and produced Null-terminated ASCII string
481   contains more than PcdMaximumAsciiStringLength ASCII characters not including the
482   Null-terminator, then ASSERT().
483 
484   @param  StartOfBuffer   A pointer to the output buffer for the produced Null-terminated
485                           ASCII string.
486   @param  BufferSize      The size, in bytes, of the output buffer specified by StartOfBuffer.
487   @param  FormatString    A Null-terminated ASCII format string.
488   @param  ...             Variable argument list whose contents are accessed based on the
489                           format string specified by FormatString.
490 
491   @return The number of ASCII characters in the produced output buffer not including the
492           Null-terminator.
493 
494 **/
495 UINTN
496 EFIAPI
AsciiSPrint(OUT CHAR8 * StartOfBuffer,IN UINTN BufferSize,IN CONST CHAR8 * FormatString,...)497 AsciiSPrint (
498   OUT CHAR8        *StartOfBuffer,
499   IN  UINTN        BufferSize,
500   IN  CONST CHAR8  *FormatString,
501   ...
502   )
503 {
504   VA_LIST Marker;
505   UINTN   NumberOfPrinted;
506 
507   VA_START (Marker, FormatString);
508   NumberOfPrinted = AsciiVSPrint (StartOfBuffer, BufferSize, FormatString, Marker);
509   VA_END (Marker);
510   return NumberOfPrinted;
511 }
512 
513 /**
514   Produces a Null-terminated ASCII string in an output buffer based on a Null-terminated
515   Unicode format string and a VA_LIST argument list.
516 
517   Produces a Null-terminated ASCII string in the output buffer specified by StartOfBuffer
518   and BufferSize.
519   The ASCII string is produced by parsing the format string specified by FormatString.
520   Arguments are pulled from the variable argument list specified by Marker based on
521   the contents of the format string.
522   The number of ASCII characters in the produced output buffer is returned not including
523   the Null-terminator.
524   If BufferSize is 0, then no output buffer is produced and 0 is returned.
525 
526   If BufferSize > 0 and StartOfBuffer is NULL, then ASSERT().
527   If BufferSize > 0 and FormatString is NULL, then ASSERT().
528   If BufferSize > 0 and FormatString is not aligned on a 16-bit boundary, then ASSERT().
529   If PcdMaximumUnicodeStringLength is not zero, and FormatString contains more than
530   PcdMaximumUnicodeStringLength Unicode characters not including the Null-terminator, then
531   ASSERT().
532   If PcdMaximumAsciiStringLength is not zero, and produced Null-terminated ASCII string
533   contains more than PcdMaximumAsciiStringLength ASCII characters not including the
534   Null-terminator, then ASSERT().
535 
536   @param  StartOfBuffer   A pointer to the output buffer for the produced Null-terminated
537                           ASCII string.
538   @param  BufferSize      The size, in bytes, of the output buffer specified by StartOfBuffer.
539   @param  FormatString    A Null-terminated Unicode format string.
540   @param  Marker          VA_LIST marker for the variable argument list.
541 
542   @return The number of ASCII characters in the produced output buffer not including the
543           Null-terminator.
544 
545 **/
546 UINTN
547 EFIAPI
AsciiVSPrintUnicodeFormat(OUT CHAR8 * StartOfBuffer,IN UINTN BufferSize,IN CONST CHAR16 * FormatString,IN VA_LIST Marker)548 AsciiVSPrintUnicodeFormat (
549   OUT CHAR8         *StartOfBuffer,
550   IN  UINTN         BufferSize,
551   IN  CONST CHAR16  *FormatString,
552   IN  VA_LIST       Marker
553   )
554 {
555   ASSERT_UNICODE_BUFFER (FormatString);
556   return BasePrintLibSPrintMarker (StartOfBuffer, BufferSize, FORMAT_UNICODE, (CHAR8 *)FormatString, Marker, NULL);
557 }
558 
559 /**
560   Produces a Null-terminated ASCII string in an output buffer based on a Null-terminated
561   Unicode format string and a BASE_LIST argument list.
562 
563   Produces a Null-terminated ASCII string in the output buffer specified by StartOfBuffer
564   and BufferSize.
565   The ASCII string is produced by parsing the format string specified by FormatString.
566   Arguments are pulled from the variable argument list specified by Marker based on
567   the contents of the format string.
568   The number of ASCII characters in the produced output buffer is returned not including
569   the Null-terminator.
570   If BufferSize is 0, then no output buffer is produced and 0 is returned.
571 
572   If BufferSize > 0 and StartOfBuffer is NULL, then ASSERT().
573   If BufferSize > 0 and FormatString is NULL, then ASSERT().
574   If BufferSize > 0 and FormatString is not aligned on a 16-bit boundary, then ASSERT().
575   If PcdMaximumUnicodeStringLength is not zero, and FormatString contains more than
576   PcdMaximumUnicodeStringLength Unicode characters not including the Null-terminator, then
577   ASSERT().
578   If PcdMaximumAsciiStringLength is not zero, and produced Null-terminated ASCII string
579   contains more than PcdMaximumAsciiStringLength ASCII characters not including the
580   Null-terminator, then ASSERT().
581 
582   @param  StartOfBuffer   A pointer to the output buffer for the produced Null-terminated
583                           ASCII string.
584   @param  BufferSize      The size, in bytes, of the output buffer specified by StartOfBuffer.
585   @param  FormatString    A Null-terminated Unicode format string.
586   @param  Marker          BASE_LIST marker for the variable argument list.
587 
588   @return The number of ASCII characters in the produced output buffer not including the
589           Null-terminator.
590 
591 **/
592 UINTN
593 EFIAPI
AsciiBSPrintUnicodeFormat(OUT CHAR8 * StartOfBuffer,IN UINTN BufferSize,IN CONST CHAR16 * FormatString,IN BASE_LIST Marker)594 AsciiBSPrintUnicodeFormat (
595   OUT CHAR8         *StartOfBuffer,
596   IN  UINTN         BufferSize,
597   IN  CONST CHAR16  *FormatString,
598   IN  BASE_LIST     Marker
599   )
600 {
601   ASSERT_UNICODE_BUFFER (FormatString);
602   return BasePrintLibSPrintMarker (StartOfBuffer, BufferSize, FORMAT_UNICODE, (CHAR8 *)FormatString, gNullVaList, Marker);
603 }
604 
605 /**
606   Produces a Null-terminated ASCII string in an output buffer based on a Null-terminated
607   Unicode format string and  variable argument list.
608 
609   Produces a Null-terminated ASCII string in the output buffer specified by StartOfBuffer
610   and BufferSize.
611   The ASCII string is produced by parsing the format string specified by FormatString.
612   Arguments are pulled from the variable argument list based on the contents of the
613   format string.
614   The number of ASCII characters in the produced output buffer is returned not including
615   the Null-terminator.
616   If BufferSize is 0, then no output buffer is produced and 0 is returned.
617 
618   If BufferSize > 0 and StartOfBuffer is NULL, then ASSERT().
619   If BufferSize > 0 and FormatString is NULL, then ASSERT().
620   If BufferSize > 0 and FormatString is not aligned on a 16-bit boundary, then ASSERT().
621   If PcdMaximumUnicodeStringLength is not zero, and FormatString contains more than
622   PcdMaximumUnicodeStringLength Unicode characters not including the Null-terminator, then
623   ASSERT().
624   If PcdMaximumAsciiStringLength is not zero, and produced Null-terminated ASCII string
625   contains more than PcdMaximumAsciiStringLength ASCII characters not including the
626   Null-terminator, then ASSERT().
627 
628   @param  StartOfBuffer   A pointer to the output buffer for the produced Null-terminated
629                           ASCII string.
630   @param  BufferSize      The size, in bytes, of the output buffer specified by StartOfBuffer.
631   @param  FormatString    A Null-terminated Unicode format string.
632   @param  ...             Variable argument list whose contents are accessed based on the
633                           format string specified by FormatString.
634 
635   @return The number of ASCII characters in the produced output buffer not including the
636           Null-terminator.
637 
638 **/
639 UINTN
640 EFIAPI
AsciiSPrintUnicodeFormat(OUT CHAR8 * StartOfBuffer,IN UINTN BufferSize,IN CONST CHAR16 * FormatString,...)641 AsciiSPrintUnicodeFormat (
642   OUT CHAR8         *StartOfBuffer,
643   IN  UINTN         BufferSize,
644   IN  CONST CHAR16  *FormatString,
645   ...
646   )
647 {
648   VA_LIST Marker;
649   UINTN   NumberOfPrinted;
650 
651   VA_START (Marker, FormatString);
652   NumberOfPrinted = AsciiVSPrintUnicodeFormat (StartOfBuffer, BufferSize, FormatString, Marker);
653   VA_END (Marker);
654   return NumberOfPrinted;
655 }
656 
657 
658 /**
659   Converts a decimal value to a Null-terminated ASCII string.
660 
661   Converts the decimal number specified by Value to a Null-terminated ASCII string
662   specified by Buffer containing at most Width characters. No padding of spaces
663   is ever performed.
664   If Width is 0 then a width of  MAXIMUM_VALUE_CHARACTERS is assumed.
665   The number of ASCII characters in Buffer is returned not including the Null-terminator.
666   If the conversion contains more than Width characters, then only the first Width
667   characters are returned, and the total number of characters required to perform
668   the conversion is returned.
669   Additional conversion parameters are specified in Flags.
670   The Flags bit LEFT_JUSTIFY is always ignored.
671   All conversions are left justified in Buffer.
672   If Width is 0, PREFIX_ZERO is ignored in Flags.
673   If COMMA_TYPE is set in Flags, then PREFIX_ZERO is ignored in Flags, and commas
674   are inserted every 3rd digit starting from the right.
675   If RADIX_HEX is set in Flags, then the output buffer will be
676   formatted in hexadecimal format.
677   If Value is < 0 and RADIX_HEX is not set in Flags, then the fist character in Buffer is a '-'.
678   If PREFIX_ZERO is set in Flags and PREFIX_ZERO is not being ignored,
679   then Buffer is padded with '0' characters so the combination of the optional '-'
680   sign character, '0' characters, digit characters for Value, and the Null-terminator
681   add up to Width characters.
682 
683   If Buffer is NULL, then ASSERT().
684   If unsupported bits are set in Flags, then ASSERT().
685   If both COMMA_TYPE and RADIX_HEX are set in Flags, then ASSERT().
686   If Width >= MAXIMUM_VALUE_CHARACTERS, then ASSERT()
687 
688   @param  Buffer  The pointer to the output buffer for the produced Null-terminated
689                   ASCII string.
690   @param  Flags   The bitmask of flags that specify left justification, zero pad, and commas.
691   @param  Value   The 64-bit signed value to convert to a string.
692   @param  Width   The maximum number of ASCII characters to place in Buffer, not including
693                   the Null-terminator.
694 
695   @return The number of ASCII characters in Buffer not including the Null-terminator.
696 
697 **/
698 UINTN
699 EFIAPI
AsciiValueToString(OUT CHAR8 * Buffer,IN UINTN Flags,IN INT64 Value,IN UINTN Width)700 AsciiValueToString (
701   OUT CHAR8      *Buffer,
702   IN  UINTN      Flags,
703   IN  INT64      Value,
704   IN  UINTN      Width
705   )
706 {
707   return BasePrintLibConvertValueToString (Buffer, Flags, Value, Width, 1);
708 }
709 
710 /**
711   Returns the number of characters that would be produced by if the formatted
712   output were produced not including the Null-terminator.
713 
714   If FormatString is NULL, then ASSERT().
715   If FormatString is not aligned on a 16-bit boundary, then ASSERT().
716 
717   @param[in]  FormatString    A Null-terminated Unicode format string.
718   @param[in]  Marker          VA_LIST marker for the variable argument list.
719 
720   @return The number of characters that would be produced, not including the
721           Null-terminator.
722 **/
723 UINTN
724 EFIAPI
SPrintLength(IN CONST CHAR16 * FormatString,IN VA_LIST Marker)725 SPrintLength (
726   IN  CONST CHAR16   *FormatString,
727   IN  VA_LIST       Marker
728   )
729 {
730   ASSERT(FormatString != NULL);
731   ASSERT_UNICODE_BUFFER (FormatString);
732   return BasePrintLibSPrintMarker (NULL, 0, FORMAT_UNICODE | OUTPUT_UNICODE | COUNT_ONLY_NO_PRINT, (CHAR8 *)FormatString, Marker, NULL);
733 }
734 
735 /**
736   Returns the number of characters that would be produced by if the formatted
737   output were produced not including the Null-terminator.
738 
739   If FormatString is NULL, then ASSERT().
740 
741   @param[in]  FormatString    A Null-terminated ASCII format string.
742   @param[in]  Marker          VA_LIST marker for the variable argument list.
743 
744   @return The number of characters that would be produced, not including the
745           Null-terminator.
746 **/
747 UINTN
748 EFIAPI
SPrintLengthAsciiFormat(IN CONST CHAR8 * FormatString,IN VA_LIST Marker)749 SPrintLengthAsciiFormat (
750   IN  CONST CHAR8   *FormatString,
751   IN  VA_LIST       Marker
752   )
753 {
754   ASSERT(FormatString != NULL);
755   return BasePrintLibSPrintMarker (NULL, 0, OUTPUT_UNICODE | COUNT_ONLY_NO_PRINT, (CHAR8 *)FormatString, Marker, NULL);
756 }
757