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

Changes for release 47.1 (30.12.2018)

- Increased the default stacksize for CON:, RAW:, PRT:, SER:, PAR:, 
  RAM: and the FFS.

- Forgot to pass the file system task in a2 in ExAll().

- The dos.library includes come now from the system includes
  and no longer from a private directory. This makes it easier
  to keep them consistent.

- added the new tag SYS_CmdStream to SystemTagList() which delivers
  the command input as a stream, not as a string.

Changes for release 47.2 (23.3.2019)

- The BCPL-inherited functions FWrite() and FRead() were terribly
  slow as they went through the low-level I/O byte per byte. Both
  functions attempt now to read entire blocks of bytes, and even
  more so, now attempt to burst, i.e. go directly down to the
  "virtual file system" of the dos.library.

Changes for release 47.3 (21.4.2019)

- PrintFault() prints now over pr_CES if it is non-NULL such that
  error output can be redirected with *> as it should.

- This release now finally supports NP_Error and NP_CloseError,
  unlike V40, which claimed to support it, but in fact did not.
  To stay compatible with V40, the default for NP_Error is NULL,
  *NOT* Open("NIL:",...), and the default for NP_CloseError is
  FALSE, not TRUE. The process flag itself is identical to Os 4.0.

- Fixed compiler warnings (typecasts, unitialized variables)

- SYS_Async now also works for System() calls with a NULL command
  or SYS_CmdStream. This can (and should) be used as a replacement
  for NewCLI. For that, supply SYS_Async=TRUE, SYS_CmdStream =
  Open("S:Startup-Sequence",...), SYS_Input = Open("CON:",...) and
  SYS_Output=0, and you get a new shell.

- System() has a number of failure cases. In case creating a new
  process failed, System() erroneously also released an input
  stream supplied by Run (though run releases it itself) and
  erraneously also released SYS_CmdStream on error. The streams
  are, however, only adopted by the child shell in the success case.

- NP_Name was ignored by System(). Instead, the new process
  always received the name "Background CLI". Fixed.

- With this release cli_init_newcli() becomes obsolete and will be
  removed in future releases.

- System() now only prints its "magic information" strings as
  a service for run only if pr_COS is non-zero.

- Adds the V50 functions PutErrStr(), GetCurrentDir(),
  ErrorOutput() and SelectErrorOutput().

- Reserved slots for multiple other V50 functions.

Changes for release 47.4 (29.04.2019)

- Added VolumeRequestHook() library call to enable relaying DOS
  Volume mount requests to external programs ("AssignWedge")

- Updated makefile to generate dos_lib.fd from dos_lib.sfd

- Makefile said VERSION := 40, changed to 47

Changes for release 47.5 (09.05.2019)

- CliInitRun() may have had an MuForce hit of the original
  creating process had no CLI but provided an Output channel.

- In case allocating a new process failed, CreateNewProc()
  erraneously tried to FreeVec() the seg-array of the not-yet
  available process, but this segarray is not created by AllocVec,
  hence the result was a memory corruption.

- In case the dos.library finds the bootstrap module, it will
  start this instead of the shell, and it does not attempt to
  find any other modules then. Creating the runtime environment
  is then up to bootstrap.
  
Changes for release 47.6 (10.06.2019)

- When patching in a default stack size for a file system, the
  dos.library init code did not take care of the different units
  the stack size is measured in. It is in LONGs for BCPL style
  handlers, but in BYTEs for C-style handlers. Since the default
  was "512" (whatever unit), this caused very tight limits for
  C-style handlers. This got fixed.
  
Changes for release 47.7 (11.06.2019)

- When mounting handlers, the handler segment is now scanned
  for the magic $STACK cookie, and the stack size is adjusted
  accordingly.

- Recompiled with registerized parameters for string functions.

Changes for release 47.8 (21.06.2019)

- Obsoleted CliInitNewCli() and CliInit(). Both functions end now
  in a dead-end alert as they are no longer implemented. The
  shell startup mechanism depends now solely on CliInitRun().

- The dos.library init code no longer falls back to the legacy
  init method, it requires now system-startup to take over.

- Quite like the previous releases, newshell (or a System() call
  that implements newshell) no longer prints the CLI number of
  the shell that was just created.
  
Changes for release 47.9 (26.06.2019)

- The dos.library startup code no longer mounts the boot point
  mounts from expansion. This is now handed over to system-startup.

