summaryrefslogtreecommitdiff
path: root/Library/StdLibC.c
diff options
context:
space:
mode:
authorraywu <raywu0301@gmail.com>2018-06-15 00:00:50 +0800
committerraywu <raywu0301@gmail.com>2018-06-15 00:00:50 +0800
commitb7c51c9cf4864df6aabb99a1ae843becd577237c (patch)
treeeebe9b0d0ca03062955223097e57da84dd618b9a /Library/StdLibC.c
downloadzprj-b7c51c9cf4864df6aabb99a1ae843becd577237c.tar.xz
init. 1AQQW051HEADmaster
Diffstat (limited to 'Library/StdLibC.c')
-rw-r--r--Library/StdLibC.c1831
1 files changed, 1831 insertions, 0 deletions
diff --git a/Library/StdLibC.c b/Library/StdLibC.c
new file mode 100644
index 0000000..749c5cc
--- /dev/null
+++ b/Library/StdLibC.c
@@ -0,0 +1,1831 @@
+//*************************************************************************
+//*************************************************************************
+//** **
+//** (C)Copyright 1985-2009, American Megatrends, Inc. **
+//** **
+//** All Rights Reserved. **
+//** **
+//** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 **
+//** **
+//** Phone: (770)-246-8600 **
+//** **
+//*************************************************************************
+//*************************************************************************
+
+//**********************************************************************
+// $Header: /Alaska/SOURCE/Core/Library/StdLibC.c 22 8/15/12 5:41p Artems $
+//
+// $Revision: 22 $
+//
+// $Date: 8/15/12 5:41p $
+//**********************************************************************
+// Revision History
+// ----------------
+// $Log: /Alaska/SOURCE/Core/Library/StdLibC.c $
+//
+// 22 8/15/12 5:41p Artems
+// [TAG] EIP N/A
+// [Category] Spec Update
+// [Severity] Minor
+// [Description] Added correct error codes for display purposes
+// [Files] StdLib.c
+//
+// 21 11/17/11 6:12p Artems
+// Fixed bug: PI errors don't display properly
+//
+// 20 11/11/11 3:37p Artems
+// Added UEFI 2.3.1 error codes
+//
+// 19 2/05/11 3:11p Artems
+// Added PI 1.0-1.1 error and warning messages
+//
+// 18 8/07/09 4:45p Felixp
+// Minor bug fix in StrtolEx function.
+// The code of Sprintf_s_va_list and Swprintf_s_va_list functions is
+// optimized.
+//
+// 17 7/31/09 4:24p Felixp
+// Minor improvements in Sprintf_s_va_list and Swprintf_s_va_list
+// functions.
+//
+// 16 7/30/09 4:23p Vyacheslava
+// Minor bug fix. EIP#24453: Synopsis: CPU exception when printing long
+// debug messages.
+//
+// 15 7/29/09 4:04p Vyacheslava
+// Buffer overflow protection has been added for Sprintf.
+//
+// 14 7/28/09 4:52p Vyacheslava
+// Bug fix. EIP#24453: Synopsis: CPU exception when printing long
+// debug messages.
+//
+// 13 7/10/09 4:35p Felixp
+//
+// 12 7/10/09 3:49p Felixp
+// Function headers added
+//
+// 11 5/04/09 3:21p Felixp
+// Bug fix in Strcpy and Wcscpy functions.
+// The functions were returning pointer to the next character after the
+// terminator of the destination string.
+// The code is updated to return pointer to the beginning of the
+// destination string.
+//
+// 10 8/24/06 9:26a Felixp
+// Preliminary x64 support (work in progress):
+// 1. Processor architecture specific functions moved to a processor
+// library
+// 2. Makefile removed (AmiLib files are build by the AmiPeiLib and
+// AmeDxeLib makefile)
+// 3. Tokens.c added
+//
+// 9 5/19/06 10:25p Felixp
+// Strcpy, Wcscpy changed to return pointer to the end of the string
+//
+// 8 4/30/06 9:40p Felixp
+//
+// 7 7/11/05 4:52p Felixp
+// Sprintf and Swprinf: added support for %c (character printing)
+//
+// 6 4/22/05 4:47p Felixp
+//
+// 5 4/21/05 8:01p Felixp
+// Spintf and Swprinf changed to reflect value changes for AMI Status Code
+// (see the corresponding change in EFI.h
+//
+// 4 4/02/05 2:25p Felixp
+// Swprintf function added
+//
+// 3 3/25/05 5:25p Felixp
+// Strtol modified to support both ASCII and Unicode strings
+//
+// 2 1/18/05 3:22p Felixp
+// PrintDebugMessage renamed to Trace
+//
+// 1 12/23/04 9:41a Felixp
+//
+// 14 12/15/04 9:06p Felixp
+// LegacyBoot application added
+// Minor build process improvements
+//
+// 13 12/15/04 3:52p Markw
+// Added Strstr.
+//
+// 12 11/24/04 9:36a Felixp
+// int64 suppot added to Itoa and Itow
+//
+// 11 11/10/04 5:14p Felixp
+// 1. Bug fixes in Itoa and Itow
+// 2. const qualifiers removed
+//
+// 10 10/22/04 7:42p Felixp
+//
+// 9 9/21/04 10:47a Robert
+// Sprintf_va_list needed to add a carrage return character when it found
+// a new line character
+//
+// 8 4/04/04 2:58p Felixp
+//
+// 7 3/30/04 3:42p Markw
+// Added sprintf status code support.
+//
+// 6 3/30/04 9:51a Markw
+// Added Sprintf declaration before Sprintf_va_list.
+//
+// 5 3/29/04 5:26p Markw
+// Added Guid printing through sprintf, and renamed some functions. Split
+// sprintf into the variable parameter list and non-varialble parameter
+// list.
+//
+// 4 3/26/04 5:59p Markw
+// Replaced a broken printf with a working sprintf. Does not support of
+// floating points.
+//
+// 3 3/17/04 12:01p Markw
+// Changed unsigned (where it should be size_t) to UINTN.
+//
+// 2 2/26/04 3:23p Felixp
+//
+// 1 1/22/04 3:04p Markw
+//
+//*************************************************************************
+//<AMI_FHDR_START>
+//
+// Name: StdLibC.c
+//
+// Description:
+// StdLibC.c contains a number of standard C library functions, including
+// but not limited to string and cctype library functions.
+//
+//<AMI_FHDR_END>
+//*************************************************************************
+#include <AmiLib.h>
+
+char EfiErrorStatus[][25] =
+{
+ "EFI_LOAD_ERROR",
+ "EFI_INVALID_PARAMETER",
+ "EFI_UNSUPPORTED",
+ "EFI_BAD_BUFFER_SIZE",
+ "EFI_BUFFER_TOO_SMALL",
+ "EFI_NOT_READY",
+ "EFI_DEVICE_ERROR",
+ "EFI_WRITE_PROTECTED",
+ "EFI_OUT_OF_RESOURCES",
+ "EFI_VOLUME_CORRUPTED",
+ "EFI_VOLUME_FULL",
+ "EFI_NO_MEDIA",
+ "EFI_MEDIA_CHANGED",
+ "EFI_NOT_FOUND",
+ "EFI_ACCESS_DENIED",
+ "EFI_NO_RESPONSE",
+ "EFI_NO_MAPPING",
+ "EFI_TIMEOUT",
+ "EFI_NOT_STARTED",
+ "EFI_ALREADY_STARTED",
+ "EFI_ABORTED",
+ "EFI_ICMP_ERROR",
+ "EFI_TFTP_ERROR",
+ "EFI_PROTOCOL_ERROR",
+ "EFI_INCOMPATIBLE_VERSION",
+ "EFI_SECURITY_VIOLATION",
+ "EFI_CRC_ERROR"
+#if EFI_SPECIFICATION_VERSION<0x20000
+ ,"EFI_NOT_AVAILABLE_YET",
+ "EFI_UNLOAD_IMAGE"
+#else
+ ,"EFI_END_OF_MEDIA",
+ "EFI_UNDEFINED_29",
+ "EFI_UNDEFINED_30",
+ "EFI_END_OF_FILE",
+ "EFI_INVALID_LANGUAGE",
+ "EFI_COMPROMISED_DATA"
+#endif
+};
+
+char PiErrorStatus[][25] =
+{
+ "EFI_INTERRUPT_PENDING",
+ "EFI_REQUEST_UNLOAD_IMAGE",
+ "EFI_NOT_AVAILABLE_YET"
+};
+
+char AmiErrorStatus[][25] =
+{
+ "EFI_DBE_EOF",
+ "EFI_DBE_BOF"
+};
+
+char EfiWarningStatus[][26] =
+{
+ "EFI_WARN_UNKNOWN_GLYPH",
+ "EFI_WARN_DELETE_FAILURE",
+ "EFI_WARN_WRITE_FAILURE",
+ "EFI_WARN_BUFFER_TOO_SMALL"
+};
+
+char PiWarningStatus[][35] =
+{
+ "EFI_WARN_INTERRUPT_SOURCE_PENDING",
+ "EFI_WARN_INTERRUPT_SOURCE_QUIESCED"
+};
+
+#if EFI_SPECIFICATION_VERSION<0x20000
+#define NUM_OF_EFI_ERRORS 29
+#else
+#define NUM_OF_EFI_ERRORS 30
+#endif
+#define NUM_OF_EFI_WARNINGS 4
+#define NUM_OF_AMI_ERRORS 2
+#define NUM_OF_PI_ERRORS 3
+#define NUM_OF_PI_WARNINGS 2
+
+char EfiUnknown[] = "Status Code"; //If unknown value.
+
+CHAR16 * wcsupr(CHAR16 *str);
+
+#define true TRUE
+#define false FALSE
+
+//*************************************************************************
+//<AMI_GHDR_START>
+//
+// Name: Stdlib_Functions
+//
+// Description:
+// C standard general utilities library functions, typically found in
+// stdlib.h, that are defined in the AMI library.
+//
+// Fields: Header Function Description
+// ------------------------------------------------------------------
+// AmiLib Atoi Convert 8-bit ASCII string to INT32.
+// AmiLib StrtolEx Convert 8-bit ASCII string to INT64.
+// AmiLib ItoaEx Convert INT64 to 8-bit ASCII string.
+// AmiLib ItowEx Convert INT64 to 16-bit Unicode string.
+// AmiDxeLib Malloc Allocate memory from EfiBootServicesData.
+// AmiDxeLib MallocZ Allocate memory from EfiBootServicesData that has been cleared with zeros.
+//
+// Notes:
+// Header details which header file contains the function prototype for
+// the above functions; append .h to the given name. None indicates that
+// no header file contains a function prototype.
+//
+//<AMI_GHDR_END>
+//*************************************************************************
+
+//*************************************************************************
+//<AMI_GHDR_START>
+//
+// Name: Ctype_Functions
+//
+// Description:
+// C character handling functions, typically found in ctype.h, that are
+// defined in the AMI library.
+//
+// Fields: Header Function Description
+// ------------------------------------------------------------------
+// None Toupper Convert lowercase 8-bit ASCII character to uppercase.
+//
+// Notes:
+// Header details which header file contains the function prototype for
+// the above functions; append .h to the given name. None indicates that
+// no header file contains a function prototype.
+//
+//<AMI_GHDR_END>
+//*************************************************************************
+
+//*************************************************************************
+//<AMI_GHDR_START>
+//
+// Name: String_Functions
+//
+// Description:
+// String related functions that are defined in the AMI library.
+//
+// Fields: Header Function Description
+// ------------------------------------------------------------------
+// AmiLib Strlen Find length of null-terminated 8-bit ASCII string.
+// AmiLib Wcslen Find length of null-terminated 16-bit Unicode string.
+// AmiLib Strcpy Copy an 8-bit ASCII string into another string.
+// AmiLib Wcscpy Copy a 16-bit Unicode string into another string.
+// AmiLib Strcmp Compare two 8-bit ASCII strings to each other.
+// AmiLib Wcscmp Compare two 16-bit Unicode strings to each other.
+// AmiLib Strupr Convert an 8-bit ASCII string into all uppercase characters.
+// AmiLib Wcsupr Convert a 16-bit Unicode string to all uppercase characters.
+// AmiLib Strstr Find an occurrence of an 8-bit ASCII string inside another string.
+// AmiLib Sprintf Print a formatted 8-bit ASCII string to a buffer.
+// AmiLib Swprintf Print a formatted 16-bit Unicode string to a buffer.
+// AmiLib Sprintf_s Print a formatted 8-bit ASCII string to a buffer of predetermined size.
+// AmiLib Swprintf_s Print a formatted 16-bit Unicode string to a buffer of predetermined size.
+// AmiLib ItoaEx Convert INT64 to 8-bit ASCII string.
+// AmiLib ItowEx Convert INT64 to 16-bit Unicode string.
+//
+// Notes:
+// Header details which header file contains the function prototype for
+// the above functions; append .h to the given name. None indicates that
+// no header file contains a function prototype.
+//
+//<AMI_GHDR_END>
+//*************************************************************************
+
+//*************************************************************************
+//<AMI_GHDR_START>
+//
+// Name: Cstring_Functions
+//
+// Description:
+// C string handling functions, typically found in string.h, that are
+// defined in the AMI library.
+//
+// Fields: Header Function Description
+// ------------------------------------------------------------------
+// AmiLib Strlen Find length of null-terminated 8-bit ASCII string.
+// AmiLib Wcslen Find length of null-terminated 16-bit Unicode string.
+// AmiLib Strcpy Copy an 8-bit ASCII string into another string.
+// AmiLib Wcscpy Copy a 16-bit Unicode string into another string.
+// AmiLIb MemCpy Copy a buffer into another buffer.
+// AmiLib Strcmp Compare two 8-bit ASCII strings to each other.
+// AmiLib Wcscmp Compare two 16-bit Unicode strings to each other.
+// AmiLib MemCmp Compare two buffers for equality.
+// AmiLib Strupr Convert an 8-bit ASCII string into all uppercase characters.
+// AmiLib Wcsupr Convert a 16-bit Unicode string to all uppercase characters.
+// AmiLib Strstr Find an occurrence of an 8-bit ASCII string inside another string.
+// AmiLib MemSet Fills a buffer with a user provided value.
+//
+// Notes:
+// Header details which header file contains the function prototype for
+// the above functions; append .h to the given name. None indicates that
+// no header file contains a function prototype.
+//
+//<AMI_GHDR_END>
+//*************************************************************************
+
+//*************************************************************************
+//<AMI_GHDR_START>
+//
+// Name: Stdio_Functions
+//
+// Description:
+// C standard I/O functions, typically found in stdio.h, that are
+// defined in the AMI library.
+//
+// Fields: Header Function Description
+// ------------------------------------------------------------------
+// AmiLib Sprintf Print a formatted 8-bit ASCII string to a buffer.
+// AmiLib Swprintf Print a formatted 16-bit Unicode string to a buffer.
+// AmiLib Sprintf_s Print a formatted 8-bit ASCII string to a buffer of predetermined size.
+// AmiLib Swprintf_s Print a formatted 16-bit Unicode string to a buffer of predetermined size.
+//
+// Notes:
+// Header details which header file contains the function prototype for
+// the above functions; append .h to the given name. None indicates that
+// no header file contains a function prototype.
+//
+//<AMI_GHDR_END>
+//*************************************************************************
+
+//*************************************************************************
+//<AMI_PHDR_START>
+//
+// Name: Toupper
+//
+// Description:
+// INT32 Toupper(IN INT32 c) converts a lowercase ASCII character, c, to an
+// uppercase ASCII character and returns its uppercase ASCII value. If c is
+// not a valid lowercase ASCII character, returns c.
+//
+// Input:
+// IN INT32 c
+// ASCII value to be converted from lowercase to uppercase.
+//
+// Output:
+// INT32 value of c, if c is not a valid lowercase ASCII character.
+// Otherwise, INT32 ASCII value of c as an uppercase letter.
+//
+// Modified:
+//
+// Referrals:
+//
+// Notes:
+//
+//<AMI_PHDR_END>
+//*************************************************************************
+int Toupper(int c) {
+ return (c>='a' && c<='z') ? c-'a'+'A' : c;
+}
+
+//*************************************************************************
+//<AMI_PHDR_START>
+//
+// Name: Strlen
+//
+// Description:
+// UINTN Strlen(IN CHAR8 *string) takes a null-terminated CHAR8 string and
+// returns its UINTN length (not including the null-terminator).
+//
+// Input:
+// IN CHAR8 *string
+// Pointer to a null-terminated CHAR8 string.
+//
+// Output:
+// UINTN length of the string (not including the null-terminator).
+//
+// Modified:
+//
+// Referrals:
+//
+// Notes:
+//
+//<AMI_PHDR_END>
+//*************************************************************************
+UINTN Strlen(char *string) {
+ UINTN length=0;
+ while(*string++) length++;
+ return length;
+}
+
+//*************************************************************************
+//<AMI_PHDR_START>
+//
+// Name: Wcslen
+//
+// Description:
+// UINTN Wcslen(IN CHAR16 *string) takes a null-terminated CHAR16 string and
+// returns its UINTN length (not including the null-terminator).
+//
+// Input:
+// IN CHAR16 *string
+// Pointer to a null-terminated CHAR16 string.
+//
+// Output:
+// UINTN length of the string (not including the null-terminator).
+//
+// Modified:
+//
+// Referrals:
+//
+// Notes:
+//
+//<AMI_PHDR_END>
+//*************************************************************************
+UINTN Wcslen(CHAR16 *string) {
+ UINTN length=0;
+ while(*string++) length++;
+ return length;
+}
+
+//*************************************************************************
+//<AMI_PHDR_START>
+//
+// Name: Strcpy
+//
+// Description:
+// CHAR8* Strcpy(IN OUT CHAR8 *string1, IN CHAR8 *string2) copies the
+// contents of a CHAR8 string, string2, into another CHAR8 string, string1.
+//
+// Input:
+// IN OUT CHAR8 *string1
+// Pointer to a CHAR8 string buffer to receive the contents of string2.
+// String size must be greater than or equal to string2. User is
+// responsible for allocating the necessary memory resources.
+//
+// IN CHAR8 *string2
+// Pointer to a null-terminated CHAR8 string to be copied.
+//
+// Output:
+// CHAR8* string pointer to the last character added to string1.
+//
+// Modified:
+//
+// Referrals:
+//
+// Notes:
+//
+//<AMI_PHDR_END>
+//*************************************************************************
+char* Strcpy(char *string1,char *string2){
+ char *dest = string1;
+ while(*string1++=*string2++);
+ return dest;
+}
+
+//*************************************************************************
+//<AMI_PHDR_START>
+//
+// Name: Wcscpy
+//
+// Description:
+// CHAR16* Wcscpy(IN OUT CHAR16 *string1, IN CHAR16 *string2) copies the
+// contents of a CHAR16 string, string2, into another CHAR16 string, string1.
+//
+// Input:
+// IN OUT CHAR16 *string1
+// Pointer to a CHAR16 string buffer to receive the contents of string2.
+// String size must be greater than or equal to string2. User is
+// responsible for allocating the necessary memory resources.
+//
+// IN CHAR16 *string2
+// Pointer to a null-terminated CHAR16 string to be copied.
+//
+// Output:
+// CHAR16* string pointer to the last character added to string1.
+//
+// Modified:
+//
+// Referrals:
+//
+// Notes:
+//
+//<AMI_PHDR_END>
+//*************************************************************************
+CHAR16* Wcscpy(CHAR16 *string1, CHAR16* string2){
+ CHAR16 *dest = string1;
+ while(*string1++=*string2++);
+ return dest;
+}
+
+//*************************************************************************
+//<AMI_PHDR_START>
+//
+// Name: Strcmp
+//
+// Description:
+// INT32 Strcmp(IN CHAR8 *string1, IN CHAR8 *string2) compares two CHAR8
+// strings, string1 and string2, and returns 0 if they are identical,
+// non-zero if they are not identical.
+//
+// Input:
+// IN CHAR8 *string1
+// Pointer to a CHAR8 null-terminated string.
+//
+// IN CHAR8 *string2
+// Pointer to a CHAR8 null-terminated string.
+//
+// Output:
+// INT32 non-zero value if both string1 and string2 are not identical.
+// Otherwise, returns 0 if both string1 and string 2 are identical.
+//
+// Modified:
+//
+// Referrals:
+//
+// Notes:
+//
+//<AMI_PHDR_END>
+//*************************************************************************
+int Strcmp( char *string1, char *string2 ) {
+ while(*string1 && *string1==*string2) {*string1++;*string2++;}
+ return *string1 - *string2;
+}
+
+//*************************************************************************
+//<AMI_PHDR_START>
+//
+// Name: Wcscmp
+//
+// Description:
+// INT32 Wcscmp(IN CHAR16 *string1, IN CHAR16 *string2) compares two CHAR16
+// strings, string1 and string2, and returns 0 if they are identical,
+// non-zero if they are not identical.
+//
+// Input:
+// IN CHAR16 *string1
+// Pointer to a CHAR16 null-terminated string.
+//
+// IN CHAR16 *string2
+// Pointer to a CHAR16 null-terminated string.
+//
+// Output:
+// INT32 non-zero value if both string1 and string2 are not identical.
+// Otherwise, returns 0 if both string1 and string 2 are identical.
+//
+// Modified:
+//
+// Referrals:
+//
+// Notes:
+//
+//<AMI_PHDR_END>
+//*************************************************************************
+int Wcscmp( CHAR16 *string1, CHAR16 *string2 ) {
+ while(*string1 && *string1==*string2) {*string1++;*string2++;}
+ return *string1 - *string2;
+}
+
+//*************************************************************************
+//<AMI_PHDR_START>
+//
+// Name: Atoi
+//
+// Description:
+// INT32 Atoi(IN CHAR8 *string) converts an ASCII string that represents an
+// integer into an actual INT32 integer value and returns the result.
+//
+// Input:
+// IN CHAR8 *string
+// Pointer to a CHAR8 string that represents an integer number.
+//
+// Output:
+// INT32 value that the string represented.
+//
+// Modified:
+//
+// Referrals:
+//
+// Notes:
+//
+//<AMI_PHDR_END>
+//*************************************************************************
+int Atoi(char *string) {
+ int value=0;
+ while (*string>='0' && *string<='9') {
+ value *=10;
+ value += *string-'0';
+ string++;
+ }
+ return value;
+}
+
+//*************************************************************************
+//
+// Name: ItoaHelper
+//
+// Description:
+// CHAR8* ItoaHelper(IN INT64 value, IN OUT CHAR8 *string, IN INT32 radix,
+// IN BOOLEAN is_int64) is a helper function for ItoaEx and ItowEx which
+// converts an INT64 value into a CHAR8 ASCII representation in reverse
+// order.
+//
+// Input:
+// IN INT64 value
+// Value to be converted.
+//
+// IN OUT CHAR8 *string
+// Pointer to a CHAR8 string buffer that will hold the result of the reverse
+// conversion. User is responsible for allocating the necessary memory
+// resources.
+//
+// IN INT32 radix
+// Radix of the conversion.
+//
+// IN BOOLEAN is_int64
+// TRUE if value is a 64-bit integer; FALSE if it's 32-bit.
+//
+// Output:
+// CHAR8* string pointer to the last character added to the input string,
+// which now contains an ASCII string that is the reverse of what value
+// represents.
+//
+// Modified:
+//
+// Referrals:
+// Div64
+//
+// Notes:
+//
+//*************************************************************************
+char * ItoaHelper(INT64 value, char *string,int radix, BOOLEAN is_int64) {
+ UINTN digit;
+ UINT64 v = (value>=0)
+ ? (UINT64) value
+ : (radix==10)
+ ? (UINT64)-value
+ : (is_int64)
+ ? (UINT64)value
+ : (UINT32)value;
+ if (v)
+ while (v) {
+ v = Div64(v,radix,&digit);
+ if (digit<0xa) *string=(char)(digit+'0');
+ else *string=(char)(digit-0xa+'a');
+ string++;
+ }
+ else *string++='0';
+ if (radix==10 && value<0) *string++='-';
+ *string--=0;
+ return string;
+}
+
+//*************************************************************************
+//<AMI_PHDR_START>
+//
+// Name: ItoaEx
+//
+// Description:
+// CHAR8* ItoaEx(IN INT64 value, IN OUT CHAR8 *string, IN INT32 radix,
+// IN BOOLEAN is_int64) converts an INT64 value into a CHAR8 ASCII
+// representation and returns a pointer to the ASCII string.
+//
+// Input:
+// IN INT64 value
+// Value that needs to be converted into an ASCII representation.
+//
+// IN OUT CHAR8 *string
+// Pointer to a CHAR8 string buffer which will contain the result of the
+// conversion. User is responsible for allocating the necessary memory
+// resources.
+//
+// IN INT32 radix
+// Radix of the conversion. For example, 10 for decimal, 16 for hexadecimal,
+// etc.
+//
+// IN BOOLEAN is_int64
+// TRUE if value is a 64-bit integer; FALSE if it's 32-bit.
+//
+// Output:
+// CHAR8* string pointer, string, that contains the ASCII representation of
+// value in the user requested radix.
+//
+// Modified:
+//
+// Referrals:
+// ItoaHelper
+//
+// Notes:
+//
+//<AMI_PHDR_END>
+//*************************************************************************
+char * ItoaEx(INT64 value, char *string,int radix, BOOLEAN is_int64) {
+ char *strp=string;
+ char *str2p=ItoaHelper(value,strp,radix,is_int64);
+ //reverse string
+ while(strp<str2p) {
+ char temp=*strp;
+ *strp=*str2p;
+ *str2p=temp;
+ strp++;str2p--;
+ }
+ return string;
+}
+
+//*************************************************************************
+//<AMI_PHDR_START>
+//
+// Name: ItowEx
+//
+// Description:
+// CHAR16* ItowEx(IN INT64 value, IN OUT CHAR16 *string, IN INT32 radix,
+// IN BOOLEAN is_int64) converts an INT64 value into a 16-bit Unicode
+// representation and returns a CHAR16 pointer to the string.
+//
+// Input:
+// IN INT64 value
+// Value that needs to be converted into an ASCII representation.
+//
+// IN OUT CHAR16 *string
+// Pointer to a CHAR8 string buffer which will contain the result of the
+// conversion.
+//
+// IN INT32 radix
+// Radix of the conversion. For example, 10 for decimal, 16 for hexadecimal,
+// etc.
+//
+// IN BOOLEAN is_int64
+// TRUE if value is a 64-bit integer; FALSE if it's 32-bit.
+//
+// Output:
+// CHAR16* string pointer, string, that contains the 16-bit Unicode
+// representation of value in the user requested radix.
+//
+// Modified:
+//
+// Referrals:
+// ItoaHelper
+//
+// Notes:
+//
+//<AMI_PHDR_END>
+//*************************************************************************
+CHAR16 * ItowEx(INT64 value, CHAR16 *string,int radix, BOOLEAN is_int64) {
+ char s[0x100];
+ CHAR16 *str = string;
+ char *send=ItoaHelper(value,(char*)s,radix,is_int64);
+ //convert to unicode
+ while(send>=s) {
+ *str++ = *send--;
+ }
+ *str=0;
+ return string;
+}
+
+//*************************************************************************
+//<AMI_PHDR_START>
+//
+// Name: StrtolEx
+//
+// Description:
+// INT64 StrtolEx(IN CHAR8 *nptr, OUT CHAR8 **endptr, IN INT32 base,
+// IN INT32 increment) converts a CHAR8 string representation of a number
+// into an INT64 representation.
+//
+// Input:
+// IN CHAR8 *nptr
+// CHAR8 string to be converted into an INT64.
+//
+// OUT CHAR8 **endptr
+// CHAR8 string pointer to the final character read from nptr.
+//
+// IN INT32 base
+// The base of the string being passed in. If 0, string will be parsed by
+// defaults; preceding "0x" treated as hexadecimal, preceding "0" treated as
+// octal, everything else treated as decimal.
+//
+// IN INT32 increment
+// The number of characters in between each number digit. For example,
+// "14131" would be 1; "1 4 1 3 1" would be 2.
+//
+// Output:
+// INT64 representation of the number in the ASCII nptr string using the
+// provided base and increment amount.
+//
+// Modified:
+//
+// Referrals:
+//
+// Notes:
+//
+//<AMI_PHDR_END>
+//*************************************************************************
+long StrtolEx(char *nptr,char **endptr,int base, int increment) {
+ unsigned char overflow=false;
+ char sign=1;
+ char digit;
+ long value=0;
+
+ while(*nptr == ' ' || *nptr == '\t') nptr+=increment;
+ if (*nptr == '\0') {*endptr=(char*)nptr;return 0;}
+
+ if (*nptr == '-') {sign = -1;nptr+=increment;}
+ if (*nptr == '+') nptr+=increment;
+
+ if (!base) {
+ base=10;
+ if (*nptr == '0') {
+ base=8;
+ nptr+=increment;
+ if ((*nptr&0xdf)=='X') { //Check for 'x' or 'X'
+ base=16;
+ nptr+=increment;
+ }
+ }
+ }
+ while(true) {
+ if (*nptr >= '0' && *nptr <='9') digit=*nptr-'0';
+ else if ((*nptr&0xdf)>='A'&& (*nptr&0xdf)<='Z') digit = (*nptr&0xdf) - 'A' + 0xa;
+ else break;
+ if (digit >= base) break;
+ value = value * base + digit;
+ if (sign==1) {
+ if ((unsigned) value >= (unsigned) 0x80000000) overflow=true;
+ } else if ((unsigned) value > (unsigned) 0x80000000) overflow=true;
+ nptr+=increment;
+ }
+ *endptr=(char*)nptr;
+ if (overflow) {
+ value=0x7fffffff;
+ if (sign==-1) value++;
+ }
+ return value*sign;
+}
+
+//*************************************************************************
+//<AMI_PHDR_START>
+//
+// Name: Strupr
+//
+// Description:
+// CHAR8* Strupr(IN CHAR8 *str) converts a CHAR8 string to all uppercase
+// characters.
+//
+// Input:
+// IN CHAR8 *str
+// CHAR8 string to be converted to all uppercase.
+//
+// Output:
+// CHAR8* string pointer to the start of the modified string.
+//
+// Modified:
+//
+// Referrals:
+//
+// Notes:
+// Original string will be modified!
+//
+//<AMI_PHDR_END>
+//*************************************************************************
+char * Strupr(char *str) {
+ char *strptr=str;
+ while (*strptr) { //End of string?
+ if (*strptr >=0x61 && *strptr<=0x7a) *strptr-=0x20; //If char is lower case, convert to upper.
+ strptr++; //Next char
+ }
+ return str;
+}
+
+//*************************************************************************
+//<AMI_PHDR_START>
+//
+// Name: Wcsupr
+//
+// Description:
+// CHAR16* Wcsupr(IN CHAR16 *str) converts a CHAR16 string to all uppercase
+// characters.
+//
+// Input:
+// IN CHAR16 *str
+// CHAR16 string to be converted to all uppercase.
+//
+// Output:
+// CHAR16* string pointer to the start of the modified string.
+//
+// Modified:
+//
+// Referrals:
+//
+// Notes:
+// Original string will be modified!
+//
+//<AMI_PHDR_END>
+//*************************************************************************
+CHAR16 * Wcsupr(CHAR16 *str) {
+ CHAR16 *strptr=str;
+ while (*strptr) { //End of string?
+ if (*strptr >=0x61 && *strptr<=0x7a) *strptr-=0x20; //If char is lower case, convert to upper.
+ strptr++; //Next char
+ }
+ return str;
+}
+
+//*************************************************************************
+//<AMI_PHDR_START>
+//
+// Name: Strstr
+//
+// Description:
+// CHAR8* Strstr(IN CONST CHAR8 *string, IN CONST CHAR8 *strSearch) locates
+// strSearch within string, and returns a pointer to the start of the located
+// string.
+//
+// Input:
+// IN CONST CHAR8 *string
+// The string to be searched through.
+//
+// IN CONST CHAR8 *strSearch
+// The string to locate/find.
+//
+// Output:
+// CHAR8* string pointer to the start of the located string if strSearch is
+// located. If not found, returns a pointer to the end of the input string.
+// If strSearch is an empty null-terminated string, returns the start of
+// string.
+//
+// Modified:
+//
+// Referrals:
+//
+// Notes:
+//
+//<AMI_PHDR_END>
+//*************************************************************************
+char *Strstr(
+ const char *string,
+ const char *strSearch
+)
+{
+ char *StartPos = (char *)string;
+
+ if (!*strSearch) return StartPos;
+
+ while (*StartPos)
+ {
+ char *p = StartPos;
+ char *q = (char *) strSearch;
+
+ while (*q && *p == *q) {++p;++q;}
+ if (!*q) return StartPos;
+ ++StartPos;
+ }
+ return StartPos;
+}
+
+//*************************************************************************
+//
+// Name: Sprintf_va_list
+//
+// Description:
+// UINTN Sprintf_va_list(OUT CHAR8 *buffer, IN CHAR8 *format,
+// IN va_list arg) produces a null-terminated ASCII string in the output
+// buffer. The ASCII string is produced by parsing the format string
+// specified by format. Arguments are pulled from the variable argument
+// list, specified by arg, based on the contents of the format string. The
+// number of ASCII characters in the produced output buffer is returned, not
+// including the null-terminator.
+//
+// Input:
+// buffer - Pointer to a null-terminated output ASCII string buffer.
+// User is responsible for allocating the necessary memory resources!
+//
+// BufferSize - Size of the buffer in bytes.
+//
+// format - Pointer to a null-terminated format ASCII string.
+//
+// arg - Marker for the variable argument list.
+//
+// Output:
+// UINTN - number of ASCII characters in the produced output buffer, not
+// including the null-terminator.
+//
+// Referrals:
+// va_arg
+// Strtol
+// Sprintf
+// Strupr
+// I64toa
+// Itoa
+// Strlen
+//
+// Notes: Refer to Sprintf function for format string syntax.
+//
+//*************************************************************************
+UINTN Sprintf_va_list( char *buffer, char *format, va_list arg )
+{
+ return Sprintf_s_va_list( buffer, 0, format, arg );
+}
+
+//*************************************************************************
+//<AMI_PHDR_START>
+//
+// Name: Sprintf
+//
+// Description:
+// UINTN Sprintf(OUT CHAR8 *Buffer, IN CHAR8 *Format, IN ...) produces a
+// null-terminated ASCII string in the output Buffer. The ASCII string is
+// produced by parsing the format string specified by Format. Arguments are
+// pulled from the variable argument list based on the contents of the format
+// string. The number of ASCII characters in the produced output buffer is
+// returned, not including the null-terminator. See notes for format string
+// information.
+//
+// Input:
+// OUT CHAR8 *Buffer
+// Pointer to a null-terminated output ASCII string buffer. User is
+// responsible for allocating the necessary memory resources!
+//
+// IN CHAR8 *Format
+// Pointer to a null-terminated format ASCII string.
+//
+// IN ...
+// Variable argument list which provides the data/variables used within the
+// format string.
+//
+// Output:
+// UINTN number of ASCII characters in the produced output buffer, not
+// including the null-terminator.
+//
+// Modified:
+//
+// Referrals:
+// va_start
+// Sprintf_va_list
+// va_end
+//
+// Notes:
+// Objects inside the format string have the following syntax.
+// %[flags][width]type
+//
+// *** [flags] ***
+//
+// . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
+// . Flag . Description
+// . .
+// . - . The field is left justified. If flag is not specified, then
+// . . the field is right justified.
+// . .
+// . space . Prefix a space character to a number. Only valid for types X,
+// . . x, and d.
+// . .
+// . + . Prefix a plus character to a number. Only valid for types X,
+// . . x, and d. If both space and `+' are specified, then space is
+// . . ignored.
+// . .
+// . 0 . Pad with `0' characters to the left of a number. Only valid
+// . . for types X, x, and d.
+// . .
+// . L, l . The number being printed is a UINT64. Only valid for types X,
+// . . x, and d. If this flag is not specified, then the number being
+// . . printed is an int.
+// . .
+// . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
+//
+// NOTE
+// All invalid [flags] are ignored.
+//
+// *** [width] ***
+//
+// . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
+// . Width . Description
+// . .
+// . * . The width of the field is specified by a UINTN argument in the
+// . . argument list.
+// . .
+// . Number . The number specified as a decimal value represents the width of
+// . . the field.
+// . .
+// . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
+//
+// NOTE
+// If [width] is not specified, then a field width of 0 is assumed.
+//
+// *** type ***
+//
+// . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
+// . Type . Description
+// . .
+// . % . Print a `%'.
+// . .
+// . c . The argument is an ASCII character.
+// . .
+// . x . The argument is a hexadecimal number. The characters used are
+// . . 0..9 and a..f. If the flag `l' is not specified, then the
+// . . argument is assumed to be an int.
+// . .
+// . X . The argument is a hexadecimal number. The characters used are
+// . . 0..9 and A..F. If the flag `l' is not specified, then the
+// . . argument is assumed to be an int.
+// . .
+// . d . The argument is a decimal number. If the flag `l' is not
+// . . specified, then the argument is assumed to be an int.
+// . .
+// . i . The same as `d'.
+// . .
+// . s . The argument is a pointer to null-terminated ASCII string.
+// . .
+// . a . The same as `s'.
+// . .
+// . S . The argument is a pointer to a null-terminated Unicode string.
+// . .
+// . g . The argument is a pointer to a GUID structure. The GUID is
+// . . printed in the format xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.
+// . .
+// . G . The argument is a pointer to a GUID structure. The GUID is
+// . . printed in the format XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX.
+// . .
+// . r . The argument is an EFI_STATUS value. This value is converted
+// . . to a string.
+// . .
+// . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
+//
+// NOTE
+// All invalid type characters are copied into the result string.
+//
+//<AMI_PHDR_END>
+//*************************************************************************
+UINTN Sprintf( char *Buffer, char *Format, ...)
+{
+ va_list ArgList = va_start(ArgList,Format);
+ UINTN Ret = Sprintf_va_list( Buffer, Format, ArgList );
+ va_end(ArgList);
+ return Ret;
+}
+
+char* GetStatusCodeString(EFI_STATUS Status){
+ static char* EfiSuccess="EFI_SUCCESS";
+
+ if (Status == 0) return EfiSuccess;
+ if ((Status & EFI_ERROR_BIT) == 0 ){//warning
+ if ((Status & PI_WARNING_BIT) == PI_WARNING_BIT ){//PI warning
+ if (Status >= NUM_OF_PI_WARNINGS) return NULL;
+ return PiWarningStatus[Status];
+ }else{//UEFI warning
+ if (Status > NUM_OF_EFI_WARNINGS) return NULL;
+ return EfiWarningStatus[Status-1];
+ }
+ }else{//error
+ UINTN Index = Status & ~(EFI_ERROR_BIT | PI_ERROR_BIT | OEM_ERROR_BIT);
+ if ((Status & PI_ERROR_BIT) == PI_ERROR_BIT ){//PI error
+ if (Index >= NUM_OF_PI_ERRORS) return NULL;
+ return PiErrorStatus[Index];
+ }else if ((Status & OEM_ERROR_BIT) == OEM_ERROR_BIT ){//OEM error
+ if (Index > NUM_OF_AMI_ERRORS) return NULL;
+ return AmiErrorStatus[Index-1];
+ }else{//UEFI error
+ if (Index > NUM_OF_EFI_ERRORS) return NULL;
+ return EfiErrorStatus[Index-1];
+ }
+
+ }
+}
+
+//*************************************************************************
+//
+// Name: Sprintf_s_va_list
+//
+// Description:
+// UINTN Sprintf_s_va_list(OUT CHAR8 *Buffer, IN UINTN BufferSize,
+// IN CHAR8 *Format, IN va_list Marker) produces a null-terminated ASCII
+// string in the output Buffer of size BufferSize. The ASCII string is
+// produced by parsing the format string specified by Format. Arguments are
+// pulled from the variable argument list, Marker, based on the contents of
+// the format string. The number of ASCII characters in the produced output
+// buffer is returned, not including the null-terminator.
+//
+// Input:
+// OUT CHAR8 *Buffer
+// Pointer to a null-terminated output ASCII string buffer. User is
+// responsible for allocating the necessary memory resources!
+//
+// IN UINTN BufferSize
+// The size, in bytes, of the output Buffer.
+//
+// IN CHAR8 *Format
+// Pointer to a null-terminated format ASCII string.
+//
+// IN va_list Marker
+// Marker for the variable argument list.
+//
+// Output:
+// UINTN number of ASCII characters in the produced output buffer, not
+// including the null-terminator.
+//
+// Modified:
+//
+// Referrals:
+// Sprintf_va_list
+// MemCpy
+//
+// Notes:
+// This is a helper function for Sprintf_s. Refer to Sprintf function for
+// format string syntax.
+//
+//*************************************************************************
+UINTN Sprintf_s_va_list(char *Buffer, UINTN BufferSize, char *Format, va_list Marker)
+{
+ char filler;
+ int width;
+ char numbuffer[32];
+ UINTN strlength;
+ char *strp = Format;
+ char *buffp = Buffer;
+ char *_strp, *str2p;
+ int radix;
+ BOOLEAN its_int64;
+ UINTN n;
+
+ if (Buffer==NULL || Format==NULL) return -1;
+ //If BuuferSize is 0, no size check required
+ while(BufferSize!=1 && *strp) {
+ if (*strp != '%'){
+ *buffp++ = *strp++;
+ BufferSize--;
+ continue;
+ }
+ strp++; //skip %
+ if (*strp=='%') {
+ strp++;
+ *buffp++ = '%';
+ BufferSize--;
+ continue;
+ }
+
+ filler = ' ';
+
+ //Get flags
+ if (*strp == '0') {
+ filler = '0';
+ *strp++;
+ }
+
+ //Get Width
+ if (*strp == '*') { //width is supplied by argument.
+ strp++;
+ width = va_arg(Marker,int);
+ } else {
+ width = Strtol(strp,&_strp,10); //If no width, then 0 returned.
+ strp=_strp;
+ }
+
+ //Get type.
+ if (*strp == 's' || *strp == 'a'/*to be compatible with Intel Print library*/) { //string
+ char *str = va_arg(Marker,char *);
+ while (*str) {
+ if ( --BufferSize == 0 ) {
+ *buffp = 0; // null terminator
+ return buffp - Buffer;
+ }
+ *buffp++ = *str++;
+ }
+ ++strp;
+ continue;
+ }
+
+ if (*strp == 'S') { // unicode string
+ CHAR16 *str = va_arg(Marker,CHAR16 *);
+ while (*str) {
+ if ( --BufferSize == 0 ) {
+ *buffp = 0; // null terminator
+ return buffp - Buffer;
+ }
+ *buffp++ = (char)*str++;
+ }
+ ++strp;
+ continue;
+ }
+
+ if (*strp == 'c') { //character
+ *buffp++ = va_arg(Marker,char);
+ ++strp;
+ continue;
+ }
+
+ if ((*strp & 0xdf) == 'G') { //'G' or 'g'
+ EFI_GUID *guid = va_arg(Marker,EFI_GUID*);
+ CHAR8 *origp = buffp;
+
+ n = Sprintf_s(
+ buffp,
+ BufferSize,
+ "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
+ guid->Data1, guid->Data2, guid->Data3, guid->Data4[0],
+ guid->Data4[1], guid->Data4[2], guid->Data4[3], guid->Data4[4],
+ guid->Data4[5], guid->Data4[6], guid->Data4[7]
+ );
+ buffp += n;
+ if (*strp == 'G')
+ Strupr(origp);
+ BufferSize -= n;
+ ++strp;
+ continue;
+ }
+
+ if (*strp == 'r') {
+ EFI_STATUS Status = va_arg(Marker,EFI_STATUS);
+ char *StatusCodeString = GetStatusCodeString(Status);
+
+ if (StatusCodeString==NULL)
+ n = Sprintf_s( buffp, BufferSize, "%s(%X)", EfiUnknown, Status );
+ else
+ n = Sprintf_s( buffp, BufferSize, "%s", StatusCodeString );
+
+ buffp += n;
+ BufferSize -= n;
+ ++strp;
+ continue;
+ }
+
+ if (*strp == 'l') {
+ strp++;
+ its_int64 = TRUE;
+ } else
+ its_int64 = FALSE;
+
+ if (*strp == 'd' || *strp == 'i')
+ radix = 10;
+ else if ( (*strp & 0xdf) == 'X' )
+ radix = 16; //'X' or 'x'
+ else
+ continue; //invalid *strp
+
+ if (its_int64)
+ I64toa( va_arg(Marker,INT64), numbuffer, radix );
+ else
+ Itoa( va_arg(Marker,int), numbuffer, radix );
+ if (*strp == 'X')
+ Strupr(numbuffer);
+
+ strlength = Strlen(numbuffer);
+ while ( strlength++ < (unsigned)width ) {
+ if ( --BufferSize == 0 ) {
+ *buffp = 0; // null terminator
+ return buffp - Buffer;
+ }
+ *buffp++ = filler;
+ }
+
+ str2p = numbuffer;
+ while (*str2p) {
+ if ( --BufferSize == 0 ) {
+ *buffp = 0; // null terminator
+ return buffp - Buffer;
+ }
+ *buffp++ = *str2p++;
+ }
+
+ strp++;
+ }
+
+ *buffp = 0;
+ return buffp - Buffer;
+}
+
+//*************************************************************************
+//<AMI_PHDR_START>
+//
+// Name: Sprintf_s
+//
+// Description:
+// UINTN Sprintf_s(OUT CHAR8 *Buffer, IN UINTN BufferSize, IN CHAR8 *Format,
+// IN ...) produces a null-terminated ASCII string in the output Buffer of
+// size BufferSize. The ASCII string is produced by parsing the format
+// string specified by Format. Arguments are pulled from the variable
+// argument list based on the contents of the format string. The number of
+// ASCII characters in the produced output buffer is returned, not including
+// the null-terminator.
+//
+// Input:
+// OUT CHAR8 *Buffer
+// Pointer to a null-terminated output ASCII string buffer. User is
+// responsible for allocating the necessary memory resources!
+//
+// IN UINTN BufferSize
+// The size, in bytes, of the output Buffer.
+//
+// IN CHAR8 *Format
+// Pointer to a null-terminated format ASCII string.
+//
+// IN ...
+// Variable argument list of data/variables used within the format string.
+//
+// Output:
+// UINTN number of ASCII characters in the produced output buffer, not
+// including the null-terminator.
+//
+// Modified:
+//
+// Referrals:
+// va_start
+// Sprintf_s_va_list
+// va_end
+//
+// Notes:
+// Refer to Sprintf function for format string syntax.
+//
+//<AMI_PHDR_END>
+//*************************************************************************
+UINTN Sprintf_s( char *Buffer, UINTN BufferSize, char *Format, ... )
+{
+ va_list ArgList = va_start(ArgList, Format);
+ UINTN Ret = Sprintf_s_va_list( Buffer, BufferSize, Format, ArgList );
+ va_end(ArgList);
+ return Ret;
+}
+
+//*************************************************************************
+//
+// Name: Swprintf_va_list
+//
+// Description:
+// UINTN Swprintf_va_list(OUT CHAR16 *buffer, IN CHAR16 *format,
+// IN va_list arg) produces a null-terminated Unicode string in the output
+// buffer. The Unicode string is produced by parsing the format string
+// specified by format. Arguments are pulled from the variable argument list
+// specified by arg based on the contents of the format string. The number
+// of Unicode characters in the produced output buffer is returned, not
+// including the null-terminator.
+//
+// Input:
+// OUT CHAR16 *buffer
+// Pointer to a null-terminated output Unicode string buffer. User is
+// responsible for allocating the necessary memory resources!
+//
+// IN CHAR16 *format
+// Pointer to a null-terminated format Unicode string.
+//
+// IN va_list arg
+// Marker for the variable argument list.
+//
+// Output:
+// UINTN number of Unicode characters in the produced output buffer, not
+// including the null-terminator.
+//
+// Modified:
+//
+// Referrals:
+// va_arg
+// Wcstol
+// Swprintf
+// Wcsupr
+// I64tow
+// Itow
+// Wcslen
+//
+// Notes:
+// Refer to Sprintf function for format string syntax.
+//
+//*************************************************************************
+UINTN Swprintf_va_list(CHAR16 *buffer, CHAR16 *format, va_list arg)
+{
+ return Swprintf_s_va_list( buffer, 0, format, arg );
+}
+
+//*************************************************************************
+//<AMI_PHDR_START>
+//
+// Name: Swprintf
+//
+// Description:
+// UINTN Swprintf(OUT CHAR16 *Buffer, IN CHAR16 *Format, IN ...) produces a
+// null-terminated Unicode string in the output Buffer. The Unicode string is
+// produced by parsing the format string specified by Format. Arguments are
+// pulled from the variable argument list based on the contents of the format
+// string. The number of Unicode characters in the produced output buffer is
+// returned, not including the null-terminator.
+//
+// Input:
+// OUT CHAR16 *Buffer
+// Pointer to a null-terminated output Unicode string buffer. User is
+// responsible for allocating the necssary memory resources!
+//
+// IN CHAR16 *Format
+// Pointer to a null-terminated format Unicode string.
+//
+// IN ...
+// Variable arguement list of data/variables used within the format string.
+//
+// Output:
+// UINTN number of Unicode characters in the produced output buffer, not
+// including the null-terminator.
+//
+// Modified:
+//
+// Referrals:
+// va_start
+// Swprintf_va_list
+// va_end
+//
+// Notes:
+// See Sprintf function for format string details.
+//
+//<AMI_PHDR_END>
+//*************************************************************************
+UINTN Swprintf(CHAR16 *Buffer, CHAR16 *Format, ...)
+{
+ va_list ArgList = va_start(ArgList,Format);
+ UINTN Ret = Swprintf_va_list(Buffer,Format,ArgList);
+ va_end(ArgList);
+ return Ret;
+}
+
+//*************************************************************************
+//
+// Name: Swprintf_s_va_list
+//
+// Description:
+// UINTN Swprintf_s_va_list(OUT CHAR16 *Buffer, IN UINTN BufferSize,
+// IN CHAR16 *Format, IN va_list Marker) produces a null-terminated Unicode
+// string in the output Buffer of size BufferSize. The Unicode string is
+// produced by parsing the format string specified by Format. Arguments are
+// pulled from the variable argument list based on the contents of the format
+// string. The number of Unicode characters in the produced output buffer is
+// returned, not including the null-terminator.
+//
+// Input:
+// OUT CHAR16 *Buffer
+// Pointer to a null-terminated output Unicode string buffer. User is
+// responsible for allocating the necessary memory resources!
+//
+// IN UINTN BufferSize
+// The size, in bytes, of the output Buffer.
+//
+// IN CHAR16 *Format
+// Pointer to a null-terminated format Unicode string.
+//
+// IN va_list Marker
+// Marker for the variable argument list.
+//
+// Output:
+// UINTN number of ASCII characters in the produced output buffer, not
+// including the null-terminator.
+//
+// Modified:
+//
+// Referrals:
+// Swprintf_va_list
+// MemCpy
+//
+// Notes:
+// This is a helper function for Swprintf_s. Refer to Sprintf function for
+// format string syntax.
+//
+//*************************************************************************
+UINTN Swprintf_s_va_list(CHAR16 *Buffer, UINTN BufferSize, CHAR16 *Format, va_list Marker)
+{
+ CHAR16 filler;
+ int width;
+ CHAR16 numbuffer[32];
+ UINTN strlength;
+ CHAR16 *strp = Format;
+ CHAR16 *buffp = Buffer;
+ CHAR16 *_strp, *str2p;
+ int radix;
+ BOOLEAN its_int64;
+ UINTN n;
+
+ if (Buffer==NULL || Format==NULL) return -1;
+ //If BuuferSize is 0, no size check required
+ while(BufferSize!=1 && *strp) {
+ if (*strp != '%'){
+ *buffp++ = *strp++;
+ BufferSize--;
+ continue;
+ }
+ strp++; //skip %
+ if (*strp=='%') {
+ strp++;
+ *buffp++ = '%';
+ BufferSize--;
+ continue;
+ }
+
+ filler = ' ';
+
+ //Get flags
+ if (*strp == '0') {
+ filler = '0';
+ *strp++;
+ }
+
+ //Get Width
+ if (*strp == '*') { //width is supplied by argument.
+ strp++;
+ width = va_arg(Marker, int);
+ } else {
+ width = Wcstol( strp, &_strp, 10 ); //If no width, then 0 returned.
+ strp=_strp;
+ }
+
+ //Get type.
+ if (*strp == 's') { // unicode string
+ CHAR16 *str = va_arg(Marker, CHAR16*);
+ while (*str) {
+ if ( --BufferSize == 0 ) {
+ *buffp = 0; // null terminator
+ return buffp - Buffer;
+ }
+ *buffp++ = *str++;
+ }
+ ++strp;
+ continue;
+ }
+
+ if ( *strp == 'S' || *strp == 'a' /*to be compatible with Intel Print library*/ ) { //string
+ char *str = va_arg(Marker, char *);
+ while (*str) {
+ if ( --BufferSize == 0 ) {
+ *buffp = 0; // null terminator
+ return buffp - Buffer;
+ }
+ *buffp++ = *str++;
+ }
+ ++strp;
+ continue;
+ }
+
+ if (*strp == 'c') { //character
+ *buffp++ = va_arg(Marker, CHAR16);
+ ++strp;
+ continue;
+ }
+
+ if ((*strp & 0xdf) == 'G') { //'G' or 'g'
+ EFI_GUID *guid = va_arg(Marker, EFI_GUID*);
+ CHAR16 *origp = buffp;
+ n = Swprintf_s(
+ buffp,
+ BufferSize,
+ L"%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
+ guid->Data1, guid->Data2, guid->Data3, guid->Data4[0],
+ guid->Data4[1], guid->Data4[2], guid->Data4[3], guid->Data4[4],
+ guid->Data4[5], guid->Data4[6], guid->Data4[7]
+ );
+ buffp += n;
+ if (*strp == 'G')
+ Wcsupr(origp);
+ BufferSize -= n;
+ ++strp;
+ continue;
+ }
+
+ if (*strp == 'r') {
+ EFI_STATUS Status = va_arg(Marker, EFI_STATUS);
+ char *StatusCodeString = GetStatusCodeString(Status);
+
+ if (StatusCodeString==NULL)
+ n = Swprintf_s( buffp, BufferSize, L"%S(%X)", EfiUnknown, Status );
+ else
+ n = Swprintf_s( buffp, BufferSize, L"%S", StatusCodeString );
+
+ buffp += n;
+ BufferSize -= n;
+ ++strp;
+ continue;
+ }
+
+ if (*strp == 'l') {
+ strp++;
+ its_int64 = TRUE;
+ } else
+ its_int64 = FALSE;
+
+ if (*strp == 'd' || *strp == 'i')
+ radix = 10;
+ else if ((*strp & 0xdf) == 'X')
+ radix = 16; //'X' or 'x'
+ else
+ continue; //invalid *strp
+
+ if (its_int64)
+ I64tow( va_arg(Marker,INT64), numbuffer, radix );
+ else
+ Itow( va_arg(Marker,int), numbuffer, radix );
+ if (*strp == 'X')
+ Wcsupr(numbuffer);
+
+ strlength = Wcslen(numbuffer);
+ while ( strlength++ < (unsigned)width ) {
+ if ( --BufferSize == 0 ) {
+ *buffp = 0; // null terminator
+ return buffp - Buffer;
+ }
+ *buffp++ = filler;
+ }
+
+ str2p = numbuffer;
+ while (*str2p) {
+ if ( --BufferSize == 0 ) {
+ *buffp = 0; // null terminator
+ return buffp - Buffer;
+ }
+ *buffp++ = *str2p++;
+ }
+
+ strp++;
+ }
+
+ *buffp = 0;
+ return buffp - Buffer;
+}
+
+//*************************************************************************
+//<AMI_PHDR_START>
+//
+// Name: Swprintf_s
+//
+// Description:
+// UINTN Swprintf_s(OUT CHAR16 *Buffer, IN UINTN BufferSize,
+// IN CHAR16 *Format, IN ...) produces a null-terminated Unicode string in
+// the output Buffer of size BufferSize. The Unicode string is produced by
+// parsing the format string specified by Format. Arguments are pulled from
+// the variable argument list based on the contents of the format string.
+// The number of Unicode characters in the produced output buffer is
+// returned, not including the null-terminator.
+//
+// Input:
+// OUT CHAR16 *Buffer
+// Pointer to a null-terminated output Unicode string buffer. User is
+// responsible for allocating the necessary memory resources!
+//
+// IN UINTN BufferSize
+// The size, in bytes, of the output Buffer.
+//
+// IN CHAR16 *Format
+// Pointer to a null-terminated format Unicode string.
+//
+// IN ...
+// Variable argument list of data/variables used within the format string.
+//
+// Output:
+// UINTN number of Unicode characters in the produced output buffer, not
+// including the null-terminator.
+//
+// Modified:
+//
+// Referrals:
+// va_start
+// Swprintf_s_va_list
+// va_end
+//
+// Notes:
+// Refer to Sprintf function for format string syntax.
+//
+//<AMI_PHDR_END>
+//*************************************************************************
+UINTN Swprintf_s(CHAR16 *Buffer, UINTN BufferSize, CHAR16 *Format, ...)
+{
+ va_list ArgList = va_start(ArgList,Format);
+ UINTN Ret = Swprintf_s_va_list(Buffer,BufferSize,Format,ArgList);
+ va_end(ArgList);
+ return Ret;
+}
+//*************************************************************************
+//*************************************************************************
+//** **
+//** (C)Copyright 1985-2009, American Megatrends, Inc. **
+//** **
+//** All Rights Reserved. **
+//** **
+//** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 **
+//** **
+//** Phone: (770)-246-8600 **
+//** **
+//*************************************************************************
+//*************************************************************************