The main duty of FreeCOM is to prompt the user to enter commands, which are interpreted, processed directly by FreeCOM or executed as executable files.
Those commands processed by FreeCOM directly are called Internal Commands.
Non-internal commands, which cannot be processed by FreeCOM directly, are called External Commands, because FreeCOM will search for files equally named as typed-in.
Besides to implement certain commands FreeCOM offers some features.
If present, the first non-option argument specifies the location in
which FreeCOM resides. This location is later stored in the environment
variable COMSPEC. Since DOS3+ this option is no longer necessary to find
the shell invoked during the boot process, but it may be used to let the
system boot a primary shell from one location, but use a shell of the
same version from a different location later on.
One shallt not point to a RAMdisk at this time, because FreeCOM
needs to reload certain information relatively early during execution,
before AUTOEXEC.BAT had been executed, in which, normally, FreeCOM is
copied into the RAMdisk.
For convinience FreeCOM checks, if at the given location a FreeCOM
exists and is accessable, if not, the given location is
ignored. Also, the standard requires to specify a path only, but
FreeCOM accepts an absolute filename, so accepting that FreeCOM is not
necessarily named COMMAND.COM.
The second non-option argument, if present, specifies the console FreeCOM shall enable. This setting is system-wide and is not limited to FreeCOM or just this particular process tree. In its result, this argument is identical to the CTTY command.
FreeCOM knows the following options:
DISP_EXITCODE.
+' to enable or '-' to disable swapping.
Boolean options, which can only be enabled or disabled, may be
prefixed by '+' to enable or '-' to disable it.
FreeCOM uses a number of environment variables for its own purpose.
There are a number of automatic variables that do not follow the above mentioned syntax and which contents is automatically generated. Unlike the normal variables these automatic variables are constructed of exactly two characters, the first one is a single percent sign and the second one the variable identifier:
Because automatic variables have one percent sign only, it sometimes lead to
confusion within the FOR command, e.g. in:
CMD: SET adam=eva
CMD: FOR %a in (*.*) DO echo %adam% %a
The synopsises of the internal commands are described in a style derived from EBNF.
In interactive mode FreeCOM prompts the user to enter a command, the line is interpreted, parsed and, finally, either rejected because of an error or executed.
The first optional 
The colon marks the line as label, which causes to let FreeCOM ignore the line completely as no interpretation is tried on this line, neiter are any redirections created.
The 
The optional 
The asterisk 
If commands are chained with the 
CMD: cmd1 | cmd2 | cmd3
forms a pipe consisting of the three individual commands 
CMD: cmd1 >%TEMP%\cmd###1.tmp
CMD: cmd2 <%TEMP%\cmd###1.tmp >%TEMP%\cmd###2.tmp
CMD: cmd3 <%TEMP%\cmd###2.tmp
The files are temporary ones and will be removed as soon as they are
no longer required, meaning the tempfile #1 is removed after 
Redirections tie the standard input or output stream to a file or device,
for instance: If the echo state is enabled, the user is prompted with the
PROMPT string; otherwise no visible or audible prompt is issued to
indicate an user activity request.
 In either mode the ENTER key terminates the editing and
lets FreeCOM start to interprete the entered line.
 The standard input mode does neither support command line
history, except the last command line in some circumstances, nor file completion.
The following keys have a special meaning:
 The enhanced input mode does support command line history and
file completion.  The following keys have a special meaning:
 
 
 
 The To-Do list:
 
 The packages themselves include:
 Alternatively the WebCVS
-- follow the Browse CVS link there and remember to select the
MAIN branch
-- might be helpful in order to download a handful of files.
 However, CVS allows to branch the development of a module at some
point from the main trunk into side trees. On these branches the module
can be developed further, new features can be added etc., without
disturbing the main trunk (and therefore the primary release) of the
module. When the side development proved its worthiness, the changes are
merged into the main trunk and, hence, becomes part of the primary
release.
 Branches are marked by tags, though, unlike normal tags branch tags
automatically evolve with the file, what means that when a file from a
specific branch is updated, the branch tag automatically move from the
current version of the file to the new one.
 The FreeCOM module has the following active branches:
 The FreeCOM module has the following obsoleted branches:
 Unless modified by above mentioned operators a sequence of tokens
