Hamilton C shell(tm) for Windows NT(tm)  Release Notes 2.2.a
Copyright (c) 1989-1993 by Hamilton Laboratories.  All rights reserved.


Change Summary

The basic release history for the C shell has been:

   Dec 1988    1.0   First release, running on OS/2 1.0.
   Jan 1989    1.01  Cleanup and final release for OS/2 1.0.
   Feb 1989    1.02  First release for OS/2 1.1 (Presentation Manager).
   Mar 1989    1.03  Cleanup and base release for OS/2 1.1.
   Aug 1989    1.04  Command line editing and filename and command
                     completion added.
   Mar 1990    1.05  Support for OS/2 1.2, HPFS and long filenames added
                     along with many important utilities including grep,
                     diff, head, tail, sed, etc.
   Feb 1991    1.06  Support for user-defined screen colors, inheritable
                     local variables, higher performance, etc.
   Jul 1992    2.0   First release from a unified codebase supporting
                     OS/2 and Windows NT.
   Apr 1993    2.1   Support for Berkeley mode scripts, better error
                     diagnostics, support for Windows NT March beta.
   Sep 1993    2.2   Complete rebuild for Windows NT final release.
                     Support for starting Win3.x apps seamlessly from
                     the command line under OS/2 2.x.  Addition of the
                     cron utility.

Along the way, Hamilton C shell has grown from about 35,000 lines of C
to over 105,000 lines.  All of it has been created from scratch by
Hamilton Laboratories.  Not one line was ported from or written on anything
but OS/2 or Windows NT.

This document will contain a detailed summary of all the changes made
along the way from one release to another, beginning with the initial 2.0
release for NT.  Changes which only affect certain builds (e.g., OS/2) are
so indicated.

Changes are presented chronologically, so if you're updating from a previous
release, you'll want to jump in somewhere in the middle to start reading.

At the very end of this document is a short list of the known bugs and
limitations.  You'll also find contact information in case you encounter a
problem or have a suggestion.


Fix Level 2.0 Changes:

1.  First release from a new unified codebase from which both OS/2
    and Windows NT versions can be built.

2.  The shell and all the utilities have been fixed so they no longer
    routinely translate a filename to lower case before trying to open it.
    That didn't work in situations with an NFS network connection to a UNIX
    system with case-sensitive filenames.


Fix Level 2.0.a Changes:

3.  [OS/2] The 2.0 version of ls wasn't adding up the allocated sizes of
    directories properly when using the -Lw options.  It does now.


Fix Level 2.0.b Changes:

4.  [OS/2] The C shell can now be run when escaping to the command line from
    the OS/2 1.x and 2.0 installation disks.

5.  [NT/MIPS] Final cleanup on the C shell codebase to make it portable to
    the MIPS RISC processor under NT.

6.  [NT] Trying to run a .bat or .cmd file started cmd.exe, but didn't
    actually run the script.  It does now.

7.  [NT/x86]  A codegen error in the compiler caused :s/.../.../ operations
    to trash the heap, causing the C shell to crash randomly.

8.  [NT] A minor bug in the common routines used to read number pad
    keystrokes was fixed.

9.  [NT] A number of bugs in tar.exe that caused it problems opening new
    tar files and setting or reporting timestamps on files extracted from or
    listed in a tar file were fixed.

10. [NT] More no longer fails with a complaint that it can't scroll or
    fill the console if, e.g., you go to the end of a file, page down and
    then search backward for text that's not found.  The console api's were
    erroneously reporting failures when in fact they worked fine.


Fix Level 2.0.c Changes:

11. [NT] The common screen painting library used by the shell and a number of
    the utilities would sometimes set the cursor incorrectly if scrolling was
    involved.  It should now be correct.

12. [NT] cut.exe couldn't read files specified on the command line.  It can
    now.

13. The di (diff interative) alias for diff -b! (merged diff using color,
    ignoring white space differences) has been added to startup.csh and the
    definition for the mi (more interactive) alias has been fixed for NT.

14. [NT] ver.csh was added to the bin directory.

