-StrHexToUintnS (\r
- CONST CHAR16 *String,\r
- CHAR16 **EndPointer, OPTIONAL\r
- UINTN *Data\r
- )\r
-{\r
- ASSERT (((UINTN) String & BIT0) == 0);\r
-\r
- //\r
- // 1. Neither String nor Data shall be a null pointer.\r
- //\r
- SAFE_STRING_CONSTRAINT_CHECK ((String != NULL), RETURN_INVALID_PARAMETER);\r
- SAFE_STRING_CONSTRAINT_CHECK ((Data != NULL), RETURN_INVALID_PARAMETER);\r
-\r
- //\r
- // 2. The length of String shall not be greater than RSIZE_MAX.\r
- //\r
- if (RSIZE_MAX != 0) {\r
- SAFE_STRING_CONSTRAINT_CHECK ((StrnLenS (String, RSIZE_MAX + 1) <= RSIZE_MAX), RETURN_INVALID_PARAMETER);\r
- }\r
-\r
- if (EndPointer != NULL) {\r
- *EndPointer = (CHAR16 *) String;\r
- }\r
-\r
- //\r
- // Ignore the pad spaces (space or tab)\r
- //\r
- while ((*String == L' ') || (*String == L'\t')) {\r
- String++;\r
- }\r
-\r
- //\r
- // Ignore leading Zeros after the spaces\r
- //\r
- while (*String == L'0') {\r
- String++;\r
- }\r
-\r
- if (InternalCharToUpper (*String) == L'X') {\r
- if (*(String - 1) != L'0') {\r
- *Data = 0;\r
- return RETURN_SUCCESS;\r
- }\r
- //\r
- // Skip the 'X'\r
- //\r
- String++;\r
- }\r
-\r
- *Data = 0;\r
-\r
- while (InternalIsHexaDecimalDigitCharacter (*String)) {\r
- //\r
- // If the number represented by String overflows according to the range\r
- // defined by UINTN, then MAX_UINTN is stored in *Data and\r
- // RETURN_UNSUPPORTED is returned.\r
- //\r
- if (*Data > ((MAX_UINTN - InternalHexCharToUintn (*String)) >> 4)) {\r
- *Data = MAX_UINTN;\r
- if (EndPointer != NULL) {\r
- *EndPointer = (CHAR16 *) String;\r
- }\r
- return RETURN_UNSUPPORTED;\r
- }\r
-\r
- *Data = (*Data << 4) + InternalHexCharToUintn (*String);\r
- String++;\r
- }\r
-\r
- if (EndPointer != NULL) {\r
- *EndPointer = (CHAR16 *) String;\r
- }\r
- return RETURN_SUCCESS;\r
-}\r
-RETURN_STATUS\r