- The dos requesters no longer use intuitionbase from the GlobVec
  but open it. This allows easier relocation of Intuition.

Changes for release 47.10 (29.08.2019)

- In case WFPrintf receives an invalid argument to the template,
  it is now substituted by a question mark instead of just
  printing nonsense.

Changes for release 47.11 (01.09.2019)

- The BCPL IO functions were further improved by inlining some
  of the common code for put and get.
  
Changes for release 47.12 (26.09.2019)

- The dos.library Abort handler is now register-transparent and
  returns with the user selected registers and parts of the supervisor
  stack frame into the exec exception handler, which is usually the
  ROMWack.

Changes for release 47.13 (29.09.2019)

- The maximum size of the stack frame to be copied in case of an
  exception is now 256 bytes for unknown or corrupt stack frames.

- Invalid task names are now printed as <NULL>.

Changes for release 47.14 (09.10.2019)

- Mounting a BCPL-style handler (there are not many left, though)
  leaked 20 bytes of memory when the handler exited as the emulated
  BCPL library forgot to add the memory of the seglist to the list
  of allocated task memory.

Changes for release 47.15 (27.10.2019)

- Extended the ExtendedCommandLineInterface structure by a back
  pointer to ease identification.

Changes for release 47.16 (13.11.2019)

- Recompiled for the longer ExtendedCommandLineInterface.

Changes for release 47.17 (26.11.2019)

- The object code(sic!) that is used by Lock() and many
  other LVOs ensures now long-word alignment of its stack.

- Removed some dead code and obsolete files from the source.

- Extended ReadArgs() to make use of the new function.

- Added the DoShellMethod() function to request functionality
  from the shell such as to perform TAB expansion.
  
Changes for release 47.18 (1.12.2019)

- Enlarged the eCLI structure again to make it a bit more
  extensible.

Changes for release 47.19 (22.12.2019)

- SetVar() clears now the e protection bit of the variable
  it set.

- In case a variable path included //, SetVar() would have
  run into an endless loop and the ultimately crashes due
  to running out of stack.

Changes for release 47.20 (28.12.2019)

- Added tags SYS_InName, SYS_CmdName and SYS_OutName to System()
  to open a stream in the context of the shell and not in the
  context of the caller.

- System() could still leak resources in case it opened one of its
  streams itself but a later stream open failed.

- When deleting an environment variable, the dos.library leaves now
  an unreadable dummy file in ENV: behind, such that RAM: does not
  attempt to replace it from a saved copy from ENVARC: again. The
  shell primitives $?var and $var work correctly with this construction.
  In how far shell scripts are affected still remains to be seen.

- Improved the autodocs for System() by quite a bit.

Changes for release 47.21 (26.1.2020)

- Failures to read a long word within LoadSeg() and friends did not
  return a usable failure code.
  
Changes for release 47.22 (22.12.2020)

- Added an experimental buffered implemention of the *Printf family of
  functions, which is significantly faster. It is not enabled by default,
  but will replace the original implementation if the preprocessor symbol
  USE_BUFFERED_PRINTF is defined in bcplio.c and io.asm and both files are
  recompiled.

  Code size cost is 12B.
 
  Some A3000 030@25Mhz benchmarks where plain strings are printed to NIL:
  - Iter:         Number of iterations of the test
  - Len:          Length of the string used as input to the function
  - Printf:       Runtime for original Printf() in seconds
  - PrintBuf:     Runtime for buffered Printf() in seconds
  - RawDoFmt:     Runtime for underlaying RawDoFmt()
  - Printf-RDF:   Runtime minus RawDoFmt() runtime for original Printf()
  - PrintBuf-RDF: Runtime minus RawDoFmt() runtime for buffered Printf()
  - Ratio:        Ratio between original and buffered Printf(), using
                  Printf-RDF/PrintBuf-RDF.
 
    Iter  Len  Printf  PrintBuf  RawDoFmt  Printf-RDF  PrintBuf-RDF  Ratio
     160  625   3.312     1.661     1.049       2.263         0.612  3.697
     800  125   3.524     1.829     1.248       2.276         0.581  3.917
    4000   25   4.497     2.880     2.048       2.449         0.832  2.943
   20000    5   9.649     8.067     6.237       3.412         1.830  1.864
  100000    1  35.430    34.545    27.050       8.380         7.495  1.118

Changes for release 47.23 (2.1.2021)

- Permanently enabled the buffered implemention of the *Printf family of
  functions.
