diff options
author | Ruiyu Ni <ruiyu.ni@intel.com> | 2016-07-18 18:06:33 +0800 |
---|---|---|
committer | Ruiyu Ni <ruiyu.ni@intel.com> | 2016-07-20 10:27:51 +0800 |
commit | c0bcd3433f33876c519bf5567e0ab69261b57fe9 (patch) | |
tree | 54535f574a388cd336cd5f1a80d01b5be9b69e3a /ShellPkg/Library/UefiShellCommandLib | |
parent | b464d7ed0f417fe37a9d998e377a144704273949 (diff) | |
download | edk2-c0bcd3433f33876c519bf5567e0ab69261b57fe9.zip edk2-c0bcd3433f33876c519bf5567e0ab69261b57fe9.tar.gz edk2-c0bcd3433f33876c519bf5567e0ab69261b57fe9.tar.bz2 |
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 <ruiyu.ni@intel.com>
Reviewed-by: Jaben Carsey <jaben.carsey@intel.com>
Diffstat (limited to 'ShellPkg/Library/UefiShellCommandLib')
-rw-r--r-- | ShellPkg/Library/UefiShellCommandLib/UefiShellCommandLib.c | 185 |
1 files changed, 185 insertions, 0 deletions
diff --git a/ShellPkg/Library/UefiShellCommandLib/UefiShellCommandLib.c b/ShellPkg/Library/UefiShellCommandLib/UefiShellCommandLib.c index a97361c..ac77111 100644 --- a/ShellPkg/Library/UefiShellCommandLib/UefiShellCommandLib.c +++ b/ShellPkg/Library/UefiShellCommandLib/UefiShellCommandLib.c @@ -83,6 +83,191 @@ CommandInit( }
/**
+ 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.
Initialize the library and determine if the underlying is a UEFI Shell 2.0 or an EFI shell.
|