]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ShellPkg/Library/UefiShellLevel1CommandsLib/For.c
Comment's added and fixed.
[mirror_edk2.git] / ShellPkg / Library / UefiShellLevel1CommandsLib / For.c
index 0e68119b8dd87451284debcc607fcb221ac38cd1..64110099d36d8f39f08db98bbd0cd77a9103c6e9 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   Main file for endfor and for shell level 1 functions.\r
 \r
-  Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2009 - 2011, 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
 #include "UefiShellLevel1CommandsLib.h"\r
 #include <Library/PrintLib.h>\r
 \r
+/**\r
+  Determine if a valid string is a valid number for the 'for' command.\r
+\r
+  @param[in] Number The pointer to the string representation of the number to test.\r
+\r
+  @retval TRUE    The number is valid.\r
+  @retval FALSE   The number is not valid.\r
+**/\r
 BOOLEAN\r
 EFIAPI\r
 ShellIsValidForNumber (\r
@@ -61,6 +69,7 @@ ShellCommandRunEndFor (
 {\r
   EFI_STATUS          Status;\r
   BOOLEAN             Found;\r
+  SCRIPT_FILE         *CurrentScriptFile;\r
 \r
   Status = CommandInit();\r
   ASSERT_EFI_ERROR(Status);\r
@@ -78,7 +87,18 @@ ShellCommandRunEndFor (
   Found = MoveToTag(GetPreviousNode, L"for", L"endfor", NULL, ShellCommandGetCurrentScriptFile(), FALSE, FALSE, FALSE);\r
 \r
   if (!Found) {\r
-    ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SYNTAX_NO_MATCHING), gShellLevel1HiiHandle, L"For", L"EndFor", ShellCommandGetCurrentScriptFile()->CurrentCommand->Line);\r
+    CurrentScriptFile = ShellCommandGetCurrentScriptFile();\r
+    ShellPrintHiiEx(\r
+      -1, \r
+      -1, \r
+      NULL, \r
+      STRING_TOKEN (STR_SYNTAX_NO_MATCHING), \r
+      gShellLevel1HiiHandle, \r
+      L"For", \r
+      L"EndFor", \r
+      CurrentScriptFile!=NULL\r
+        && CurrentScriptFile->CurrentCommand!=NULL\r
+          ? CurrentScriptFile->CurrentCommand->Line:0);\r
     return (SHELL_NOT_FOUND);\r
   }\r
   return (SHELL_SUCCESS);\r
@@ -103,8 +123,11 @@ typedef struct {
   @param[in] Alias              The alias to test for.\r
   @param[in] CommandString      The updated command string.\r
   @param[in,out] List           The list to search.\r
+\r
+  @retval EFI_SUCCESS           The operation was completed successfully.\r
+  @retval EFI_OUT_OF_RESOURCES  There was not enough free memory.\r
 **/\r
-VOID\r
+EFI_STATUS\r
 EFIAPI\r
 InternalUpdateAliasOnList(\r
   IN CONST CHAR16       *Alias,\r
@@ -139,12 +162,16 @@ InternalUpdateAliasOnList(
   }\r
   if (!Found) {\r
     Node = AllocateZeroPool(sizeof(ALIAS_LIST));\r
+    if (Node == NULL) {\r
+      return (EFI_OUT_OF_RESOURCES);\r
+    }\r
     ASSERT(Node->Alias == NULL);\r
     Node->Alias         = StrnCatGrow(&Node->Alias, NULL, Alias, 0);\r
     ASSERT(Node->CommandString == NULL);\r
     Node->CommandString = StrnCatGrow(&Node->CommandString, NULL, CommandString, 0);\r
     InsertTailList(List, &Node->Link);\r
   }\r
+  return (EFI_SUCCESS);\r
 }\r
 \r
 /**\r
@@ -290,7 +317,16 @@ ShellCommandRunFor (
     // Make sure that an End exists.\r
     //\r
     if (!MoveToTag(GetNextNode, L"endfor", L"for", NULL, CurrentScriptFile, TRUE, TRUE, FALSE)) {\r
-      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SYNTAX_NO_MATCHING), gShellLevel1HiiHandle, L"EndFor", L"For", ShellCommandGetCurrentScriptFile()->CurrentCommand->Line);\r
+      ShellPrintHiiEx(\r
+        -1, \r
+        -1, \r
+        NULL, \r
+        STRING_TOKEN (STR_SYNTAX_NO_MATCHING), \r
+        gShellLevel1HiiHandle, \r
+        L"EndFor", \r
+        L"For", \r
+        CurrentScriptFile->CurrentCommand!=NULL\r
+          ?CurrentScriptFile->CurrentCommand->Line:0);\r
       return (SHELL_DEVICE_ERROR);\r
     }\r
 \r
@@ -301,7 +337,7 @@ ShellCommandRunFor (
       ||!((gEfiShellParametersProtocol->Argv[1][1] >= L'a' && gEfiShellParametersProtocol->Argv[1][1] <= L'z')\r
        ||(gEfiShellParametersProtocol->Argv[1][1] >= L'A' && gEfiShellParametersProtocol->Argv[1][1] <= L'Z'))\r
      ) {\r
-      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_VAR), gShellLevel1HiiHandle, gEfiShellParametersProtocol->Argv[2]);\r
+      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_VAR), gShellLevel1HiiHandle, gEfiShellParametersProtocol->Argv[1]);\r
       return (SHELL_INVALID_PARAMETER);\r
     }\r
 \r
@@ -372,7 +408,7 @@ ShellCommandRunFor (
         if (ArgSet == NULL) {\r
 //        ArgSet = StrnCatGrow(&ArgSet, &ArgSize, L"\"", 0);\r
         } else {\r
-          ArgSet = StrnCatGrow(&ArgSet, &ArgSize, L"  ", 0);\r
+          ArgSet = StrnCatGrow(&ArgSet, &ArgSize, L" ", 0);\r
         }\r
         ArgSet = StrnCatGrow(&ArgSet, &ArgSize, gEfiShellParametersProtocol->Argv[LoopVar], 0);\r
 //        ArgSet = StrnCatGrow(&ArgSet, &ArgSize, L" ", 0);\r
@@ -387,54 +423,109 @@ ShellCommandRunFor (
       Info->CurrentValue    = NULL;\r
       ArgSetWalker            = ArgSet;\r
       if (ArgSetWalker[0] != L'(') {\r
-        ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM_SCRIPT), gShellLevel1HiiHandle, ArgSet, ShellCommandGetCurrentScriptFile()->CurrentCommand->Line);\r
+        ShellPrintHiiEx(\r
+          -1, \r
+          -1, \r
+          NULL, \r
+          STRING_TOKEN (STR_GEN_PROBLEM_SCRIPT), \r
+          gShellLevel1HiiHandle, \r
+          ArgSet, \r
+          CurrentScriptFile!=NULL \r
+            && CurrentScriptFile->CurrentCommand!=NULL\r
+            ? CurrentScriptFile->CurrentCommand->Line:0);\r
         ShellStatus = SHELL_INVALID_PARAMETER;\r
       } else {\r
-        ArgSetWalker++;\r
-        while (ArgSetWalker != NULL && ArgSetWalker[0] == L' ') {\r
-          ArgSetWalker++;\r
+        TempSpot = StrStr(ArgSetWalker, L")");\r
+        if (TempSpot != NULL) {\r
+          TempString = TempSpot+1;\r
+          if (*(TempString) != CHAR_NULL) {\r
+            while(TempString != NULL && *TempString == L' ') {\r
+              TempString++;\r
+            }\r
+            if (StrLen(TempString) > 0) {\r
+              TempSpot = NULL;\r
+            }\r
+          }\r
         }\r
-        if (!ShellIsValidForNumber(ArgSetWalker)) {\r
-          ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM_SCRIPT), gShellLevel1HiiHandle, ArgSet, ShellCommandGetCurrentScriptFile()->CurrentCommand->Line);\r
+        if (TempSpot == NULL) {\r
+          ShellPrintHiiEx(\r
+            -1, \r
+            -1, \r
+            NULL, \r
+            STRING_TOKEN (STR_GEN_PROBLEM_SCRIPT), \r
+            gShellLevel1HiiHandle, \r
+            CurrentScriptFile!=NULL \r
+              && CurrentScriptFile->CurrentCommand!=NULL\r
+              ? CurrentScriptFile->CurrentCommand->Line:0);\r
           ShellStatus = SHELL_INVALID_PARAMETER;\r
         } else {\r
-          if (ArgSetWalker[0] == L'-') {\r
-            Info->Current = 0 - (INTN)ShellStrToUintn(ArgSetWalker+1);\r
-          } else {\r
-            Info->Current = (INTN)ShellStrToUintn(ArgSetWalker);\r
-          }\r
-          ArgSetWalker  = StrStr(ArgSetWalker, L" ");\r
+          *TempSpot = CHAR_NULL;\r
+          ArgSetWalker++;\r
           while (ArgSetWalker != NULL && ArgSetWalker[0] == L' ') {\r
             ArgSetWalker++;\r
           }\r
-          if (ArgSetWalker == NULL || *ArgSetWalker == CHAR_NULL || !ShellIsValidForNumber(ArgSetWalker)){\r
-            ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM_SCRIPT), gShellLevel1HiiHandle, ArgSet, ShellCommandGetCurrentScriptFile()->CurrentCommand->Line);\r
+          if (!ShellIsValidForNumber(ArgSetWalker)) {\r
+            ShellPrintHiiEx(\r
+              -1, \r
+              -1, \r
+              NULL, \r
+              STRING_TOKEN (STR_GEN_PROBLEM_SCRIPT), \r
+              gShellLevel1HiiHandle, \r
+              ArgSet, \r
+              CurrentScriptFile!=NULL \r
+                && CurrentScriptFile->CurrentCommand!=NULL\r
+                ? CurrentScriptFile->CurrentCommand->Line:0);\r
             ShellStatus = SHELL_INVALID_PARAMETER;\r
           } else {\r
             if (ArgSetWalker[0] == L'-') {\r
-              Info->End = 0 - (INTN)ShellStrToUintn(ArgSetWalker+1);\r
-            } else {\r
-              Info->End = (INTN)ShellStrToUintn(ArgSetWalker);\r
-            }\r
-            if (Info->Current < Info->End) {\r
-              Info->Step            = 1;\r
+              Info->Current = 0 - (INTN)ShellStrToUintn(ArgSetWalker+1);\r
             } else {\r
-              Info->Step            = -1;\r
+              Info->Current = (INTN)ShellStrToUintn(ArgSetWalker);\r
             }\r
-\r
             ArgSetWalker  = StrStr(ArgSetWalker, L" ");\r
             while (ArgSetWalker != NULL && ArgSetWalker[0] == L' ') {\r
               ArgSetWalker++;\r
             }\r
-            if (ArgSetWalker != NULL && *ArgSetWalker != CHAR_NULL) {\r
-              TempSpot = StrStr(ArgSetWalker, L")");\r
-              if (TempSpot == NULL) {\r
-                ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM_SCRIPT), gShellLevel1HiiHandle, ArgSet, ShellCommandGetCurrentScriptFile()->CurrentCommand->Line);\r
-                ShellStatus = SHELL_INVALID_PARAMETER;\r
+            if (ArgSetWalker == NULL || *ArgSetWalker == CHAR_NULL || !ShellIsValidForNumber(ArgSetWalker)){\r
+              ShellPrintHiiEx(\r
+                -1, \r
+                -1, \r
+                NULL, \r
+                STRING_TOKEN (STR_GEN_PROBLEM_SCRIPT), \r
+                gShellLevel1HiiHandle, \r
+                ArgSet, \r
+                CurrentScriptFile!=NULL \r
+                  && CurrentScriptFile->CurrentCommand!=NULL\r
+                  ? CurrentScriptFile->CurrentCommand->Line:0);\r
+              ShellStatus = SHELL_INVALID_PARAMETER;\r
+            } else {\r
+              if (ArgSetWalker[0] == L'-') {\r
+                Info->End = 0 - (INTN)ShellStrToUintn(ArgSetWalker+1);\r
+              } else {\r
+                Info->End = (INTN)ShellStrToUintn(ArgSetWalker);\r
+              }\r
+              if (Info->Current < Info->End) {\r
+                Info->Step            = 1;\r
               } else {\r
-                *TempSpot = CHAR_NULL;\r
+                Info->Step            = -1;\r
+              }\r
+\r
+              ArgSetWalker  = StrStr(ArgSetWalker, L" ");\r
+              while (ArgSetWalker != NULL && ArgSetWalker[0] == L' ') {\r
+                ArgSetWalker++;\r
+              }\r
+              if (ArgSetWalker != NULL && *ArgSetWalker != CHAR_NULL) {\r
                 if (ArgSetWalker == NULL || *ArgSetWalker == CHAR_NULL || !ShellIsValidForNumber(ArgSetWalker)){\r
-                  ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM_SCRIPT), gShellLevel1HiiHandle, ArgSet, ShellCommandGetCurrentScriptFile()->CurrentCommand->Line);\r
+                  ShellPrintHiiEx(\r
+                    -1, \r
+                    -1, \r
+                    NULL, \r
+                    STRING_TOKEN (STR_GEN_PROBLEM_SCRIPT), \r
+                    gShellLevel1HiiHandle, \r
+                    ArgSet, \r
+                    CurrentScriptFile!=NULL \r
+                      && CurrentScriptFile->CurrentCommand!=NULL\r
+                      ? CurrentScriptFile->CurrentCommand->Line:0);\r
                   ShellStatus = SHELL_INVALID_PARAMETER;\r
                 } else {\r
                   if (*ArgSetWalker == L')') {\r
@@ -445,8 +536,23 @@ ShellCommandRunFor (
                     } else {\r
                       Info->Step = (INTN)ShellStrToUintn(ArgSetWalker);\r
                     }\r
+\r
+                    if (StrStr(ArgSetWalker, L" ") != NULL) {\r
+                      ShellPrintHiiEx(\r
+                        -1, \r
+                        -1, \r
+                        NULL, \r
+                        STRING_TOKEN (STR_GEN_PROBLEM_SCRIPT), \r
+                        gShellLevel1HiiHandle, \r
+                        ArgSet, \r
+                        CurrentScriptFile!=NULL \r
+                          && CurrentScriptFile->CurrentCommand!=NULL\r
+                          ? CurrentScriptFile->CurrentCommand->Line:0);\r
+                      ShellStatus = SHELL_INVALID_PARAMETER;\r
+                    }\r
                   }\r
                 }\r
+                \r
               }\r
             }\r
           }\r
@@ -461,7 +567,16 @@ ShellCommandRunFor (
       }\r
       CurrentScriptFile->CurrentCommand->Data = Info;\r
     } else {\r
-      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM_SCRIPT), gShellLevel1HiiHandle, ArgSet, ShellCommandGetCurrentScriptFile()->CurrentCommand->Line);\r
+      ShellPrintHiiEx(\r
+        -1, \r
+        -1, \r
+        NULL, \r
+        STRING_TOKEN (STR_GEN_PROBLEM_SCRIPT), \r
+        gShellLevel1HiiHandle, \r
+        ArgSet, \r
+        CurrentScriptFile!=NULL \r
+          && CurrentScriptFile->CurrentCommand!=NULL\r
+          ? CurrentScriptFile->CurrentCommand->Line:0);\r
       ShellStatus = SHELL_INVALID_PARAMETER;\r
     }\r
   } else {\r
@@ -502,7 +617,17 @@ ShellCommandRunFor (
         // find the matching endfor (we're done with the loop)\r
         //\r
         if (!MoveToTag(GetNextNode, L"endfor", L"for", NULL, CurrentScriptFile, TRUE, FALSE, FALSE)) {\r
-          ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SYNTAX_NO_MATCHING), gShellLevel1HiiHandle, L"EndFor", L"For", ShellCommandGetCurrentScriptFile()->CurrentCommand->Line);\r
+          ShellPrintHiiEx(\r
+            -1, \r
+            -1, \r
+            NULL, \r
+            STRING_TOKEN (STR_SYNTAX_NO_MATCHING), \r
+            gShellLevel1HiiHandle, \r
+            L"EndFor", \r
+            L"For", \r
+            CurrentScriptFile!=NULL \r
+              && CurrentScriptFile->CurrentCommand!=NULL\r
+              ? CurrentScriptFile->CurrentCommand->Line:0);\r
           ShellStatus = SHELL_DEVICE_ERROR;\r
         }\r
         if (Info->RemoveSubstAlias) {\r
@@ -522,9 +647,9 @@ ShellCommandRunFor (
         if (Info->CurrentValue[0] == L'\"') {\r
           Info->CurrentValue++;\r
         }\r
-        while (Info->CurrentValue[0] == L' ') {\r
-          Info->CurrentValue++;\r
-        }\r
+//        while (Info->CurrentValue[0] == L' ') {\r
+//          Info->CurrentValue++;\r
+//        }\r
         if (Info->CurrentValue[0] == L'\"') {\r
           Info->CurrentValue++;\r
         }\r
@@ -560,7 +685,17 @@ ShellCommandRunFor (
         // find the matching endfor (we're done with the loop)\r
         //\r
         if (!MoveToTag(GetNextNode, L"endfor", L"for", NULL, CurrentScriptFile, TRUE, FALSE, FALSE)) {\r
-          ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SYNTAX_NO_MATCHING), gShellLevel1HiiHandle, L"EndFor", L"For", ShellCommandGetCurrentScriptFile()->CurrentCommand->Line);\r
+          ShellPrintHiiEx(\r
+            -1, \r
+            -1, \r
+            NULL, \r
+            STRING_TOKEN (STR_SYNTAX_NO_MATCHING), \r
+            gShellLevel1HiiHandle, \r
+            L"EndFor", \r
+            L"For", \r
+            CurrentScriptFile!=NULL \r
+              && CurrentScriptFile->CurrentCommand!=NULL\r
+              ? CurrentScriptFile->CurrentCommand->Line:0);\r
           ShellStatus = SHELL_DEVICE_ERROR;\r
         }\r
         if (Info->RemoveSubstAlias) {\r