/*++

Copyright (c) 1998  Intel Corporation

Module Name:

    shelle.h
    
Abstract:




Revision History

--*/


#include "shell.h"
#include "shellenv.h"

/* 
 *  Internal defines
 */

typedef struct {
    UINTN           Signature;
    LIST_ENTRY      Link;
    CHAR16          *Line;
    CHAR16          Buffer[80];
} DEFAULT_CMD;

#define MAX_CMDLINE         256
#define MAX_ARG_COUNT        32
#define MAX_ARG_LENGTH      256

#define NON_VOL             1
#define VOL                 0


#define IsWhiteSpace(c)     (c == ' ' || c == '\t' || c == '\n' || c == '\r')
#define IsValidChar(c)      (c >= ' ')
#define IsDigit(c)          (c >= '0' && c <= '9')
#define IsAlpha(c)          ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z' ))

#define GOTO_TARGET_FOUND        (1)
#define GOTO_TARGET_NOT_FOUND    (2)
#define GOTO_TARGET_DOESNT_EXIST (3)

/* 
 *  Internal structures
 */

#define VARIABLE_SIGNATURE  EFI_SIGNATURE_32('v','i','d',' ')
typedef struct {
    UINTN               Signature;
    LIST_ENTRY          Link;
    CHAR16              *Name;

    UINTN               ValueSize;
    union {
        UINT8           *Value;
        CHAR16          *Str;
    } u;

    CHAR16              *CurDir;
    UINT8               Flags ;
} VARIABLE_ID;


/* 
 *  IDs of different variables stored by the shell environment
 */

#define ENVIRONMENT_VARIABLE_ID  \
    { 0x47c7b224, 0xc42a, 0x11d2, 0x8e, 0x57, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b }

#define DEVICE_PATH_MAPPING_ID  \
    { 0x47c7b225, 0xc42a, 0x11d2, 0x8e, 0x57, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b }

#define PROTOCOL_ID_ID  \
    { 0x47c7b226, 0xc42a, 0x11d2, 0x8e, 0x57, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b }

#define ALIAS_ID  \
    { 0x47c7b227, 0xc42a, 0x11d2, 0x8e, 0x57, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b }

/* 
 * 
 */

#define ENV_REDIR_SIGNATURE         EFI_SIGNATURE_32('r','i','d','s')
typedef struct {
    UINTN                           Signature;
    BOOLEAN                         Ascii;
    EFI_STATUS                      WriteError;
    EFI_FILE_HANDLE                 File;
    EFI_DEVICE_PATH                 *FilePath;
    EFI_HANDLE                      Handle;
    SIMPLE_TEXT_OUTPUT_INTERFACE    Out;
    SIMPLE_INPUT_INTERFACE          In;
} ENV_SHELL_REDIR_FILE;

typedef struct {
    EFI_SHELL_INTERFACE             ShellInt;
    EFI_SYSTEM_TABLE                *SystemTable;

    ENV_SHELL_REDIR_FILE            StdIn;
    ENV_SHELL_REDIR_FILE            StdOut;
    ENV_SHELL_REDIR_FILE            StdErr;

} ENV_SHELL_INTERFACE;

/* 
 *  Internal prototypes from init.c
 */

EFI_SHELL_INTERFACE *
SEnvNewShell (
    IN EFI_HANDLE                   ImageHandle
    );


/* 
 *  Internal prototypes from cmddisp.c
 */

VOID
SEnvInitCommandTable (
    VOID
    );

EFI_STATUS
SEnvAddCommand (
    IN SHELLENV_INTERNAL_COMMAND    Handler,
    IN CHAR16                       *Cmd,
    IN CHAR16                       *CmdFormat,
    IN CHAR16                       *CmdHelpLine,
    IN CHAR16                       *CmdVerboseHelp
    );


SHELLENV_INTERNAL_COMMAND
SEnvGetCmdDispath(
    IN CHAR16                   *CmdName
    );