15. [NT] The common keyboard routines now recognize ctrl-H as the same as a
    backspace and ctrl-[ as an escape.


Fix Level 2.0.d Changes:

16. A long-standing bug in the shell's command line editing routines that
    could cause the screen to be painted incorrectly has been corrected.

17. [NT] A bug in the common seek logic used in tar, tail, and xd caused them
    to have problems reading files that came in over a pipe on stdin.  That
    problem has been fixed.  binedit, more, sed and tee used the same logic
    and were recompiled even though they were unaffected.

18. A long-standing, but usually benign bug in the more filter's ISAM
    mechanism was fixed.

19. The shell no longer complains under NT nor fails under OS/2 if one tries
    to edit a history reference (e.g., with !!:s/X/Y/) that's > 64K.

20. [OS/2] dskwrite now properly detects and autoformats any unformatted
    disks it's given as disks 2 or following when using dskwrite -ac.

21. The sizeof sample script has been improved to run a bit faster and to
    avoid problems running out of memory in the C shell if a big directory
    is being measured.


Fix Level 2.0.e Changes:

22. [NT] The common keyboard routines have been fixed to silently gobble up
    CapsLock keystrokes.  They were being passed through to the application.
    The shell, mv, cp, rm and more were affected.

23. [NT] The help screens for label, more and tar and for the internal
    commands hashstat, kill and ps have been edited to replace references
    to OS/2 with NT.

24. eval -h now indicates "success" as its return value.  (It no longer
    causes a loop to exit.)

25. [NT] The C shell no longer litters the output generated by the setenv
    command with current directory variables such as "=C:".  Also, it now
    correctly reads all current directories out of the environment at
    startup.

26. [NT] The C shell now properly treats environmental variable names as
    case-insensitive.  (They're still case sensitive under OS/2.)  The set,
    unset and @ statements are case-sensitive (that's so you can still create
    shell variables that differ from environmental variables only by case)
    but the setenv and unsetenv statements and $var and other variable
    references first try case-sensitive, then case-insensitive variable
    lookups.


Fix Level 2.0.f Changes:

27. [NT] The NT version of the C shell can now determine, just as the OS/2
    version can, whether a child will run in the same or a different window.
    If it's a different window, the shell immediately prompts for a new
    command.

28. [NT] hlabel.exe now includes a warning in the help screen that setting the
    volume label is disabled under NT due to a kernel limitation.  Also, it
    properly gives an error message if you type "label a:foo".


Fix Level 2.0.g Changes:

29. [NT/x86] rm -x was broken in the 2.0.e build when we switched to the July
    SDK compiler; the optimizer generated bad code that we didn't spot.
    Rebuilding with optimization turned off with pragmas fixed the problem.


Fix Level 2.0.h Changes:

30. All the utilities have been cleaned up in preparation for the 32-bit
    release for OS/2 2.0.

31. binedit, chmod, dim, fgrep and head no longer routinely translate
    filenames to lower case, thus avoiding any problems with mixed-case
    filesystems.

32. [OS/2] more no longer has problems forward or backward searching across
    more than 32,000 lines.

33. When moreh [OS/2] or hmore [NT] recognizes that it's reading from a
    file, meaning it can use seeks to re-read any data it discards, it
    now buffers only a 100K window into the file.  That reduces swapping
    under OS/2 and dramatically improves heap performance under NT without
    sacrificing functionality.

34. [NT] The C shell now correctly recognizes that it must wait for DOS apps
    to complete before prompting for another command.

35. [NT] The C shell now responds to Close events from the pull-down on its
    window.


Fix Level 2.0.i Changes:

36. [OS/2] markexe now understands how to mark 32-bit 2.0 applications.

37. The ts.csh script was broken when quoting rules inside a backquoted
    string were changed at release 1.06 but went unnoticed until now.
    The fix was to delete the now superfluous escaped single quotes.

38. If filename completion matched a file with a ! in the name, it wouldn't
    always escape it.  Sometimes it'd just single quote it, causing it to
    be mistaken for a history reference.

39. des had a couple bugs.  Under NT, it would often fail with a divide by
    zero due to improper initialization.  And under both NT and OS/2, it
    didn't handle EOF if data was being read from stdin properly.  Both
    problems have been fixed.


Fix Level 2.0.j Changes:

40. [OS/2] Since there's no .. entry in the root of a FAT drive, cd .. there
    wouldn't work.  Instead, the C shell would try cd'ing to one of the CDPATH
    directories.  It now does the right thing.


Fix Level 2.0.k Changes:

41. [OS/2] The change to markexe at 2.0.i broke it, causing markexe to garble
    the .exe header.  It now works as it should.


Fix Level 2.0.L Changes:

42. [NT] Complete rebuild of everything for the October Beta version of NT.

43. [NT] Background children are now protected from ^C in a console window
    using the new CREATE_NEW_PROCESS_GROUP option to the CreateProcess api.
    Also, the kill command now uses, by default, the new GenerateConsole-
    CtrlEvent api call to send a ^Break to a child.  The advantage is that
    if the child is willing to accept it, links to any DLL's are closed
    properly.

44. [NT] Support for the new shutdown and logoff signal events has been
    added, allowing copies of the C shell to automatically exit when
    shutdown or logoff is selected from the Program Manager.

45. [NT] Support for the new LocalTime notion has been added to the date
    and ls utilities.

46. Additional work has been done on all the utilities and the shell in
    particular to prepare for a full 32-bit OS/2 2.0 release from one common
    source base.

47. [NT] The -s option to fgrep and grep didn't work.  It does now.

48. [OS/2] A number of bad semaphore races were inadvertently introduced
    when support for NT was added at release 2.0.  Apparently, they never
    caused problems (none were ever reported) but, in any event, they are
    fixed now.


Fix Level 2.0.m Changes:

49. [NT] The built-in sleep command no longer forgets to close its open
    thread handle.  Previously, after running sleep roughly 5000 times, it'd
    fail, claiming it couldn't start a new thread.

50. [NT] The -i (interactive) option for mv, cp and rm now works.

51. [NT] Minor changes were made to the shell to prepare it for the DEC
    Alpha version of NT.

52. [NT] Support for LocalTime has been added to the touch utility.

53. [NT] The NTVersion (NT Build number) and WinVersion built-in variables
    have been added and used in the ver.csh script.

54. A new -u (unbuffered) option has been added to the C shell to allow
    it to be used over a communications line.

55. First release of a demo version of the shell and all its utilities.


Fix Level 2.0.n Changes:

56. [NT] Split was broken.  It works now.


Fix Level 2.0.o Changes:

57. [NT] If an ordinary foreground child process was started, wait would not
    work; it'd think the child never completed.  It works now.

58. [NT] ^C now properly kills nested C shell scripts.  Previously, ^C only
    worked if it happened to come in while the top-most level was running.

59. [NT] The shell could trap in certain situations, usually involving labels.
    For example, the one-line script, "foo: echo hello", would trap.  It
    works now.

60. [NT] If the current directory on the current drive was changed in a
    script or other thread, the shell wouldn't properly set it back for child
    processes created from other threads.  That's been fixed.

61. The w option to a search/replace operation in sed was broken.  It's now
    working.

62. [NT] The w command to sed didn't know how to open a file that didn't
    already exist.  It does now.

63. [NT/MIPS] The search/replace command to sed often failed due to datatype
    misalignment in the compiled sed script.  That's been fixed.

64. [NT] The shell now issues an error message if an attempt is made to pass
    a command line longer than 32,282 characters (the limit for the NT
    CreateProcess call) to a child.

65. The fullpath function now knows not to let .. segments back up over the
    system or resource names in a UNC (network) name.  Also, the driveno
    function now reports an error if its argument has an invalid drive
    specification or is a UNC name.

66. The shell now runs logout.csh scripts properly.  A primordial bug caused
    it to issue a prompt if it found a logout.csh script (it shouldn't have)
    and run just the first statement.

67. [NT] Erroneous statements like "cat >" (i/o redirection with no filename
    following) no longer cause the shell to crash.  (Actually, this bug has
    been in the OS/2 version all along also but just didn't happen to cause
    problems.)

68. [NT] File sharing or other errors that prevented a file from being copied
    are now reported by cp and mv.  Previously, the copy would fail, but
    there'd be no warning.


Fix Level 2.0.p Changes:

69. Rerunning a statement that set any of the colors variables to a literal
    (e.g., "for i = 1 to 10 do setenv COLORS = black on white; end") used to
    cause a trap.  It works now.

70. Escape characters in a substitution containing command or variable
    subsitutions that were edited to produce more than one word were not
    correctly processed.  E.g.,

         echo "`echo a b`:s/a/A/^""

    produced:

         A b^"

    It should have produced (as it does now):

         A b"

71. A long-standing, but only recently reported bug that could cause traps
    and assert failures doing a cd +c to a subdirectory on another drive
    has been found and corrected.

72. unset'ing or unsetenv'ing a non-existent variable is no longer treated
    as an error.

73. [NT/Alpha] First release with support for the DEC Alpha processor.

74. [OS/2 2.0] First build with complete, working, debugged support for
    use of 32-bit code and the 32-bit API's under OS/2 2.0.

75. [NT] The SHELL variable, if wasn't already defined in the inherited
    environment, would be set to the pathname of the C shell, but with the
    last character dropped.  This has been fixed.

76. ls.exe now accepts a -q (quiet) option, telling ls not to complain
    about non-existent files.  Also, it's more consistent when it does
    complain.  (Previously, it would not complain if it was asked to look
    for an "impossible" name, e.g., a long filename on a FAT drive.)  ls
    also now looks for an LSOPTIONS environmental variable.

77. sed will now ignore Ctrl-Z characters between statements in a script.
    This change lets it process scripts created with editors that insist
    on pasting a Ctrl-Z (EOF) character onto the end of the files they
    produce.

78. [NT] The help alias has been deleted from startup.csh.  It really
    applied only to OS/2.

79. [NT] The cl.csh (compile and link) and makecpgm.csh (make all the C
    programs) scripts have been added to the samples directory along with
    a sample skip file containing fragments of lines that should be skipped in
    the compiler/linker output.


Fix Level 2.0.q Changes:

80. [NT & OS/2 2.0] A very minor performance improvement was made, eliminating
    some unnecessary checks for stack overflow.  (The check was superfluous
    because under NT and 2.0, the system grows the stack automatically as
    needed anyway.)

81. The popup that appears if an internal assertion fails in the C shell
    now goes away, showing what was underneath it, when you press a keystroke.


Fix Level 2.0.r Changes:

82. Minor fixups were done to the C shell, patchlnk, dskread, dskwrite,
    markexe and setrows to allow demo versions to be built for OS/2.

83. The cookie passed to demo versions of the utilities now expires
    more slowly.  Previously, the cookie expired too fast to allow the
    utilities demos to be run reliably from a CD-ROM.

84. [NT] A typo in the kill -h help screen was corrected.

85. [NT/x86] A compiler optimization bug in rm, mv, and cp that affected
    recursive operations against directories has been fixed by turning off
    certain optimizations where the problem occurred.

86. [NT] pwd now exits with a correct return code of 0 if it's successful.
    Also, it now reports an error if asked for the current directory on an
    invalid drive.


Fix Level 2.0.s Changes:

87. [NT] ps was incorrectly reporting running threads as zombies and zombies
    (threads that had ended but which hadn't been cleaned up yet) as running.
    That's been fixed.


Fix Level 2.0.t Changes:

88. [NT] touch didn't properly recognize 4-digit year numbers.  It does now.

89. [NT] ls and pwd didn't properly interpret the MIXEDCASEDRIVES variable
    (off-by-one error).  Also, the shell and pwd didn't show current
    directories in the right case on mixed case drives.

90. [NT] The cl.csh script in samples directory didn't work properly with the
    DEC Alpha compiler; it does now.  Also, it's been enhanced to look for the
    skip file in the same directory with the cl.csh script.

91. [NT] If a child of the C shell changed the console mode (e.g., disabling
    processed input, thus turning off Ctrl-C processing) but didn't reset
    things before exiting, it could affect the shell.  That's been fixed; now
    the C shell resets the console mode every time it prompts for a new
    command from the keyboard.


Fix Level 2.0.u Changes:

92. [NT] The C shell now ensures that the drive letters passed to the NT
    kernel for the current directories are always upper case.  Lower case
    drive letters have been found to be a problem when spawning POSIX
    children.


Fix Level 2.0.v Changes:

93. The C shell now supports command and variable substitution in <<-style
    inline i/o ("here" documents).  Quoting (with single, double or back
    quotes) or escaping any part of the word immediately following the <<
    operator suppresses the substitutions.

94. Error reporting is now substantially improved.  Messages will now show
    the line number of the statement that failed, not where it was called
    from even if it was inside a user-defined procedure.  Also, by default,
    the shell will print out a complete trace of the call stack showing
    arguments passed to procedures, scripts, eval statements, etc., all the
    way down the stack.  (To suppress call stack dumps, invoke the C shell
    with the new -t option.)

95. A new mode that provides more strict compatibility with the original
    BSD C shell has been added.  Triggered by trying to run a script that
    starts with #!/bin/csh or if the shell is invoked with the new -B
    option, the C shell will attempt to process statements in a more fully
    Berkeley-compatible fashion.  (Scripts that do not start with #!/bin/csh
    will still be processed according to Hamilton C shell rules, even if
    the -B option is used to request Berkeley compatibility interactively.)
    In BSD compatibility mode:

   a. The status variable will reflect the return code from the rightmost
      stage of a pipeline.  The tailstatus variable will be ignored.
   b. All the shell variables will be snapshotted and all new variables
      made local to the thread.
   c. Berkeley-style $var[...] indexing notation will be used, where the
      indexing is by word selection operators (like the :-editing operators)
      rather than by expression.
   d. All variable arrays (except argv) will start with element 1.
      Accessing element 0 will give a null.
   e. $0 or $argv[0] will be the scriptname.  $argv will be the rest of the
      argument vector.  The bsdargv variable will be ignored.
   f. The # character will not need to be followed by white space to be
      considered the start of a comment.
   g. The patterns in a case test (inside a switch) will be strings and need
      not be quoted, rather than arbitrary expressions.  Also, the switch
      value is evaluated as a wordlist which may contain variable or command
      substitutions and wildcards and then rendered as a string.
   h. endif and endsw will be predefined aliases for end (but only when
      closing an if or switch, respectively).  breaksw will be a pre-defined
      alias for break.
   i. "set foo" and "setenv foo" will set foo to a null string, not dump
      its value.
   j. / and /= will perform integer division.
   k. The right operand of the =~ and !~ pattern matching operators will be
      taken as a word which may contain wildcards.
   l. In an expression, a variable must be preceded by $.  If it doesn't, it'll
      be taken as a literal string.

    The changes should allow most scripts to run without problems.  However,
    there will still be a few differences:

   a. The escape character will still be controlled by the escapesym
      variable (shared across all threads), which defaults to ^, not \.
   b. Environmental variables will still be shared.  Changing them in a
      script will change them as seen by the parent.
   c. The special meaning of several break statements on one line will
      not be supported.
   d. unset and unsetenv still do not accept patterns.
   e. The following commands are not supported: bg, exec, fg, glob, jobs,
      limit, nice (but eval gives similar functionality), nohup, notify,
      stop, suspend, unlimit and %job.
   f. History references inside alias definitions will still not be
      supported.
   g. The (...) construct will isolate only the current directory, not all
      variables and other state information.

96. Running a statement in the background using the & flag at the end of the
    line will cause a new "job ID" number rather than a thread ID to be
    printed.  Any threads, processes or screens spawned by that thread will
    inherit that same job ID.  The job ID can be passed to the kill command
    to kill everything associated with that background job.  Also, the ps
    command has been enhanced to show job ID numbers.

97. $* is now supported as an alias for $argv.


Fix Level 2.0.w Changes:

98. A number of minor problems associated with supporting substitutions
    inside <<-style inline i/o documents were fixed:  a) If there was a syntax
    error, the prompt would not be properly reset to prompt1.  b) Single and
    double quotes should have been treated as ordinary characters in inline
    i/o.  (To quote something, only the escape character can be used.)
    c) Any line containing a substitution caused a blank line to be added
    to the history list.  d) If a substitution was at the end of a line, an
    extra space was erroneously added.