specifies that each token must be present exactly one time in exactly
that order. 
Copyright 2000-2001 © Steffen Kaiser - current maintainer of FreeCOM
CMD: cmd arg 
redirects the standard input stream of Command Line Editing
FreeCOM offers two methods to interactively enter command lines:
The first one just calls a DOS function, whereas the second one processes each
key for its own. Which method FreeCOM uses is defined at compile time.
	 Key 
		Meaning 
	 F1 
		Get next character from last line, if available 
	 F3 
		Get last line, if available 
	 F5 
		Place current line in last-line buffer and restart editing on a blank line 
	 F6 
		Insert the pseudo-character End-of-file 
	 backspace 
		delete character to the left 
	 cursor left 
		delete character to the left 
	 cursor right 
		Get next character from last line, if available 
	 Key 
		Meaning 
	 F1 
		Get next character from last line, if available 
	 F3 
		Get last line, if available 
	 F5 
		Place current line in last-line buffer and restart editing on a blank line 
	 backspace 
		delete character to the left 
	 cursor down 
		Replace the current input line with the previous line from the history 
	 cursor left 
		move cursor one character one position to the left 
	 cursor right 
		Move cursor one position to the right; at the end of the line
			get next character from last line, if available 
	 cursor up 
		Replace the current input line with the next line from the history 
	 delete 
		Deletes the character on the cursor 
	 end 
		Moves the cursor to the end of the line 
	 ESC 
		Clear current line 
	 home 
		moves the cursor to the beginning of the line 
	 insert 
		Switch between insert and overwrite mode 
	 TAB 
		Take the current word for a file and try to complete it 
	 ^C 
		Clear current line and enable echo state. The echo state is
			enabled to ensure the user gets to know he is on the command line of
			FreeCOM rather than stuck in a non-interruptable program. 
Features of FreeCOM
FreeCOM implements the following features:
SKAUS_EVALUATE_PERL: $_ = $features
Status of FreeCOM
FreeCOM's development currently targets the v1.0 version, which is to
provide all functionality (features) of commonly known COMMAND.COMs at
minimum, but probably at the cost of optimization and performance.
	 
Feature 
		Target 
	 
