| /*++ | |
| Copyright (c) 2004-2006 Intel Corporation. All rights reserved | |
| This program and the accompanying materials are licensed and made available | |
| under the terms and conditions of the BSD License which accompanies this | |
| distribution. The full text of the license may be found at | |
| http://opensource.org/licenses/bsd-license.php | |
| THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | |
| WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | |
| Module Name: | |
| PrintLibInternal.c | |
| Abstract: | |
| Print Library worker functions. | |
| --*/ | |
| #include <Common/UefiBaseTypes.h> | |
| #include <Library/PrintLib.h> | |
| #include "CommonLib.h" | |
| #include "PrintLibInternal.h" | |
| static CONST CHAR8 mHexStr[] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; | |
| CHAR8 * | |
| BasePrintLibFillBuffer ( | |
| CHAR8 *Buffer, | |
| INTN Length, | |
| UINTN Character, | |
| INTN Increment | |
| ) | |
| { | |
| INTN Index; | |
| for (Index = 0; Index < Length; Index++) { | |
| *Buffer = (CHAR8) Character; | |
| *(Buffer + 1) = (CHAR8) (Character >> 8); | |
| Buffer += Increment; | |
| } | |
| return Buffer; | |
| } | |
| /** | |
| Print worker function that prints a Value as a decimal number in Buffer. | |
| @param Buffer Location to place the Unicode or ASCII string of Value. | |
| @param Value Value to convert to a Decimal or Hexidecimal string in Buffer. | |
| @param Flags Flags to use in printing string, see file header for details. | |
| @param Precision Minimum number of digits to return in the ASCII string | |
| @return Number of characters printed. | |
| **/ | |
| UINTN | |
| EFIAPI | |
| BasePrintLibValueToString ( | |
| IN OUT CHAR8 *Buffer, | |
| IN INT64 Value, | |
| IN UINTN Radix | |
| ) | |
| { | |
| UINTN Digits; | |
| UINT32 Remainder; | |
| // | |
| // Loop to convert one digit at a time in reverse order | |
| // | |
| *(Buffer++) = 0; | |
| Digits = 0; | |
| do { | |
| // Value = (INT64)DivU64x32Remainder ((UINT64)Value, (UINT32)Radix, &Remainder); | |
| Remainder = (UINT64)Value % (UINT32)Radix; | |
| Value = (UINT64)Value / (UINT32)Radix; | |
| *(Buffer++) = mHexStr[Remainder]; | |
| Digits++; | |
| } while (Value != 0); | |
| return Digits; | |
| } | |
| UINTN | |
| BasePrintLibConvertValueToString ( | |
| IN OUT CHAR8 *Buffer, | |
| IN UINTN Flags, | |
| IN INT64 Value, | |
| IN UINTN Width, | |
| IN UINTN Increment | |
| ) | |
| { | |
| CHAR8 *OriginalBuffer; | |
| CHAR8 ValueBuffer[MAXIMUM_VALUE_CHARACTERS]; | |
| UINTN Count; | |
| UINTN Digits; | |
| UINTN Index; | |
| OriginalBuffer = Buffer; | |
| if (Width == 0 || (Flags & COMMA_TYPE) != 0) { | |
| Flags &= (~PREFIX_ZERO); | |
| } | |
| if (Width == 0 || Width > (MAXIMUM_VALUE_CHARACTERS - 1)) { | |
| Width = MAXIMUM_VALUE_CHARACTERS - 1; | |
| } | |
| if (Value < 0) { | |
| Value = -Value; | |
| Buffer = BasePrintLibFillBuffer (Buffer, 1, '-', Increment); | |
| } | |
| Count = BasePrintLibValueToString (ValueBuffer, Value, 10); | |
| if ((Flags & PREFIX_ZERO) != 0) { | |
| Buffer = BasePrintLibFillBuffer (Buffer, Width - Count, '0', Increment); | |
| } | |
| Digits = 3 - (Count % 3); | |
| for (Index = 0; Index < Count; Index++) { | |
| Buffer = BasePrintLibFillBuffer (Buffer, 1, ValueBuffer[Count - Index], Increment); | |
| if ((Flags & COMMA_TYPE) != 0) { | |
| Digits++; | |
| if (Digits == 3) { | |
| Digits = 0; | |
| if ((Index + 1) < Count) { | |
| Buffer = BasePrintLibFillBuffer (Buffer, 1, ',', Increment); | |
| } | |
| } | |
| } | |
| } | |
| Buffer = BasePrintLibFillBuffer (Buffer, 1, 0, Increment); | |
| return ((Buffer - OriginalBuffer) / Increment); | |
| } |