/** @file Copyright (c) 2007 - 2016, Intel Corporation. All rights reserved.
This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License which accompanies this distribution. The full text of the license may be found at http://opensource.org/licenses/bsd-license.php THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. **/ #include "Edb.h" /** Convert hex string to uint. @param Str - The string **/ UINTN EFIAPI Xtoi ( CHAR16 *Str ) { UINTN RetVal; CHAR16 TempChar; UINTN MaxVal; ASSERT (Str != NULL); MaxVal = (UINTN) -1 >> 4; // // skip preceeding white space // while (*Str != '\0' && *Str == ' ') { Str += 1; } // // skip preceeding zeros // while (*Str != '\0' && *Str == '0') { Str += 1; } // // skip preceeding white space // if (*Str != '\0' && (*Str == 'x' || *Str == 'X')) { Str += 1; } // // convert hex digits // RetVal = 0; TempChar = *(Str++); while (TempChar != '\0') { if (TempChar >= 'a' && TempChar <= 'f') { TempChar -= 'a' - 'A'; } if ((TempChar >= '0' && TempChar <= '9') || (TempChar >= 'A' && TempChar <= 'F')) { if (RetVal > MaxVal) { return (UINTN) -1; } RetVal = (RetVal << 4) | (TempChar - (TempChar >= 'A' ? 'A' - 10 : '0')); } else { break; } TempChar = *(Str++); } return RetVal; } /** Convert hex string to uint. @param Str - The string **/ UINT64 EFIAPI LXtoi ( CHAR16 *Str ) { UINT64 RetVal; CHAR16 TempChar; UINT64 MaxVal; ASSERT (Str != NULL); MaxVal = RShiftU64 ((UINT64) -1, 4); // // skip preceeding white space // while (*Str != '\0' && *Str == ' ') { Str += 1; } // // skip preceeding zeros // while (*Str != '\0' && *Str == '0') { Str += 1; } // // skip preceeding white space // if (*Str != '\0' && (*Str == 'x' || *Str == 'X')) { Str += 1; } // // convert hex digits // RetVal = 0; TempChar = *(Str++); while (TempChar != '\0') { if (TempChar >= 'a' && TempChar <= 'f') { TempChar -= 'a' - 'A'; } if ((TempChar >= '0' && TempChar <= '9') || (TempChar >= 'A' && TempChar <= 'F')) { if (RetVal > MaxVal) { return (UINT64) -1; } RetVal = LShiftU64 (RetVal, 4); RetVal = RetVal + (TempChar - (TempChar >= 'A' ? 'A' - 10 : '0')); } else { break; } TempChar = *(Str++); } return RetVal; } /** Convert hex string to uint. @param Str - The string **/ UINTN EFIAPI Atoi ( CHAR16 *Str ) { UINTN RetVal; CHAR16 TempChar; UINTN MaxVal; UINTN ResteVal; ASSERT (Str != NULL); MaxVal = (UINTN) -1 / 10; ResteVal = (UINTN) -1 % 10; // // skip preceeding white space // while (*Str != '\0' && *Str == ' ') { Str += 1; } // // convert digits // RetVal = 0; TempChar = *(Str++); while (TempChar != '\0') { if (TempChar >= '0' && TempChar <= '9') { if (RetVal > MaxVal || (RetVal == MaxVal && TempChar - '0' > (INTN) ResteVal)) { return (UINTN) -1; } RetVal = (RetVal * 10) + TempChar - '0'; } else { break; } TempChar = *(Str++); } return RetVal; } /** Convert hex string to uint. @param Str - The string **/ UINTN EFIAPI AsciiXtoi ( CHAR8 *Str ) { UINTN RetVal; CHAR8 TempChar; UINTN MaxVal; ASSERT (Str != NULL); MaxVal = (UINTN) -1 >> 4; // // skip preceeding white space // while (*Str != '\0' && *Str == ' ') { Str += 1; } // // skip preceeding zeros // while (*Str != '\0' && *Str == '0') { Str += 1; } // // skip preceeding white space // if (*Str != '\0' && (*Str == 'x' || *Str == 'X')) { Str += 1; } // // convert hex digits // RetVal = 0; TempChar = *(Str++); while (TempChar != '\0') { if (TempChar >= 'a' && TempChar <= 'f') { TempChar -= 'a' - 'A'; } if ((TempChar >= '0' && TempChar <= '9') || (TempChar >= 'A' && TempChar <= 'F')) { if (RetVal > MaxVal) { return (UINTN) -1; } RetVal = (RetVal << 4) | (TempChar - (TempChar >= 'A' ? 'A' - 10 : '0')); } else { break; } TempChar = *(Str++); } return RetVal; } /** Convert hex string to uint. @param Str - The string **/ UINTN EFIAPI AsciiAtoi ( CHAR8 *Str ) { UINTN RetVal; CHAR8 TempChar; UINTN MaxVal; UINTN ResteVal; ASSERT (Str != NULL); MaxVal = (UINTN) -1 / 10; ResteVal = (UINTN) -1 % 10; // // skip preceeding white space // while (*Str != '\0' && *Str == ' ') { Str += 1; } // // convert digits // RetVal = 0; TempChar = *(Str++); while (TempChar != '\0') { if (TempChar >= '0' && TempChar <= '9') { if (RetVal > MaxVal || (RetVal == MaxVal && TempChar - '0' > (INTN) ResteVal)) { return (UINTN) -1; } RetVal = (RetVal * 10) + TempChar - '0'; } else { break; } TempChar = *(Str++); } return RetVal; } /** Convert the character to upper case. @param Chr the character to be converted. **/ STATIC CHAR16 UnicodeToUpper ( IN CHAR16 Chr ) { return (Chr >= L'a' && Chr <= L'z') ? Chr - (L'a' - L'A') : Chr; } /** Convert the character to upper case. @param Chr the character to be converted. **/ STATIC CHAR8 AsciiToUpper ( IN CHAR8 Chr ) { return (Chr >= 'a' && Chr <= 'z') ? Chr - ('a' - 'A') : Chr; } /** Compare the Unicode and Ascii string pointed by String to the string pointed by String2. @param String - Unicode String to process @param String2 - Ascii string to process @return Return a positive integer if String is lexicall greater than String2; Zero if the two strings are identical; and a negative interger if String is lexically less than String2. **/ INTN EFIAPI StrCmpUnicodeAndAscii ( IN CHAR16 *String, IN CHAR8 *String2 ) { while (*String != '\0') { if (*String != (CHAR16)*String2) { break; } String += 1; String2 += 1; } return (*String - (CHAR16)*String2); } /** Compare the Unicode string pointed by String to the string pointed by String2. @param String - Unicode String to process @param String2 - Unicode string to process @return Return a positive integer if String is lexically greater than String2; Zero if the two strings are identical; and a negative integer if String is lexically less than String2. **/ INTN EFIAPI StriCmp ( IN CHAR16 *String, IN CHAR16 *String2 ) { while ((*String != L'\0') && (UnicodeToUpper (*String) == UnicodeToUpper (*String2))) { String++; String2++; } return UnicodeToUpper (*String) - UnicodeToUpper (*String2); } /** Compare the Unicode and Ascii string pointed by String to the string pointed by String2. @param String - Unicode String to process @param String2 - Ascii string to process @return Return a positive integer if String is lexically greater than String2; Zero if the two strings are identical; and a negative integer if String is lexically less than String2. **/ INTN EFIAPI StriCmpUnicodeAndAscii ( IN CHAR16 *String, IN CHAR8 *String2 ) { while ((*String != L'\0') && (UnicodeToUpper (*String) == (CHAR16)AsciiToUpper (*String2))) { String++; String2++; } return UnicodeToUpper (*String) - (CHAR16)AsciiToUpper (*String2); } /** Verify if the string is end with the sub string. @param Str - The string where to search the sub string @param SubStr - The substring. **/ BOOLEAN EFIAPI StrEndWith ( IN CHAR16 *Str, IN CHAR16 *SubStr ) { CHAR16 *Temp; if ((Str == NULL) || (SubStr == NULL) || (StrLen(Str) < StrLen(SubStr))) { return FALSE; } Temp = Str + StrLen(Str) - StrLen(SubStr); // // Compare // if (StriCmp (Temp, SubStr) == 0) { return TRUE; } else { return FALSE; } } /** Duplicate a string. @param Src The string to be duplicated. **/ CHAR16 * EFIAPI StrDuplicate ( IN CHAR16 *Src ) { CHAR16 *Dest; UINTN Size; Size = (StrLen(Src) + 1) * sizeof(CHAR16); Dest = AllocateZeroPool (Size); if (Dest != NULL) { CopyMem (Dest, Src, Size); } return Dest; } CHAR16 *mLineBuffer = NULL; CHAR16 *mFieldBuffer = NULL; /** Find the first substring. @param String Point to the string where to find the substring. @param CharSet Point to the string to be found. **/ UINTN EFIAPI StrSpn ( IN CHAR16 *String, IN CHAR16 *CharSet ) { UINTN Count; CHAR16 *Str1; CHAR16 *Str2; Count = 0; for (Str1 = String; *Str1 != L'\0'; Str1 ++) { for (Str2 = CharSet; *Str2 != L'\0'; Str2 ++) { if (*Str1 == *Str2) { break; } } if (*Str2 == L'\0') { return Count; } Count ++; } return Count; } /** Searches a string for the first occurrence of a character contained in a specified buffer. @param String Point to the string where to find the substring. @param CharSet Point to the string to be found. **/ CHAR16 * EFIAPI StrBrk ( IN CHAR16 *String, IN CHAR16 *CharSet ) { CHAR16 *Str1; CHAR16 *Str2; for (Str1 = String; *Str1 != L'\0'; Str1 ++) { for (Str2 = CharSet; *Str2 != L'\0'; Str2 ++) { if (*Str1 == *Str2) { return (CHAR16 *) Str1; } } } return NULL; } /** Find the next token after one or more specified characters. @param String Point to the string where to find the substring. @param CharSet Point to the string to be found. **/ CHAR16 * EFIAPI StrTokenLine ( IN CHAR16 *String OPTIONAL, IN CHAR16 *CharSet ) { CHAR16 *Begin; CHAR16 *End; Begin = (String == NULL) ? mLineBuffer : String; if (Begin == NULL) { return NULL; } Begin += StrSpn (Begin, CharSet); if (*Begin == L'\0') { mLineBuffer = NULL; return NULL; } End = StrBrk (Begin, CharSet); if ((End != NULL) && (*End != L'\0')) { *End = L'\0'; End ++; } mLineBuffer = End; return Begin; } /** Find the next token after one specificed characters. @param String Point to the string where to find the substring. @param CharSet Point to the string to be found. **/ CHAR16 * EFIAPI StrTokenField ( IN CHAR16 *String OPTIONAL, IN CHAR16 *CharSet ) { CHAR16 *Begin; CHAR16 *End; Begin = (String == NULL) ? mFieldBuffer : String; if (Begin == NULL) { return NULL; } if (*Begin == L'\0') { mFieldBuffer = NULL; return NULL; } End = StrBrk (Begin, CharSet); if ((End != NULL) && (*End != L'\0')) { *End = L'\0'; End ++; } mFieldBuffer = End; return Begin; } /** Find the next token after one or more specified characters. @param String Point to the string where to find the substring. @param CharSet Point to the string to be found. **/ CHAR16 * EFIAPI StrGetNewTokenLine ( IN CHAR16 *String, IN CHAR16 *CharSet ) { return StrTokenLine (String, CharSet); } /** Find the next token after one or more specified characters. @param CharSet Point to the string to be found. **/ CHAR16 * EFIAPI StrGetNextTokenLine ( IN CHAR16 *CharSet ) { return StrTokenLine (NULL, CharSet); } /** Find the next token after one specificed characters. @param String Point to the string where to find the substring. @param CharSet Point to the string to be found. **/ CHAR16 * EFIAPI StrGetNewTokenField ( IN CHAR16 *String, IN CHAR16 *CharSet ) { return StrTokenField (String, CharSet); } /** Find the next token after one specificed characters. @param CharSet Point to the string to be found. **/ CHAR16 * EFIAPI StrGetNextTokenField ( IN CHAR16 *CharSet ) { return StrTokenField (NULL, CharSet); } /** Patch a character to the end of a string. @param Buffer The string to be patched. @param Patch The patch character. **/ VOID EFIAPI PatchForStrTokenAfter ( IN CHAR16 *Buffer, IN CHAR16 Patch ) { CHAR16 *Str; if (Buffer == NULL) { return ; } Str = Buffer; while (*Str != 0) { Str ++; } *Str = Patch; while (*(Str ++) != '\0') { if (*Str == 0) { *Str = Patch; } else { break; } } return ; } /** Patch a character at the beginning of a string. @param Buffer The string to be patched. @param Patch The patch character. **/ VOID EFIAPI PatchForStrTokenBefore ( IN CHAR16 *Buffer, IN CHAR16 Patch ) { CHAR16 *Str; if (Buffer == NULL) { return ; } Str = Buffer; while (*(Str --) != '\0') { if ((*Str == 0) || (*Str == Patch)) { *Str = Patch; } else { break; } } return ; } CHAR8 *mAsciiLineBuffer = NULL; CHAR8 *mAsciiFieldBuffer = NULL; /** Find the first substring. @param String Point to the string where to find the substring. @param CharSet Point to the string to be found. **/ UINTN EFIAPI AsciiStrSpn ( IN CHAR8 *String, IN CHAR8 *CharSet ) { UINTN Count; CHAR8 *Str1; CHAR8 *Str2; Count = 0; for (Str1 = String; *Str1 != '\0'; Str1 ++) { for (Str2 = CharSet; *Str2 != '\0'; Str2 ++) { if (*Str1 == *Str2) { break; } } if (*Str2 == '\0') { return Count; } Count ++; } return Count; } /** Searches a string for the first occurrence of a character contained in a specified buffer. @param String Point to the string where to find the substring. @param CharSet Point to the string to be found. **/ CHAR8 * EFIAPI AsciiStrBrk ( IN CHAR8 *String, IN CHAR8 *CharSet ) { CHAR8 *Str1; CHAR8 *Str2; for (Str1 = String; *Str1 != '\0'; Str1 ++) { for (Str2 = CharSet; *Str2 != '\0'; Str2 ++) { if (*Str1 == *Str2) { return (CHAR8 *) Str1; } } } return NULL; } /** Find the next token after one or more specified characters. @param String Point to the string where to find the substring. @param CharSet Point to the string to be found. **/ CHAR8 * EFIAPI AsciiStrTokenLine ( IN CHAR8 *String OPTIONAL, IN CHAR8 *CharSet ) { CHAR8 *Begin; CHAR8 *End; Begin = (String == NULL) ? mAsciiLineBuffer : String; if (Begin == NULL) { return NULL; } Begin += AsciiStrSpn (Begin, CharSet); if (*Begin == '\0') { mAsciiLineBuffer = NULL; return NULL; } End = AsciiStrBrk (Begin, CharSet); if ((End != NULL) && (*End != '\0')) { *End = '\0'; End ++; } mAsciiLineBuffer = End; return Begin; } /** Find the next token after one specificed characters. @param String Point to the string where to find the substring. @param CharSet Point to the string to be found. **/ CHAR8 * EFIAPI AsciiStrTokenField ( IN CHAR8 *String OPTIONAL, IN CHAR8 *CharSet ) { CHAR8 *Begin; CHAR8 *End; Begin = (String == NULL) ? mAsciiFieldBuffer : String; if (Begin == NULL) { return NULL; } if (*Begin == '\0') { mAsciiFieldBuffer = NULL; return NULL; } End = AsciiStrBrk (Begin, CharSet); if ((End != NULL) && (*End != '\0')) { *End = '\0'; End ++; } mAsciiFieldBuffer = End; return Begin; } /** Find the next token after one or more specified characters. @param String Point to the string where to find the substring. @param CharSet Point to the string to be found. **/ CHAR8 * EFIAPI AsciiStrGetNewTokenLine ( IN CHAR8 *String, IN CHAR8 *CharSet ) { return AsciiStrTokenLine (String, CharSet); } /** Find the next token after one or more specified characters. @param CharSet Point to the string to be found. **/ CHAR8 * EFIAPI AsciiStrGetNextTokenLine ( IN CHAR8 *CharSet ) { return AsciiStrTokenLine (NULL, CharSet); } /** Find the next token after one specificed characters. @param String Point to the string where to find the substring. @param CharSet Point to the string to be found. **/ CHAR8 * EFIAPI AsciiStrGetNewTokenField ( IN CHAR8 *String, IN CHAR8 *CharSet ) { return AsciiStrTokenField (String, CharSet); } /** Find the next token after one specificed characters. @param CharSet Point to the string to be found. **/ CHAR8 * EFIAPI AsciiStrGetNextTokenField ( IN CHAR8 *CharSet ) { return AsciiStrTokenField (NULL, CharSet); } /** Patch a character to the end of a string. @param Buffer The string to be patched. @param Patch The patch character. **/ VOID EFIAPI PatchForAsciiStrTokenAfter ( IN CHAR8 *Buffer, IN CHAR8 Patch ) { CHAR8 *Str; if (Buffer == NULL) { return ; } Str = Buffer; while (*Str != 0) { Str ++; } *Str = Patch; while (*(Str ++) != '\0') { if (*Str == 0) { *Str = Patch; } else { break; } } return ; } /** Patch a character at the beginning of a string. @param Buffer The string to be patched. @param Patch The patch character. **/ VOID EFIAPI PatchForAsciiStrTokenBefore ( IN CHAR8 *Buffer, IN CHAR8 Patch ) { CHAR8 *Str; if (Buffer == NULL) { return ; } Str = Buffer; while (*(Str --) != '\0') { if ((*Str == 0) || (*Str == Patch)) { *Str = Patch; } else { break; } } return ; }