99. [NT] The sleep command left a thread entry lying around in the threads
    list after it had already exited.  It's now properly cleaned up.

100. Filename completion with ^F did not quote special characters if there was
    only a partial match.  It does now.

101. Doing a "sed '#'" caused a segment fault.  It now works.


Fix Level 2.0.x Changes:

102. [NT] rm didn't work on read-only directories even with -f or -x.  It
    does now.

103. The more -t option for setting tabstops from the command line didn't
    work.  It does now.

104. diff, uniq, cut, fgrep, grep and sed shared a common i/o buffering
    routine that had a bug that could cause them to crash or produce
    erroneous results on files with line ends other than \r\n.  That's
    been fixed.


Fix Level 2.0.y Changes:

105. There was a bug in the Berkeley compatibility mode introduced at 2.0.v
    that would cause the shell to hang if a #!/bin/csh script that contained
    any set statements was run more than once.  That's been fixed.


Fix Level 2.0.z Changes:

106. Calling the abs() built-in function without an argument caused the shell
    to crash.  It now gives an error message as it should.


Fix Level 2.0.27 Changes:

107. The changes made at 2.0.v to provide call stack dumps caused line
    numbers not to be shown in parser error messages when compiling scripts.
    That's been fixed.

108. The -I, +I, -O and +O command line options have been added to the C shell
    to allow insert mode to be customized.  Type "csh -h" for more info.