/* 
 *  From exec.c
 */

EFI_STATUS
SEnvExecute (
    IN EFI_HANDLE           *ParentImageHandle,
    IN CHAR16               *CommandLine,
    IN BOOLEAN              DebugOutput
    );

EFI_STATUS
SEnvDoExecute (
    IN EFI_HANDLE           *ParentImageHandle,
    IN CHAR16               *CommandLine,
    IN ENV_SHELL_INTERFACE  *Shell,
    IN BOOLEAN              Output
    );

EFI_STATUS
SEnvExit (
    IN EFI_HANDLE               ImageHandle,
    IN EFI_SYSTEM_TABLE         *SystemTable
    );

EFI_STATUS
SEnvStringToArg (
    IN CHAR16       *Str,
    IN BOOLEAN      Output,
    OUT CHAR16      ***pArgv,
    OUT UINT32      *pArgc
    );

/* 
 *  Internal prototypes from protid.c
 */

VOID
INTERNAL
SEnvInitProtocolInfo (
    VOID
    );

EFI_STATUS
SEnvLoadDefaults (
    IN EFI_HANDLE           Parent,
    IN EFI_SYSTEM_TABLE     *SystemTable
    );

EFI_STATUS
SEnvReloadDefaults (
    IN EFI_HANDLE           Parent,
    IN EFI_SYSTEM_TABLE     *SystemTable
    );

VOID
INTERNAL
SEnvLoadInternalProtInfo (
    VOID
    );

VOID
INTERNAL
SEnvFreeHandleProtocolInfo (
    VOID
    );

VOID
SEnvAddProtocol (
    IN EFI_GUID                     *Protocol,
    IN SHELLENV_DUMP_PROTOCOL_INFO  DumpToken OPTIONAL,
    IN SHELLENV_DUMP_PROTOCOL_INFO  DumpInfo OPTIONAL,
    IN CHAR16                       *IdString
    );

VOID
INTERNAL
SEnvIAddProtocol (
    IN BOOLEAN                      SaveId,
    IN EFI_GUID                     *Protocol,
    IN SHELLENV_DUMP_PROTOCOL_INFO  DumpToken OPTIONAL,
    IN SHELLENV_DUMP_PROTOCOL_INFO  DumpInfo OPTIONAL,
    IN CHAR16                       *IdString
    );

VOID
INTERNAL
SEnvLoadHandleProtocolInfo (
    IN EFI_GUID                     *Skip
    );

CHAR16 *
SEnvGetProtocol (
    IN EFI_GUID                     *ProtocolId,
    IN BOOLEAN                      GenId
    );

EFI_STATUS
INTERNAL
SEnvCmdProt (
    IN EFI_HANDLE                   ImageHandle,
    IN EFI_SYSTEM_TABLE             *SystemTable
    );

VOID
SEnvDHProt (
    IN BOOLEAN                      Verbose,
    IN UINTN                        HandleNo,
    IN EFI_HANDLE                   Handle
    );

EFI_STATUS
INTERNAL
SEnvCmdDH (
    IN EFI_HANDLE               ImageHandle,
    IN EFI_SYSTEM_TABLE         *SystemTable
    );

EFI_STATUS
SEnvIGetProtID (
    IN CHAR16           *Str,
    OUT EFI_GUID        *ProtId
    );


/* 
 *  Handle.c
 */

VOID
INTERNAL
SEnvInitHandleGlobals(
    VOID
    );

VOID
INTERNAL
SEnvLoadHandleTable (
    VOID
    );

VOID
INTERNAL
SEnvFreeHandleTable (
    VOID
    );

UINTN
SEnvHandleNoFromStr(
    IN CHAR16       *Str
    );

EFI_HANDLE
SEnvHandleFromStr(
    IN CHAR16       *Str
    );

/* 
 *  Internal prototypes from var.c
 */


VOID
SEnvInitVariables (
    VOID
    );

