Go to the source code of this file.
◆ C_OP_HIGHEST
◆ C_OP_LOWEST
◆ CHAR
◆ DUMP
Value:do { \
} while (0)
char * Pad(char *Str, char PadChar, ULONG Length)
static void dump(const void *ptr, unsigned len)
◆ IF_MAX_COMPARISON
◆ IF_MAX_UNARY
◆ MSCMD_ECHO_COMMAND_COMPAT
#define MSCMD_ECHO_COMMAND_COMPAT |
◆ MSCMD_PARSER_BUGS
◆ MSCMD_REDIR_PARSE_BUGS
#define MSCMD_REDIR_PARSE_BUGS |
◆ PRINTF
◆ RECURSE
Value:do { \
} while (0)
PTCHAR UnparseCommand(IN PARSED_COMMAND *Cmd, OUT PTCHAR Out, IN PTCHAR OutEnd)
◆ STRING
Value:do { \
} while (0)
LPTSTR _stpcpy(LPTSTR, LPCTSTR)
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFSTRING String
size_t __cdecl _tcslen(const _TCHAR *str)
◆ TOK_TYPE
◆ _TOK_TYPE
Enumerator |
---|
TOK_END | |
TOK_NORMAL | |
TOK_OPERATOR | |
TOK_REDIRECTION | |
TOK_BEGIN_BLOCK | |
TOK_END_BLOCK | |
Definition at line 77 of file parser.c.
◆ AllocCommand()
Definition at line 459 of file parser.c.
475 Command.First[CmdHeadLen + CmdTailLen]));
484 Cmd->Command.Rest =
Cmd->Command.First + CmdHeadLen;
520 ERR(
"Unknown command type 0x%x\n",
Type);
size_t __cdecl _tcslen(const _TCHAR *str)
#define memcpy(s1, s2, n)
#define FIELD_OFFSET(t, f)
Referenced by ParseBlock(), ParseCommandBinaryOp(), ParseCommandPart(), ParseFor(), ParseIf(), ParsePrimary(), and ParseRem().
◆ DumpCommand()
Definition at line 1533 of file parser.c.
1542 #define DUMP(Command, Pad) \ 1564 #ifndef MSCMD_ECHO_COMMAND_COMPAT 1566 Cmd->Command.First,
Cmd->Type);
1569 Cmd->Command.First,
Cmd->Type);
1572 if (
Cmd->Command.Rest && *(
Cmd->Command.Rest))
1573 #ifndef MSCMD_ECHO_COMMAND_COMPAT 1587 #ifndef MSCMD_ECHO_COMMAND_COMPAT 1595 DUMP(
Cmd->Subcommands, SpacePad + 2);
1601 #ifndef MSCMD_ECHO_COMMAND_COMPAT 1611 for (Sub =
Cmd->Subcommands; Sub; Sub = Sub->
Next)
1613 #if defined(MSCMD_ECHO_COMMAND_COMPAT) && defined(MSCMD_PARSER_BUGS) 1661 #ifndef MSCMD_ECHO_COMMAND_COMPAT 1669 #endif // defined(MSCMD_ECHO_COMMAND_COMPAT) && defined(MSCMD_PARSER_BUGS) 1680 #ifndef MSCMD_ECHO_COMMAND_COMPAT 1689 Sub =
Cmd->Subcommands;
1704 if (
Cmd->For.Params)
1707 DUMP(
Cmd->Subcommands, SpacePad + 2);
1757 #ifndef MSCMD_ECHO_COMMAND_COMPAT 1771 #ifndef MSCMD_ECHO_COMMAND_COMPAT 1784 Sub =
Cmd->Subcommands;
#define IFFLAG_IGNORECASE
#define ConOutPrintf(szStr,...)
struct _PARSED_COMMAND * Next
static VOID DumpRedir(IN REDIRECTION *Redirections)
static const TCHAR *const IfOperatorString[]
VOID DumpCommand(IN PARSED_COMMAND *Cmd, IN ULONG SpacePad)
#define DUMP(Command, Pad)
static const TCHAR OpString[][3]
static void dump(const void *ptr, unsigned len)
VOID ConOutPuts(LPTSTR szText)
Referenced by ParseCommand().
◆ DumpRedir()
Definition at line 1514 of file parser.c.
1520 #ifndef MSCMD_ECHO_COMMAND_COMPAT 1525 for (Redir = Redirections; Redir; Redir = Redir->
Next)
#define ConOutPrintf(szStr,...)
static const TCHAR RedirString[][3]
struct _REDIRECTION * Next
VOID ConOutPuts(LPTSTR szText)
Referenced by DumpCommand().
◆ EchoCommand()
Definition at line 1808 of file parser.c.
1827 #ifdef MSCMD_ECHO_COMMAND_COMPAT 1844 Sub =
Cmd->Subcommands;
1846 bIsFirstCmdCRLF = (Sub && Sub->
Next);
1848 #if defined(MSCMD_ECHO_COMMAND_COMPAT) && defined(MSCMD_PARSER_BUGS) 1853 bIsFirstCmdCRLF = bIsFirstCmdCRLF && (Sub->
Type !=
C_MULTI);
1860 if (bIsFirstCmdCRLF)
1863 for (; Sub; Sub = Sub->
Next)
1867 #ifdef MSCMD_ECHO_COMMAND_COMPAT 1874 if (bIsFirstCmdCRLF)
1877 #ifdef MSCMD_ECHO_COMMAND_COMPAT 1891 Sub =
Cmd->Subcommands;
1905 if (
Cmd->For.Params)
1927 Sub =
Cmd->Subcommands;
1942 for (Redir =
Cmd->Redirections; Redir; Redir = Redir->
Next)
1946 #ifdef MSCMD_ECHO_COMMAND_COMPAT
VOID EchoCommand(IN PARSED_COMMAND *Cmd)
#define IFFLAG_IGNORECASE
#define ConOutPrintf(szStr,...)
struct _PARSED_COMMAND * Next
BOOL SubstituteForVars(IN PCTSTR Src, OUT PTSTR Dest)
static const TCHAR *const IfOperatorString[]
static const TCHAR RedirString[][3]
static const TCHAR OpString[][3]
struct _REDIRECTION * Next
static TCHAR TempBuf[CMDLINE_LENGTH]
VOID ConOutPuts(LPTSTR szText)
Referenced by ExecuteCommandWithEcho().
◆ FreeCommand()
◆ InitParser()
Definition at line 173 of file parser.c.
179 #ifndef MSCMD_PARSER_BUGS 180 bReparseToken =
FALSE;
181 LastCurTokPos =
NULL;
static TOK_TYPE CurrentTokenType
static TCHAR CurrentToken[CMDLINE_LENGTH]
TCHAR ParseLine[CMDLINE_LENGTH]
static VOID ResetParser(IN PTCHAR Pos)
Referenced by ParseCommand().
◆ IsSeparator()
static __inline BOOL IsSeparator |
( |
TCHAR |
Char | ) |
|
|
static |
◆ ParseBlock()
Definition at line 649 of file parser.c.
657 WARN(
"Cannot allocate memory for Cmd!\n");
663 NextPtr = &
Cmd->Subcommands;
701 NextPtr = &Sub->
Next;
727 #ifndef MSCMD_REDIR_PARSE_BUGS static TOK_TYPE CurrentTokenType
static TCHAR CurrentToken[CMDLINE_LENGTH]
static PARSED_COMMAND * AllocCommand(IN COMMAND_TYPE Type, IN PCTSTR CmdHead OPTIONAL, IN PCTSTR CmdTail OPTIONAL)
static __inline PARSED_COMMAND * ParseCommandOp(IN COMMAND_TYPE OpType)
struct _PARSED_COMMAND * Next
VOID FreeCommand(IN OUT PARSED_COMMAND *Cmd)
static BOOL ParseRedirection(IN OUT REDIRECTION **List)
static __inline INT ParseToken(IN TCHAR ExtraEnd OPTIONAL, IN PCTSTR Separators OPTIONAL)
static VOID UnParseToken(VOID)
static __inline VOID ParseError(VOID)
Referenced by ParsePrimary().
◆ ParseChar()
Definition at line 187 of file parser.c.
204 while (Char ==
_T(
'\r'));
static BOOL bLineContinuations
void restart(int argc, const char *argv[])
TCHAR ParseLine[CMDLINE_LENGTH]
BOOL ReadLine(TCHAR *commandline, BOOL bMore)
static VOID ResetParser(IN PTCHAR Pos)
Referenced by ParseTokenEx().
◆ ParseCommand()
Definition at line 1461 of file parser.c.
static TOK_TYPE CurrentTokenType
BOOL SubstituteVars(IN PCTSTR Src, OUT PTSTR Dest, IN TCHAR Delim)
static TCHAR CurrentToken[CMDLINE_LENGTH]
int _tcscmp(const _TCHAR *s1, const _TCHAR *s2)
static __inline PARSED_COMMAND * ParseCommandOp(IN COMMAND_TYPE OpType)
static BOOL bLineContinuations
VOID FreeCommand(IN OUT PARSED_COMMAND *Cmd)
TCHAR ParseLine[CMDLINE_LENGTH]
static VOID InitParser(VOID)
BOOL ReadLine(TCHAR *commandline, BOOL bMore)
VOID DumpCommand(IN PARSED_COMMAND *Cmd, IN ULONG SpacePad)
static __inline VOID ParseError(VOID)
Referenced by Batch(), cmd_call(), ParseCommandLine(), and ProcessInput().
◆ ParseCommandBinaryOp()
bc &&
Definition at line 1295 of file parser.c.
1308 #ifdef MSCMD_PARENS_PARSE_BUGS 1321 #ifdef MSCMD_PARENS_PARSE_BUGS 1382 #ifdef MSCMD_PARENS_PARSE_BUGS 1422 #ifndef MSCMD_MULTI_EMPTY_RHS 1430 WARN(
"Cannot allocate memory for Cmd!\n");
1436 Cmd->Subcommands = Left;
1438 #ifdef MSCMD_MULTI_EMPTY_RHS static TOK_TYPE CurrentTokenType
static TCHAR CurrentToken[CMDLINE_LENGTH]
int _tcscmp(const _TCHAR *s1, const _TCHAR *s2)
static PARSED_COMMAND * AllocCommand(IN COMMAND_TYPE Type, IN PCTSTR CmdHead OPTIONAL, IN PCTSTR CmdTail OPTIONAL)
static __inline PARSED_COMMAND * ParseCommandOp(IN COMMAND_TYPE OpType)
BOOL bIgnoreParserComments
struct _PARSED_COMMAND * Next
VOID FreeCommand(IN OUT PARSED_COMMAND *Cmd)
static PARSED_COMMAND * ParseCommandBinaryOp(IN COMMAND_TYPE OpType)
static __inline INT ParseToken(IN TCHAR ExtraEnd OPTIONAL, IN PCTSTR Separators OPTIONAL)
static const TCHAR OpString[][3]
static PARSED_COMMAND * ParsePrimary(VOID)
static __inline VOID ParseError(VOID)
Referenced by ParseCommandOp().
◆ ParseCommandOp()
◆ ParseCommandPart()
Definition at line 1051 of file parser.c.
1130 #ifndef MSCMD_REDIR_PARSE_BUGS 1198 ParsedLine + TailOffset);
1201 WARN(
"Cannot allocate memory for Cmd!\n");
static TOK_TYPE CurrentTokenType
static PARSED_COMMAND * ParseRem(VOID)
static TCHAR CurrentToken[CMDLINE_LENGTH]
static PARSED_COMMAND * ParseFor(VOID)
static PARSED_COMMAND * AllocCommand(IN COMMAND_TYPE Type, IN PCTSTR CmdHead OPTIONAL, IN PCTSTR CmdTail OPTIONAL)
static PARSED_COMMAND * ParseIf(VOID)
LPTSTR _stpcpy(LPTSTR, LPCTSTR)
static BOOL ParseRedirection(IN OUT REDIRECTION **List)
size_t __cdecl _tcslen(const _TCHAR *str)
static __inline INT ParseToken(IN TCHAR ExtraEnd OPTIONAL, IN PCTSTR Separators OPTIONAL)
VOID ParseErrorEx(IN PCTSTR s)
static VOID UnParseToken(VOID)
static TCHAR TempBuf[CMDLINE_LENGTH]
static __inline VOID ParseError(VOID)
Referenced by ParsePrimary().
◆ ParseError()
static __inline VOID ParseError |
( |
VOID |
| ) |
|
|
static |
◆ ParseErrorEx()
◆ ParseFor()
Definition at line 875 of file parser.c.
886 WARN(
"Cannot allocate memory for Cmd!\n");
904 if (!
Cmd->For.Params)
919 if (!
Cmd->For.Params)
938 if ((
Cmd->For.Switches & (
Cmd->For.Switches - 1)) != 0
static TOK_TYPE CurrentTokenType
static TCHAR CurrentToken[CMDLINE_LENGTH]
static PARSED_COMMAND * AllocCommand(IN COMMAND_TYPE Type, IN PCTSTR CmdHead OPTIONAL, IN PCTSTR CmdTail OPTIONAL)
static __inline PARSED_COMMAND * ParseCommandOp(IN COMMAND_TYPE OpType)
static VOID StripQuotes(LPSTR in)
VOID FreeCommand(IN OUT PARSED_COMMAND *Cmd)
LPTSTR _stpcpy(LPTSTR, LPCTSTR)
size_t __cdecl _tcslen(const _TCHAR *str)
static __inline INT ParseToken(IN TCHAR ExtraEnd OPTIONAL, IN PCTSTR Separators OPTIONAL)
_Must_inspect_result_ _In_ WDFCMRESLIST List
static TCHAR TempBuf[CMDLINE_LENGTH]
static __inline VOID ParseError(VOID)
Referenced by ParseCommandPart().
◆ ParseIf()
Definition at line 780 of file parser.c.
787 WARN(
"Cannot allocate memory for Cmd!\n");
858 if (
Cmd->Subcommands->Next ==
NULL)
static TOK_TYPE CurrentTokenType
#define IFFLAG_IGNORECASE
static TCHAR CurrentToken[CMDLINE_LENGTH]
static PARSED_COMMAND * AllocCommand(IN COMMAND_TYPE Type, IN PCTSTR CmdHead OPTIONAL, IN PCTSTR CmdTail OPTIONAL)
static __inline PARSED_COMMAND * ParseCommandOp(IN COMMAND_TYPE OpType)
VOID FreeCommand(IN OUT PARSED_COMMAND *Cmd)
static __inline INT ParseToken(IN TCHAR ExtraEnd OPTIONAL, IN PCTSTR Separators OPTIONAL)
static const TCHAR *const IfOperatorString[]
#define IF_MAX_COMPARISON
static __inline VOID ParseError(VOID)
Referenced by ParseCommandPart().
◆ ParsePrimary()
Definition at line 1209 of file parser.c.
1220 WARN(
"Cannot allocate memory for Cmd!\n");
1231 #ifndef MSCMD_REDIR_PARSE_BUGS 1283 Cmd->Redirections = RedirList;
static TOK_TYPE CurrentTokenType
static TCHAR CurrentToken[CMDLINE_LENGTH]
static PARSED_COMMAND * AllocCommand(IN COMMAND_TYPE Type, IN PCTSTR CmdHead OPTIONAL, IN PCTSTR CmdTail OPTIONAL)
static __inline PARSED_COMMAND * ParseCommandOp(IN COMMAND_TYPE OpType)
static PARSED_COMMAND * ParseCommandPart(IN OUT REDIRECTION **RedirList)
static BOOL ParseRedirection(IN OUT REDIRECTION **List)
static __inline INT ParseToken(IN TCHAR ExtraEnd OPTIONAL, IN PCTSTR Separators OPTIONAL)
VOID FreeRedirection(REDIRECTION *)
static VOID UnParseToken(VOID)
static __inline VOID ParseError(VOID)
static PARSED_COMMAND * ParseBlock(IN OUT REDIRECTION **RedirList)
Referenced by ParseCommandBinaryOp().
◆ ParseRedirection()
Definition at line 551 of file parser.c.
559 if ( !(*Tok ==
_T(
'<') || *Tok ==
_T(
'>')) &&
561 (Tok[1] ==
_T(
'<') || Tok[1] ==
_T(
'>')) ) )
574 if (*Tok++ ==
_T(
'<'))
598 #ifndef MSCMD_REDIR_PARSE_BUGS 611 while ((Redir = *
List))
625 WARN(
"Cannot allocate memory for Redir!\n");
631 Redir->
Mode = RedirMode;
static TOK_TYPE CurrentTokenType
enum _REDIR_MODE REDIR_MODE
static TCHAR CurrentToken[CMDLINE_LENGTH]
#define INVALID_HANDLE_VALUE
_TCHAR * _tcscpy(_TCHAR *to, const _TCHAR *from)
IN PVCB IN PBCB OUT PDIRENT IN USHORT IN POEM_STRING Filename
size_t __cdecl _tcslen(const _TCHAR *str)
static __inline INT ParseToken(IN TCHAR ExtraEnd OPTIONAL, IN PCTSTR Separators OPTIONAL)
_Must_inspect_result_ _In_ WDFCMRESLIST List
_In_opt_ PENTER_STATE_SYSTEM_HANDLER _In_opt_ PVOID _In_ LONG _In_opt_ LONG volatile * Number
#define FIELD_OFFSET(t, f)
VOID FreeRedirection(REDIRECTION *)
struct _REDIRECTION * Next
static __inline VOID ParseError(VOID)
Referenced by ParseBlock(), ParseCommandPart(), and ParsePrimary().
◆ ParseRem()
Definition at line 1003 of file parser.c.
1039 ParsedLine + TailOffset);
1042 WARN(
"Cannot allocate memory for Cmd!\n");
static TCHAR CurrentToken[CMDLINE_LENGTH]
static PARSED_COMMAND * AllocCommand(IN COMMAND_TYPE Type, IN PCTSTR CmdHead OPTIONAL, IN PCTSTR CmdTail OPTIONAL)
LPTSTR _stpcpy(LPTSTR, LPCTSTR)
static TOK_TYPE ParseTokenEx(IN TCHAR PrefixOperator OPTIONAL, IN TCHAR ExtraEnd OPTIONAL, IN PCTSTR Separators OPTIONAL, IN BOOL bHandleContinuations)
size_t __cdecl _tcslen(const _TCHAR *str)
static VOID UnParseToken(VOID)
static TCHAR TempBuf[CMDLINE_LENGTH]
static __inline VOID ParseError(VOID)
Referenced by ParseCommandPart().
◆ ParseToken()
static __inline INT ParseToken |
( |
IN TCHAR ExtraEnd |
OPTIONAL, |
|
|
IN PCTSTR Separators |
OPTIONAL |
|
) |
| |
|
static |
◆ ParseTokenEx()
Definition at line 241 of file parser.c.
253 #ifndef MSCMD_PARSER_BUGS 256 bReparseToken =
FALSE;
262 CurrentTokStart = LastCurTokPos;
263 Out = CurrentTokStart;
276 bInQuote ^= (Char ==
_T(
'"'));
279 if (Separators !=
NULL)
284 if (
Out == CurrentTokStart)
291 if ((
Out == CurrentTokStart) && (Char == PrefixOperator))
313 if (Char == ExtraEnd)
324 if (Char ==
_T(
'\n'))
326 #ifndef MSCMD_PARSER_BUGS 333 if (
Out == CurrentTokStart)
355 if (
Out != CurrentTokStart)
362 else if (Char ==
_T(
'@'))
368 else if (Char ==
_T(
'('))
374 else if (Char ==
_T(
')'))
380 else if (Char ==
_T(
'&') || Char ==
_T(
'|'))
393 (Char ==
_T(
'<') || Char ==
_T(
'>')) )
static TOK_TYPE CurrentTokenType
static TCHAR CurrentToken[CMDLINE_LENGTH]
#define ConOutPrintf(szStr,...)
static PTCHAR OldParsePos
_TCHAR * _tcschr(const _TCHAR *s, _XINT c)
static TCHAR ParseChar(VOID)
BOOL bHandleContinuations
static __inline BOOL IsSeparator(TCHAR Char)
Referenced by ParseCommandOp(), ParseRem(), and ParseToken().
◆ ResetParser()
◆ UnparseCommand()
Definition at line 1965 of file parser.c.
1975 #define CHAR(Char) \ 1977 if (Out == OutEnd) return NULL; \ 1980 #define STRING(String) \ 1982 if (Out + _tcslen(String) > OutEnd) return NULL; \ 1983 Out = _stpcpy(Out, String); \ 1985 #define PRINTF(Format, ...) \ 1987 UINT Len = _sntprintf(Out, OutEnd - Out, Format, __VA_ARGS__); \ 1988 if (Len > (UINT)(OutEnd - Out)) return NULL; \ 1991 #define RECURSE(Subcommand) \ 1993 Out = UnparseCommand(Subcommand, Out, OutEnd); \ 1994 if (!Out) return NULL; \ 2028 for (Sub =
Cmd->Subcommands; Sub; Sub = Sub->
Next)
2043 Sub =
Cmd->Subcommands;
2057 if (
Cmd->For.Params)
2062 PRINTF(
_T(
" %%%c in (%s) do "),
Cmd->For.Variable,
Cmd->For.List);
2079 Sub =
Cmd->Subcommands;
2094 for (Redir =
Cmd->Redirections; Redir; Redir = Redir->
Next)
#define RECURSE(Subcommand)
#define IFFLAG_IGNORECASE
struct _PARSED_COMMAND * Next
#define PRINTF(Format,...)
BOOL SubstituteForVars(IN PCTSTR Src, OUT PTSTR Dest)
static const TCHAR *const IfOperatorString[]
static const TCHAR RedirString[][3]
static const TCHAR OpString[][3]
struct _REDIRECTION * Next
static TCHAR TempBuf[CMDLINE_LENGTH]
Referenced by ExecuteAsync().
◆ UnParseToken()
◆ bHandleContinuations
◆ bIgnoreParserComments
◆ bLineContinuations
◆ bParseError
Definition at line 90 of file parser.c.
Referenced by Batch(), cmd_call(), ParseBlock(), ParseChar(), ParseCommand(), ParseCommandBinaryOp(), ParseCommandLine(), ParseCommandPart(), ParseErrorEx(), ParsePrimary(), ResetParser(), and SubstituteVar().
◆ CurrentToken
Definition at line 99 of file parser.c.
Referenced by InitParser(), ParseBlock(), ParseCommand(), ParseCommandBinaryOp(), ParseCommandPart(), ParseError(), ParseFor(), ParseIf(), ParsePrimary(), ParseRedirection(), ParseRem(), and ParseTokenEx().
◆ CurrentTokenType
Definition at line 100 of file parser.c.
Referenced by InitParser(), ParseBlock(), ParseCommand(), ParseCommandBinaryOp(), ParseCommandPart(), ParseError(), ParseFor(), ParseIf(), ParsePrimary(), ParseRedirection(), and ParseTokenEx().
◆ fDumpParse
◆ fDumpTokens
◆ IfOperatorString
◆ InsideBlock
◆ OldParsePos
◆ OpString
◆ ParseLine
◆ ParsePos
◆ RedirString
◆ TempBuf