diff --git a/Cryptlib/Include/CrtLibSupport.h b/Cryptlib/Include/CrtLibSupport.h index 47b864a..42c056f 100644 --- a/Cryptlib/Include/CrtLibSupport.h +++ b/Cryptlib/Include/CrtLibSupport.h @@ -191,7 +191,7 @@ typedef CHAR8 *VA_LIST; For pre-Standard C compilers, here is a version that usually works (but watch out!): */ #ifndef offsetof -#define offsetof(type, member) ( (int) & ((type*)0) -> member ) +#define offsetof(type, member) ( (UINTN) & ((type*)0) -> member ) #endif // @@ -307,6 +307,9 @@ char *strncpy (char *, const char *, size_t); char *strrchr (const char *, int); unsigned long strtoul (const char *, char **, int); long strtol (const char *, char **, int); +char *strerror (int); +size_t strspn (const char *, const char *); +size_t strcspn (const char *, const char *); int printf (const char *, ...); int sscanf (const char *, const char *, ...); int open (const char *, int, ...); @@ -356,26 +359,26 @@ extern FILE *stdin; extern FILE *stdout; #define AsciiStrLen(x) strlena(x) -#define AsciiStrnCmp(s1, s2, len) strncmpa(s1, s2, len) +#define AsciiStrnCmp(s1, s2, len) strncmpa((CHAR8 *)s1, (CHAR8 *)s2, len) // // Macros that directly map functions to BaseLib, BaseMemoryLib, and DebugLib functions // #define memcpy(dest,source,count) ( {CopyMem(dest,source,(UINTN)(count)); dest; }) #define memset(dest,ch,count) SetMem(dest,(UINTN)(count),(UINT8)(ch)) -#define memchr(buf,ch,count) ScanMem8(buf,(UINTN)(count),(UINT8)ch) +#define memchr(buf,ch,count) ScanMem8((CHAR8 *)buf,(UINTN)(count),ch) #define memcmp(buf1,buf2,count) (int)(CompareMem(buf1,buf2,(UINTN)(count))) #define memmove(dest,source,count) CopyMem(dest,source,(UINTN)(count)) -#define strlen(str) (size_t)(AsciiStrLen(str)) +#define strlen(str) (size_t)(AsciiStrLen((CHAR8 *)str)) #define strcpy(strDest,strSource) AsciiStrCpy(strDest,strSource) #define strncpy(strDest,strSource,count) AsciiStrnCpy(strDest,strSource,(UINTN)count) #define strcat(strDest,strSource) AsciiStrCat(strDest,strSource) -#define strchr(str,ch) ScanMem8((VOID *)(str),AsciiStrSize(str),(UINT8)ch) -#define strcmp strcmpa +#define strchr(str,ch) (char *)(ScanMem8((CHAR8 *)str,AsciiStrSize((CHAR8 *)str),ch)) +#define strcmp(string1,string2) strcmpa((CHAR8 *)string1,(CHAR8 *)string2) #define strncmp(string1,string2,count) (int)(AsciiStrnCmp(string1,string2,(UINTN)(count))) #define localtime(timer) NULL #define assert(expression) -#define atoi(nptr) Atoi(nptr) +#define atoi(nptr) AsciiStrDecimalToUintn(nptr) #define gettimeofday(tvp,tz) do { (tvp)->tv_sec = time(NULL); (tvp)->tv_usec = 0; } while (0) #define gmtime_r(timer,result) (result = NULL) diff --git a/Cryptlib/Library/BaseLib.h b/Cryptlib/Library/BaseLib.h index 4c99fa9..c29919e 100644 --- a/Cryptlib/Library/BaseLib.h +++ b/Cryptlib/Library/BaseLib.h @@ -1,2 +1,8 @@ #include #include + +UINT32 WriteUnaligned32 (UINT32 *Buffer, UINT32 Value); +UINTN AsciiStrSize (CHAR8 *string); +char *AsciiStrnCpy(char *Destination, char *Source, UINTN count); +char *AsciiStrCat(char *Destination, char *Source); +UINTN AsciiStrDecimalToUintn(const char *String); diff --git a/Cryptlib/Library/BaseMemoryLib.h b/Cryptlib/Library/BaseMemoryLib.h index e69de29..cc118e3 100644 --- a/Cryptlib/Library/BaseMemoryLib.h +++ b/Cryptlib/Library/BaseMemoryLib.h @@ -0,0 +1 @@ +CHAR8 *ScanMem8(CHAR8 *str, UINTN count, CHAR8 ch); diff --git a/Cryptlib/SysCall/BaseStrings.c b/Cryptlib/SysCall/BaseStrings.c index 0e6de37..990037d 100644 --- a/Cryptlib/SysCall/BaseStrings.c +++ b/Cryptlib/SysCall/BaseStrings.c @@ -1,9 +1,9 @@ #include -CHAR8 * -AsciiStrCat(CHAR8 *Destination, CHAR8 *Source) +char * +AsciiStrCat(char *Destination, char *Source) { - UINTN dest_len = strlena(Destination); + UINTN dest_len = strlena((CHAR8 *)Destination); UINTN i; for (i = 0; Source[i] != '\0'; i++) @@ -25,8 +25,8 @@ AsciiStrCpy(CHAR8 *Destination, CHAR8 *Source) return Destination; } -CHAR8 * -AsciiStrnCpy(CHAR8 *Destination, CHAR8 *Source, UINTN count) +char * +AsciiStrnCpy(char *Destination, char *Source, UINTN count) { UINTN i; @@ -64,4 +64,32 @@ AsciiStrSize(CHAR8 *string) return strlena(string) + 1; } +/* Based on AsciiStrDecimalToUintnS() in edk2 + * MdePkg/Library/BaseLib/SafeString.c */ +UINTN +AsciiStrDecimalToUintn(const char *String) +{ + UINTN Result; + if (String == NULL) + return 0; + + /* Ignore the pad spaces (space or tab) */ + while ((*String == ' ') || (*String == '\t')) { + String++; + } + + /* Ignore leading Zeros after the spaces */ + while (*String == '0') { + String++; + } + + Result = 0; + + while (*String >= '0' && *String <= '9') { + Result = Result * 10 + (*String - '0'); + String++; + } + + return Result; +}