reactos/base/shell/cmd
Hermès Bélusca-Maïto d029a626e9
[CMD] Make the command-line parser more compatible with Windows' CMD one.
All these modifications have been verified with Windows' CMD, either
by using written cmd_rostests and the existing cmd_winetests, or
manually by enabling the flags cmd!fDumpTokens and cmd!fDumpParse
(available in the public symbols) and analyzing how the tokens are
being parsed, as well as the generated command tree.

See also the following links for more details (but remember that these
observations have to be double-checked in Windows' CMD!):

* Parser rules: https://stackoverflow.com/a/4095133/13530036
* Discussion: https://www.dostips.com/forum/viewtopic.php?f=3&t=8355
* Numbers parsing: https://www.dostips.com/forum/viewtopic.php?t=3758
* Label names vs. GOTO and CALL: https://www.dostips.com/forum/viewtopic.php?f=3&t=3803
  and: https://www.dostips.com/forum/viewtopic.php?f=3&t=3803&p=55405#p55405

- Fix REM command parsing. A C_COMMAND-like structure should still
  be built, so that it can show up during batch command echo. However
  some specific handling needs to be done, so use instead a new C_REM
  command type.
  Escape carets are parsed differently than usual: they are explicitly
  kept in the command line and don't participate in line continuations.
  Also, the Windows' CMD behaviour is to discards everything before the
  last line continuation.

- Prefix operator '@' (the "silent" operator) is parsed as a separate
  command. Thus, the command @@foo@bar is parsed as: '@', '@', 'foo@bar'.

- Improve the checks for numbered redirection.
  For this purpose, we check whether this is a number, that is in first
  position in the current parsing buffer or is preceded by a whitespace-
  like separator, including standard command operators (excepting '@' !)
  and double-quotes.

- Empty command blocks, i.e. "( )", standing by themselves, or present
  in IF or FOR commands, are considered invalid. (The closing parenthesis
  is considered "unexpected".)

- Ignore single closing parenthesis when being outside of command blocks,
  thus interpreting it as a command, and ignore explicitly everything
  following on the same line, including line continuations.
  This very specific situation can happen e.g. while running in batch mode,
  when jumping to a label present inside a command block.
  See the code for a thorough explanation.

- Detect whether a parenthesized block is not terminated at the end
  of a command stream (getting a NUL character instead of a newline),
  and if so, bail out early instead of entering into an infinite loop.

- Perform a similar check for the parenthesized list in FOR commands.

- Initialize the static 'InsideBlock' value to a known value.

- The '&' operator (multi-commmand) is allowed to have an empty RHS.
  When such situation occurs, turn the CurrentTokenType to TOK_END
  so as to avoid a parse error later on.

- The main body of a IF statement, or its 'else' clause, as well as
  the main body of a FOR statement, must not be empty, otherwise this
  is considered a syntax error. If so, call ParseError() that sets
  the 'bParseError' flag, and forcing all batch execution to stop.
2020-09-27 02:27:15 +02:00
..
lang [BASE] Improve Spanish (es-ES) translation (#3088) 2020-08-25 18:10:23 +03:00
res
alias.c [CMD] Add missing memory allocation NULL checks (#161). CORE-8304 2018-08-21 14:02:24 +02:00
assoc.c [CMD] ASSOC: Simplify the code and make it more robust; fix returned ERRORLEVEL values. 2020-09-23 00:22:47 +02:00
batch.c [CMD] Add a MSCMD_BATCH_ECHO define for enabling Windows' CMD.EXE way of preserving/restoring the echo flag across batch calls. 2020-09-23 00:22:47 +02:00
batch.h [CMD] Add a MSCMD_BATCH_ECHO define for enabling Windows' CMD.EXE way of preserving/restoring the echo flag across batch calls. 2020-09-23 00:22:47 +02:00
beep.c
call.c [CMD] Additional fixes for ERRORLEVEL and last returned exit code from EXIT, CALL commands and CMD. 2020-08-19 20:36:03 +02:00
choice.c
cls.c
CMakeLists.txt [CMD] Remove deprecated definition in CMakeLists.txt. 2020-08-19 20:35:52 +02:00
cmd.c [CMD] Make the command-line parser more compatible with Windows' CMD one. 2020-09-27 02:27:15 +02:00
cmd.h [CMD] Make the command-line parser more compatible with Windows' CMD one. 2020-09-27 02:27:15 +02:00
cmd.rc [CMD] Update the documentation of the FOR command. CORE-5806 2017-11-21 23:47:46 +01:00
cmddbg.c
cmddbg.h
cmdinput.c [CMD] Do not overwrite input string on Ctrl+C (#852) 2018-09-13 11:47:01 +02:00
cmdtable.c [LABEL][CMD] Convert the label command to a standalone executable 2019-09-22 14:51:23 +02:00
cmdver.h
color.c
config.h [LABEL][CMD] Convert the label command to a standalone executable 2019-09-22 14:51:23 +02:00
console.c [CONUTILS] Diverse improvements: start doxygenating and add some resource messsage helper functions. 2018-02-02 00:41:54 +01:00
console.h
copy.c
ctty.c
date.c [CMD] DATE: Simplify the input loop, based on the TIME command. 2020-08-19 20:36:10 +02:00
del.c [CMD] Fix the ErrorMessage() function. 2020-05-18 02:21:56 +02:00
delay.c
dir.c [CMD] Correctly parse drive-decorated pathname (#2382) 2020-02-26 22:28:02 +09:00
dirstack.c [CMD] Add missing memory allocation NULL checks (#161). CORE-8304 2018-08-21 14:02:24 +02:00
echo.c
error.c [CMD] Use pointers to const strings in error functions, where applicable. 2020-09-13 22:50:09 +02:00
filecomp.c [CMD] Code formatting for IsValidPathName, IsExistingFile, IsExistingDirectory, and use INVALID_FILE_ATTRIBUTES instead of an hardcoded value. 2020-09-04 00:24:45 +02:00
files.txt
for.c [CMD] FOR: Additional Windows' CMD compatibility "fixes" for FOR /F token parsing command. 2020-09-21 03:31:01 +02:00
free.c
goto.c [CMD] GOTO: Fix label parsing. 2020-08-19 20:36:01 +02:00
history.c [CMD] HISTORY: Fix command output (missing linefeed) (#3205) 2020-09-18 00:17:08 +02:00
history.txt
if.c [CMD] IF: Fix x64 warning C4267. 2020-09-21 03:31:01 +02:00
internal.c [CMD] Make the command-line parser more compatible with Windows' CMD one. 2020-09-27 02:27:15 +02:00
license.txt
locale.c
memory.c
misc.c [CMD] Code formatting for IsValidPathName, IsExistingFile, IsExistingDirectory, and use INVALID_FILE_ATTRIBUTES instead of an hardcoded value. 2020-09-04 00:24:45 +02:00
mklink.c
move.c [CMD] MOVE: Set the errorlevel on failure. 2020-08-19 20:36:07 +02:00
msgbox.c
parser.c [CMD] Make the command-line parser more compatible with Windows' CMD one. 2020-09-27 02:27:15 +02:00
path.c [CMD] Change ERRORLEVEL behaviour for commands ASSOC, PATH, PROMPT and SET. 2020-09-23 00:22:46 +02:00
pause.c [CMD] Print a newline after the interactive 'pause' command message finishes to run. 2018-06-03 02:36:32 +02:00
precomp.h [CMD] Use string-safe call to build the new console title (possibly truncated, we don't care), avoiding any buffer overflow. Caught by David Quintana. 2018-05-20 19:57:43 +02:00
prompt.c [CMD] Change ERRORLEVEL behaviour for commands ASSOC, PATH, PROMPT and SET. 2020-09-23 00:22:46 +02:00
readme.txt
readme2.txt
redir.c
ren.c
ren.txt
replace.c [CMD] REPLACE: Fix a memory leak. 2020-08-19 20:36:13 +02:00
resource.h [CMD] PATH, SET: Fix the returned error message when an environment variable does not exist. 2020-08-19 20:36:06 +02:00
screen.c
set.c [CMD] SET: Diverse fixes for the arithmetic-expression parser (/A option). 2020-09-23 00:22:48 +02:00
setlocal.c [CMD] SETLOCAL / ENDLOCAL: Save / Restore as well the current drive and current directory. 2020-08-19 20:36:13 +02:00
shift.c [CMD] SHIFT: Use _istdigit(). 2020-09-13 22:50:10 +02:00
start.c [CMD] Add missing memory allocation NULL checks (#161). CORE-8304 2018-08-21 14:02:24 +02:00
strtoclr.c
time.c [CMD] TIME: The /T option is available only when extensions are enabled. 2020-08-19 20:36:09 +02:00
timer.c
title.c [CMD] Improve the situations when the console title can be changed. 2018-06-03 02:36:39 +02:00
todo.txt [CMD] todo.txt: Remove some points that have already been implemented since ages. 2020-08-19 20:35:52 +02:00
type.c [CMD] TYPE: Rewrite the command so as to fix some of its behaviour. 2020-08-19 21:39:22 +02:00
ver.c
verify.c
vol.c [CMD] Fix the ErrorMessage() function. 2020-05-18 02:21:56 +02:00
where.c [CMD] Add missing memory allocation NULL checks (#161). CORE-8304 2018-08-21 14:02:24 +02:00
window.c

ReactOS command line interpreter CMD
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

The ReactOS command line interpreter CMD is derived from FreeCOM, the
FreeDOS command line interpreter.

We are shooting mainly to be just like 2000/XP cmd.exe.  They are very close and only a small number(none that i can recall off the top of my head, so maybe 0) differences have been found between those two.  It has been reported that ROS cmd.exe does not work on nt4 because of a missing api.  I'm hoping to fix this at some point.


Compiling
~~~~~~~~~
ROS cmd used to depend on __REACTOS__ to provide two different ways to build cmd.  There is still code left in it for this but...  The __REACTOS__ = 0 has not been develped, maintained.  And therefore it does not even compile anymore.  __REACTOS__ = 1 works fine on both windows(nt). and someday i plan to remove all the __REACTOS__ = 0.

Using rbuild you can compile cmd separately by "make cmd_install".  Also you can compile cmd using MSVC 6 and soon 7/8 hopefully.


Current Features
~~~~~~~~~~~~~~~~
 - environment handling with prompt and path support.
 - directory utilities.
 - command-line history with doskey-like features.
 - batch file processing.
 - input/output redirection and piping.
 - alias support.
 - filename completion (use TAB), both Bash and Windows-CMD style.


Credits
~~~~~~~
FreeDOS developers:
   normat@rpi.edu (Tim Norman)
   mrains@apanix.apana.org.au (Matt Rains)
   ejeffrey@iastate.edu (Evan Jeffrey)
   Steffen.Kaiser@Informatik.TU-Chemnitz.DE (Steffen Kaiser)
   Svante Frey (sfrey@kuai.se)
   Oliver Mueller (ogmueller@t-online.de)
   Aaron Kaufman (morgan@remarque.berkeley.edu)
   Marc Desrochers (bitzero@hotmail.com)
   Rob Lake (rlake@cs.mun.ca)
   John P. Price <linux-guru@gcfl.net>
   Hans B Pufal <hansp@digiweb.com>

ReactOS developers:
   Eric Kohl
   Emanuele Aliberti <ea@iol.it>
   Paolo Pantaleo <paolopan@freemail.it>
   Brandon Turner <turnerb7@msu.edu>


Bugs
~~~~
There are still many bugs ;)
Please report bugs to ReactOS team <ros-dev@reactos.org> or to JIRA at www.reactos.org