EFI_STATUS
SEnvCmdSet (
    IN EFI_HANDLE               ImageHandle,
    IN EFI_SYSTEM_TABLE         *SystemTable
    );

EFI_STATUS
SEnvCmdAlias (
    IN EFI_HANDLE               ImageHandle,
    IN EFI_SYSTEM_TABLE         *SystemTable
    );


CHAR16 *
SEnvGetMap (
    IN CHAR16           *Name
    );

CHAR16 *
SEnvGetEnv (
    IN CHAR16           *Name
    );

CHAR16 *
SEnvGetAlias (
    IN CHAR16           *Name
    );


/* 
 *  Prototypes from conio.c
 */

VOID
SEnvConIoInitDosKey (
    VOID
    );

EFI_STATUS
SEnvConIoOpen (
    IN struct _EFI_FILE_HANDLE  *File,
    OUT struct _EFI_FILE_HANDLE **NewHandle,
    IN CHAR16                   *FileName,
    IN UINT64                   OpenMode,
    IN UINT64                   Attributes
    );

EFI_STATUS
SEnvConIoNop (
    IN struct _EFI_FILE_HANDLE  *File
    );

EFI_STATUS
SEnvConIoGetPosition (
    IN struct _EFI_FILE_HANDLE  *File,
    OUT UINT64                  *Position
    );

EFI_STATUS
SEnvConIoSetPosition (
    IN struct _EFI_FILE_HANDLE  *File,
    OUT UINT64                  Position
    );

EFI_STATUS
SEnvConIoGetInfo (
    IN struct _EFI_FILE_HANDLE  *File,
    IN EFI_GUID                 *InformationType,
    IN OUT UINTN                *BufferSize,
    OUT VOID                    *Buffer
    );

EFI_STATUS
SEnvConIoSetInfo (
    IN struct _EFI_FILE_HANDLE  *File,
    IN EFI_GUID                 *InformationType,
    IN UINTN                    BufferSize,
    OUT VOID                    *Buffer
    );

EFI_STATUS
SEnvConIoWrite (
    IN struct _EFI_FILE_HANDLE  *File,
    IN OUT UINTN                *BufferSize,
    IN VOID                     *Buffer
    );

EFI_STATUS
SEnvConIoRead (
    IN struct _EFI_FILE_HANDLE  *File,
    IN OUT UINTN                *BufferSize,
    IN VOID                     *Buffer
    );

EFI_STATUS
SEnvErrIoWrite (
    IN struct _EFI_FILE_HANDLE  *File,
    IN OUT UINTN                *BufferSize,
    IN VOID                     *Buffer
    );

EFI_STATUS
SEnvErrIoRead (
    IN struct _EFI_FILE_HANDLE  *File,
    IN OUT UINTN                *BufferSize,
    IN VOID                     *Buffer
    );


EFI_STATUS
SEnvReset (
    IN SIMPLE_TEXT_OUTPUT_INTERFACE     *This,
    IN BOOLEAN                          ExtendedVerification
    );

EFI_STATUS
SEnvOutputString (
    IN SIMPLE_TEXT_OUTPUT_INTERFACE     *This,
    IN CHAR16                       *String
    );

EFI_STATUS
SEnvTestString (
    IN SIMPLE_TEXT_OUTPUT_INTERFACE     *This,
    IN CHAR16                       *String
    );

EFI_STATUS 
SEnvQueryMode (
    IN SIMPLE_TEXT_OUTPUT_INTERFACE     *This,
    IN UINTN                        ModeNumber,
    OUT UINTN                       *Columns,
    OUT UINTN                       *Rows
    );

EFI_STATUS
SEnvSetMode (
    IN SIMPLE_TEXT_OUTPUT_INTERFACE     *This,
    IN UINTN                        ModeNumber
    );

EFI_STATUS
SEnvSetAttribute (
    IN SIMPLE_TEXT_OUTPUT_INTERFACE     *This,
    IN UINTN                            Attribute
    );