109. [NT] mv didn't properly move read-only files across disk partitions.  It'd
    make a copy, then complain it didn't have proper access.  It works now.


Fix Level 2.1 Changes:

110. [NT] First complete rebuild for the March beta.

111. [NT] tar now knows that NT keeps track of timezone information.  The TZ
    variable and the -g and -G options are no longer used.

112. [NT] The shell is dramatically faster, especially at inserting into long
    command lines and compiling scripts on the DEC Alpha and MIPS R4x00.

113. The -b option has been added to the C shell to turn off Berkeley mode
    even on scripts that start with #!/bin/csh.

114. Error messages from the C shell should now all be properly displaying line
    numbers where appropriate.

115. A bug that potentially could have (but was never reported to have) caused
    the shell's unproc and unalias commands to crash was fixed.

116. [NT] The cl.csh script in the samples directory has been updated for
    the March NT beta and now knows about the hybrid compilers on the MIPS
    and Alpha machines.  Use -old to get the old compilers.

117. [NT] hlabel.exe can now set the label on a volume.  (There was no Win32
    API to support this under the October Beta.)

118. [NT] The C shell -Z option now works.  (Previously, it was ignored under
    NT because there was no support for it under the October Beta Win32.)

119. [NT] The rm.exe command has been renamed hrm.exe and an "alias rm hrm"
    command added to the default startup.csh script to avoid conflicts with
    the brain-dead Microsoft rm.exe command supplied with the NT SDK.

