| /** @file | |
| The header <stdlib.h> declares five types and several functions of general | |
| utility, and defines several macros. | |
| The files stddef.h and stdlib.h are "catch all" headers for definitions and declarations | |
| that don't fit well in the other headers. There are two separate header files because | |
| the contents of <stddef.h> are valid in both freestanding and hosted environment, while the | |
| header <stdlib.h> contains elements that are only valid in a hosted environment. | |
| The following macros are defined in this file:<BR> | |
| @verbatim | |
| EXIT_FAILURE An expression indicating application failure, used as an argument to exit(). | |
| EXIT_SUCCESS An expression indicating application success, used as an argument to exit(). | |
| RAND_MAX The maximum value returned by the rand function. | |
| MB_CUR_MAX Maximum number of bytes in a multibyte character for the current locale. | |
| ATEXIT_MAX Maximum number of routines that may be registered by the atexit function. | |
| @endverbatim | |
| The following types are defined in this file:<BR> | |
| @verbatim | |
| size_t Unsigned integer type of the result of the sizeof operator. | |
| wchar_t The type of a wide character. | |
| div_t Type of the value returned by the div function. | |
| ldiv_t Type of the value returned by the ldiv function. | |
| lldiv_t Type of the value returned by the lldiv function. | |
| @endverbatim | |
| The following functions are declared in this file:<BR> | |
| @verbatim | |
| ################ Communication with the environment | |
| void abort (void) __noreturn; | |
| int atexit (void (*)(void)); | |
| void exit (int status) __noreturn; | |
| void _Exit (int status) __noreturn; | |
| char *getenv (const char *name); | |
| int setenv (register const char * name, | |
| register const char * value, int rewrite); | |
| int system (const char *string); | |
| ################ Integer arithmetic functions | |
| int abs (int j); | |
| long labs (long j); | |
| long long llabs (long long j); | |
| div_t div (int numer, int denom); | |
| ldiv_t ldiv (long numer, long denom); | |
| lldiv_t lldiv (long long numer, long long denom); | |
| ################ Pseudo-random sequence generation functions | |
| int rand (void); | |
| void srand (unsigned seed); | |
| ################ Memory management functions | |
| void *calloc (size_t Num, size_t Size); | |
| void free (void *); | |
| void *malloc (size_t); | |
| void *realloc (void *Ptr, size_t NewSize); | |
| ################ Searching and Sorting utilities | |
| void *bsearch (const void *key, const void *base0, | |
| size_t nmemb, size_t size, | |
| int (*compar)(const void *, const void *)); | |
| void qsort (void *base, size_t nmemb, size_t size, | |
| int (*compar)(const void *, const void *)); | |
| ################ Multibyte/wide character conversion functions | |
| int mblen (const char *, size_t); | |
| int mbtowc (wchar_t * __restrict, const char * __restrict, size_t); | |
| int wctomb (char *, wchar_t); | |
| ################ Multibyte/wide string conversion functions | |
| size_t mbstowcs (wchar_t * __restrict dest, | |
| const char * __restrict src, size_t limit); | |
| size_t wcstombs (char * __restrict dest, | |
| const wchar_t * __restrict src, size_t limit); | |
| ################ Miscelaneous functions for *nix compatibility | |
| char *realpath (char *file_name, char *resolved_name); | |
| const char *getprogname (void); | |
| void setprogname (const char *progname); | |
| ############ Integer Numeric conversion functions | |
| int atoi (const char *nptr); | |
| long atol (const char *nptr); | |
| long long atoll (const char *nptr); | |
| long strtol (const char * __restrict nptr, | |
| char ** __restrict endptr, int base); | |
| unsigned long strtoul (const char * __restrict nptr, | |
| char ** __restrict endptr, int base); | |
| long long strtoll (const char * __restrict nptr, | |
| char ** __restrict endptr, int base); | |
| unsigned long long strtoull (const char * __restrict nptr, | |
| char ** __restrict endptr, int base); | |
| ######### Floating-point Numeric conversion functions | |
| double atof (const char *); | |
| double strtod (const char * __restrict nptr, | |
| char ** __restrict endptr); | |
| float strtof (const char * __restrict nptr, | |
| char ** __restrict endptr); | |
| long double strtold (const char * __restrict nptr, | |
| char ** __restrict endptr); | |
| @endverbatim | |
| Copyright (c) 2010 - 2012, Intel Corporation. All rights reserved.<BR> | |
| This program and the accompanying materials are licensed and made available under | |
| the terms and conditions of the BSD License that accompanies this distribution. | |
| The full text of the license may be found at | |
| http://opensource.org/licenses/bsd-license. | |
| THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | |
| WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | |
| **/ | |
| #ifndef _STDLIB_H | |
| #define _STDLIB_H | |
| #include <sys/EfiCdefs.h> | |
| #ifdef _EFI_SIZE_T_ | |
| /** Unsigned integer type of the result of the sizeof operator. **/ | |
| typedef _EFI_SIZE_T_ size_t; | |
| #undef _EFI_SIZE_T_ | |
| #undef _BSD_SIZE_T_ | |
| #endif | |
| #ifndef __cplusplus | |
| #ifdef _EFI_WCHAR_T | |
| /** Type of a wide (Unicode) character. **/ | |
| typedef _EFI_WCHAR_T wchar_t; | |
| #undef _EFI_WCHAR_T | |
| #undef _BSD_WCHAR_T_ | |
| #endif | |
| #endif | |
| /// A structure type that is the type of the value returned by the div function. | |
| typedef struct { | |
| int quot; /**< quotient */ | |
| int rem; /**< remainder */ | |
| } div_t; | |
| /// A structure type that is the type of the value returned by the ldiv function. | |
| typedef struct { | |
| long quot; | |
| long rem; | |
| } ldiv_t; | |
| /// A structure type that is the type of the value returned by the lldiv function. | |
| typedef struct { | |
| long long quot; | |
| long long rem; | |
| } lldiv_t; | |
| /** @{ | |
| Expand to integer constant expressions that can be used as the argument to | |
| the exit function to return unsuccessful or successful termination status, | |
| respectively, to the host environment. | |
| **/ | |
| #define EXIT_FAILURE 1 | |
| #define EXIT_SUCCESS 0 | |
| /*@}*/ | |
| /** Expands to an integer constant expression that is the maximum value | |
| returned by the rand function. | |
| **/ | |
| #define RAND_MAX 0x7fffffff | |
| /** Expands to a positive integer expression with type size_t that is the | |
| maximum number of bytes in a multibyte character for the extended character | |
| set specified by the current locale (category LC_CTYPE), which is never | |
| greater than MB_LEN_MAX. | |
| Since UEFI only supports the Unicode Base Multilingual Plane (BMP), | |
| correctly formed characters will only produce 1, 2, or 3-byte UTF-8 characters. | |
| **/ | |
| #define MB_CUR_MAX 3 | |
| /** Maximum number of functions that can be registered by atexit. | |
| The C standard states that the implementation shall support the | |
| registration of at least 32 functions. | |
| **/ | |
| #define ATEXIT_MAX 32 | |
| __BEGIN_DECLS | |
| /* ################ Communication with the environment ################## */ | |
| /** The abort function causes abnormal program termination to occur, unless | |
| the signal SIGABRT is being caught and the signal handler does not return. | |
| Open streams with unwritten buffered data are not flushed, open | |
| streams are not closed, and temporary files are not removed by abort. | |
| Unsuccessful termination is returned to the host environment by means of | |
| the function call, raise(SIGABRT). | |
| @sa signal.h | |
| **/ | |
| void abort(void) __noreturn; | |
| /** The atexit function registers the function pointed to by func, to be | |
| called without arguments at normal program termination. | |
| The implementation supports the registration of up to 32 functions. | |
| @param[in] Handler Pointer to the function to register as one of the | |
| routines to call at application exit time. | |
| @return The atexit function returns zero if the registration succeeds, | |
| nonzero if it fails. | |
| **/ | |
| int atexit(void (*Handler)(void)); | |
| /** The exit function causes normal program termination to occur. If more than | |
| one call to the exit function is executed by a program, | |
| the behavior is undefined. | |
| First, all functions registered by the atexit function are called, in the | |
| reverse order of their registration, except that a function is called | |
| after any previously registered functions that had already been called at | |
| the time it was registered. If, during the call to any such function, a | |
| call to the longjmp function is made that would terminate the call to the | |
| registered function, the behavior is undefined. | |
| Next, all open streams with unwritten buffered data are flushed, all open | |
| streams are closed, and all files created by the tmpfile function | |
| are removed. | |
| Finally, control is returned to the host environment. | |
| @param[in] status A value to be returned when the application exits. | |
| @return If the value of status is zero, or EXIT_SUCCESS, status is | |
| returned unchanged. If the value of status is EXIT_FAILURE, | |
| RETURN_ABORTED is returned. Otherwise, status is returned unchanged. | |
| **/ | |
| void exit(int status) __noreturn; | |
| /** The _Exit function causes normal program termination to occur and control | |
| to be returned to the host environment. | |
| No functions registered by the atexit function or signal handlers | |
| registered by the signal function are called. Open streams with unwritten | |
| buffered data are not flushed, open streams are not closed, and temporary | |
| files are not removed by abort. | |
| The status returned to the host environment is determined in the same way | |
| as for the exit function. | |
| @param[in] status A value to be returned when the application exits. | |
| @return If the value of status is zero, or EXIT_SUCCESS, status is | |
| returned unchanged. If the value of status is EXIT_FAILURE, | |
| RETURN_ABORTED is returned. Otherwise, status is returned unchanged. | |
| **/ | |
| void _Exit(int status) __noreturn; | |
| /** The getenv function searches an environment list, provided by the host | |
| environment, for a string that matches the string pointed to by name. The | |
| set of environment names and the method for altering the environment list | |
| are determined by the underlying UEFI Shell implementation. | |
| @param[in] name Pointer to a string naming the environment variable to retrieve. | |
| @return The getenv function returns a pointer to a string associated with | |
| the matched list member. The string pointed to shall not be | |
| modified by the program, but may be overwritten by a subsequent | |
| call to the getenv function. If the specified name cannot be | |
| found, a null pointer is returned. | |
| **/ | |
| char *getenv(const char *name); | |
| /** Add or update a variable in the environment list. | |
| @param[in] name Address of a zero terminated name string. | |
| @param[in] value Address of a zero terminated value string. | |
| @param[in] rewrite TRUE allows overwriting existing values. | |
| @retval 0 Returns 0 upon success. | |
| @retval -1 Returns -1 upon failure, sets errno with more information. | |
| **/ | |
| int | |
| setenv ( | |
| register const char * name, | |
| register const char * value, | |
| int rewrite | |
| ); | |
| /** If string is a null pointer, the system function determines whether the | |
| host environment has a command processor. If string is not a null pointer, | |
| the system function passes the string pointed to by string to that command | |
| processor to be executed in a manner which the implementation shall | |
| document; this might then cause the program calling system to behave in a | |
| non-conforming manner or to terminate. | |
| @param[in] string Pointer to the command string to be executed. | |
| @return If the argument is a null pointer, the system function returns | |
| nonzero only if a command processor is available. If the argument | |
| is not a null pointer, and the system function does return, it | |
| returns an implementation-defined value. | |
| **/ | |
| int system(const char *string); | |
| /* ################ Integer arithmetic functions ######################## */ | |
| /** Computes the absolute value of an integer j. | |
| @param[in] j The value to find the absolute value of. | |
| @return The absolute value of j. | |
| **/ | |
| int abs(int j); | |
| /** Computes the absolute value of a long integer j. | |
| @param[in] j The value to find the absolute value of. | |
| @return The absolute value of j. | |
| **/ | |
| long labs(long j); | |
| /** Computes the absolute value of a long long integer j. | |
| @param[in] j The value to find the absolute value of. | |
| @return The absolute value of j. | |
| **/ | |
| long long | |
| llabs(long long j); | |
| /** Computes numer / denom and numer % denom in a single operation. | |
| @param[in] numer The numerator for the division. | |
| @param[in] denom The denominator for the division. | |
| @return Returns a structure of type div_t, comprising both the | |
| quotient and the remainder. | |
| **/ | |
| div_t div(int numer, int denom); | |
| /** Computes numer / denom and numer % denom in a single operation. | |
| @param[in] numer The numerator for the division. | |
| @param[in] denom The denominator for the division. | |
| @return Returns a structure of type ldiv_t, comprising both the | |
| quotient and the remainder. | |
| **/ | |
| ldiv_t ldiv(long numer, long denom); | |
| /** Computes numer / denom and numer % denom in a single operation. | |
| @param[in] numer The numerator for the division. | |
| @param[in] denom The denominator for the division. | |
| @return Returns a structure of type lldiv_t, comprising both the | |
| quotient and the remainder. | |
| **/ | |
| lldiv_t lldiv(long long numer, long long denom); | |
| /* ############ Integer Numeric conversion functions #################### */ | |
| /** The atoi function converts the initial portion of the string pointed to by | |
| nptr to int representation. Except for the behavior on error, it is | |
| equivalent to: | |
| - atoi: (int)strtol(nptr, (char **)NULL, 10) | |
| @param[in] nptr Pointer to the string to be converted. | |
| @return The atoi function returns the converted value. | |
| **/ | |
| int atoi(const char *nptr); | |
| /** The atol function converts the initial portion of the string pointed to by | |
| nptr to long int representation. Except for the behavior on error, it is | |
| equivalent to: | |
| - atol: strtol(nptr, (char **)NULL, 10) | |
| @param[in] nptr Pointer to the string to be converted. | |
| @return The atol function returns the converted value. | |
| **/ | |
| long atol(const char *nptr); | |
| /** The atoll function converts the initial portion of the string pointed to by | |
| nptr to long long int representation. Except for the behavior on error, it | |
| is equivalent to: | |
| - atoll: strtoll(nptr, (char **)NULL, 10) | |
| @param[in] nptr Pointer to the string to be converted. | |
| @return The atoll function returns the converted value. | |
| **/ | |
| long long | |
| atoll(const char *nptr); | |
| /** The strtol, strtoll, strtoul, and strtoull functions convert the initial | |
| portion of the string pointed to by nptr to long int, long long int, | |
| unsigned long int, and unsigned long long int representation, respectively. | |
| First, they decompose the input string into three parts: an initial, | |
| possibly empty, sequence of white-space characters (as specified by the | |
| isspace function), a subject sequence resembling an integer represented in | |
| some radix determined by the value of base, and a final string of one or | |
| more unrecognized characters, including the terminating null character of | |
| the input string. Then, they attempt to convert the subject sequence to an | |
| integer, and return the result. | |
| If the value of base is zero, the expected form of the subject sequence is | |
| that of an integer constant, optionally preceded | |
| by a plus or minus sign, but not including an integer suffix. If the value | |
| of base is between 2 and 36 (inclusive), the expected form of the subject | |
| sequence is a sequence of letters and digits representing an integer with | |
| the radix specified by base, optionally preceded by a plus or minus sign, | |
| but not including an integer suffix. The letters from a (or A) through z | |
| (or Z) are ascribed the values 10 through 35; only letters and digits whose | |
| ascribed values are less than that of base are permitted. If the value of | |
| base is 16, the characters 0x or 0X may optionally precede the sequence of | |
| letters and digits, following the sign if present. | |
| The subject sequence is defined as the longest initial subsequence of the | |
| input string, starting with the first non-white-space character, that is of | |
| the expected form. The subject sequence contains no characters if the input | |
| string is empty or consists entirely of white space, or if the first | |
| non-white-space character is other than a sign or a permissible letter or digit. | |
| If the subject sequence has the expected form and the value of base is | |
| zero, the sequence of characters starting with the first digit is | |
| interpreted as an integer constant. If the subject sequence has the | |
| expected form and the value of base is between 2 and 36, it is used as the | |
| base for conversion, ascribing to each letter its value as given above. If | |
| the subject sequence begins with a minus sign, the value resulting from the | |
| conversion is negated (in the return type). A pointer to the final string | |
| is stored in the object pointed to by endptr, provided that endptr is | |
| not a null pointer. | |
| In other than the "C" locale, additional locale-specific subject sequence | |
| forms may be accepted. | |
| If the subject sequence is empty or does not have the expected form, no | |
| conversion is performed; the value of nptr is stored in the object pointed | |
| to by endptr, provided that endptr is not a null pointer. | |
| @param[in] nptr Pointer to the string to be converted. | |
| @param[out] endptr If not NULL, points to an object to receive a pointer to the final string. | |
| @param[in] base The base, 0 to 36, of the number represented by the input string. | |
| @return The strtol, strtoll, strtoul, and strtoull functions return the | |
| converted value, if any. If no conversion could be performed, zero | |
| is returned. If the correct value is outside the range of | |
| representable values, LONG_MIN, LONG_MAX, LLONG_MIN, LLONG_MAX, | |
| ULONG_MAX, or ULLONG_MAX is returned (according to the return type | |
| and sign of the value, if any), and the value of the macro ERANGE | |
| is stored in errno. | |
| **/ | |
| long strtol(const char * __restrict nptr, char ** __restrict endptr, int base); | |
| /** The strtoul function converts the initial portion of the string pointed to | |
| by nptr to unsigned long int representation. | |
| See the description for strtol for more information. | |
| @param[in] nptr Pointer to the string to be converted. | |
| @param[out] endptr If not NULL, points to an object to receive a pointer to the final string. | |
| @param[in] base The base, 0 to 36, of the number represented by the input string. | |
| @return The strtoul function returns the converted value, if any. If no | |
| conversion could be performed, zero is returned. If the correct | |
| value is outside the range of representable values, ULONG_MAX is | |
| returned and the value of the macro ERANGE is stored in errno. | |
| **/ | |
| unsigned long | |
| strtoul(const char * __restrict nptr, char ** __restrict endptr, int base); | |
| /** The strtoll function converts the initial portion of the string pointed to | |
| by nptr to long long int representation. | |
| See the description for strtol for more information. | |
| @param[in] nptr Pointer to the string to be converted. | |
| @param[out] endptr If not NULL, points to an object to receive a pointer to the final string. | |
| @param[in] base The base, 0 to 36, of the number represented by the input string. | |
| @return The strtoll function returns the converted value, if any. If no | |
| conversion could be performed, zero is returned. If the correct | |
| value is outside the range of representable values, LLONG_MIN or | |
| LLONG_MAX is returned (according to the sign of the value, if any), | |
| and the value of the macro ERANGE is stored in errno. | |
| **/ | |
| long long | |
| strtoll(const char * __restrict nptr, char ** __restrict endptr, int base); | |
| /** The strtoull function converts the initial portion of the string pointed to | |
| by nptr to unsigned long long int representation. | |
| See the description for strtol for more information. | |
| @param[in] nptr Pointer to the string to be converted. | |
| @param[out] endptr If not NULL, points to an object to receive a pointer to the final string. | |
| @param[in] base The base, 0 to 36, of the number represented by the input string. | |
| @return The strtoull function returns the converted value, if any. If no | |
| conversion could be performed, zero is returned. If the correct | |
| value is outside the range of representable values, ULLONG_MAX is | |
| returned and the value of the macro ERANGE is stored in errno. | |
| **/ | |
| unsigned long long | |
| strtoull(const char * __restrict nptr, char ** __restrict endptr, int base); | |
| /* ######### Floating-point Numeric conversion functions ################ */ | |
| /** Convert the initial part of a string to double representation. | |
| @param[in] nptr Pointer to the string to be converted. | |
| @return The floating-point value representing the string nptr. | |
| **/ | |
| double atof(const char *nptr); | |
| /** @{ | |
| The strtod, strtof, and strtold functions convert the initial portion of | |
| the string pointed to by nptr to double, float, and long double | |
| representation, respectively. First, they decompose the input string into | |
| three parts: an initial, possibly empty, sequence of white-space characters | |
| (as specified by the isspace function), a subject sequence resembling a | |
| floating-point constant or representing an infinity or NaN; and a final | |
| string of one or more unrecognized characters, including the terminating | |
| null character of the input string. Then, they attempt to convert the | |
| subject sequence to a floating-point number, and return the result. | |
| */ | |
| /** Convert a string to a double and point to the character after the last converted. | |
| @param[in] nptr Pointer to the string to be converted. | |
| @param[out] endptr If not NULL, points to an object to receive a pointer to the final string. | |
| @return A floating-point value representing the string nptr. | |
| A pointer to the final string is stored in the object pointed to | |
| by endptr, provided that endptr is not a null pointer. | |
| If the subject sequence is empty or does not have the expected | |
| form, no conversion is performed; the value of nptr is stored in | |
| the object pointed to by endptr, provided that endptr is not a null pointer. | |
| **/ | |
| double strtod(const char * __restrict nptr, char ** __restrict endptr); | |
| /** Convert a string to a float and point to the character after the last converted. | |
| @param[in] nptr Pointer to the string to be converted. | |
| @param[out] endptr If not NULL, points to an object to receive a pointer to the final string. | |
| @return A floating-point value representing the string nptr. | |
| A pointer to the final string is stored in the object pointed to | |
| by endptr, provided that endptr is not a null pointer. | |
| If the subject sequence is empty or does not have the expected | |
| form, no conversion is performed; the value of nptr is stored in | |
| the object pointed to by endptr, provided that endptr is not a null pointer. | |
| **/ | |
| float strtof(const char * __restrict nptr, char ** __restrict endptr); | |
| /** Convert a string to a long double and point to the character after the last converted. | |
| @param[in] nptr Pointer to the string to be converted. | |
| @param[out] endptr If not NULL, points to an object to receive a pointer to the final string. | |
| @return A floating-point value representing the string nptr. | |
| A pointer to the final string is stored in the object pointed to | |
| by endptr, provided that endptr is not a null pointer. | |
| If the subject sequence is empty or does not have the expected | |
| form, no conversion is performed; the value of nptr is stored in | |
| the object pointed to by endptr, provided that endptr is not a null pointer. | |
| **/ | |
| long double | |
| strtold(const char * __restrict nptr, char ** __restrict endptr); | |
| /*@}*/ | |
| /* ################ Pseudo-random sequence generation functions ######### */ | |
| /** The rand function computes a sequence of pseudo-random integers in the | |
| range 0 to RAND_MAX. | |
| @return The rand function returns a pseudo-random integer. | |
| **/ | |
| int rand(void); | |
| /** The srand function uses the argument as a seed for a new sequence of | |
| pseudo-random numbers to be returned by subsequent calls to rand. | |
| If srand is then called with the same seed value, the sequence of | |
| pseudo-random numbers shall be repeated. If rand is called before any calls | |
| to srand have been made, the same sequence shall be generated as when srand | |
| is first called with a seed value of 1. | |
| @param[in] seed The value used to "seed" the random number generator with. | |
| **/ | |
| void srand(unsigned seed); | |
| /* ################ Memory management functions ######################### */ | |
| /** The calloc function allocates space for an array of Num objects, each of | |
| whose size is Size. The space is initialized to all bits zero. | |
| @param[in] Num The number of objects to allocate space for. | |
| @param[in] Size The size, in bytes, of each object. | |
| @return NULL is returned if the space could not be allocated and errno | |
| contains the cause. Otherwise, a pointer to an 8-byte aligned | |
| region of the requested size is returned. | |
| **/ | |
| void *calloc(size_t Num, size_t Size); | |
| /** The free function causes the space pointed to by Ptr to be deallocated, | |
| that is, made available for further allocation. | |
| If Ptr is a null pointer, no action occurs. Otherwise, if the argument | |
| does not match a pointer earlier returned by the calloc, malloc, or realloc | |
| function, or if the space has been deallocated by a call to free or | |
| realloc, the behavior is undefined. | |
| @param Ptr Pointer to a previously allocated region of memory to be freed. | |
| **/ | |
| void free(void *Ptr); | |
| /** The malloc function allocates space for an object whose size is specified | |
| by size and whose value is indeterminate. | |
| This implementation uses the UEFI memory allocation boot services to get a | |
| region of memory that is 8-byte aligned and of the specified size. The | |
| region is allocated with type EfiLoaderData. | |
| @param Size Size, in bytes, of the region to allocate. | |
| @return NULL is returned if the space could not be allocated and errno | |
| contains the cause. Otherwise, a pointer to an 8-byte aligned | |
| region of the requested size is returned.<BR> | |
| If NULL is returned, errno may contain: | |
| - EINVAL: Requested Size is zero. | |
| - ENOMEM: Memory could not be allocated. | |
| **/ | |
| void *malloc(size_t Size); | |
| /** The realloc function changes the size of the object pointed to by Ptr to | |
| the size specified by NewSize. | |
| The contents of the object are unchanged up to the lesser of the new and | |
| old sizes. If the new size is larger, the value of the newly allocated | |
| portion of the object is indeterminate. | |
| If Ptr is a null pointer, the realloc function behaves like the malloc | |
| function for the specified size. | |
| If Ptr does not match a pointer earlier returned by the calloc, malloc, or | |
| realloc function, or if the space has been deallocated by a call to the free | |
| or realloc function, the behavior is undefined. | |
| If the space cannot be allocated, the object pointed to by Ptr is unchanged. | |
| If NewSize is zero and Ptr is not a null pointer, the object it points to | |
| is freed. | |
| This implementation uses the UEFI memory allocation boot services to get a | |
| region of memory that is 8-byte aligned and of the specified size. The | |
| region is allocated with type EfiLoaderData. | |
| @param Ptr Pointer to a previously allocated region of memory to be resized. | |
| @param NewSize Size, in bytes, of the new object to allocate space for. | |
| @return NULL is returned if the space could not be allocated and errno | |
| contains the cause. Otherwise, a pointer to an 8-byte aligned | |
| region of the requested size is returned. If NewSize is zero, | |
| NULL is returned and errno will be unchanged. | |
| **/ | |
| void *realloc(void *Ptr, size_t NewSize); | |
| /* ################ Searching and Sorting utilities ##################### */ | |
| /** The bsearch function searches an array of Nmemb objects, the initial | |
| element of which is pointed to by Base, for an element that matches the | |
| object pointed to by Key. The size of each element of the array is | |
| specified by Size. | |
| The comparison function pointed to by Compar is called with two arguments | |
| that point to the Key object and to an array element, in that order. The | |
| function returns an integer less than, equal to, or greater than zero if | |
| the Key object is considered, respectively, to be less than, to match, or | |
| to be greater than the array element. The array consists of: all the | |
| elements that compare less than, all the elements that compare equal to, | |
| and all the elements that compare greater than the key object, | |
| in that order. | |
| @param[in] Key Pointer to the object to search for. | |
| @param[in] Base Pointer to the first element of an array to search. | |
| @param[in] Nmemb Number of objects in the search array. | |
| @param[in] Size The size of each object in the search array. | |
| @param[in] Compar Pointer to the function used to compare two objects. | |
| @return The bsearch function returns a pointer to a matching element of the | |
| array, or a null pointer if no match is found. If two elements | |
| compare as equal, which element is matched is unspecified. | |
| **/ | |
| void *bsearch( const void *Key, const void *Base, | |
| size_t Nmemb, size_t Size, | |
| int (*Compar)(const void *, const void *) | |
| ); | |
| /** The qsort function sorts an array of Nmemb objects, the initial element of | |
| which is pointed to by Base. The size of each object is specified by Size. | |
| The contents of the array are sorted into ascending order according to a | |
| comparison function pointed to by Compar, which is called with two | |
| arguments that point to the objects being compared. The function shall | |
| return an integer less than, equal to, or greater than zero if the first | |
| argument is considered to be respectively less than, equal to, or greater | |
| than the second. | |
| If two elements compare as equal, their order in the resulting sorted array | |
| is unspecified. | |
| @param[in,out] Base Pointer to the first element of an array to sort. | |
| @param[in] Nmemb Number of objects in the array. | |
| @param[in] Size The size of each object in the array. | |
| @param[in] Compar Pointer to the function used to compare two objects. | |
| **/ | |
| void qsort( void *base, size_t nmemb, size_t size, | |
| int (*compar)(const void *, const void *)); | |
| /* ################ Multibyte/wide character conversion functions ####### */ | |
| /** Determine the number of bytes comprising a multibyte character. | |
| If S is not a null pointer, the mblen function determines the number of bytes | |
| contained in the multibyte character pointed to by S. Except that the | |
| conversion state of the mbtowc function is not affected, it is equivalent to | |
| mbtowc((wchar_t *)0, S, N); | |
| @param[in] S NULL to query whether multibyte characters have | |
| state-dependent encodings. Otherwise, points to a | |
| multibyte character. | |
| @param[in] N The maximum number of bytes in a multibyte character. | |
| @return If S is a null pointer, the mblen function returns a nonzero or | |
| zero value, if multibyte character encodings, respectively, do | |
| or do not have state-dependent encodings. If S is not a null | |
| pointer, the mblen function either returns 0 (if S points to the | |
| null character), or returns the number of bytes that are contained | |
| in the multibyte character (if the next N or fewer bytes form a | |
| valid multibyte character), or returns -1 (if they do not form a | |
| valid multibyte character). | |
| **/ | |
| int mblen(const char *S, size_t N); | |
| /** Convert a multibyte character into a wide character. | |
| If S is not a null pointer, the mbtowc function inspects at most N bytes | |
| beginning with the byte pointed to by S to determine the number of bytes | |
| needed to complete the next multibyte character (including any shift | |
| sequences). If the function determines that the next multibyte character | |
| is complete and valid, it determines the value of the corresponding wide | |
| character and then, if Pwc is not a null pointer, stores that value in | |
| the object pointed to by Pwc. If the corresponding wide character is the | |
| null wide character, the function is left in the initial conversion state. | |
| @param[out] Pwc Pointer to a wide-character object to receive the converted character. | |
| @param[in] S Pointer to a multibyte character to convert. | |
| @param[in] N Maximum number of bytes in a multibyte character. | |
| @return If S is a null pointer, the mbtowc function returns a nonzero or | |
| zero value, if multibyte character encodings, respectively, do | |
| or do not have state-dependent encodings. If S is not a null | |
| pointer, the mbtowc function either returns 0 (if S points to | |
| the null character), or returns the number of bytes that are | |
| contained in the converted multibyte character (if the next N or | |
| fewer bytes form a valid multibyte character), or returns -1 | |
| (if they do not form a valid multibyte character). | |
| In no case will the value returned be greater than N or the value | |
| of the MB_CUR_MAX macro. | |
| **/ | |
| int mbtowc(wchar_t * __restrict Pwc, const char * __restrict S, size_t N); | |
| /** Convert a wide character into a multibyte character. | |
| The wctomb function determines the number of bytes needed to represent the | |
| multibyte character corresponding to the wide character given by WC | |
| (including any shift sequences), and stores the multibyte character | |
| representation in the array whose first element is pointed to by S (if S is | |
| not a null pointer). At most MB_CUR_MAX characters are stored. If WC is a | |
| null wide character, a null byte is stored, preceded by any shift sequence | |
| needed to restore the initial shift state, and the function is left in the | |
| initial conversion state. | |
| @param[out] S Pointer to the object to receive the converted multibyte character. | |
| @param[in] WC Wide character to be converted. | |
| @return If S is a null pointer, the wctomb function returns a nonzero or | |
| zero value, if multibyte character encodings, respectively, do or | |
| do not have state-dependent encodings. If S is not a null pointer, | |
| the wctomb function returns -1 if the value of WC does not | |
| correspond to a valid multibyte character, or returns the number | |
| of bytes that are contained in the multibyte character | |
| corresponding to the value of WC. | |
| In no case will the value returned be greater than the value of | |
| the MB_CUR_MAX macro. | |
| **/ | |
| int wctomb(char *S, wchar_t WC); | |
| /* ################ Multibyte/wide string conversion functions ########## */ | |
| /** Convert a multibyte character string into a wide-character string. | |
| The mbstowcs function converts a sequence of multibyte characters that | |
| begins in the initial shift state from the array pointed to by Src into | |
| a sequence of corresponding wide characters and stores not more than limit | |
| wide characters into the array pointed to by Dest. No multibyte | |
| characters that follow a null character (which is converted into a null | |
| wide character) will be examined or converted. Each multibyte character | |
| is converted as if by a call to the mbtowc function, except that the | |
| conversion state of the mbtowc function is not affected. | |
| No more than Limit elements will be modified in the array pointed to by Dest. | |
| If copying takes place between objects that overlap, | |
| the behavior is undefined. | |
| @param[out] Dest Pointer to the array to receive the converted string. | |
| @param[in] Src Pointer to the string to be converted. | |
| @param[in] Limit Maximum number of elements to be written to Dest. | |
| @return If an invalid multibyte character is encountered, the mbstowcs | |
| function returns (size_t)(-1). Otherwise, the mbstowcs function | |
| returns the number of array elements modified, not including a | |
| terminating null wide character, if any. | |
| **/ | |
| size_t mbstowcs(wchar_t * __restrict Dest, const char * __restrict Src, size_t Limit); | |
| /** Convert a wide-character string into a multibyte character string. | |
| The wcstombs function converts a sequence of wide characters from the | |
| array pointed to by Src into a sequence of corresponding multibyte | |
| characters that begins in the initial shift state, and stores these | |
| multibyte characters into the array pointed to by Dest, stopping if a | |
| multibyte character would exceed the limit of Limit total bytes or if a | |
| null character is stored. Each wide character is converted as if by | |
| a call to the wctomb function, except that the conversion state of | |
| the wctomb function is not affected. | |
| No more than Limit bytes will be modified in the array pointed to by Dest. | |
| If copying takes place between objects that overlap, | |
| the behavior is undefined. | |
| @param[out] Dest Pointer to the array to receive the converted string. | |
| @param[in] Src Pointer to the string to be converted. | |
| @param[in] Limit Maximum number of bytes to be written to Dest. | |
| @return If a wide character is encountered that does not correspond to a | |
| valid multibyte character, the wcstombs function returns | |
| (size_t)(-1). Otherwise, the wcstombs function returns the number | |
| of bytes modified, not including a terminating null character, | |
| if any. | |
| **/ | |
| size_t wcstombs(char * __restrict Dest, const wchar_t * __restrict Src, size_t Limit); | |
| /* ############## Miscelaneous functions for *nix compatibility ########## */ | |
| /** The realpath() function shall derive, from the pathname pointed to by | |
| file_name, an absolute pathname that names the same file, whose resolution | |
| does not involve '.', '..', or symbolic links. The generated pathname shall | |
| be stored as a null-terminated string, up to a maximum of {PATH_MAX} bytes, | |
| in the buffer pointed to by resolved_name. | |
| If resolved_name is a null pointer, the behavior of realpath() is | |
| implementation-defined. | |
| @param[in] file_name The filename to convert. | |
| @param[in,out] resolved_name The resultant name. | |
| @retval NULL An error occured. | |
| @retval resolved_name. | |
| **/ | |
| char * realpath(char *file_name, char *resolved_name); | |
| /** The getprogname() function returns the name of the program. If the name | |
| has not been set yet, it will return NULL. | |
| @return The getprogname function returns NULL if the program's name has not | |
| been set, otherwise it returns the name of the program. | |
| **/ | |
| const char * getprogname(void); | |
| /** The setprogname() function sets the name of the program. | |
| @param[in] progname The name of the program. This memory must be retained | |
| by the caller until no calls to "getprogname" will be | |
| called. | |
| **/ | |
| void setprogname(const char *progname); | |
| /* ############### Functions specific to this implementation ############# */ | |
| /* Determine the number of bytes needed to represent a Wide character | |
| as a MBCS character. | |
| A single wide character may convert into a one, two, three, or four byte | |
| narrow (MBCS or UTF-8) character. The number of MBCS bytes can be determined | |
| as follows. | |
| If WCS char < 0x00000080 One Byte | |
| Else if WCS char < 0x0000D800 Two Bytes | |
| Else Three Bytes | |
| Since UEFI only supports the Unicode Base Multilingual Plane (BMP), | |
| Four-byte characters are not supported. | |
| @param[in] InCh Wide character to test. | |
| @retval -1 Improperly formed character | |
| @retval 0 InCh is 0x0000 | |
| @retval >0 Number of bytes needed for the MBCS character | |
| */ | |
| int | |
| EFIAPI | |
| OneWcToMcLen(const wchar_t InCh); | |
| /* Determine the number of bytes needed to represent a Wide character string | |
| as a MBCS string of given maximum length. Will optionally return the number | |
| of wide characters that would be consumed. | |
| @param[in] Src Pointer to a wide character string. | |
| @param[in] Limit Maximum number of bytes the converted string may occupy. | |
| @param[out] NumChar Pointer to where to store the number of wide characters, or NULL. | |
| @return The number of bytes required to convert Src to MBCS, | |
| not including the terminating NUL. If NumChar is not NULL, the number | |
| of characters represented by the return value will be written to | |
| where it points. | |
| **/ | |
| size_t | |
| EFIAPI | |
| EstimateWtoM(const wchar_t * Src, size_t Limit, size_t *NumChar); | |
| /** Determine the number of characters in a MBCS string. | |
| @param[in] Src The string to examine | |
| @return The number of characters represented by the MBCS string. | |
| **/ | |
| size_t | |
| EFIAPI | |
| CountMbcsChars(const char *Src); | |
| __END_DECLS | |
| #endif /* _STDLIB_H */ |