EFI_STATUS
SEnvClearScreen (
    IN SIMPLE_TEXT_OUTPUT_INTERFACE     *This
    );

EFI_STATUS
SEnvSetCursorPosition (
    IN SIMPLE_TEXT_OUTPUT_INTERFACE     *This,
    IN UINTN                        Column,
    IN UINTN                        Row
    );

EFI_STATUS
SEnvEnableCursor (
    IN SIMPLE_TEXT_OUTPUT_INTERFACE     *This,
    IN BOOLEAN                      Enable
    );

/* 
 *  Prototypes from batch.c
 */
VOID
SEnvInitBatch(
    VOID
    );

BOOLEAN
SEnvBatchIsActive( 
    VOID
    );

VOID
SEnvSetBatchAbort( 
    VOID
    );

VOID
SEnvBatchGetConsole( 
    OUT SIMPLE_INPUT_INTERFACE       **ConIn,
    OUT SIMPLE_TEXT_OUTPUT_INTERFACE **ConOut
    );

EFI_STATUS
SEnvBatchEchoCommand( 
    IN ENV_SHELL_INTERFACE  *Shell
    );

VOID
SEnvBatchSetEcho( 
    IN BOOLEAN Val
    );

BOOLEAN
SEnvBatchGetEcho( 
    VOID
    );

EFI_STATUS
SEnvBatchSetFilePos( 
    IN UINT64 NewPos
    );

EFI_STATUS
SEnvBatchGetFilePos( 
    UINT64  *FilePos
    );

VOID
SEnvBatchSetCondition( 
    IN BOOLEAN Val 
    );

VOID
SEnvBatchSetGotoActive( 
    VOID
    );

BOOLEAN
SEnvBatchVarIsLastError( 
    IN CHAR16 *Name 
    );

CHAR16*
SEnvBatchGetLastError( 
    VOID 
    );

VOID
SEnvBatchSetLastError( 
    IN UINTN NewLastError 
    );

EFI_STATUS
SEnvBatchGetArg(
    IN  UINTN  Argno,
    OUT CHAR16 **Argval
    );

EFI_STATUS
SEnvExecuteScript(
    IN ENV_SHELL_INTERFACE          *Shell,
    IN EFI_FILE_HANDLE          File
    );

/* 
 *  Prototypes from dprot.c
 */

VOID SEnvDPath (EFI_HANDLE, VOID *);
VOID SEnvDPathTok (EFI_HANDLE, VOID *);
VOID SEnvTextOut (EFI_HANDLE, VOID *);
VOID SEnvBlkIo (EFI_HANDLE, VOID *);
VOID SEnvImageTok (EFI_HANDLE, VOID *);
VOID SEnvImage (EFI_HANDLE, VOID *);

/* 
 *  Prototypes from map.c
 */

VOID
SEnvInitMap (
    VOID
    );

CHAR16 *
SEnvGetDefaultMapping (
    IN EFI_HANDLE ImageHandle
    );

EFI_STATUS
INTERNAL
SEnvCmdMap (
    IN EFI_HANDLE               ImageHandle,
    IN EFI_SYSTEM_TABLE         *SystemTable
    );

EFI_STATUS
INTERNAL
SEnvCmdMount (
    IN EFI_HANDLE               ImageHandle,
    IN EFI_SYSTEM_TABLE         *SystemTable
    );

VARIABLE_ID *
SEnvMapDeviceFromName (
    IN OUT CHAR16   **pPath
    );

EFI_DEVICE_PATH *
SEnvIFileNameToPath (
    IN CHAR16               *Path
    );

EFI_DEVICE_PATH *
SEnvFileNameToPath (
    IN CHAR16               *Path
    );

EFI_DEVICE_PATH *
SEnvNameToPath (
    IN CHAR16                   *PathName
    );

EFI_STATUS
SEnvSetCurrentDevice (
    IN CHAR16       *Name
    );

CHAR16 *
SEnvGetCurDir (
    IN CHAR16       *DeviceName OPTIONAL    
    );

