/** @file
  Main file for endfor and for shell level 1 functions.

  (C) Copyright 2015 Hewlett-Packard Development Company, L.P.<BR>
  Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>
  SPDX-License-Identifier: BSD-2-Clause-Patent

**/

#include "UefiShellLevel1CommandsLib.h"
#include <Library/PrintLib.h>

/**
  Determine if a valid string is a valid number for the 'for' command.

  @param[in] Number The pointer to the string representation of the number to test.

  @retval TRUE    The number is valid.
  @retval FALSE   The number is not valid.
**/
BOOLEAN
ShellIsValidForNumber (
  IN CONST CHAR16  *Number
  )
{
  if ((Number == NULL) || (*Number == CHAR_NULL)) {
    return (FALSE);
  }

  if (*Number == L'-') {
    Number++;
  }

  if (StrLen (Number) == 0) {
    return (FALSE);
  }

  if (StrLen (Number) >= 7) {
    if ((StrStr (Number, L" ") == NULL) || (((StrStr (Number, L" ") != NULL) && ((StrStr (Number, L" ") - Number) >= 7)))) {
      return (FALSE);
    }
  }

  if (!ShellIsDecimalDigitCharacter (*Number)) {
    return (FALSE);
  }

  return (TRUE);
}

/**
  Function for 'endfor' command.

  @param[in] ImageHandle  Handle to the Image (NULL if Internal).
  @param[in] SystemTable  Pointer to the System Table (NULL if Internal).
**/
SHELL_STATUS
EFIAPI
ShellCommandRunEndFor (
  IN EFI_HANDLE        ImageHandle,
  IN EFI_SYSTEM_TABLE  *SystemTable
  )
{
  EFI_STATUS   Status;
  BOOLEAN      Found;
  SCRIPT_FILE  *CurrentScriptFile;

  Status = CommandInit ();
  ASSERT_EFI_ERROR (Status);

  if (!gEfiShellProtocol->BatchIsActive ()) {
    ShellPrintHiiDefaultEx (STRING_TOKEN (STR_NO_SCRIPT), gShellLevel1HiiHandle, L"endfor");
    return (SHELL_UNSUPPORTED);
  }

  if (gEfiShellParametersProtocol->Argc > 1) {
    ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel1HiiHandle, L"endfor");
    return (SHELL_INVALID_PARAMETER);
  }

  Found = MoveToTag (GetPreviousNode, L"for", L"endfor", NULL, ShellCommandGetCurrentScriptFile (), FALSE, FALSE, FALSE);

  if (!Found) {
    CurrentScriptFile = ShellCommandGetCurrentScriptFile ();
    ShellPrintHiiDefaultEx (
      STRING_TOKEN (STR_SYNTAX_NO_MATCHING),
      gShellLevel1HiiHandle,
      L"For",
      L"EndFor",
      CurrentScriptFile != NULL
                           && CurrentScriptFile->CurrentCommand != NULL
          ? CurrentScriptFile->CurrentCommand->Line : 0
      );
    return (SHELL_NOT_FOUND);
  }

  return (SHELL_SUCCESS);
}

typedef struct {
  UINT32     Signature;
  INTN       Current;
  INTN       End;
  INTN       Step;
  CHAR16     *ReplacementName;
  CHAR16     *CurrentValue;
  BOOLEAN    RemoveSubstAlias;
  CHAR16     Set[1];
} SHELL_FOR_INFO;
#define SIZE_OF_SHELL_FOR_INFO    OFFSET_OF (SHELL_FOR_INFO, Set)
#define SHELL_FOR_INFO_SIGNATURE  SIGNATURE_32 ('S', 'F', 'I', 's')

