From 1f22879ac2174d12180c1a0aaeb97080fec5f752 Mon Sep 17 00:00:00 2001 From: Ruiyu Ni Date: Mon, 18 Jul 2016 18:06:33 +0800 Subject: ShellPkg: Move FindFirstCharacter/GetNextParameter to ShellCommandLib And add Shell prefix to the two library APIs. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Ruiyu Ni Reviewed-by: Jaben Carsey (cherry picked from commit c0bcd3433f33876c519bf5567e0ab69261b57fe9) --- .../UefiShellCommandLib/UefiShellCommandLib.c | 185 +++++++++++++++++++++ 1 file changed, 185 insertions(+) (limited to 'ShellPkg/Library/UefiShellCommandLib') diff --git a/ShellPkg/Library/UefiShellCommandLib/UefiShellCommandLib.c b/ShellPkg/Library/UefiShellCommandLib/UefiShellCommandLib.c index a97361c407..ac77111ef9 100644 --- a/ShellPkg/Library/UefiShellCommandLib/UefiShellCommandLib.c +++ b/ShellPkg/Library/UefiShellCommandLib/UefiShellCommandLib.c @@ -82,6 +82,191 @@ CommandInit( return (EFI_SUCCESS); } +/** + Return the pointer to the first occurrence of any character from a list of characters. + + @param[in] String The string to parse + @param[in] CharacterList The list of character to look for + @param[in] IgnoreEscapedCharacter TRUE to ignore escaped characters + + @return The location of the first character in the String. + @return Pointer to the ending NULL character of the String. +**/ +CONST CHAR16* +EFIAPI +ShellFindFirstCharacter ( + IN CONST CHAR16 *String, + IN CONST CHAR16 *CharacterList, + IN CONST BOOLEAN IgnoreEscapedCharacter + ) +{ + UINTN WalkChar; + UINTN WalkStr; + + for (WalkStr = 0; WalkStr < StrLen (String); WalkStr++) { + if (IgnoreEscapedCharacter && (String[WalkStr] == L'^')) { + WalkStr++; + continue; + } + for (WalkChar = 0; WalkChar < StrLen (CharacterList); WalkChar++) { + if (String[WalkStr] == CharacterList[WalkChar]) { + return &String[WalkStr]; + } + } + } + return &String[WalkStr]; +} + +/** + Return the next parameter's end from a command line string. + + @param[in] String the string to parse +**/ +CONST CHAR16* +FindEndOfParameter( + IN CONST CHAR16 *String + ) +{ + CONST CHAR16 *First; + CONST CHAR16 *CloseQuote; + + First = ShellFindFirstCharacter (String, L" \"", TRUE); + + // + // nothing, all one parameter remaining + // + if (*First == CHAR_NULL) { + return (First); + } + + // + // If space before a quote (or neither found, i.e. both CHAR_NULL), + // then that's the end. + // + if (*First == L' ') { + return (First); + } + + CloseQuote = ShellFindFirstCharacter (First+1, L"\"", TRUE); + + // + // We did not find a terminator... + // + if (*CloseQuote == CHAR_NULL) { + return (NULL); + } + + return (FindEndOfParameter (CloseQuote+1)); +} + +/** + Return the next parameter from a command line string. + + This function moves the next parameter from Walker into NextParameter and moves + Walker up past that parameter for recursive calling. When the final parameter + is moved *Walker will be set to NULL; + + This will also remove all remaining ^ characters after processing. + + @param[in, out] Walker pointer to string of command line. Adjusted to + reminaing command line on return + @param[in, out] NextParameter pointer to string of command line item extracted. + @param[in] Length buffer size of TempParameter. + @param[in] StripQuotation if TRUE then strip the quotation marks surrounding + the parameters. + + @return EFI_INALID_PARAMETER A required parameter was NULL or pointed to a NULL or empty string. + @return EFI_NOT_FOUND A closing " could not be found on the specified string +**/ +EFI_STATUS +EFIAPI +ShellGetNextParameter ( + IN OUT CHAR16 **Walker, + IN OUT CHAR16 *NextParameter, + IN CONST UINTN Length, + IN BOOLEAN StripQuotation + ) +{ + CONST CHAR16 *NextDelim; + + if (Walker == NULL + ||*Walker == NULL + ||NextParameter == NULL + ){ + return EFI_INVALID_PARAMETER; + } + + // + // make sure we dont have any leading spaces + // + while ((*Walker)[0] == L' ') { + (*Walker)++; + } + + // + // make sure we still have some params now... + // + if (StrLen(*Walker) == 0) { + DEBUG_CODE ( + *Walker = NULL; + ); + return (EFI_INVALID_PARAMETER); + } + + NextDelim = FindEndOfParameter(*Walker); + + if (NextDelim == NULL){ + DEBUG_CODE ( + *Walker = NULL; + ); + return (EFI_NOT_FOUND); + } + + StrnCpyS(NextParameter, Length / sizeof(CHAR16), (*Walker), NextDelim - *Walker); + + // + // Add a CHAR_NULL if we didnt get one via the copy + // + if (*NextDelim != CHAR_NULL) { + NextParameter[NextDelim - *Walker] = CHAR_NULL; + } + + // + // Update Walker for the next iteration through the function + // + *Walker = (CHAR16*)NextDelim; + + // + // Remove any non-escaped quotes in the string + // Remove any remaining escape characters in the string + // + for (NextDelim = ShellFindFirstCharacter(NextParameter, L"\"^", FALSE) + ; *NextDelim != CHAR_NULL + ; NextDelim = ShellFindFirstCharacter(NextDelim, L"\"^", FALSE) + ) { + if (*NextDelim == L'^') { + + // + // eliminate the escape ^ + // + CopyMem ((CHAR16*)NextDelim, NextDelim + 1, StrSize (NextDelim + 1)); + NextDelim++; + } else if (*NextDelim == L'\"') { + + // + // eliminate the unescaped quote + // + if (StripQuotation) { + CopyMem ((CHAR16*)NextDelim, NextDelim + 1, StrSize (NextDelim + 1)); + } else { + NextDelim++; + } + } + } + + return EFI_SUCCESS; +} + /** Constructor for the Shell Command library. -- cgit v1.2.3