/** @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
-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
- \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
+Copyright (c) 2004 - 2018, 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
\r
-Module Name:\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
- 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
Routine Description:\r
\r
This function reads a line, stripping any comments.\r
- The function reads a string from the input stream argument and stores it in \r
- the input string. ReadLine reads characters from the current file position \r
- to and including the first newline character, to the end of the stream, or \r
- until the number of characters read is equal to MaxLength - 1, whichever \r
- comes first. The newline character, if read, is replaced with a \0. \r
+ The function reads a string from the input stream argument and stores it in\r
+ the input string. ReadLine reads characters from the current file position\r
+ to and including the first newline character, to the end of the stream, or\r
+ until the number of characters read is equal to MaxLength - 1, whichever\r
+ comes first. The newline character, if read, is replaced with a \0.\r
\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
\r
-Routine Description: \r
+Routine Description:\r
\r
- Converts a string to an EFI_GUID. The string must be in the \r
+ Converts a string to an EFI_GUID. The string must be in the\r
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx format.\r
\r
-Arguments: \r
+Arguments:\r
\r
AsciiGuidBuffer - pointer to ascii string\r
GuidBuffer - pointer to destination Guid\r
\r
-Returns: \r
+Returns:\r
\r
EFI_ABORTED Could not convert the string\r
EFI_SUCCESS The string was successfully converted\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
break;\r
}\r
} else {\r
- if (((AsciiGuidBuffer[Index] >= '0') && (AsciiGuidBuffer[Index] <= '9')) || \r
+ if (((AsciiGuidBuffer[Index] >= '0') && (AsciiGuidBuffer[Index] <= '9')) ||\r
((AsciiGuidBuffer[Index] >= 'a') && (AsciiGuidBuffer[Index] <= 'f')) ||\r
((AsciiGuidBuffer[Index] >= 'A') && (AsciiGuidBuffer[Index] <= 'F'))) {\r
continue;\r
}\r
}\r
}\r
- \r
+\r
if (Index < 36 || AsciiGuidBuffer[36] != '\0') {\r
Error (NULL, 0, 1003, "Invalid option value", "Incorrect GUID \"%s\"\n Correct Format \"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\"", AsciiGuidBuffer);\r
return EFI_ABORTED;\r
}\r
- \r
+\r
//\r
// Scan the guid string into the buffer\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
Routine Description:\r
\r
- Converts a null terminated ascii string that represents a number into a \r
- UINT64 value. A hex number may be preceeded by a 0x, but may not be \r
- succeeded by an h. A number without 0x or 0X is considered to be base 10 \r
+ Converts a null terminated ascii string that represents a number into a\r
+ UINT64 value. A hex number may be preceeded by a 0x, but may not be\r
+ succeeded by an h. A number without 0x or 0X is considered to be base 10\r
unless the IsHex input is true.\r
\r
Arguments:\r
--*/\r
{\r
UINT8 Index;\r
- UINT64 HexNumber;\r
+ UINT64 Value;\r
CHAR8 CurrentChar;\r
- \r
+\r
//\r
// Initialize the result\r
//\r
- HexNumber = 0;\r
- \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