120. [OS/2 2.0] Inexplicably, DOS VDM applications were being started in
    invisible windows.  Accessing them required typing Ctrl-Esc.  They're
    now properly started in visible windows.


Fix Level 2.1.a Changes:

121. [NT] Touch, mv, cp and tar now know how to set the timestamps on
    directories.

122. csh -XC now looks for a command immediately following the "C".  It no
    longer tries to parse any remaining characters in that word as option
    characters and no longer requires the command to start in the next word.


Fix Level 2.1.b Changes:

123. [NT] Hlabel would only change the label on the current drive.  It works
    properly now.

124. The C shell didn't properly handle $i[$j] and $i[$k[^]] references in
    Berkeley compatibility mode.  That's been fixed.

125. Set variables weren't always inherited by child threads in Berkeley mode.
    For example,

       % set i = 1; echo `echo $i`

    didn't work.  It does now.


Fix Level 2.1.c Changes:

126. In Berkeley mode, double quoted substitutions involving $0 could fail.
    E.g.,

      % echo "$0 a"

    caused the shell to crash.  It works now.

127. The Berkeley C shell would accept case clauses that didn't have colons
    following the test and those with quotes around the pattern.  This wasn't
    the documented behavior but some users did write scripts that depended on
    it so Hamilton C shell now allows that also in Berkeley mode.

128. for i = 1 to 1 by -1; echo $i; end would loop thru 1, 0, -1, -2, -3, etc.,
    rather than exiting after the first iteration.  That's fixed now.


Fix Level 2.1.d Changes:

129. [NT] Trying to set path[i] garbled the global variables lock.  That
    statement would appear to work, but, e.g., trying then to do a setenv
    would hang and eventually crash.  That's been fixed.

130. In Berkeley mode, other indexed variable references such as @ i[$j]++
    didn't index properly.  They do now.

131. [NT] The cl.csh script in the samples directory didn't properly work
    with -O options.  It does now.


Fix Level 2.1.e Changes:

132. [NT] The dskwrite and dskread utilities have (finally!) been added.

133. [NT/x86] Tar no longer fails when it tries watching for binary files and
    automatically turning off \n to \r\n conversions.  (This was actually a bug
    in all versions of tar; for some reason, it just didn't manifest itself
    except in the NT/x86 version.)


Fix Level 2.1.f Changes:

134. [NT] A bug in NT's DOS subsystem caused DOS apps started from the C shell
    to think they were running in the wrong current directory.  E.g.,

      1 C% cd \tmp
      2 C% dosapp
      3 C% cd ..
      4 C% dosapp <-- Still thought it was in \tmp

    This build contains a workaround for the problem.

135. In Berkeley compatibility mode, the C shell no longer tokenizes #
    separately to recognize comments. Thus, where previously

      echo `echo '#r'`

    produced "# r", it now properly produces "#r".


Fix Level 2.1.g Changes:

136. dskread and dskwrite didn't properly handle missing ordinates, e.g.,
    (35,,) or ranges that weren't closed, e.g., (50,0,0)-.  It works now.

137. [NT] dskwrite didn't work at all writing an entire disk.  It does now.

138. [NT] ls no longer generates a spurious "'*.*' does not exist" message
    when listing a blank formatted diskette.  Also, it now does give a
    message when listing an unformatted diskette.


Fix Level 2.1.h Changes:

139. Changes made to support stack tracing caused the shell to crash if the
    prompt was set to something involving command substitution.  That's fixed.

140. In certain cases, the diagnostics would indicate an error at line 1 when
    it should have said something else.  That's been fixed.

141. The C shell's -I option didn't work.  It does now.

142. [NT/Alpha] Expressions such as i += 1, where i is an integer, were
    incorrectly producing a floating point result due to a compiler
    optimization error.  In this build, optimization has been turned off
    for the relevant module to ensure correct results.

143. [NT/Alpha] du didn't correctly report the total space on a drive.
    This build contains a workaround.

144. [NT] dskwrite -F crashed.  It works now.

145. [NT/Alpha] dskread and dskwrite would frequently fail, complaining they
    couldn't read the drive parameters, if the diskette drive had not
    previously been accessed.  Rerunning dskread or dskwrite would work.
    This has been traced to a bug in the Alpha/NT system; the current build
    contains a workaround to ensure correct results.

146. [NT] It's now possible to redirect stdout to a device such as \\.\a: or
    \\.\tape0.


Fix Level 2.1.i Changes:

147. tar complained about archives created on UNIX SVR4.  The SVR4 tar writes
    all octal fields in the header as null-terminated strings, contrary to
    spec as defined in the BSD 4.3 Programmer's Manual which says that many
    of the fields should be terminated with space + null and others not
    terminated at all.  Hamilton tar now knows to accept this variant format
    without complaint.  Also, when tar extracts files, it now sets the archive
    bit on the newly-extracted files.

148. mv and cp now retain the case of any filenames they move.  Previously,
    if one typed "mv foo ..", the resulting file would be in whatever case
    was typed, not what it had been stored as previously.

149. [NT/Alpha] Expressions like 2**10 resulted in floating point results
    (albeit correct ones) when they should have produced integer results.
    This build contains a workaround.

150. [NT] winerror.c and winerror.exe were added to the samples directory
    and the help proc definition were added to startup.csh.  This gives a
    convenient means of getting the Win32 error message corresponding to a
    return code.

151. [NT] The source command should have tried pasting a .csh extension onto
    the filename if the name as specified didn't exist.  It does now.

152. Command substitution now processes certain unquoted escape sequences in
    the backquoted string before parsing it.  This ensures, e.g., that the
    following will work, producing "1 2 3 4 5":

      echo `for i = 1 to 5 do ^
      echo $i ^
      end`

153. If callstack reporting was turned off with csh -t, there was a possibility
    (never reported) that the shell could crash following stack pops.  That's
    been fixed.

154. The shell now generates callstack reports for scripts read with the
    source command and now reports the correct linenumber if a syntax error
    is encountered inside the sourced script.

155. [NT/Alpha] strings was broken due to a bug in the Alpha compiler.  This
    build contains a workaround.

156. [NT] International keyboard keying conventions (e.g., ALT + 8 to create
    the "[" character on a German keyboard) should now be working.  This
    change affects the C shell, mv, cp, rm, more and des.


Fix Level 2.1.j Changes:

157. [NT/x86] diff had two problems with binary files:  a bug in the code that
    automatically detected binary data could cause diff to crash.  Also, a
    compiler optimization bug caused diff to claim there were differences in
    binary files that were in reality exactly the same.  This build fixes
    both those problems.


Fix Level 2.1.k Changes:

