mirror of
				https://github.com/acidanthera/audk.git
				synced 2025-10-27 01:03:45 +01:00 
			
		
		
		
	git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@1676 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			143 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			143 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*++
 | |
| 
 | |
| 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);
 | |
| }
 |