/**
  Update the value of a given alias on the list.  If the alias is not there then add it.

  @param[in] Alias               The alias to test for.
  @param[in] CommandString       The updated command string.
  @param[in, out] List           The list to search.

  @retval EFI_SUCCESS           The operation was completed successfully.
  @retval EFI_OUT_OF_RESOURCES  There was not enough free memory.
**/
EFI_STATUS
InternalUpdateAliasOnList (
  IN CONST CHAR16    *Alias,
  IN CONST CHAR16    *CommandString,
  IN OUT LIST_ENTRY  *List
  )
{
  ALIAS_LIST  *Node;
  BOOLEAN     Found;

  //
  // assert for NULL parameter
  //
  ASSERT (Alias != NULL);

  //
  // check for the Alias
  //
  for ( Node = (ALIAS_LIST *)GetFirstNode (List), Found = FALSE
        ; !IsNull (List, &Node->Link)
        ; Node = (ALIAS_LIST *)GetNextNode (List, &Node->Link)
        )
  {
    ASSERT (Node->CommandString != NULL);
    ASSERT (Node->Alias != NULL);
    if (StrCmp (Node->Alias, Alias) == 0) {
      FreePool (Node->CommandString);
      Node->CommandString = NULL;
      Node->CommandString = StrnCatGrow (&Node->CommandString, NULL, CommandString, 0);
      Found               = TRUE;
      break;
    }
  }

  if (!Found) {
    Node = AllocateZeroPool (sizeof (ALIAS_LIST));
    if (Node == NULL) {
      return (EFI_OUT_OF_RESOURCES);
    }

    ASSERT (Node->Alias == NULL);
    Node->Alias = StrnCatGrow (&Node->Alias, NULL, Alias, 0);
    ASSERT (Node->CommandString == NULL);
    Node->CommandString = StrnCatGrow (&Node->CommandString, NULL, CommandString, 0);
    InsertTailList (List, &Node->Link);
  }

  return (EFI_SUCCESS);
}

/**
  Find out if an alias is on the given list.

  @param[in] Alias              The alias to test for.
  @param[in] List               The list to search.

  @retval TRUE                  The alias is on the list.
  @retval FALSE                 The alias is not on the list.
**/
BOOLEAN
InternalIsAliasOnList (
  IN CONST CHAR16      *Alias,
  IN CONST LIST_ENTRY  *List
  )
{
  ALIAS_LIST  *Node;

  //
  // assert for NULL parameter
  //
  ASSERT (Alias != NULL);

  //
  // check for the Alias
  //
  for ( Node = (ALIAS_LIST *)GetFirstNode (List)
        ; !IsNull (List, &Node->Link)
        ; Node = (ALIAS_LIST *)GetNextNode (List, &Node->Link)
        )
  {
    ASSERT (Node->CommandString != NULL);
    ASSERT (Node->Alias != NULL);
    if (StrCmp (Node->Alias, Alias) == 0) {
      return (TRUE);
    }
  }

  return (FALSE);
}

/**
  Remove an alias from the given list.

  @param[in] Alias               The alias to remove.
  @param[in, out] List           The list to search.
**/
BOOLEAN
InternalRemoveAliasFromList (
  IN CONST CHAR16    *Alias,
  IN OUT LIST_ENTRY  *List
  )
{
  ALIAS_LIST  *Node;

  //
  // assert for NULL parameter
  //
  ASSERT (Alias != NULL);

  //
  // check for the Alias
  //
  for ( Node = (ALIAS_LIST *)GetFirstNode (List)
        ; !IsNull (List, &Node->Link)
        ; Node = (ALIAS_LIST *)GetNextNode (List, &Node->Link)
        )
  {
    ASSERT (Node->CommandString != NULL);
    ASSERT (Node->Alias != NULL);
    if (StrCmp (Node->Alias, Alias) == 0) {
      RemoveEntryList (&Node->Link);
      FreePool (Node->Alias);
      FreePool (Node->CommandString);
      FreePool (Node);
      return (TRUE);
    }
  }

  return (FALSE);
}

/**
  Function to determine whether a string is decimal or hex representation of a number
  and return the number converted from the string.

  @param[in] String   String representation of a number

  @return             the number
  @retval (UINTN)(-1) An error ocurred.
**/
UINTN
ReturnUintn (
  IN CONST CHAR16  *String
  )
{
  UINT64  RetVal;

  if (!EFI_ERROR (ShellConvertStringToUint64 (String, &RetVal, FALSE, TRUE))) {
    return ((UINTN)RetVal);
  }

  return ((UINTN)(-1));
}

