/** @file\r
+This contains some useful functions for parsing INF files.\r
\r
-Copyright (c) 2004 - 2008, Intel Corporation \r
-All rights reserved. This program and the accompanying materials \r
+Copyright (c) 2004 - 2016, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials \r
are licensed and made available under the terms and conditions of the BSD License \r
which accompanies this distribution. The full text of the license may be found at \r
http://opensource.org/licenses/bsd-license.php \r
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
\r
-Module Name:\r
-\r
- ParseInf.c\r
-\r
-Abstract:\r
-\r
- This contains some useful functions for parsing INF files.\r
-\r
---*/\r
+**/\r
\r
#include <assert.h>\r
#include <string.h>\r
#include <stdlib.h>\r
#include "EfiUtilityMsgs.h"\r
#include "ParseInf.h"\r
+#include "CommonLib.h"\r
\r
CHAR8 *\r
ReadLine (\r
Arguments:\r
\r
InputFile Memory file image.\r
- InputBuffer Buffer to read into, must be _MAX_PATH size.\r
+ InputBuffer Buffer to read into, must be MaxLength size.\r
MaxLength The maximum size of the input buffer.\r
\r
Returns:\r
\r
--*/\r
{\r
- CHAR8 InputBuffer[_MAX_PATH];\r
+ CHAR8 InputBuffer[MAX_LONG_FILE_PATH];\r
CHAR8 *CurrentToken;\r
\r
//\r
//\r
// Read a line\r
//\r
- ReadLine (InputFile, InputBuffer, _MAX_PATH);\r
+ ReadLine (InputFile, InputBuffer, MAX_LONG_FILE_PATH);\r
\r
//\r
// Check if the section is found\r
Section The section to search for, a string within [].\r
Token The token to search for, e.g. EFI_PEIM_RECOVERY, followed by an = in the INF file.\r
Instance The instance of the token to search for. Zero is the first instance.\r
- Value The string that holds the value following the =. Must be _MAX_PATH in size.\r
+ Value The string that holds the value following the =. Must be MAX_LONG_FILE_PATH in size.\r
\r
Returns:\r
\r
\r
--*/\r
{\r
- CHAR8 InputBuffer[_MAX_PATH];\r
+ CHAR8 InputBuffer[MAX_LONG_FILE_PATH];\r
CHAR8 *CurrentToken;\r
+ CHAR8 *Delimiter;\r
BOOLEAN ParseError;\r
BOOLEAN ReadError;\r
UINTN Occurrance;\r
//\r
// Read a line from the file\r
//\r
- if (ReadLine (InputFile, InputBuffer, _MAX_PATH) == NULL) {\r
+ if (ReadLine (InputFile, InputBuffer, MAX_LONG_FILE_PATH) == NULL) {\r
//\r
// Error reading from input file\r
//\r
//\r
// Get the first non-whitespace string\r
//\r
+ Delimiter = strchr (InputBuffer, '=');\r
+ if (Delimiter != NULL) {\r
+ *Delimiter = 0;\r
+ }\r
+\r
CurrentToken = strtok (InputBuffer, " \t\n");\r
- if (CurrentToken == NULL) {\r
+ if (CurrentToken == NULL || Delimiter == NULL) {\r
//\r
// Whitespace line found (or comment) so continue\r
//\r
//\r
// Copy the contents following the =\r
//\r
- CurrentToken = strtok (NULL, "= \t\n");\r
- if (CurrentToken == NULL) {\r
+ CurrentToken = Delimiter + 1;\r
+ if (*CurrentToken == 0) {\r
//\r
// Nothing found, parsing error\r
//\r
ParseError = TRUE;\r
} else {\r
+ //\r
+ // Strip leading white space\r
+ //\r
+ while (*CurrentToken == ' ' || *CurrentToken == '\t') {\r
+ CurrentToken++;\r
+ }\r
//\r
// Copy the current token to the output value\r
//\r
strcpy (Value, CurrentToken);\r
+ //\r
+ // Strip trailing white space\r
+ //\r
+ while (strlen(Value) > 0 && (*(Value + strlen(Value) - 1) == ' ' || *(Value + strlen(Value) - 1) == '\t')) {\r
+ *(Value + strlen(Value) - 1) = 0;\r
+ }\r
return EFI_SUCCESS;\r
}\r
} else {\r
--*/\r
{\r
INT32 Index;\r
- UINT32 Data1;\r
- UINT32 Data2;\r
- UINT32 Data3;\r
- UINT16 Data4[8];\r
+ int Data1;\r
+ int Data2;\r
+ int Data3;\r
+ int Data4[8];\r
\r
if (AsciiGuidBuffer == NULL || GuidBuffer == NULL) {\r
return EFI_INVALID_PARAMETER;\r
//\r
Index = sscanf (\r
AsciiGuidBuffer,\r
- "%08x-%04x-%04x-%02hx%02hx-%02hx%02hx%02hx%02hx%02hx%02hx",\r
+ "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",\r
&Data1,\r
&Data2,\r
&Data3,\r
--*/\r
{\r
UINT8 Index;\r
- UINT64 HexNumber;\r
+ UINT64 Value;\r
CHAR8 CurrentChar;\r
\r
//\r
// Initialize the result\r
//\r
- HexNumber = 0;\r
+ Value = 0;\r
+ Index = 0;\r
\r
//\r
- // Check input paramter\r
+ // Check input parameter\r
//\r
if (AsciiString == NULL || ReturnValue == NULL) {\r
return EFI_INVALID_PARAMETER;\r
}\r
+ while (AsciiString[Index] == ' ') {\r
+ Index ++;\r
+ }\r
+ \r
//\r
// Add each character to the result\r
//\r
- if (IsHex || (AsciiString[0] == '0' && (AsciiString[1] == 'x' || AsciiString[1] == 'X'))) {\r
- //\r
- // Verify string is a hex number\r
- //\r
- for (Index = 2; Index < strlen (AsciiString); Index++) {\r
- if (isxdigit (AsciiString[Index]) == 0) {\r
- return EFI_ABORTED;\r
- }\r
- }\r
+ \r
+ //\r
+ // Skip first two chars only if the string starts with '0x' or '0X'\r
+ //\r
+ if (AsciiString[Index] == '0' && (AsciiString[Index + 1] == 'x' || AsciiString[Index + 1] == 'X')) {\r
+ IsHex = TRUE;\r
+ Index += 2;\r
+ }\r
+ if (IsHex) {\r
//\r
// Convert the hex string.\r
//\r
- for (Index = 2; AsciiString[Index] != '\0'; Index++) {\r
+ for (; AsciiString[Index] != '\0'; Index++) {\r
CurrentChar = AsciiString[Index];\r
- HexNumber *= 16;\r
+ if (CurrentChar == ' ') {\r
+ break;\r
+ }\r
+ //\r
+ // Verify Hex string\r
+ //\r
+ if (isxdigit ((int)CurrentChar) == 0) {\r
+ return EFI_ABORTED;\r
+ }\r
+ //\r
+ // Add hex value\r
+ //\r
+ Value *= 16;\r
if (CurrentChar >= '0' && CurrentChar <= '9') {\r
- HexNumber += CurrentChar - '0';\r
+ Value += CurrentChar - '0';\r
} else if (CurrentChar >= 'a' && CurrentChar <= 'f') {\r
- HexNumber += CurrentChar - 'a' + 10;\r
+ Value += CurrentChar - 'a' + 10;\r
} else if (CurrentChar >= 'A' && CurrentChar <= 'F') {\r
- HexNumber += CurrentChar - 'A' + 10;\r
- } else {\r
- //\r
- // Unrecognized character\r
- //\r
- return EFI_ABORTED;\r
+ Value += CurrentChar - 'A' + 10;\r
}\r
}\r
\r
- *ReturnValue = HexNumber;\r
+ *ReturnValue = Value;\r
} else {\r
//\r
- // Verify string is a number\r
+ // Convert dec string is a number\r
//\r
- for (Index = 0; Index < strlen (AsciiString); Index++) {\r
- if (isdigit (AsciiString[Index]) == 0) {\r
+ for (; Index < strlen (AsciiString); Index++) {\r
+ CurrentChar = AsciiString[Index];\r
+ if (CurrentChar == ' ') {\r
+ break;\r
+ }\r
+ //\r
+ // Verify Dec string\r
+ //\r
+ if (isdigit ((int)CurrentChar) == 0) {\r
return EFI_ABORTED;\r
}\r
+ //\r
+ // Add dec value\r
+ //\r
+ Value = Value * 10;\r
+ Value += CurrentChar - '0';\r
}\r
\r
- *ReturnValue = atol (AsciiString);\r
+ *ReturnValue = Value;\r
}\r
\r
return EFI_SUCCESS;\r
Arguments:\r
\r
InputFile Stream pointer.\r
- InputBuffer Buffer to read into, must be _MAX_PATH size.\r
+ InputBuffer Buffer to read into, must be MAX_LONG_FILE_PATH size.\r
\r
Returns:\r
\r
//\r
// Read a line\r
//\r
- if (fgets (InputBuffer, _MAX_PATH, InputFile) == NULL) {\r
+ if (fgets (InputBuffer, MAX_LONG_FILE_PATH, InputFile) == NULL) {\r
return NULL;\r
}\r
//\r
\r
--*/\r
{\r
- CHAR8 InputBuffer[_MAX_PATH];\r
+ CHAR8 InputBuffer[MAX_LONG_FILE_PATH];\r
CHAR8 *CurrentToken;\r
\r
//\r