Add Mde String and PrintLibs. Port StrGather to the Mde Unicode implementation. Compile with 2 byte wchars. Now StrGather works with gcc.
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@358 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
137
Tools/Source/TianoTools/String/PrintLibInternal.c
Normal file
137
Tools/Source/TianoTools/String/PrintLibInternal.c
Normal file
@ -0,0 +1,137 @@
|
||||
/** @file
|
||||
Print Library worker functions.
|
||||
|
||||
Copyright (c) 2006, Intel Corporation<BR>
|
||||
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
|
||||
|
||||
**/
|
||||
|
||||
#include <Base.h>
|
||||
#include <UefiBaseTypes.h>
|
||||
#include <PrintLib.h>
|
||||
#include <BaseLib.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);
|
||||
}
|
Reference in New Issue
Block a user