xref: /reactos/base/shell/cmd/batch.h (revision 9393fc32)
1 /*
2  *  BATCH.H - A structure to preserve the context of a batch file
3  */
4 
5 #pragma once
6 
7 /*
8  * This batch type enumeration allows us to adjust the behaviour of some commands
9  * depending on whether they are run from within a .BAT or a .CMD file.
10  * The behaviour is selected when the top-level batch file is loaded,
11  * and it remains the same for any child batch file that may be loaded later.
12  *
13  * See https://ss64.com/nt/errorlevel.html for more details.
14  */
15 typedef enum _BATCH_TYPE
16 {
17     NONE,
18     BAT_TYPE,   /* Old-style DOS batch file */
19     CMD_TYPE    /* New-style NT OS/2 batch file */
20 } BATCH_TYPE;
21 
22 
23 /* Enable this define for Windows' CMD batch-echo behaviour compatibility */
24 #define MSCMD_BATCH_ECHO
25 
26 typedef struct _BATCH_CONTEXT
27 {
28     struct _BATCH_CONTEXT *prev;
29     char    *mem;       /* batchfile content in memory */
30     DWORD   memsize;    /* size of batchfile */
31     DWORD   mempos;     /* current position to read from */
32     BOOL    memfree;    /* true if it need to be freed when exitbatch is called */
33     TCHAR BatchFilePath[MAX_PATH];
34     LPTSTR params;
35     LPTSTR raw_params;  /* Holds the raw params given by the input */
36     INT    shiftlevel[10];
37 #ifndef MSCMD_BATCH_ECHO
38     BOOL   bEcho;       /* Preserve echo flag across batch calls */
39 #endif
40     REDIRECTION *RedirList;
41     PARSED_COMMAND *current;
42     struct _SETLOCAL *setlocal;
43 } BATCH_CONTEXT, *PBATCH_CONTEXT;
44 
45 typedef struct _FOR_CONTEXT
46 {
47     struct _FOR_CONTEXT *prev;
48     TCHAR firstvar;
49     UINT   varcount;
50     LPTSTR *values;
51 } FOR_CONTEXT, *PFOR_CONTEXT;
52 
53 
54 /*
55  * The stack of current batch contexts.
56  * NULL when no batch is active.
57  */
58 extern BATCH_TYPE BatType;
59 extern PBATCH_CONTEXT bc;
60 extern PFOR_CONTEXT fc;
61 
62 #ifdef MSCMD_BATCH_ECHO
63 extern BOOL bBcEcho;
64 #endif
65 
66 extern BOOL bEcho;       /* The echo flag */
67 
68 #define BATCH_BUFFSIZE  8192
69 
70 extern TCHAR textline[BATCH_BUFFSIZE]; /* Buffer for reading Batch file lines */
71 
72 
73 BOOL
74 FindArg(
75     IN TCHAR Char,
76     OUT PCTSTR* ArgPtr,
77     OUT BOOL* IsParam0);
78 
79 VOID   ExitBatch(VOID);
80 VOID   ExitAllBatches(VOID);
81 INT    Batch(LPTSTR, LPTSTR, LPTSTR, PARSED_COMMAND *);
82 BOOL   BatchGetString(LPTSTR lpBuffer, INT nBufferLength);
83 LPTSTR ReadBatchLine(VOID);
84 VOID   AddBatchRedirection(REDIRECTION **);
85