\r
BOOLEAN AsciiRedirection = FALSE;\r
\r
+/**\r
+ Return the next parameter's end from a command line string.\r
+\r
+ @param[in] String the string to parse\r
+**/\r
+CONST CHAR16*\r
+EFIAPI\r
+FindEndOfParameter(\r
+ IN CONST CHAR16 *String\r
+ )\r
+{\r
+ CONST CHAR16 *First;\r
+ CONST CHAR16 *CloseQuote;\r
+\r
+ First = FindFirstCharacter(String, L" \"", L'^');\r
+\r
+ //\r
+ // nothing, all one parameter remaining\r
+ //\r
+ if (*First == CHAR_NULL) {\r
+ return (First);\r
+ }\r
+\r
+ //\r
+ // If space before a quote (or neither found, i.e. both CHAR_NULL),\r
+ // then that's the end.\r
+ //\r
+ if (*First == L' ') {\r
+ return (First);\r
+ }\r
+\r
+ CloseQuote = FindFirstCharacter (First+1, L"\"", L'^');\r
+\r
+ //\r
+ // We did not find a terminator...\r
+ //\r
+ if (*CloseQuote == CHAR_NULL) {\r
+ return (NULL);\r
+ }\r
+\r
+ return (FindEndOfParameter (CloseQuote+1));\r
+}\r
+\r
+/**\r
+ Return the next parameter from a command line string.\r
+\r
+ This function moves the next parameter from Walker into TempParameter and moves\r
+ Walker up past that parameter for recursive calling. When the final parameter\r
+ is moved *Walker will be set to NULL;\r
+\r
+ Temp Parameter must be large enough to hold the parameter before calling this\r
+ function.\r
+\r
+ This will also remove all remaining ^ characters after processing.\r
+\r
+ @param[in, out] Walker pointer to string of command line. Adjusted to\r
+ reminaing command line on return\r
+ @param[in, out] TempParameter pointer to string of command line item extracted.\r
+ @param[in] Length buffer size of TempParameter.\r
+ @param[in] StripQuotation if TRUE then strip the quotation marks surrounding\r
+ the parameters.\r
+\r
+ @return EFI_INALID_PARAMETER A required parameter was NULL or pointed to a NULL or empty string.\r
+ @return EFI_NOT_FOUND A closing " could not be found on the specified string\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+GetNextParameter(\r
+ IN OUT CHAR16 **Walker,\r
+ IN OUT CHAR16 **TempParameter,\r
+ IN CONST UINTN Length,\r
+ IN BOOLEAN StripQuotation\r
+ )\r
+{\r
+ CONST CHAR16 *NextDelim;\r
+\r
+ if (Walker == NULL\r
+ ||*Walker == NULL\r
+ ||TempParameter == NULL\r
+ ||*TempParameter == NULL\r
+ ){\r
+ return (EFI_INVALID_PARAMETER);\r
+ }\r
+\r
+\r
+ //\r
+ // make sure we dont have any leading spaces\r
+ //\r
+ while ((*Walker)[0] == L' ') {\r
+ (*Walker)++;\r
+ }\r
+\r
+ //\r
+ // make sure we still have some params now...\r
+ //\r
+ if (StrLen(*Walker) == 0) {\r
+DEBUG_CODE_BEGIN();\r
+ *Walker = NULL;\r
+DEBUG_CODE_END();\r
+ return (EFI_INVALID_PARAMETER);\r
+ }\r
+\r
+ NextDelim = FindEndOfParameter(*Walker);\r
+\r
+ if (NextDelim == NULL){\r
+DEBUG_CODE_BEGIN();\r
+ *Walker = NULL;\r
+DEBUG_CODE_END();\r
+ return (EFI_NOT_FOUND);\r
+ }\r
+\r
+ StrnCpyS(*TempParameter, Length / sizeof(CHAR16), (*Walker), NextDelim - *Walker);\r
+\r
+ //\r
+ // Add a CHAR_NULL if we didnt get one via the copy\r
+ //\r
+ if (*NextDelim != CHAR_NULL) {\r
+ (*TempParameter)[NextDelim - *Walker] = CHAR_NULL;\r
+ }\r
+\r
+ //\r
+ // Update Walker for the next iteration through the function\r
+ //\r
+ *Walker = (CHAR16*)NextDelim;\r
+\r
+ //\r
+ // Remove any non-escaped quotes in the string\r
+ // Remove any remaining escape characters in the string\r
+ //\r
+ for (NextDelim = FindFirstCharacter(*TempParameter, L"\"^", CHAR_NULL) \r
+ ; *NextDelim != CHAR_NULL \r
+ ; NextDelim = FindFirstCharacter(NextDelim, L"\"^", CHAR_NULL)\r
+ ) {\r
+ if (*NextDelim == L'^') {\r
+\r
+ //\r
+ // eliminate the escape ^\r
+ //\r
+ CopyMem ((CHAR16*)NextDelim, NextDelim + 1, StrSize (NextDelim + 1));\r
+ NextDelim++;\r
+ } else if (*NextDelim == L'\"') {\r
+\r
+ //\r
+ // eliminate the unescaped quote\r
+ //\r
+ if (StripQuotation) {\r
+ CopyMem ((CHAR16*)NextDelim, NextDelim + 1, StrSize (NextDelim + 1));\r
+ } else{\r
+ NextDelim++;\r
+ }\r
+ }\r
+ }\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
/**\r
Function to populate Argc and Argv.\r
\r
; Walker != NULL && *Walker != CHAR_NULL\r
; Count++\r
) {\r
- if (EFI_ERROR (ShellGetNextParameter (&Walker, TempParameter, Size, TRUE))) {\r
+ if (EFI_ERROR(GetNextParameter(&Walker, &TempParameter, Size, TRUE))) {\r
break;\r
}\r
}\r
Walker = (CHAR16*)NewCommandLine;\r
while(Walker != NULL && *Walker != CHAR_NULL) {\r
SetMem16(TempParameter, Size, CHAR_NULL);\r
- if (EFI_ERROR (ShellGetNextParameter (&Walker, TempParameter, Size, StripQuotation))) {\r
+ if (EFI_ERROR(GetNextParameter(&Walker, &TempParameter, Size, StripQuotation))) {\r
Status = EFI_INVALID_PARAMETER;\r
goto Done;\r
}\r