Swapping without any supporting secondary programs
			( 
			 INT-2E backdoor 
			 
Wildcards for  
			 
	 
Input/output functions to replace <stdio.h> by
			<io.h> (aka replace FILE*-based
			I/O by handle-based one) 
			 
Strict error recognition, probably _doserrno
			based 
			 
Support for  
			 
Code sharing of modules 
			 
Redirection in conjunction with Swapping 
			 
Optimize FreeCOM for size 
		post v1.0 
	 
Other swap storage areas, e.g. XMS and EMS 
		post v1.0 
	 
Long filenames 
		post v1.0 
	 
internal commands 
		mostly done 
	 
Aliases: ALIAS 
			 
Command line history: HISTORY 
			 
Directory stack: DIRS, PUSHD, and POPD 
			 
MUX-AE interface 
			 
Enhanced command line editing,
			file completion 
			 
Last directory recognition: CD, CDD, PUSHD 
			 
Control Break handler 
			 
Critical Error handler 
			 
	 
Full support for DOS NLS 
			 
Footnotes:
Appendix
Compile FreeCOM - sample
Due to heavy request, there is a sample description
how to compile FreeCOM in ten steps.
Download
FreeCOM can be downloaded from SourceForge in several ways and packages:
Resources accessable via anonymous FTP
SourceForge closed the FTP - Services.
Resources accessable via HTTP
http://freedos.sourceforge.net/freecom/packages/
contains several variants of tarballs and pre-compiled packages of FreeCOM.
The files immediately located in the directory contain the most current
major release of FreeCOM, whereas the subdirectories include Beta releases
of the upcoming release.
	 
file name 
		contents 
	 
COM###.ZIP or Com###Beta##.ZIP 
		tarball (the source code tree without CVS
			information) 
	 
BINARY.ZIP 
		the most commonly used pre-compiled FreeCOM with
			almost any feature, but debugging enabled.
			 
This release uses standard swapping mechanisms!	 
XMSSWAP.ZIP 
		the most commonly used pre-compiled FreeCOM with
			almost any feature, but debugging enabled.
			 
This release uses XMS-Only swapping mechanism!	 
PLAINEDT.ZIP 
		As BINARY.ZIP but using the plain command line
			editor of the kernel instead of the enhanced one 
	 
DEBUG.ZIP 
		As BINARY.ZIP with debugging support enabled.
			 
This variant is a lot larger than the standard release
			and can generate lots of output.	 
LOCALIZE.ZIP 
		As BINARY.ZIP but targetted at maintainers of
			a language description file (*.LNG). 
	 
SUPPL.ZIP 
		the SUPPL library required for linking FreeCOM precompiled
			for use with Turbo C++ v1.01 
	 
DOCS.ZIP 
		a package with these HTML documents 
File Releases on SourceForge
On SourceForge
so-called File Releases can be created. The file release section of
the FreeCOM module contains a source ZIP and a binary ZIP file, they are equal
to the tarball and the BINARY.ZIP on the anon FTP space respectively.
Unlike the FTP space, old versions are kept, but no Beta versions or side branches.
CVS Resources
On SourceForge
a short description of how to access the CVS repository is located.
Following those instructions will download the main trunk of the
specified module of the repository,
e.g.: cvs -z6 co freecom
 downloads the MAIN trunk, also
called HEAD, of FreeCOM.
To check out a branch, create a new directory, change within it and
execute:
cvs -z6 co -r tag freecom
,
where tag is the name of the branch you want to download.
Note: It is not advisable to use the same directory to manage
files for two different branches.
	 Tag 
		Meaning 
	 expExec 
		Stack-based execution context implementation 
	 expSpawn 
		Module based FreeCOM, bases on expRes branch 
	 Tag 
		Meaning 
	 expRes 
		Resource management implementation.
			 
Finally merged into trunk as of 2001/03/10
Bug Tracking / Bugzilla
FreeCOM uses FreeDOS's Bugzilla for tracking bugs and the like.
EBNF
Documents encode the synopsis of the commands with operators derived from
EBNF (Extended Backus-Naur Formula).
Type setting
Depending on different meanings characters are set into various shapes:
	 Name
	 Meaning
	 Example
 
	 terminal
	 characters to be enterred on command line or displayed by
		the computer; EBNF: "terminal symbols"
	 ECHO
 
	 'string'
	 The quotes remove the metafunction of the enclosed characters
		in order to specify EBNF operators as terminal symbols.
		EBNF: "terminal symbols"
	 '|'
 
	 bold
	 operators that constructs portions together;
		EBNF: "operators"
	 |
 
	 italic
	 placeholders for arguments, which are explained in the description;
		EBNF: "non-terminal symbols"
	 varname
 Operators
The EBNF  uses the following operators:
	 Symbol
	 Meaning
 
	 |
	 alternative; use either left or right token
 
	 () 
	 parenthizes enclose tokens limiting the range of |
 
	 []
	 brackets enclose optional tokens, thus, they may appear zero or
		one time; they also limit the range of |
 
	 {}
	 curly brackets enclose repitive tokens, which may appear one or
		more times; they also limit the range of |
 
	 { : }
	 as the normal curly brackets, but any repitive tokens are delimited
	by the token(s) right of the colon; for instance:
	 
	{ file : '+' }
	
	is the same as:
	
	file [{ '+' file }]
	
	and applies to:
	
	
	 «   »
	 is a placeholder for an arbitary string of terminal symbols, which
		further syntax is described by the enclosed text in English
		natural language.
 
	 ::=
	 assigns a meaning (right side) to a non-terminal symbol (left side);
		for instance 
	DIR [ { option | filespec } ]
	option ::= / ( A | B | C )
		Any occurance -- only one here -- of option on the right
		side of an ::= or where no ::= is present at all is
		to be replaced by the right side of option::=.
 Note: For the sake of clearness, spaces are inserted
between tokens. These spaces do not mean that a space
is allowed at this place!  Also, the fact that no _ is present
does not mean that at this place is none allowed. It is
assumed that the reader will find the places where optional spaces are
valid either by "doing" or by reading the
examples.