EFI_STATUS
SEnvCmdCd (
    IN EFI_HANDLE           ImageHandle,
    IN EFI_SYSTEM_TABLE     *SystemTable
    );

/* 
 *  Prototypes from echo.c
 */

EFI_STATUS
SEnvCmdEcho (
    IN EFI_HANDLE           ImageHandle,
    IN EFI_SYSTEM_TABLE     *SystemTable
    );

/* 
 *  Prototypes from if.c
 */

EFI_STATUS
SEnvCmdIf (
    IN EFI_HANDLE           ImageHandle,
    IN EFI_SYSTEM_TABLE     *SystemTable
    );

EFI_STATUS
SEnvCmdEndif (
    IN EFI_HANDLE           ImageHandle,
    IN EFI_SYSTEM_TABLE     *SystemTable
    );

/* 
 *  Prototypes from goto.c
 */

EFI_STATUS
SEnvCmdGoto (
    IN EFI_HANDLE           ImageHandle,
    IN EFI_SYSTEM_TABLE     *SystemTable
    );

EFI_STATUS
SEnvCheckForGotoTarget(
    IN  CHAR16 *Candidate,
    IN  UINT64 GotoFilePos, 
    IN  UINT64 FilePosition, 
    OUT UINTN  *GotoTargetStatus
    );

VOID
SEnvPrintLabelNotFound( 
    VOID
    );

VOID
SEnvInitTargetLabel(
    VOID
    );

VOID
SEnvFreeTargetLabel(
    VOID
    );

/* 
 *  Prototypes from for.c
 */

VOID
SEnvInitForLoopInfo (
    VOID
    );

EFI_STATUS
SEnvSubstituteForLoopIndex( 
    IN CHAR16  *Str,
    OUT CHAR16 **Val
    );

EFI_STATUS
SEnvCmdFor (
    IN EFI_HANDLE           ImageHandle,
    IN EFI_SYSTEM_TABLE     *SystemTable
    );

EFI_STATUS
SEnvCmdEndfor (
    IN EFI_HANDLE           ImageHandle,
    IN EFI_SYSTEM_TABLE     *SystemTable
    );

/* 
 *  Prototypes from pause.c
 */

EFI_STATUS
SEnvCmdPause (
    IN EFI_HANDLE           ImageHandle,
    IN EFI_SYSTEM_TABLE     *SystemTable
    );

/* 
 *  Prototypes from marg.c
 */

CHAR16 *
SEnvFileHandleToFileName (
    IN EFI_FILE_HANDLE      Handle
    );

EFI_STATUS
SEnvFreeFileList (
    IN OUT LIST_ENTRY       *ListHead
    );

EFI_STATUS
SEnvFileMetaArg (
    IN CHAR16               *Arg,
    IN OUT LIST_ENTRY       *ListHead
    );

VOID
EFIStructsPrint (
    IN  VOID            *Buffer,
    IN  UINTN           BlockSize,
    IN  UINT64          BlockAddress,
    IN  EFI_BLOCK_IO    *BlkIo
);

EFI_STATUS
DumpBlockDev (
    IN EFI_HANDLE               ImageHandle,
    IN EFI_SYSTEM_TABLE         *SystemTable
    );

/* 
 *  Global data
 */

extern EFI_GUID SEnvEnvId;
extern EFI_GUID SEnvMapId;
extern EFI_GUID SEnvProtId;
extern EFI_GUID SEnvAliasId;
extern EFI_SHELL_ENVIRONMENT SEnvInterface;
extern EFI_FILE SEnvIOFromCon;
extern EFI_FILE SEnvErrIOFromCon;
extern FLOCK SEnvLock;
extern FLOCK SEnvGuidLock;
extern UINTN SEnvNoHandles;
extern EFI_HANDLE *SEnvHandles;
extern SIMPLE_TEXT_OUTPUT_INTERFACE SEnvConToIo;