Changes for 45.0 (commit log unavailable)

- Oh wow, this was a tough job. The Shell really looked like
  some kind of BCPL left-over. It took several days just to
  cleanup the code and turn it into something more readable.
  BCPL was lurking thru the code all over. No more, folks,
  no more...

- The V40 shell was unable to perform the "implicit CD" command
  properly if the directory name was quoted. It inserted an
  unnecessary blank space behind the directory name.

- The shell didn't support multiple backticks on the command line;
  the backtick parser was simply broken: Fixed handling of 
  asterisk-backtick sequences. The backtick wasn't escaped properly.

- The shell did not treat TABs as blank spaces. Fixed.

- Removed the SetClock kludge. Whoever is still using a 1.3
  SetClock nowadays cannot be helped anymore and deserves
  to be crashed. (-;

- Added a few missing Forbid/Permit locks around access of
  the list of resident commands.

- Removed an ugly hack to set the RC and Result2 variables;
  this really uses now the proper system functions and doesn't
  attempt to hack directly into the variable buffers.

- Reworked the parser a lot; it partially tried to fiddle in
  the internal buffers of file handles using structures that
  have never been documented. The code now loads full lines
  at once (no matter how big they are) and then parses within
  its buffers. This removes all dependencies of implementation
  details of the file handles.

- Arguments to redirection did not expand backticks. Fixed.

- Added a lot of proper error checking if it is low on memory.

- The internal (and deceased "GlobalVector") is no longer
  passed thru to all functions. Instead, I'm now using some
  SAS magic to allocate my data segment myself on each
  invocaton.

- Decided not to disable echo-ing for non-interactive shells.
  Otherwise, we could not debug scripts or the startup-sequence.
  Sorry, Heinz, but I reconsidered and it's really better this
  way.

- Shell V45 re-introduces the handling of the "h" bit. Should it
  find a command with "pure" and "h" bits set, it makes the 
  command resident automatically. Note that this is (again) the
  V39 behaivour. Note that "h" is for "hold", not for "hidden".

- The shell does no longer limit command lines to 512 characters.
  Command lines can now be unlimited in size, provided the
  command itself is smaller than the AmigaOs file name size
  limit (107 characters). The Shell will now auto-expand all of 
  its internal buffers if required to do so. Furthermore, it
  uses now memory pools for this kind of administration.

- The shell offers now extended "script" support. In case a script
  file - i.e. a file whose "s" and "e" bits are set - starts with
  either the magic characters "#!" or ";!", the string behind this
  magic cookie is understood as the path to a command parser that
  shall execute this script.

- Added support for "file browsing".

- If the shell encounters now a file as first argument that has
  its "e" bit cleared (!) and is parsed and recognized as a data-
  type by the data types system, the shell runs a "viewer"
  program whose path should be placed in the $VIEWER shell
  variable.

- Added support for "stderr" redirection. Therefore, the V45
  shell introduces three new redirection symbols:

  *>  filename	  : redirects stderr to a file
  *>> filename	  : appends output to stderr to a file
  *>< 		  : redirects stderr to the same file that stdout
  		    goes into.

- The shell will also assign the console to the stderr stream
  should stderr be an interactive stream.

- Added support for "script stdin". A "<<" will pull the next
  symbol from the shell script and will push all following
  lines up to a line starting with this symbol as input into 
  the command. Hence, "<<" is exactly the Un*xoid input redirection.

- Added a new command line token, the "&" character,
  the "implicit run". If found, the shell opens named consoles
  with of a name generated thru utility/GetUniqueID(), and assigns
  these to the stdin/stdout/stderr of the command, shouldn't 
  redirection be used anyhow. Then the command is detached from
  the shell segment.

- Added automatic stack size setup for shell commands. This is a
  new feature that would hopefully limit the number of stack
  underflows as it allows application developers to increase the 
  stack automatically without the need for stack swap code. The 
  shell scans now the first 1K of each segment of a loaded binary 
  for the magic cookie "$STACK:". The string behind this cookie 
  is expected to be a decimal number, terminated with a line feed 
  (and an ASCII NUL, i.e. '\0', as for all C strings).
  This number is then interpreted as the stack size in bytes. The shell
  will automatically increase the stack size *for this command only*.
  If the pre-defined stack size is larger than the program-implicit,
  nothing will happen.

- AGENDA:

  Rewrite the parser for shell-variables. This looks currently messy
  and not very well thought-about. Especially the handling of
  asterisks is broken here.

  Rewrite the parser for backticks. This happend already to some
  degree, but it is not yet perfect.

Changes for 45.1 (commit log unavailable)

- The shell did not handle script files correctly that did not end
  on a line feed. Fixed.
  The shell bootstrap code was partially broken and could not run
  the "Initial CLI" correctly. The BCPL startup mechanism was
  rewritten completely (to the better).
  Incorporated all traditionally resident commands into the Shell-Seg
  making this a self-contained shell with a resident segment that
  is rom-able and can bootstrap the system.
  Rewrote the shell command line parser to some degree. This implies
  various changes on how the command line gets interpreted. Good
  news is that backticks can now also be used to specify the command
  itself, alias [] works within backticks, and backticks cooperate
  nicely with aliases in general. Furthermore, the new parser
  allows multiple, recursive, but non-looping alias expansion,
  and aliases containing backticks that are expanded correctly.

- Fixed *>< redirection hits. Fixed generation of result codes, the
  shell forgot to forward command result codes properly. Fixed
  stderr redirection: stderr defaults to stdout, it now defaults
  to the shell output stream; hence, an explicit *>< is required
  for the old behaivour.

- Fixed escaping for implicit commands CD,EXECUTE, and others:
  They no longer escape " and * if found in an unquoted string.
  Note that this is the proper behaivour, even though this is
  more a "feature" of ReadItem() than anything else.

- Fixed the "CD" command: It did not allocate the anchor path
  from memory resulting in a possibly mis-aligned "FileInfoBlock"
  and damaged memory. Yikes!

- Fixed the "resident" command: First of all, it also placed
  "AnchorPath"s on the stack, which is no good. Second, it did
  the printf for the resident command list within a loop while
  Forbid(), making the forbid for the list lock pretty much
  useless.

- Reworked set,setenv,alias,unset,unsetenv,unalias: All of
  these six commands are handled by the same segment, but the
  division into various subcommands happened in a rather
  unorthogonal way by second-guessing from the command name.
  It is now organized in several segments calling the same
  main routine with parameters. "set" became reorganized
  a lot as well: "setenv" without parameters is no longer
  redirected to "list", making this independent of whether
  external commands are available. "set" reformats now ESC
  and CSI sequences on the screen consistently by using the
  BCPL escape character "*". Other non-printables are (as it 
  always has been the case) replaced by the smear-character
  0x7f (DEL).

- Reworked get, getenv for the same reason: One segment, two
  commands.

- Reworked "run", but not quite as much as I would like to.
  This still rolls its own faked input file handle. Even
  worse, it gets the command line from the undocumented
  internal buffer of its stdin stream. There's currently no
  better way of doing it.

- Added a new option "HEAD" to "path". This will add new paths to
  the start of the command search path and will hence search
  them first.

- Reworked "newshell". It no longer tries to place critical
  DOS structures on the stack, and will therefore long-word align
  them correctly all the time. The window open path of NewShell
  has been changed to CON://130/AmigaShell/CLOSE/SHELL to signal
  shell usage for console handlers, e.g. ViNCEd.

- AGENDA:

  The shell argument parsing is still somewhat wierd. Backticks
  are not recognized as "quotes" and don't group commands
  on parsing - this happens only on expanding them. This is
  mainly the matter of ReadItem() which should be replaced
  by a custom routine. Further, single quotes are not handled
  at all. I wonder whether I should touch this or leave it as
  "compatibility feature".

Changes for 45.2 (commit log unavailable)

- Fixed several missing error reports, for example for out-of-memory
  situations and unability to open redirection files.

- Changes the style of stderr redirection: Stderr defaults now to
  stdout, unless redirected otherwise. This is a compatibility
  cludge for <>NIL: type redirection.

- Redirection with <> checks now explicitly whether the target file
  is interactive or NIL: It will fail in all other cases.

- Redirection into "*" with the run-back operator "&" will now go
  into the console owner established for the command output rather
  than the current console.

- Added PushCD, PopCD and SwapCD commands as build-ins.

- Re-established the "oldredirect" variable. If set to "on", the
  shell will check for redirection operators only immediately 
  behind the command name and nowhere else. This is a pre-V36
  compatibility feature that was dropped in V40 due to limited
  ROM space.

- Added SAVE keyword to UNSETENV to make the changes permanent.

- Fixed wrong templates for unalias, unset and unsetenv.

- Reworked ASK a lot; this command allows now numeric and string
  input, and places the result either on stdout or into a user
  specified local variable.

Changes for 45.3 (commit log unavailable)

- The "&" symbol was broken in several ways: First of all, it
  unlocked home and current directory twice instead of once,
  causing possible memory trashes. Further, it did not set
  CLI->cli_Module correctly which is required for some run-back
  and stay-resident programs. Thrid, it did not check the very
  same CLI variable to release the program again, hence might
  have even unloaded segments that are not meant to be unloaded.
  Fourth, it did not work well with "Execute" due to the rather
  clumpsy way the original BCPL shell introduced the execute
  logic. The "&" handling was more or less rewritten for the
  45.3. The new logic introduced another kludge in the shell
  startup logic (oh no!) but makes it possible to run programs
  in background *without* destroying stdin, hence unlike run.
  Therefore "run" is more or less obsolete now.

- The shell command line parser was turned upside down. Nothing
  of the old parser is left. The net effect is that the general
  logic of argument parsing has been improved much. The shell
  now knows on variable expansion and backtick expansion whether
  it inserts arguments into quotes, and if so, escapes properly.

- Fixed handling of aliases in some ways, especially fixed a
  bug of the 45.2 where the shell forgot to insert a space.

- Removed handling of ( and ) in pipes. They aren't used
  by any pipe command I know of and are therefore just here to
  make the syntax even more cludgy.

- Fixed handling of interpreter setup by means of #! or ;!.
  The line behind the magic symbols is now parsed thru ReadItem
  and hence requires proper quoting, so beware!

- Fixed handling of implicit commands on arguments starting
  with quotes. The old shell could not run these commands
  properly due to unadequate re-escaping of the command argument.
  This is now all handled (hopefully correctly) by one common
  routine that is also used for variable and backtick sub-
  stitution.

Changes for 45.4 (commit log unavailable)

- The 45.3 release caused problems with existing scripts because
  quoted variables within quotes where escaped by * such that
  double quotes resulted. While this is correct in principle,
  it broke already existing scripts. For this reason, a special
  rule is now applied: Variables within quotes get their first
  pair of surrounding quotes removed. You can avoid this by
  setting the variable "keepdoublequotes" to "on":

- set keepdoublequotes on

- Pre 45.3 releases generated a wrong error for script files
  that are read-protected. Fixed.

Changes for 45.5: (commit log unavailable)

- Fixed the parser state machine such that variables of wierd
  names like ">t" are possible. The parser used to be quite
  inconsistent how to handle them.

- SwapCD has an optional LEVEL argument that defines which
  level of the directory stack to swap with.

- The stack extension logic scans now the first 4K for the
  stack cookie.

- Setenv SAVE clears now the "e" bit on the saved variables.

- The asterisk in front of $, [and ` is now handled
  correctly again. * escapes the following character, **
  escapes the star from escaping, *** is a double star with
  escaped following control character.

- Added the possibility to check for the existance of a
  variable by the $?varname method. $?a will expand to
  1 if a is defined, 0 otherwise. $??a will expand to
  1 only if a is found as a global variable.

- Fixed handling of quotes in variables and backticks
  outside of quotes. Behaivour of the shell depends here now
  again on the "keepdoublequotes" variable. If "on", the
  quotes are escaped and the full string is put into quotes,
  otherwise the string is left alone. If already in quotes,
  "keepdoublequotes" = "on" escapes quotes within the
  variable body, otherwise the outermost quote gets removed.

- Fixed the escaping of the rear backtick of a backtick
  sequence.

- StdErr redirection to NIL: by *>NIL: will now clear the
  console task for the command to be run.

- Command interpreters specified by the #! or ;! token may
  now get additional arguments specified on this line. The
  script file name is inserted between the command and these
  arguments.

- Fixed the multiple redirection issue. Fixed handling
  of alias and redirection. As a side condition, the output
  of the "set" and "setenv" commands can now be redirected just
  fine.

Changes for 45.6 (commit log unavailable)

- Various minor code cleanup concerning the command buffers;
  they are now all static to the functions they belong to.

- Fixed recognition of $VIEWER which had to be a local variable
  to be functional.

- Removed beta warning message on startup.

- The shell scans now all hunks of a loaded binary for the
  stack size. Furthermore, several enhanced safety checks have
  been added for this feature.

- Added a german documentation, proof-read and spell-checked
  the english documentation.

Changes for 45.7 (commit log unavailable)

- The run-back operator & did not move the shell segment in
  the seg-array and hence might have crashed some BCPL commands.

- The stack size search routine got improved quite a lot and is
  now much faster than before - by a factor of four to five.

- The "setenv" command clears now the "e" bit of the variables
  it saves.

- Added a Shell.guide (Thanks Martin for the help).

Changes for 45.8 (commit log unavailable)

- Fixed handling of backticks within comments. They are now
  properly ignored.

- Fixed handling of equal-signs within arguments. They are
  now considered similar to blank spaces and consider
  following double-quotes as function, not as literal.

Changes for 45.11 (commit log unavailable)

- Fixed result code of PopCD. Fixed search path for external
  scripts with a non-native shell interpreter. Fixed the same
  problem for datatypes. The Shell will now use PROGDIR:
  correctly.

Changes for 45.12 (commit log unavailable)

- Fixed handling of alias expansion and backticks. In case
  a backtick expansion resulted in a string containing
  backticks, an alias would expand the second backtick pair
  again even though it shouldn't.
- Changed handling of variable expansion once again. The shell
  used to expand variables after argument parsing; especially,
  if the command was given by a variable, blanks were considered
  parts of the command. This might possibly be desirable, but
  I changed it for backwards compatibility.

Changes for 45.16 (commit log unavailable)

- Fixed two bugs of alias handling: Alias expansion now also
  recursively expands backticks and shell variables in the alias
  body.
- This version also provides a new feature of the shell, namely
  interactive debugging of shell scripts. To enable it, set the
  variable "interactive" to "on". The shell will then prompt
  every command it executes and waits for your response. The command
  can be run by pressing return, skipped by pressing DEL or the shell
  script can be aborted with ESC. This can be a useful tool for
  debugging the startup-sequence.

Changes for 45.25 (commit log unavailable)

- The alias arguments are now also valid within variable names and
  backticks. Furthermore, alias, variable and backtick expansion got
  rewritten, removing any circular dependencies, i.e. alias, backtick
  and [] expansion are now done in one single step. This has the side
  effect that backticks can not be used to expand to variable names
  (similar to the bash) and the keepdoublequotes variable also applies
  to the alias [] argument. It has another (positive) side-effect
  that no part of the command string is really parsed twice, thus
  avoiding trouble of backticks or variables that expand to another
  defined variable name by pure chance.
- Another seemingly minor improvement is that recursive execution of
  script files finally works (for the first time ever), meaning that
  you can actually skip back in front of another EXECUTE command. To
  make this working, make sure that C:Execute is resident before the
  shell requiring this feature is started. This seemingly simple
  feature required major trickery in the shell and corrects at least
  one of the anoyances of the Amiga Shell.

Changes for 45.28 (commit log unavailable)

- The magic "hash-bang" sequence was partially broken and did not
  append additional command line arguments to the executing program
  correctly. This got fixed.

Changes for 45.29 (commit log unavailable)

- Previous versions did not update the CLI stacksize field when
  creating run-back processes with the "&" operator, even though
  the correct size of stack was allocated. Nevertheless, some
  programs rather checked cli_DefaultStack instead of the stack
  size they got, and reported a lack of stack. This version fixes
  this problem.

Changes for 45.31 (commit log unavailable)

- The 45.29 version did not correctly carry over the return code
  of a command executed in back-ticks to the main shell. This version
  now reports the original secondary return code of the sub-shell as
  error again, e.g. whenever you execute a command in back-ticks, and
  this command fails, the shell will print this failure as error code.

-------------------- AmigaOS 3.1.4.(1) project -----------------------

Changes for 45.32 (18.12.2016)

- This re-integrates the latest AmigaShell for
  the classics (V45.31) back into the AmigaOs sources.

 No functional changes.

 TODOs:

- Should really include execute in the resident list as it
  requires proper handling of the execution/IO stack, which is
  currently not granted.

Changes for 45.33 (20.12.2016)

- As execute is all new now, the special hack that allowed
  recursive execution of scripts is no longer necessary and has
  been removed from the shell.

Changes for 45.34 (20.12.2016)

- Fixed a resource leak in recursive shell execution.

Changes for 45.35 (21.12.2016)

- Fixed another potential resource leak in out of memory
  situations.
- Allows now also input/output redirection of the execute
  command by storing the shell streams on the execution stack
  as well.

Changes for 45.36 (4.1.2017)

- For some strange reason, even the original shell did not
  clean up a command file left behind from an execute called
  indirectly through a System() call. This is probably an
  oversight and not a design decision, so the shell cleans
  up in this case as well.

Changes for 45.38 (10.2.2017)

- In case a recursive shell script was launched through
  System() instead through the shell directly, the shell
  erraneously terminated the entire recursive call at the
  EOF of the deepest nested script. As a related bug, the
  "QUIT" command did not work properly for recursive
  scripts and terminated only the current script, but not
  the entire hierarchy as it should.

Changes for 45.39 (29.9.2017)

- The expansion of backticks caused an error in case the command
  in backticks did not generate any output. This problem was
  fixed.

Changes for 46.1 (14.10.2017)

- This release of the shell introduces native handling of pipes
  and concatenation operators, namely | and ||. Unlike former
  releases, there is no longer a need to use an external command
  for it. Also, a new resident command named '(' has been
  added. This command spawns a subshell of its contents, and for
  that reason, orders commands, pipes and concatenation operators.

Changes for 46.2 (14.10.2017)

- Fixed releasing the temporary pipes - forgot to clear the
  pointers.

Changes for 46.3 (28.10.2017)

- The bracket operator/command requires now a blank space behind it
  to be consistent with the closing bracket. This is also made
  consistent with the rest of the command line parsing.
- Made IOstream lifetime handling much simpler.

Changes for 46.4 (4.12.2017)

- Removed special parsing rules for rx. Really need to fix the
  quoting rules for rx and adopt them to the Tripos (yuck!)
  rules.

- Improved the insertion rules by properly adding quotes in
  case the contents contains a line feed or escape.

Changes for 46.5 (5.12.2017)

- This was still not quite consistent as it did not handle
  variables with blank spaces as contents correctly. They do not
  get quoted (as they should) but must be escaped if surrounded
  by quotes.
- Variables within quotes are now expanded as binary variables,
  so line feeds then persist.

Changes for 46.6 (15.12.2017)

- Uses now the new "rx script" to disambiguate between commands
  and quoted file names.

Changes for 46.7 (17.2.2018)

- The shell removes now trailing blanks before pushing arguments
  into commands. This usually makes no difference, except if the
  arguments are parsed off by a /F template parameter. In specific,
  SET did strange and wonderful things in case the assigned
  value was not terminated.

Changes for 46.8 (11.5.2018)

- Fixed a hit in the resident command that attempted to use NULL
  as a pointer to the previous version of a resident command.

Changes for 46.9 (8.9.2018)

- Allowing binary vars in double quotes was probably not such a
  hot idea. Now binary vars can be explicitly requested by placing
  an exclamation mark in front of the variable, and also put them
  in quotes (as otherwise it really messes with the shell).

Changes for 46.10 (12.9.2018)

- The maximum size of variables is now 106 characters, which is the
  maximum size any filing system can support.

Changes for 46.11 (5.10.2018)

- The shell did not set the CLI standard input different from the
  process input in case of piping or in combination with runback
  operations triggered by "&". This broke sort and search in pipes,
  unless they were put in last position.

Changes for 46.12 (28.10.2018)

- Enlarged the maximal size of variables for get and getenv, and
  the maximal size of the path for the Path command.

Changes for 46.13 (commit log unavailable)

- Apparently, any error code passed over from command execution did
  not unwind to the top-level, which then (naturally) forgot to
  abort execution if the failat level told so.

Changes for 46.14 (17.11.2018)

- Installing a new shell on top of a ROM shell now also replaces
  the built-in commands instead of adding them twice to the resident
  list as before.
- The shell required V40 of the dos.library and crashed if it was
  not available. It can now also do with V39, and will not crash -
  though the system will not boot either on versions below V39, how
  could it without a boot shell.

Changes for 46.15 (18.12.2018)

- Runback no longer attempts to open CONSOLE: if there is no console
  task. Instead, it falls back to NIL: now.

Changes for 46.16 (17.1.2019)

- The middle part of a multi-concatenation pipe would erraneously
  read to a non-existing buffer due to a non-initialized base
  register.

Changes for 46.17 (24.3.2019)

- BuildCLI() creates now all cli strings as vectors, just in case an old
  program expects them to be so.

Changes for 46.18 (14.4.2019)

- In case variable expansion failed, the shell failed to print an error
  and just aborted.
- In case alias expansion failed, no error report was made whatsoever
  and processing erraneously just continued.
- The parser state machine had still a bug in parsing double dollar signs
  incorrectly.

Changes for 46.19 (19.4.2019)

- The $? operator only checked for environment variables, but not for
  local variables. Fixed.
- Input redirection via << did not work for some shell commands due to
  a mixup in the BCPL buffered IO.
- The variable oldredirect no longer acts on pipes as it clearly makes
  no sense there.

Changes for 46.20 (5.6.2019)

- The parser had another bug parsing two variables following each other.

Changes for 46.21 (11.6.2019)

- Reworked the scanning algorithm for the stack cookie a bit.

------------------------- AmigaOS 3.2 project ------------------------

Changes for 47.1 (16.12.2018):

- This is a new shell branch that features *TADA* tab expansion and
  history handing as part of the shell. It requires additional console
  support to receive TAB and the TAB input as CSI cmd;len;pos U
  sequences.

Changes for 47.2 (25.12.2018):

- The TAB expansion took the last character of a pattern as type
  indicator what to scan for, this idea did not work so great because
  this did not allow to scan into directories.
- The TAB and history expander uses now ^X to erase the user input
  instead of ^B, the latter of which also reset the history and send
  another TAB request back to the shell.

Changes for 47.3 (27.12.2018):

- Added the variable "simpleshell" which can be set to "on" to disable
  the tab expansion and history functions. Note that you would typically
  not need this as the shell turns off tab expansion anyhow when
  executing scripts.

Changes for 47.4 (31.12.2018):

- Directories within the current directory now also match when scanning
  for commands. This allows to find commands from the current directory
  in other subdirectories using TAB-expansion.
- The shell now clears the input buffer before sending a bell to the
  console, thus making the life of the con-handler easier, and also
  avoiding a conflict with ViNCEd.

Changes for 47.5 (2.1.2019):

- The check for Medium Mode is now more careful and does not repeat the
  same check twice on the same file handle.

Changes for 47.6 (27.1.2019):

- Added the "history" command to the shell built-in command list, and
  a communication protocol via pr_SegList[4] which contains, in a dummy
  segment, a pointer to the history - and probably other shell internals
  in the future. Ideally, struct CommandLineInterface should be extended,
  though this structure is documented and hence frozen.

Changes for 47.7 (2.2.2019):

- Hijacking pr_SegList[4] for extension did not feel right. So instead,
  it now extends the CommandLineInterface structure. Unfortunately,
  the shell has to create now its own structure for that. In long term,
  this might go into the dos.library.

Changes for 47.8 (14.2.2019):

- TAB-expansion an argument in the middle erroneously pulled in a blank
  from the command line, thus creating the wrong search pattern. This
  has been fixed.

Changes for 47.9 (5.3.2019):

- Some characters were not properly escaped before creating a pattern
  for scanning directories. In particular, brackets require escaping
  with backticks.

Changes for 47.10 (24.3.2019):

- BuildCLI() creates now all cli strings as vectors, just in case an old
  program expects them to be so.

Changes for 47.11 (14.4.2019):

- In case variable expansion failed, the shell failed to print an error
  and just aborted.

- In case alias expansion failed, no error report was made whatsoever
  and processing erraneously just continued.

- The parser state machine had still a bug in parsing double dollar signs
  incorrectly.

Changes for 47.12 (19.4.2019):

- The $? operator only checked for environment variables, but not for
  local variables. Fixed.

- The && was parsed as an operator, even if contained in brackets or
  double quotes.

- Input redirection via << did not work for some shell commands due to
  a mixup in the BCPL buffered IO.

- The variable oldredirect no longer acts on pipes as it clearly makes
  no sense there.

Changes for 47.13 (21.4.2019):

- The why command no longer prints its output through PrintFault, such
  that redirecting StdErr only affects errors.

Changes for 47.14 (5.6.2019):

- The parsing of double dollar signs was still not quite correct, fixed
  that again.

- In case two variables were placed near each other, the parser failed
  to detect the second variable because it parsed the second $ sign
  twice. This was fixed in the parser.

- The stack cookie is now also accepted if it ends with a trailing \0
  to be consistent with the workbench.

- TAB expansion incorrectly failed to identify a variable expansion
  if the cursor was placed directly behind the $ sign. This also
  happened if the $ sign was the last character on the line.

Changes for 47.15 (10.6.2019):

- newshell requires now the v47 dos.library and hence shrunk a lot in
  size.

Changes for 47.16 (11.6.2019):

- Reworked the scanning algorithm for the stack cookie a bit.

Changes for 47.17 (20.6.2019):

- Reverted the return-from-startup code a bit as the modification, albeit
  correct in the real world, does not work properly with vamos.

Changes for 47.18 (21.6.2019):

- The shell runs now into an alert in case it receives obsolete startup
  calls. As the latest dos.library builds a longer CLI structure, it is
  no longer necessary to extend it for the history.

Changes for 47.19 (5.8.2019):

- The shell is now a bit more careful for checking whether its CLI
  structure is extended or not, and works around older versions of Arexx
  not building them properly.

Changes for 47.20 (8.8.2019):

- The runback token caused a muforce hit. Fixed.
  Aborting the TAB expansion by ^E did not always work, and had
  side-effects on the current console input. It now is a safe abort that
  leaves the user input intact.

Changes for 47.21 (17.8.2019):

- Argument substitution within execute did not escape $ and backtick
  characters that were taken from the expanded arguments.
  Variables that are part of a pattern but not part of the search path
  are now expanded prior passing the pattern to the searcher.

Changes for 47.22 (21.8.2019):

- The execution stack logic unfortunately made the redirection input
  the current input of the shell, though this broke execution through
  pipes. This was actually not necessary as Execute itself performs
  this step to let the shell execute its prepared file. Hence, this
  part of the logic is removed, though recursive execution is retained.

- However, simply removing this logic had the side effect that scripts
  can no longer substitute commands, though they should. So, the
  execute input redirection rule remains in force if execute is
  "implicit" by the s bit.

- Execute did not accept arguments if its input was redirected due to
  a buffer conflict.

Changes for 47.23 (27.9.2019):

- Added the "debug" variable that, if if set to "on", pushes executed
  commands through the serial output.

- Alias argument substitution through [] stops now at all forms of
  pipes, and also at input or output redirection. Whether the latter
  is really the correct implementation is another question.

Changes for 47.24 (23.10.2019):

- The shell now escapes tokens of the pattern matcher in found file
  names with '.

Changes for 47.25 (27.10.2019):

- Instead of creating a new CLI, the shell history function errors in
  case the cli structure is unextended.

Changes for 47.26 (13.11.2019):

- Added keywords to load and save the history.

- Modified the history functions to act a bit less weird.

Changes for 47.27 (16.11.2019):

- The shell no longer sends an ACTION_FORCE_INPUT to the con-handler
  with length 0 because this makes little sense.

Changes for 47.28 (19.11.2019):

- The shell keeps now track whether a TAB search pattern matches one
  or multiple files/directories, and only inserts closing quotes in
  case the match is complete.
  
Changes for 47.29 (24.11.2019):

- Fixed an off-by-one error in stacking the command file for recursive
  execution.

- Added a function pointer to the extended CLI structure by which the
  dos.library can request TAB-expanded command line parameter
  substitution.

- Extended Execute to make use of this parameter execution.

- Added the DoShellMethod() function to request functionality
  from the shell such as to perform TAB expansion.

Changes for 47.30 (1.12.2019):

- Navigation through the history with the cursor keys (or whatever key
  the history is bound to) is now cyclic.

Changes for 47.31 (1.12.2019):

- The LIST method returns now the list of supported methods of the shell.

- The automatic buffer extension of the line reader was a bit premature
  to extend the buffer, even if it is not needed. This caused the shell
  to waste a lot of memory in case a script is not terminated by a *N.

Changes for 47.32 (unknown date):

- In case the expansion is complete, TAB expansion is aborted and the
  next TAB triggers a new scan.
  
Changes for 47.33 (22.12.2019):

- As the dos.library functions SetVar() and DeleteVar() do most of the
  work anyhow, all the manual protection bit handling and saving to
  ENVARC: was removed from the set/setenv commands.

- The Fault command prints the decoded faults now over COS, not CES.

- The path command prints the "Current Directory" string now over COS,
   not CES.

- The cd, popcd and swapcd command no longer accept soft links as targets.

- popcd and swapcd were integrated into cd to save some ROM space.

Changes for 47.34 (28.12.2019):

- NewShell uses now the new SYS_InName tag to ensure that the target
  console window is opened by the shell itself.

Changes for 47.35 (31.1.2020):

- Added the shell variable HISTSKIPDUPS. If this variable is yes,on,TRUE
   or 1, then browsing through the history skips duplicate lines.

Changes for 47.36 (13.2.2020):

- Fixed some hits in the history.

Changes for 47.37 (9.3.20) 

- Now skipping duplicate history lines is the default, and the shell
  variable NOLISTSKIPDUPS can be used if skipping is not wanted.

Changes for 47.38 (19.4.20):

- Change the tab expansion behavior into 2 distinct modes to be chosen
  via COMPLETION local shell variable

- Also disable so it doesn't do split expansion on both left and right
  side of cursor

Changes for 47.39 (21.4.20):

- Ignore .info files during completion, unless it is the only match or
  unless NOINFOEXCEPTION is given in the COMPLETION shell variable

- Don't list tab completions with full path names

- When listing completions group files with .info into one item by
  appending " (+info)"

- Fix a bug regarding protection bits for first argument completion

- New option EARLYLISTING to allow listing of all matches on first TAB
  press

- Fix the common expansion being calculated incorrectly at times - and
  also save some ROM space and speed it up a bit

- Sorted tab expansion results - affects both the listing and cycle
  order.

Changes for 47.40 (27.4.20):

- Don't sound the bell unless there is no match at all.

- Find .info file buddies amongst the matches by searching both
  forwards and backwards.

- Changed name of the local shell variable which controls the tab
  expansion behaviour from COMPLETION to SHELLCOMPLETION.

Changes for 47.41 (23.5.20):

- Sort matches directly when adding - less computation and code needed.

Changes for 47.42 (07.9.20):
- The history is no longer cyclic

Changes for 47.43 (6.11.2020)

- The built-in "Why" command now prints "Last command failed because:
  <error message>" again, instead of "<error message>: Last command
  failed because".

Changes for 47.44 (29.11.2020)

- Now the command line contents will not be cleared when a running tab
  completion is aborted.

Changes for 47.45 (02.12.2020)

- Squeeze some code together so we don't send ACTION_FORCE more than
  once unless it is a "clear"
- Fix Tab completion getting fooled by quotes

Changes for 47.46 (06.12.2020)

- Small optimizations
- Make it possible to break during printing of alternatives
- More completion fine tuning, related to completing the not-last-argument
- The tab completion of quotes had the nasty side effect it caused full
  expansion of arguments
- Do not match non-executable files in current dir when tab completing
  the first argument
- Improve tab completion performance by not adding candidates from C:
  twice if it is present in the path (which it generally always is)
- More than doubled tab candidate list scrolling speed on A3000 class
  machine.

Changes for 47.47 (23.02.2021)

- Rename NOINFOEXCEPTION to ICONSASFILES