158. [NT] The change made at 2.1.i for international keyboards ended up
    breaking support for Ctrl + other keys such as Enter or [.  That's now
    fixed, affecting the C shell, mv, cp, rm, more and des.

159.  Startup.csh changed to show how users might customize it to have operands
    to dir wildcarded by the C shell or by cmd.exe itself.

160. [NT] The cl.csh script in the samples directory now accepts the CPU
    variable values typed in mixed case.

161. [NT] The C shell no longer hangs if you attempt to kill a child Win3.x
    app and then do a ps.  (But you still can't kill the Win3.x children,
    apparently due to a bug in NT.)

162. [NT] The C shell now places =X:-style current directory variables into
    the environment for all valid drives at startup, even for drives for
    which the current directory is the root.  This is to work around an
    apparent problem in the VDMs under NT on the RISC machines.


Fix Level 2.1.L Changes:

163. The changes made to support the -B (Berkeley compatability) option
    broke the use of the bsdargv variable and could cause the shell to
    crash.  bsdargv is more-or-less obsolete now, but it certainly shouldn't
    cause a crash; it's been fixed in this build.

164. The startup.csh file has been fixed so that the alias/proc mechanisms
    used to intercept copy, xcopy, etc., will still work if the shell is
    invoked with -B.  (The problem was with the @ s = nowild statements in
    the aliases.   In Berkeley mode, a $ was needed to make a valid
    expression.)


Fix Level 2.1.m Changes:

165. The changes made to support the -B (Berkeley compatability) option
    introduced a bug in indexed variable evaluations done in the prompt1
    and prompt2 variables.  Also, some never reported but latent bugs in
    iterated statements containing indexed variable references were fixed.


Fix Level 2.1.n Changes:

166. Yet another UNIX tar was discovered that formatted octal fields in
    the headers slightly differently than the spec required, causing our
    tar to reject the file.   This release contains a fix to cause tar to
    accept virtually anything that looks like a plausible octal number.

167. Filename expansion now knows to quote or escape any { or } characters
    in any files it matches.


Fix Level 2.1.o Changes:

168. [NT] The C shell now knows to ignore nonsensical Ctrl-<key> combinations.
    Previously, these keystrokes could cause the C shell to get confused about
    the cursor position.

169. [NT/Alpha] Problems with expressions for which workarounds were added
    at 2.1.h and 2.1.i have finally been tracked down to a legitimate coding
    bug in the long precision math routines for the Alpha.  It's corrected
    in this build.


Fix Level 2.1.p Changes:

170. sed no longer allows "." to match either CarriageReturn or NewLine.  This
    ensures that

         echo abc | sed 's/./& /g'

    sensibly produces "a b c \r\n", not "a b c \r \n ".

171. Typing a few characters onto the command line, pressing Escape and then
    End caused the C shell to put the cursor in the leftmost column in the
    window rather than, as it should have, in the column following the prompt.
    That's been fixed.

172. [NT] The cl.csh script now knows how to handle C++ files with .cpp
    or .cxx extensions, resources in .rc, .res or .rbj files, and create
    either console (default or -console) or graphical (-GUI) applications.

173. [NT/x86] The args.exe, dumpenv.exe, myecho.exe and rcode.exe files in
    the samples directory had never been rebuilt since the October beta.
    They worked on the March beta but not the later builds.  They have
    now been rebuilt.


Fix Level 2.1.q Changes:

174. [OS/2] The startwin.exe utility has been added.  This is a tiny PM
    program that can be used to start Win3.x apps seamlessly on the desktop 
    under OS/2 2.x.  It's automatically invoked by the C shell if you type
    the name of a Win3.x app when running under OS/2 2.x.  For more info,
    type "startwin -h".

175. The C shell now intercepts the situation where a PM child under OS/2
    or a non-console app under NT is being run and stdout or stderr is tied
    to the C shell's console window.  Since console handles aren't inheritable
    in these cases, the C shell will instead pass a handle to the input end
    of a pipe and start a new background thread to copy anything written into
    that pipe onto the screen.  This lets ordinary printf's be used in PM
    or Win32 GUI apps without losing the output.

176. In Berkeley mode, the C shell no longer does any history expansion inside
    comments.


Fix Level 2.2 Changes:

177. [NT] A complete rebuild of the whole product on the release versions
    of NT on all three platforms.

178. [OS/2] If a child process ended with a hard error or a trap, the
    C shell didn't dump out the call stack.  It does now.

179. The C shell no longer routinely translates the PATH directory names
    to lower case.

180. Processing of special characters inside single- or double-quoted
    strings has been improved slightly.  It's now possible to type, e.g.,

       set prompt1 = '$ansi("bright yellow")$cwd '

181. ls.exe now gives an error message if a UNC name it's given doesn't
    exist.  Previously, the message was generated only for non-existent
    local names.

182. [NT] cl.csh in the samples directory has been updated for the final
    release of NT, which does not use an ntdll.lib.  It now accepts -O...
    optimization options which override the defaults.  When it finds a
    skip file, it sets the shell variable, skip, to the full pathname; that
    allows the ferr alias to work even if cl is called first from its own
    directory and later from another directory.  Also, cl knows that in
    the final release for the Alpha, acc can (finally!) use the INCLUDE
    environment variable; it's no longer necessary to break it up into
    a series of -I options.  Finally, the _MT symbol is now defined.

183. [NT] cp now knows how to set the timestamps on any read-only directories
    it copies.

184. head, tail and tabs had a bug that caused the [ in an ANSI escape
    sequence to be turned into two ['s if it fell on a buffer boundary
    when expanding tabs.

185. The demo.exe supplied with the demo version of the C shell no longer
    uses the existing HOME variable even if it's defined.  That was causing
    problems when HOME pointed to something with different/missing login.csh
    or startup.csh files.  Also, under NT, it now registers a signal handler
    so it won't exit before its child has exited.

186. It's now possible to wildcard drive letters.  E.g.,

         ls *:\*\bin

    now works.  If an * or ? is specified for the drive letter wildcard,
    then the set specified by the DRIVEMASK environmental variable is used.
    If DRIVEMASK has not been set, the drives c: thru z: (as may exist) are
    searched.  To search drives a: and b:, which are usually floppies, you
    must specify them explicitly, e.g., [a-z]:\*\bin.  Also, if the path
    is on one of the MIXEDCASEDRIVES, the entire resulting path will be in
    the correct case.

187. fullpath now puts the resulting pathname into the actual case stored
    in the filesystem if the the path is on one of the MIXEDCASEDRIVES.
    Otherwise, it puts the result into all lower case.

188. ls wouldn't report anything on a UNC drive if invoked with the current
    drive was one of the MIXEDCASEDRIVES.  It works now.  Also, MIXEDCASEDRIVES
    can now accept a list of UNC servers and/or drives following the range
    of drive letters.  For example:

       setenv MIXEDCASEDRIVES = d-f,\\alpha\drive-c,\\beta

    means that drives d: thru f:, drive-c on \\alpha, and all drives on
    \\beta are mixed case.  \\ without a machine name means all UNC names
    should be reported in mixed case.  Individual list items should be
    separated by commas, semicolons or white space.

189. du now complains if you ask for it to report on something other than
    a: thru z:.

190. cp and mv no longer attempt to set the timestamp of an existing directory
    when merging in another directory (e.g., in doing "mv a: .").

191. [NT] cp and mv no longer give a bogus message about not being able to
    query path info about the root directories on diskettes.

192. [OS/2] newer and older failed to compare the seconds component if two
    timestamps matched down to the minutes.  That's fixed.

193. The cron utility has been added.  For help, type "cron -h".

194. The -Y option to suppress the installation of an interrupt handler
    has been added to the C shell.  Under NT, this option is ignored.

195. fgrep -x didn't match lines that didn't happen to cross buffer
    boundaries.  It should now work in all cases.  Also, a minor change
    in the interface to internal get_line routine was made in fgrep, grep,
    and cut.

196. The C shell now accepts empty statement lists in an if/then/else,
    following a default: case in a switch statement or in (...) or
    {...} groups for better compatibility with the Berkely C shell.

197. more didn't properly truncate the filename in the prompt at the bottom
    of the window if the filename was too long.  Under NT, that caused it
    to fail completely.  Under OS/2, it ran, but it couldn't display command
    keystrokes.  All that's fixed.

198. [NT] If dskread/dskwrite is unable to open a drive because of a
    sharing violation, it waits 3 seconds and tries again.  This is to
    allow any writes in the system buffers to get flushed to the drive.


Fix Level 2.2.a Changes:

199. [NT] The mt (mag tape) utility has been added.  Type "mt -h" for help.

200. Tar now ensures that it never writes blocks of less than 512 bytes
    at a time.  That was important for writing to the tape device under NT.

201. [NT] dskread and dskwrite will now sleep up 7 seconds in 100 millisecond
    increments, waiting for a slow diskette to free up rather than a flat,
    all-or-nothing 3 seconds.



Known Bugs and Limitations

1.  The keyboard editing logic only checks to see if the cursor's been moved
    by a background process or thread when it reads the first keystroke.  That
    catches most situations, but if you begin typing a command and then some
    background activity starts writing to the screen or moving the cursor,
    the result can be a scrambled display.

2.  The C shell does not yet understand the special device names like CONIN$
    that NT supports.  The following statement won't work in this build:

      cat < conin$

    (It's not clear this can be made to work; NT seems to have problems
    creating handles to conin$ or conout$ that can be dup'ed and inherited
    by a child process.)

3.  To kill a NT GUI app, the -! option must be used, specifying
    that TerminateProcess should be called.  While certainly effective,
    TerminateProcess does not notify any DLL's that the process is
    exiting.  It's not currently possible to kill a Win3.x app, seemingly
    because of a bug in NT.

4.  Touch'ing a directory on an OS/2 machine over Lan Manager doesn't do
    anything; it works over a network to another NT machine.  This appears to
    be a bug in Lan Manager.

5.  Ctrl-S and Ctrl-Q flow control to the console window is not yet supported.



Thank you for using Hamilton C shell.


                  Douglas A. Hamilton
                  October 4, 1993

                  Hamilton Laboratories
                  13 Old Farm Road
                  Wayland, MA  01778-3117
                  USA

         phone:   508-358-5715
           FAX:   508-358-1113

   BIX Network:   hamilton
    CompuServe:   70034,2025
      MCI Mail:   389-0321
         Telex:   6503890321
      Internet:   3890321@mcimail.com