/**
  Function for 'for' command.

  @param[in] ImageHandle  Handle to the Image (NULL if Internal).
  @param[in] SystemTable  Pointer to the System Table (NULL if Internal).
**/
SHELL_STATUS
EFIAPI
ShellCommandRunFor (
  IN EFI_HANDLE        ImageHandle,
  IN EFI_SYSTEM_TABLE  *SystemTable
  )
{
  EFI_STATUS           Status;
  SHELL_STATUS         ShellStatus;
  SCRIPT_FILE          *CurrentScriptFile;
  CHAR16               *ArgSet;
  CHAR16               *ArgSetWalker;
  CHAR16               *Parameter;
  UINTN                ArgSize;
  UINTN                LoopVar;
  SHELL_FOR_INFO       *Info;
  CHAR16               *TempString;
  CHAR16               *TempSpot;
  BOOLEAN              FirstPass;
  EFI_SHELL_FILE_INFO  *Node;
  EFI_SHELL_FILE_INFO  *FileList;
  UINTN                NewSize;

  ArgSet       = NULL;
  ArgSize      = 0;
  ShellStatus  = SHELL_SUCCESS;
  ArgSetWalker = NULL;
  TempString   = NULL;
  Parameter    = NULL;
  FirstPass    = FALSE;

  //
  // initialize the shell lib (we must be in non-auto-init...)
  //
  Status = ShellInitialize ();
  ASSERT_EFI_ERROR (Status);

  Status = CommandInit ();
  ASSERT_EFI_ERROR (Status);

  if (!gEfiShellProtocol->BatchIsActive ()) {
    ShellPrintHiiDefaultEx (STRING_TOKEN (STR_NO_SCRIPT), gShellLevel1HiiHandle, L"for");
    return (SHELL_UNSUPPORTED);
  }

  if (gEfiShellParametersProtocol->Argc < 4) {
    ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel1HiiHandle, L"for");
    return (SHELL_INVALID_PARAMETER);
  }

  CurrentScriptFile = ShellCommandGetCurrentScriptFile ();
  if (CurrentScriptFile == NULL) {
    ASSERT (CurrentScriptFile != NULL);
    return (SHELL_INVALID_PARAMETER);
  }

  if ((CurrentScriptFile->CurrentCommand != NULL) && (CurrentScriptFile->CurrentCommand->Data == NULL)) {
    FirstPass = TRUE;

    //
    // Make sure that an End exists.
    //
    if (!MoveToTag (GetNextNode, L"endfor", L"for", NULL, CurrentScriptFile, TRUE, TRUE, FALSE)) {
      ShellPrintHiiDefaultEx (
        STRING_TOKEN (STR_SYNTAX_NO_MATCHING),
        gShellLevel1HiiHandle,
        L"EndFor",
        L"For",
        CurrentScriptFile->CurrentCommand->Line
        );
      return (SHELL_DEVICE_ERROR);
    }

    //
    // Process the line.
    //
    if (  (gEfiShellParametersProtocol->Argv[1][0] != L'%') || (gEfiShellParametersProtocol->Argv[1][2] != CHAR_NULL)
       || !(  ((gEfiShellParametersProtocol->Argv[1][1] >= L'a') && (gEfiShellParametersProtocol->Argv[1][1] <= L'z'))
           || ((gEfiShellParametersProtocol->Argv[1][1] >= L'A') && (gEfiShellParametersProtocol->Argv[1][1] <= L'Z')))
          )
    {
      ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_INV_VAR), gShellLevel1HiiHandle, gEfiShellParametersProtocol->Argv[1]);
      return (SHELL_INVALID_PARAMETER);
    }

    if (gUnicodeCollation->StriColl (
                             gUnicodeCollation,
                             L"in",
                             gEfiShellParametersProtocol->Argv[2]
                             ) == 0)
    {
      for (LoopVar = 0x3; LoopVar < gEfiShellParametersProtocol->Argc; LoopVar++) {
        ASSERT ((ArgSet == NULL && ArgSize == 0) || (ArgSet != NULL));
        if (  (StrStr (gEfiShellParametersProtocol->Argv[LoopVar], L"*") != NULL)
           || (StrStr (gEfiShellParametersProtocol->Argv[LoopVar], L"?") != NULL)
           || (StrStr (gEfiShellParametersProtocol->Argv[LoopVar], L"[") != NULL)
           || (StrStr (gEfiShellParametersProtocol->Argv[LoopVar], L"]") != NULL))
        {
          FileList = NULL;
          Status   = ShellOpenFileMetaArg ((CHAR16 *)gEfiShellParametersProtocol->Argv[LoopVar], EFI_FILE_MODE_READ, &FileList);
          if (EFI_ERROR (Status) || (FileList == NULL) || IsListEmpty (&FileList->Link)) {
            ArgSet = StrnCatGrow (&ArgSet, &ArgSize, L" \"", 0);
            ArgSet = StrnCatGrow (&ArgSet, &ArgSize, gEfiShellParametersProtocol->Argv[LoopVar], 0);
            ArgSet = StrnCatGrow (&ArgSet, &ArgSize, L"\"", 0);
          } else {
            for (Node = (EFI_SHELL_FILE_INFO *)GetFirstNode (&FileList->Link)
                 ; !IsNull (&FileList->Link, &Node->Link)
                 ; Node = (EFI_SHELL_FILE_INFO *)GetNextNode (&FileList->Link, &Node->Link)
                 )
            {
              ArgSet = StrnCatGrow (&ArgSet, &ArgSize, L" \"", 0);
              ArgSet = StrnCatGrow (&ArgSet, &ArgSize, Node->FullName, 0);
              ArgSet = StrnCatGrow (&ArgSet, &ArgSize, L"\"", 0);
            }

            ShellCloseFileMetaArg (&FileList);
          }
        } else {
          Parameter = gEfiShellParametersProtocol->Argv[LoopVar];
          if ((Parameter[0] == L'\"') && (Parameter[StrLen (Parameter)-1] == L'\"')) {
            ArgSet = StrnCatGrow (&ArgSet, &ArgSize, L" ", 0);
            ArgSet = StrnCatGrow (&ArgSet, &ArgSize, Parameter, 0);
          } else {
            ArgSet = StrnCatGrow (&ArgSet, &ArgSize, L" \"", 0);
            ArgSet = StrnCatGrow (&ArgSet, &ArgSize, Parameter, 0);
            ArgSet = StrnCatGrow (&ArgSet, &ArgSize, L"\"", 0);
          }
        }
      }

      if (ArgSet == NULL) {
        ShellStatus = SHELL_OUT_OF_RESOURCES;
      } else {
        //
        // set up for an 'in' for loop
        //
        NewSize  = StrSize (ArgSet);
        NewSize += sizeof (SHELL_FOR_INFO)+StrSize (gEfiShellParametersProtocol->Argv[1]);
        Info     = AllocateZeroPool (NewSize);
        if (Info == NULL) {
          FreePool (ArgSet);
          return SHELL_OUT_OF_RESOURCES;
        }

        Info->Signature = SHELL_FOR_INFO_SIGNATURE;
        CopyMem (Info->Set, ArgSet, StrSize (ArgSet));
        NewSize = StrSize (gEfiShellParametersProtocol->Argv[1]);
        CopyMem (Info->Set+(StrSize (ArgSet)/sizeof (Info->Set[0])), gEfiShellParametersProtocol->Argv[1], NewSize);
        Info->ReplacementName = Info->Set+StrSize (ArgSet)/sizeof (Info->Set[0]);
        Info->CurrentValue    = (CHAR16 *)Info->Set;
        Info->Step            = 0;
        Info->Current         = 0;
        Info->End             = 0;

        if (InternalIsAliasOnList (Info->ReplacementName, &CurrentScriptFile->SubstList)) {
          Info->RemoveSubstAlias = FALSE;
        } else {
          Info->RemoveSubstAlias = TRUE;
        }

        CurrentScriptFile->CurrentCommand->Data = Info;
      }
    } else if (gUnicodeCollation->StriColl (
                                    gUnicodeCollation,
                                    L"run",
                                    gEfiShellParametersProtocol->Argv[2]
                                    ) == 0)
    {
      for (LoopVar = 0x3; LoopVar < gEfiShellParametersProtocol->Argc; LoopVar++) {
        ASSERT ((ArgSet == NULL && ArgSize == 0) || (ArgSet != NULL));
        if ((StrStr (gEfiShellParametersProtocol->Argv[LoopVar], L")") != NULL) &&
            ((LoopVar + 1) < gEfiShellParametersProtocol->Argc)
            )
        {
          return (SHELL_INVALID_PARAMETER);
        }

        if (ArgSet == NULL) {
          //        ArgSet = StrnCatGrow(&ArgSet, &ArgSize, L"\"", 0);
        } else {
          ArgSet = StrnCatGrow (&ArgSet, &ArgSize, L" ", 0);
        }

        ArgSet = StrnCatGrow (&ArgSet, &ArgSize, gEfiShellParametersProtocol->Argv[LoopVar], 0);
        //        ArgSet = StrnCatGrow(&ArgSet, &ArgSize, L" ", 0);
      }

      if (ArgSet == NULL) {
        ShellStatus = SHELL_OUT_OF_RESOURCES;
      } else {
        //
        // set up for a 'run' for loop
        //
        Info = AllocateZeroPool (sizeof (SHELL_FOR_INFO)+StrSize (gEfiShellParametersProtocol->Argv[1]));
        if (Info == NULL) {
          FreePool (ArgSet);
          return SHELL_OUT_OF_RESOURCES;
        }

        Info->Signature = SHELL_FOR_INFO_SIGNATURE;
        CopyMem (Info->Set, gEfiShellParametersProtocol->Argv[1], StrSize (gEfiShellParametersProtocol->Argv[1]));
        Info->ReplacementName = Info->Set;
        Info->CurrentValue    = NULL;
        ArgSetWalker          = ArgSet;
        if (ArgSetWalker[0] != L'(') {
          ShellPrintHiiDefaultEx (
            STRING_TOKEN (STR_GEN_PROBLEM_SCRIPT),
            gShellLevel1HiiHandle,
            ArgSet,
            CurrentScriptFile->CurrentCommand->Line
            );
          ShellStatus = SHELL_INVALID_PARAMETER;
        } else {
          TempSpot = StrStr (ArgSetWalker, L")");
          if (TempSpot != NULL) {
            TempString = TempSpot+1;
            if (*(TempString) != CHAR_NULL) {
              while (TempString != NULL && *TempString == L' ') {
                TempString++;
              }

              if (StrLen (TempString) > 0) {
                TempSpot = NULL;
              }
            }
          }

          if (TempSpot == NULL) {
            ShellPrintHiiDefaultEx (
              STRING_TOKEN (STR_GEN_PROBLEM_SCRIPT),
              gShellLevel1HiiHandle,
              CurrentScriptFile->CurrentCommand->Line
              );
            ShellStatus = SHELL_INVALID_PARAMETER;
          } else {
            *TempSpot = CHAR_NULL;
            ArgSetWalker++;
            while (ArgSetWalker != NULL && ArgSetWalker[0] == L' ') {
              ArgSetWalker++;
            }

            if (!ShellIsValidForNumber (ArgSetWalker)) {
              ShellPrintHiiDefaultEx (
                STRING_TOKEN (STR_GEN_PROBLEM_SCRIPT),
                gShellLevel1HiiHandle,
                ArgSet,
                CurrentScriptFile->CurrentCommand->Line
                );
              ShellStatus = SHELL_INVALID_PARAMETER;
            } else {
              if (ArgSetWalker[0] == L'-') {
                Info->Current = 0 - (INTN)ReturnUintn (ArgSetWalker+1);
              } else {
                Info->Current = (INTN)ReturnUintn (ArgSetWalker);
              }

              ArgSetWalker = StrStr (ArgSetWalker, L" ");
              while (ArgSetWalker != NULL && ArgSetWalker[0] == L' ') {
                ArgSetWalker++;
              }

              if ((ArgSetWalker == NULL) || (*ArgSetWalker == CHAR_NULL) || !ShellIsValidForNumber (ArgSetWalker)) {
                ShellPrintHiiDefaultEx (
                  STRING_TOKEN (STR_GEN_PROBLEM_SCRIPT),
                  gShellLevel1HiiHandle,
                  ArgSet,
                  CurrentScriptFile->CurrentCommand->Line
                  );
                ShellStatus = SHELL_INVALID_PARAMETER;
              } else {
                if (ArgSetWalker[0] == L'-') {
                  Info->End = 0 - (INTN)ReturnUintn (ArgSetWalker+1);
                } else {
                  Info->End = (INTN)ReturnUintn (ArgSetWalker);
                }

                if (Info->Current < Info->End) {
                  Info->Step = 1;
                } else {
                  Info->Step = -1;
                }

                ArgSetWalker = StrStr (ArgSetWalker, L" ");
                while (ArgSetWalker != NULL && ArgSetWalker[0] == L' ') {
                  ArgSetWalker++;
                }

                if ((ArgSetWalker != NULL) && (*ArgSetWalker != CHAR_NULL)) {
                  if ((ArgSetWalker == NULL) || (*ArgSetWalker == CHAR_NULL) || !ShellIsValidForNumber (ArgSetWalker)) {
                    ShellPrintHiiDefaultEx (
                      STRING_TOKEN (STR_GEN_PROBLEM_SCRIPT),
                      gShellLevel1HiiHandle,
                      ArgSet,
                      CurrentScriptFile->CurrentCommand->Line
                      );
                    ShellStatus = SHELL_INVALID_PARAMETER;
                  } else {
                    if (*ArgSetWalker == L')') {
                      ASSERT (Info->Step == 1 || Info->Step == -1);
                    } else {
                      if (ArgSetWalker[0] == L'-') {
                        Info->Step = 0 - (INTN)ReturnUintn (ArgSetWalker+1);
                      } else {
                        Info->Step = (INTN)ReturnUintn (ArgSetWalker);
                      }

                      if (StrStr (ArgSetWalker, L" ") != NULL) {
                        ShellPrintHiiDefaultEx (
                          STRING_TOKEN (STR_GEN_PROBLEM_SCRIPT),
                          gShellLevel1HiiHandle,
                          ArgSet,
                          CurrentScriptFile->CurrentCommand->Line
                          );
                        ShellStatus = SHELL_INVALID_PARAMETER;
                      }
                    }
                  }
                }
              }
            }
          }
        }

        if (ShellStatus == SHELL_SUCCESS) {
          if (InternalIsAliasOnList (Info->ReplacementName, &CurrentScriptFile->SubstList)) {
            Info->RemoveSubstAlias = FALSE;
          } else {
            Info->RemoveSubstAlias = TRUE;
          }
        }

        if (CurrentScriptFile->CurrentCommand != NULL) {
          CurrentScriptFile->CurrentCommand->Data = Info;
        }
      }
    } else {
      ShellPrintHiiDefaultEx (
        STRING_TOKEN (STR_GEN_PROBLEM_SCRIPT),
        gShellLevel1HiiHandle,
        ArgSet,
        CurrentScriptFile != NULL
                             && CurrentScriptFile->CurrentCommand != NULL
          ? CurrentScriptFile->CurrentCommand->Line : 0
        );
      ShellStatus = SHELL_INVALID_PARAMETER;
    }
  } else {
    //
    // These need to be NULL since they are used to determine if this is the first pass later on...
    //
    ASSERT (ArgSetWalker == NULL);
    ASSERT (ArgSet       == NULL);
  }

  if ((CurrentScriptFile != NULL) && (CurrentScriptFile->CurrentCommand != NULL)) {
    Info = (SHELL_FOR_INFO *)CurrentScriptFile->CurrentCommand->Data;
    if (CurrentScriptFile->CurrentCommand->Reset) {
      if (Info != NULL) {
        Info->CurrentValue = (CHAR16 *)Info->Set;
      }

      FirstPass                                = TRUE;
      CurrentScriptFile->CurrentCommand->Reset = FALSE;
    }
  } else {
    ShellStatus = SHELL_UNSUPPORTED;
    Info        = NULL;
  }

  if (ShellStatus == SHELL_SUCCESS) {
    ASSERT (Info != NULL);
    if (Info->Step != 0) {
      //
      // only advance if not the first pass
      //
      if (!FirstPass) {
        //
        // sequence version of for loop...
        //
        Info->Current += Info->Step;
      }

      TempString = AllocateZeroPool (50*sizeof (CHAR16));
      if (TempString == NULL) {
        SHELL_FREE_NON_NULL (ArgSet);
        SHELL_FREE_NON_NULL (Info);
        return (SHELL_OUT_OF_RESOURCES);
      }

      UnicodeSPrint (TempString, 50*sizeof (CHAR16), L"%d", Info->Current);
      InternalUpdateAliasOnList (Info->ReplacementName, TempString, &CurrentScriptFile->SubstList);
      FreePool (TempString);

      if (((Info->Step > 0) && (Info->Current > Info->End)) || ((Info->Step < 0) && (Info->Current < Info->End))) {
        CurrentScriptFile->CurrentCommand->Data = NULL;
        //
        // find the matching endfor (we're done with the loop)
        //
        if (!MoveToTag (GetNextNode, L"endfor", L"for", NULL, CurrentScriptFile, TRUE, FALSE, FALSE)) {
          ShellPrintHiiDefaultEx (
            STRING_TOKEN (STR_SYNTAX_NO_MATCHING),
            gShellLevel1HiiHandle,
            L"EndFor",
            L"For",
            CurrentScriptFile != NULL
                                 && CurrentScriptFile->CurrentCommand != NULL
              ? CurrentScriptFile->CurrentCommand->Line : 0
            );
          ShellStatus = SHELL_DEVICE_ERROR;
        }

        if (Info->RemoveSubstAlias) {
          //
          // remove item from list
          //
          InternalRemoveAliasFromList (Info->ReplacementName, &CurrentScriptFile->SubstList);
        }

        FreePool (Info);
      }
    } else {
      //
      // Must be in 'in' version of for loop...
      //
      ASSERT (Info->Set != NULL);
      if ((Info->CurrentValue != NULL) && (*Info->CurrentValue != CHAR_NULL)) {
        if (Info->CurrentValue[0] == L' ') {
          Info->CurrentValue++;
        }

        if (Info->CurrentValue[0] == L'\"') {
          Info->CurrentValue++;
        }

        //
        // do the next one of the set
        //
        ASSERT (TempString == NULL);
        TempString = StrnCatGrow (&TempString, NULL, Info->CurrentValue, 0);
        if (TempString == NULL) {
          ShellStatus = SHELL_OUT_OF_RESOURCES;
        } else {
          TempSpot = StrStr (TempString, L"\" \"");
          if (TempSpot != NULL) {
            *TempSpot = CHAR_NULL;
          }

          while (TempString[StrLen (TempString)-1] == L'\"') {
            TempString[StrLen (TempString)-1] = CHAR_NULL;
          }

          InternalUpdateAliasOnList (Info->ReplacementName, TempString, &CurrentScriptFile->SubstList);
          Info->CurrentValue += StrLen (TempString);

          if (Info->CurrentValue[0] == L'\"') {
            Info->CurrentValue++;
          }

          FreePool (TempString);
        }
      } else {
        CurrentScriptFile->CurrentCommand->Data = NULL;
        //
        // find the matching endfor (we're done with the loop)
        //
        if (!MoveToTag (GetNextNode, L"endfor", L"for", NULL, CurrentScriptFile, TRUE, FALSE, FALSE)) {
          ShellPrintHiiDefaultEx (
            STRING_TOKEN (STR_SYNTAX_NO_MATCHING),
            gShellLevel1HiiHandle,
            L"EndFor",
            L"For",
            CurrentScriptFile != NULL
                                 && CurrentScriptFile->CurrentCommand != NULL
              ? CurrentScriptFile->CurrentCommand->Line : 0
            );
          ShellStatus = SHELL_DEVICE_ERROR;
        }

        if (Info->RemoveSubstAlias) {
          //
          // remove item from list
          //
          InternalRemoveAliasFromList (Info->ReplacementName, &CurrentScriptFile->SubstList);
        }

        FreePool (Info);
      }
    }
  }

  if (ArgSet != NULL) {
    FreePool (ArgSet);
  }

  return (ShellStatus);
}
