reactos/base/shell/cmd
Hermès Bélusca-Maïto 0695ecbfd6
[CMD] FOR: Additional Windows' CMD compatibility "fixes" for FOR /F token parsing command.
This compatibility behaviour implements the buggy behaviour of FOR /F
token parsing that can be observed in Windows' CMD, and that is tested
by the cmd_winetests.
It can be disabled at compile time via the MSCMD_FOR_QUIRKS define.

It fixes additional cmd_winetests, in concert with commit cb2a9c31.

Explanation of the implemented buggy behaviour
==============================================

In principle, the "tokens=x,y,m-n[*]" option describes a list of token
numbers (must be between 1 and 31) that will be assigned into variables.
Theoretically this option does not cumulate: only the latest 'tokens='
specification should be taken into account.

However things are not that simple in practice. First, not all of the
"tokens=" option state is reset when more than one specification is
provided. Second, when specifying a token range, e.g. "1-5", Windows'
CMD just ignores without error ranges that are not specified in
increasing order. Thus for example, a range "5-1" is ignored without
error. Then, token numbers strictly greater than 31 are just ignored,
and if they appear in a range, the whole range is ignored.

Another bug is the following one: suppose that the 'tokens'
specification reads:
  "tokens=1-5,1-30" , or: "tokens=1-5,3" ,
i.e. more than one range, that overlap partially. Then the actual total
number of variables will not be of the larger range size, but will be
the sum, instead.
Thus, in the first example, a total of 5 + 30 == 35 variables (> 31) is
allocated, while in the second example, a total of 5 + 1 == 6 variables
is allocated, even if they won't all store data !!
In the first example, only the first 30 FOR variables will be used, and
the 5 others will contain an empty string. In the second example, only
the first 5 FOR variables will be used, and the other one will be empty.

We also see that due to that, the "Variables" buffer of fixed size
cannot always be used (since it can contain at most 32 variables).

Last but not least, when more than one "tokens=" specification is
provided, for example:
  "tokens=1-31 tokens=1-20"
a total number of 31 FOR variables (because 31 is the max of 31 and 20)
is allocated, **but** only 20 are actually used, and the 11 others
return an empty string.

And in the specification: "tokens=1-31,* tokens=1-20", a total of
31 + 1 + 20 = 52 variables is initialized, but only the first 20 will
be used, and no "remaining-line" token (the '*' one) is used.
2020-09-21 03:31:01 +02:00
..
lang [BASE] Improve Spanish (es-ES) translation (#3088) 2020-08-25 18:10:23 +03:00
res
alias.c
assoc.c
batch.c [CMD] Some fixes for getting the enhanced '%~XXX' batch/FOR variables. 2020-09-19 19:44:54 +02:00
batch.h [CMD] Some fixes for getting the enhanced '%~XXX' batch/FOR variables. 2020-09-19 19:44:54 +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] Code formatting in SubstituteVar(). 2020-09-19 19:44:55 +02:00
cmd.h [CMD] Fix delayed expansion of variables. 2020-09-19 19:44:55 +02:00
cmd.rc
cmddbg.c
cmddbg.h
cmdinput.c
cmdtable.c
cmdver.h
color.c
config.h
console.c
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
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] CHDIR: Some features are available only when extensions are enabled. Update the SetRootPath() as well. 2020-08-19 21:39:21 +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] Use pointers to const strings in error functions, where applicable. 2020-09-13 22:50:09 +02:00
path.c [CMD] PATH, SET: Fix the returned error message when an environment variable does not exist. 2020-08-19 20:36:06 +02:00
pause.c
precomp.h
prompt.c [CMD] If the prompt displays the information line on top of the screen, ensure that the prompt won't be hidden below it. 2019-12-29 19:14:03 +01: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: Fix displaying the environment variables with a given prefix. 2020-08-19 21:39:18 +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
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
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
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