Hamilton LaboratoriesHamilton C shell 2012User guide

Release notes

Oregon Coast

Release notes
Previous | Next

These are the complete release notes for the latest build, starting with the very first release 2.0 on Windows in July 1992.

Hamilton C shell(tm) for Windows(R)  Release Notes 5.2.g
Copyright (c) 1989-2017 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.
   Aug 1998    2.3   Full support for #! syntax.

   Jun 2003    3.0   New build for Windows XP and Windows Server 2003
                     using Microsoft Visual Studio .Net 2003 that adds
                     automatic install and uninstall, on-line hypertext
                     documentation and PowerPoint tutorials.  Support
                     for OS/2 and RISC versions of NT is dropped.

   Jun 2009    4.0   New 32-bit and 64-bit builds for Windows 7, Vista
                     and earlier versions of Windows using Microsoft
                     Visual Studio 2008.  New ``...`` line-at-a-time
                     command substitution.

   Jul 2010    4.1   Full Unicode / UTF-8 versions of many of the
                     utilities, an improved su, support for Windows 7
                     elevation and code-signing of the .msi install
                     file and all the .exe files.

   Oct 2011    5.0   Better support for Windows conventions regarding
                     ACLs in mv, cp and chmod.  New splitstring and
                     findinclude samples added.  Much improved su
                     (superuser) utility for Windows 7.

   Aug 2012    5.1   Brand new documentation.

   Sep 2014    5.2   Improved documentation with better navigation,
                     additional topics, including using with Cygwin,
                     and a new random utility.

Along the way, Hamilton C shell has grown from about 35,000 lines of C
to more than 250,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.

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

13. The di (diff interactive) 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

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

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

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

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

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

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

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

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
    substitutions that were edited to produce more than one word were not
    correctly processed.  E.g.,

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


         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

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

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 predefined
      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
   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

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.

      % 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 through 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

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 ^

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 compatibility) 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

Fix Level 2.1.m Changes:

165. The changes made to support the -B (Berkeley compatibility) 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

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: through 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: through 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: through 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 Berkeley 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.

Fix Level 2.2.b Changes:

202. [NT] Changes (mostly just to the makefiles) to support a port to another
    unannounced RISC processor running Windows NT.

203. [NT] strings -v didn't properly display the filenames associated
    with the strings it found.  It works now.

Fix Level 2.2.c Changes:

204. [NT] If the C shell was started with a title bar longer than 127
    characters, it would crash.  That's fixed.

Fix Level 2.2.d Changes:

205. [NT] More minor changes for yet another port to an unannounced RISC
    processor running Windows NT.

206. [NT] mt.exe didn't format error messages properly.  It does now.

207. [NT] touch.exe had an uninitialized variable that caused it to set
    timestamps off by a random number of milliseconds.  That's fixed.

Fix Level 2.2.e Changes:

208. Changes made at release 2.2 related to better support for mixed case
    drives created a bug in the fullpath built-in function which caused a
    number of problems on a mixed case drive:  (a) fullpath("*.*") returned
    "c:\foo\." rather than "c:\foo\*.*", (c) under NT, fullpath opened a
    FindFirstFile directory handle that it would forget to close, making it
    impossible to delete the directory, (d) the shell would claim it
    couldn't find executable files in the current directory, (e) if nohashing
    was set to 2, then the shell wouldn't be able to delete any directory
    which had been a current directory at a time when any external program
    was run.  All these (seemingly different) problems were the result of
    the same 2-line bug, now fixed.

209. Those same changes at 2.2 to support mixed case also involved turning
    all filenames to all lower case on non-mixed case drives in the fullpath
    function and in the filename editing functions (:b, :e, :f, :t).  That
    caused problems for a large customer and has been backed out.

210. [NT] The C shell now uses _beginthread/_endthread to start or exit any
    threads it creates instead of calling CreateThread directly.  Microsoft
    has advised that the C run-time library (including even basic functions
    like malloc) may cause memory leaks if _beginthread isn't used.

211. [NT/Risc machines] tr -s (squeeze option) didn't work.  It does now.

212. [NT] A bug in the common display routines caused ANSI escape sequences
    to be parsed incorrectly if the escape sequence was broken across a
    buffer boundary.  The failure was a very rare event, but it could
    affect lots of utilities.  It's fixed in this build.

213. [NT] xd -w didn't work properly.  It does now.

214. A set of sed scripts have been added to the samples directory for
    converting Bourne/Korn shell scripts into C shell scripts.  Customers have
    reported these sed scripts eliminate about 85% of the work of converting
    shell scripts.

Fix Level 2.2.f Changes:

215. Statements joined with the && conditional execution operator were
    viewed as having failed with an error (causing loops to exit, etc.) if
    the leftpart returned a non-zero return code.  It should not have been
    an error and is now fixed.

Fix Level 2.2.g Changes:

216. If there were any command or variable substitutions inside a <<-style
    "here document", the line number was incorrectly incremented a second
    time.  That's been fixed.

217. Cron has been enhanced to treat blank lines and lines beginning with
    # as comments.  It also now give a warning if the values specified in
    any particular field are not monotonically increasing (to help catch
    mistakes forgetting to use 24-hour times).  Finally, a bug in the
    parsing of the day/date specification fields has been fixed.

218. The C shell has been enhanced to support use of Tab and Shift-Tab for
    file completion.  Repeatedly pressing Tab gives the first and following
    matches, one at a time.  Shift-Tab starts at the end and works backward.
    To disable Tab completion, start the C shell with the -T option.  (You
    may wish to use the CSHOPTIONS variable to do this.)

219. Heapstat figures could become garbled if filename completion was used
    and it resulted in a large number matches.  That's corrected.

220. A dollar sign that's not followed by a valid variable reference is now
    treated as literal text rather than as an error.  That makes it more
    convenient, e.g., to type UNC names such as \\alpha\d$; it's no longer
    necessary to remember to escape the $.

221. A bug in processing of the MixedCaseDrives variable has been fixed.

Fix Level 2.2.h Changes:

222. The Tab completion introduced at 2.2.g had a few bugs:  If there were
    no matches found, the shell crashed.  The original wildcard string was
    garbled if one tabbed all the way through the ring back to the original
    wildcard.  There were some minor memory leaks.  Finally, the help
    information was wrong:  -T _disables_ tab completion.  These problems
    have all been fixed.

223. [NT] The blksize utility has been added to the samples directory.  It
    can be useful for reading/writing tape devices that support only certain

224. [NT] Under certain cases, cp would fail to recognize attempts to copy
    a file over the top of itself and would actually try to do the copy,
    causing the file contents to be lost.  That's fixed.

Fix Level 2.2.i Changes:

225. More work on tab completion:  when tab completion is enabled, a plain
    tab can be typed as Ctrl-Tab.  When -T is specified, tab completion is
    now still available, but as Ctrl-Tab and Shift-Tab.  Also, if the original
    wildcard contained { or }, cycling back to it didn't work right:  the
    { and } characters were escaped; they should have been left alone.
    That's fixed.

226. Aliases now support arguments using the history reference-style syntax
    used by the Berkeley C shell.  If there are no references, any arguments
    are simply pasted on the end of the expansion as before.  For example:

      1 D% alias test echo ^!^* world
      2 D% alias test
      test        echo !* world
      3 D% test hello
      hello world
      4 D% alias test echo hello
      5 D% test world
      hello world

227. Long-form history references now properly support braces around the
    argument.  E.g., "!{!}" is the same as "!!".

228. [NT] "mt -v status" now continues dumping the tape device status even
    if it cannot determine the block number at which the device is positioned.
    Also, some of the status information was garbled; it's now correct.

229. Editing operators may now be used inside the curly braces in a variable
    reference, e.g., ${cwd:h}.  Also, any number of braces may be nested
    around a variable substitution.

230. A memory leak when aliases were unaliased has been fixed.

231. The member.csh script has been added to the samples directory.

232. (...) statement groups and {...} expressions weren't being evaluated
    correctly.  The status code was being discarded.  (That made {...}
    expressions pretty useless.)  That's fixed now.  Also, {...} expressions
    no longer push & pop the directory stack on entry and exit.

Fix Level 2.2.j Changes:

233. Wildcarding and filename completion didn't work with MixedCaseDrives
    set if the pattern contained a ".." or "." level.  That's fixed.

234. Doing Shift-Tab, then Tab skipped over the step of reposting the
    original wildcard string.  That's fixed.

235. The -Z option has been added to rm.exe (hrm.exe under NT) to allow
    a file to be completely overwritten with binary zeros before deletion,
    thus guaranteeing that no one can "undelete" the file later.

236. [NT] The change made to cp at 2.2.h was too conservative and caused
    it to refuse to do some copies that were legitimate, e.g.,
    "cp foo\bar .".  That now works.

237. tar has been dramatically improved.  Over 30% more code was added,
    to provide these new features and improvements:
    a) It now is able to read/write CPIO ascii and binary files and to
       automatically recognize them when it encounters them.
    b) It now knows how to do \r\n -> \n conversions to an archive even
       when it's writing the archive to a pipe or a tape device where seeking
       back to the header to fixup the size field is impossible.  (It now
       uses a prescan of the data if seeking is not going to be possible.)
    c) A new -ff variation on the fullpath option causes tar to write the
       entire pathname specified on the command line (including any drive
       letter and colon) into the archive.  This isn't really legal for
       restoration on a UNIX machine, but it does let you use tar to back
       up more than one drive at a time.
    d) If \'s were typed in filenames given on the command line, tar would
       not convert those to /'s in the archive.  That caused problems for
       restoration on a UNIX machine.  tar now converts all \'s to /'s.
    e) A lot of work was done to directly support tape drives under NT.
       Tape devices can now be opened as an archive file using the name
       \\.\tape0.  It's now possible to specify a blocksize to be used in
       reading/writing the archive.  Also, if tar discovers the archive
       is on a tape device, tar will try to ensure that it's using a
       blocksize that's compatible with the drive and that the drive has
       been properly initialized.
    f) The -v (verbose) option now causes tar to report the format (TAR vs.
       CPIO binary vs. CPIO ASCII) and byte sex was used in the archive.
    g) The -b (bytesex) option didn't work.  It does now.
    h) If a file being added to an archive is on a drive listed in the
       MixedCaseDrives environment variable, the filename will be stored
       into the archive in mixed case.

238. uniq -u didn't report the last line if it was unique.  It does now.

239. Null argument words weren't being passed to child processes started
    from the C shell.  E.g.,

       1 C% myecho hello "" world
       'myecho' 'hello' 'world'
       arg length = 19 characters.

    It should have (and now, does) produce:

       'myecho' 'hello' '' 'world'
       arg length = 20 characters.

240. The sample startup.csh has been modified so that it can be re-invoked
    by the same copy of the C shell without causing the layer number to be

241. [Demo versions] The maximum number of commands that can be typed before
    the demo exits, forcing the user to start a new copy has been raised from
    5 commands to 10 commands.

Fix Level 2.2.k Changes:

242. If certain wildcarding situations with MixedCaseDrives, the shell would
    forget to close a directory handle, making it impossible to delete the
    directory without exiting the shell.  That's fixed.

243. More work on cp to avoid problems copying files on top of themselves,
    this time treating the case "cp x d:" where x is on d:.

Fix Level 2.2.L Changes:

244. Corrected minor typos in the tar help screens.

245. [NT] Minor support work for unannounced RISC platforms.

246. [NT] A new, more standard makefile has replaced the old samples.mak
    in the samples directory.

Fix Level 2.2.m Changes:

247. A bug in the goto statement implementation that could cause access
    violations in the C shell was fixed.

248. Minor typos in the tar help screens were fixed.

Fix Level 2.2.n Changes:

249. Incrementing or decrementing an indexed built-in variable (e.g.,
    processid[1]++) actually changed argv, not the intended variable.  That's

250. The new tar was incorrectly writing directory names as if the -f option
    was specified, even if it wasn't.  Files themselves were added correctly.
    Now, both should be right.  Also, when listing the contents of a tar
    archive, tar printed the trailing / following directory names, just as
    they appeared in the archive.  That trailing / is no longer shown, making
    the output a little more like that of ls.

251. [NT] Trying to move a directory from one partition to another would fail
    with a sharing violation, claiming the directory was in use by another
    process, if the directory contained subdirectories.  That's fixed.

252. If MixedCaseDrives was used, wildcards like ..\..\* would fail if used
    more than 2 levels down from the root.  That's fixed.

253. Ctrl-C interrupt handling has been improved.  Interrupts now bubble
    up better from interrupted child processes and threads to the threads
    that created them.

254. The C shell no longer arbitrarily sets its exit code to 1 when it
    should be 0.

Fix Level 2.2.o Changes:

255. The new tar was properly reading cpio ASCII files, but wasn't writing
    them correctly.  Support for cpio binary files just didn't work at all.
    Appends to either tar or cpio files also didn't work.  All this should
    be working now.

Fix Level 2.2.p Changes:

256. Environment variables could be properly set to zero words, but if a
    new child copy of the C shell was started, it'd parse the value it was
    passed as a single word consisting of the null string.  That's fixed.

257. If ignoreerors was set to 2 (ignore everything), then continue, break,
    goto, exit, logout and return statements were treated as nops.  That's

258. The -e (execute only, no logging to history) and -L (load history)
    options have been added to the source command.  Also, the -n (no
    execute) option has been changed to do a syntax check, consistent
    with the -n option for the C shell itself.

259. If the C shell was started with the -n (no execute) option, exit didn't
    work.  It does now.

Fix Level 2.2.q Changes:

260. [NT] The mt -f option didn't work.  It does now.

261. source -s could cause the shell to crash if it was trying to read
    from the keyboard.  The bug could apparently (though never reported)
    also cause other failures.  The problem is now fixed.

262. If the new argument notation was used in an alias, then word separator
    characters were incorrectly handled.  Aliases such as the following
    didn't work, but should now:

       alias x  (echo ^!^*; echo hello)

    Also, errors involving unpaired quotes in an alias expansion such as
    the following were overlooked.  They're now caught.

       alias y echo "'"

Fix Level 2.2.r Changes:

263. The demo version of cron were looking for csh.exe; they should have
    been looking for cshdemo.exe.

264. Minor work to support a demo version of the C shell that would expire
    at a future date.

Fix Level 2.2.s Changes:

265. [NT] The work done at release 2.2.e to use _beginthread instead of
    CreateThread has been undone after it was discovered that the thread
    handle returned by _beginthread is unreliable.  The C shell and all the
    utilities and samples now use the single-threaded CRTL, locking each
    use with a critical section.  In general, things are now a bit smaller
    and a bit faster.

266. [NT] Everything has been recompiled on Daytona.  It should, however,
    still be fully compatible with the released NT 3.1 build.

267. [NT] dskread and dskwrite now use paragraph-aligned (16-byte aligned)
    buffers for all I/O to the diskette.  Something changed in Daytona,
    non-paragraph-aligned buffers used to work under NT 3.1, but stopped
    working on the MIPS under Daytona.

268. [NT] The blksize utility in the samples directory now uses a paragraph-
    aligned buffer.

269. Tar didn't work if you tried backing up a root directory.  Under NT,
    it did nothing; under OS/2, it crashed.  That's now fixed.

270. Sed now accepts escape sequences like \r and \n in search and replace
    expressions.  Also, the help information for static text operations
    (a\, c\ and i\) has been made a bit more readable.

271. [NT] The cl.csh sample script has been updated for the Daytona beta.

272. [NT] The tape device always reports an error, ERROR_BUS_RESET, if
    GetTapeParameters is called immediately after a new tape has been
    inserted.  Calling GetTapeParameters again gives useful information.
    The mt and tar utilities have been fixed to do that second attempt.

273. [NT] The eraseshort operation has been added to mt.

274. [NT] Some additional nuisance messages produced by the Daytona compilers
    have been added to the skip file in the samples directory.

Fix Level 2.2.t Changes:

275. Expressions in an elif clause were evaluated in Hamilton C shell mode,
    even inside #!/bin/csh scripts, where clearly Berkeley rules should be
    used.  That's been fixed.

276. [NT] Under Daytona (NT Release 3.5) or later, the C shell now starts
    child processes with error mode set to zero, just as cmd.exe does.
    The C shell itself uses a non-zero error mode to disable popups,
    allowing the shell to intercept any error conditions.  That's important
    to allow unattended scripts to be run.  But error mode was inheritable
    under NT 3.1 and it caused problems with some 3rd party apps that
    just assumed they'd be started with error mode = 0.  Daytona has a
    new option to CreateProcess to allow apps running with a non-zero
    error mode to start children with a zero error mode.

Fix Level 2.2.u Changes:

277. [NT] Changes made at 2.2.s to use CreateThread instead of _beginthread
    and GlobalAlloc instead of malloc introduced a bug into the C shell
    and cron:  their use of GlobalReAlloc was flawed and caused any
    reallocations (e.g., if editing caused the command line to grow beyond
    4 lines) to fail.

278. Dskwrite and cp, rm and mv can now diagnose more clearly those
    failures due to write-protected media.

279. cron now considers a Ctrl-Z character in a crontab as an end-of-file.
    Also, if any of first five fields is garbled, the message is better.

280. The line numbers in any messages resulting from a garbled command
    specified with -C or -c are now correct.  A counter hadn't been
    re-initialized after login.csh and startup.csh were read.

281. Tar's verbose messages now mention the blocksize it's using.

Fix Level 2.2.v Changes:

282. Support for escape sequences such as \r, added to sed at build 2.2.s,
    has been added to grep.  Hex escape sequences, which didn't work right
    in sed, have been fixed and work properly in both sed and grep.

283. Sed and grep now accept span expressions using the \{n,m\} syntax.
    E.g., grep '10\{2,4\}1' will match 1001, 10001 and 100001, but not
    101 or 1000001.

284. The rot13 alias (for decoding off-color jokes on Internet) has been
    added to startup.csh.

285. A number of improvements were made to tar:

      a) [NT] Tar would crash in its error message routine if it was asked
         to copy a file to the archive that was open for writing by another
         process.  That's fixed.
      b) [NT] Tar now normally rewinds the tape device at the start and
         at the finish of the operation.  This can be suppressed with the
         new -N (no rewind) option.
      c) Tar's messages about suppressing \r\n -> \n line end conversions on
         binary files now appear only if the -v (verbose) option is selected.
      d) If it encounters a file that can't be copied to the archive, tar now
         just gives a warning and continues; it used to give a message and
         just quit.
      e) The spurious messages about garbled headers are suppressed for
         empty tar files.
      f) [NT] Failed attempts to set the blocksize on a tape device are now
         treated as cause for a warning message, not a fatal error.

286. The sh_2_csh.csh script had some out-of-date references to an
    sh-2-csh subdirectory.  Because the hyphen isn't a legal character on
    CD-ROM filesystem, that directory was renamed but the change wasn't
    made to the script.  Now it's correct.

287. [NT] The how2tar.txt and how2tar.wri files were added to the distribution
    disks to explain how to get tar to work with a tape drive under NT.

288. The license.txt file was added to each of the .zip files on the demo

Fix Level 2.2.w Changes:

289. Dskwrite -FH didn't work at all under OS/2 and not on unformatted
    disks under NT (for different, unrelated reasons under the two systems).
    It works now.

290. Minor typos in the help screens for sed, grep, kill, and the C shell
    itself were corrected.

291. [NT] The how2tar.* files were omitted from the product versions of some
    2.2.v disks.  It should be on all of them now.

Fix Level 2.2.x Changes:

292. [NT] A bad race that could hang the C shell on a multiprocessor system
    was fixed.

293. The mixedpath(...) function and the :m editing operator were added to
    allow the true mixed case filename stored in the filesystem to be

294. The :h operator didn't work on a filename consisting of only a \.  It
    does now.

295. Dskwrite -FH and -FL still had problems formatting some disks, depending
    on how they were previously formatted.  Hopefully, all cases should now
    be covered.  Also, a -E option was added for Extended Density formatting.

296. Additional work on tar:

     a) The help screen for tar now mentions that -b abcd is little-endian
        and -b badc is big-endian and that if the archive is intended to be
        read on a RISC or Motorola-based UNIX workstation, big-endian should
        be used.  The -bB (Big-Endian) and -bL (Little-Endian) aliases for
        -b badc and -b abcd, respectively, have been added.  Also, the -v
        (verbose) output now specifically identifies abcd and badc formats
        as Little-Endian and Big-Endian, respectively.
     b) [NT] The help screen for tar now mentions that you must manually
        specify a blocksize of 1024 or larger to make a DAT drive work.
     c) The -I option, allowing the list of files to added to/extracted from
        an archive to be specified in an include file on disk or via stdin,
        has been added.
     d) The -A option has been added, meaning reset the Archive bit on any
        files or directories copied to a tar or cpio archive file.  (During
        extraction, -A is ignored and the Archive bit is always set.)
     e) The ReadOnly bit is now preserved properly.

297. The CSHTITLE environmental and cshtitle shell variables have been added,
    allowing control over the text in the title bar.  They work like the
    PROMPTx and promptx variables and are recalculated whenever they're
    displayed.  Unset'ing cshtitle causes "Hamilton C shell" to be used;
    set'ing cshtitle to a null string causes the title bar it inherited
    at entry to be used.

298. Setting prompt2 incorrectly set prompt1.  It now correctly sets prompt2.

299. [NT] The ps command didn't report the thread id's correctly following
    the work done at 2.2.s to switch back to using CreateThread.  ps now
    works properly.

300. [NT] References to environmental variables inside an expression were
    case-sensitive; they should have been case-INsensitive as they are now.

301. [NT] The kill command had an extraneous CloseHandle call that could
    have produced random results.  That's fixed.

Fix Level 2.2.y Changes:

302. The help screen for dskread now mentions that it also accepts the -E
    (extended density) option.

303. The help screen for tar now correctly specifies that when extracting
    files, the -A option is ignored and the Archive bit is always set.  Also,
    a minor typo in the -I option description was fixed.

Fix Level 2.2.z Changes:

304. A new -S (stop) option has been added to tar.  Tar no longer stops if
    it can't extract a file or directory from an archive unless -S is
    specified.  A spurious message about turning off \r\n to \n conversions
    when -vr is specified has been suppressed.  A bug that caused tar to
    fail to extract a directory if one of the levels already existed.

305. When reading stdin, wc no longer pastes a spurious null character
    onto the end of its output.

306. [NT] The posxpath.csh script for converting ordinary filenames to
    POSIX format has been added to the samples directory.

Fix Level 2.2.27 Changes:

307. [NT] Cron had a resource leak that's been fixed.  It wasn't closing
    the thread handle returned by CreateProcess when it spawned a child.

Fix Level 2.2.28 Changes:

308. [NT] Tar can now read tapes using a 512-byte blocksize.  Inserting a
    new tape in the drive no longer causes spurious failures.  Attempting to
    read a tape using the wrong blocksize now results in a message stating
    that fact.  If there's no media in the drive, that also results in a
    specific message.

309. Tar's newline processing during extraction no longer inserts
    CarriageReturns just before any NewLines that are already preceded by

310. [NT] mt no longer produces spurious -v status results after a tape
    is changed.  Also, it now produces a message if there's no tape in
    the drive.

311. [NT] cl.csh and ferr in the samples directory have been updated for
    the final release of Daytona (NT 3.5).

312. [NT] The C shell now recognizes when it's being run under Windows95
    (Chicago) and knows that the DOS command prompt there is called
    command.com, not cmd.exe as it is under NT.

313. [NT\MIPS] The blksize.exe file was (inexplicably) empty in some
    previous builds.  It now properly contains the actual executable.

Fix Level 2.2.29 Changes:

314. [NT] Cron can now be run as a service, meaning that it can be set
    up to run under a different ID or even when no one is logged in.
    A new -W (window) option has been added to allow cron to start
    up in a new window.

315. Cron now has a -! option which causes it to install an interrupt
    handler so that ^C or ^Break doesn't cause cron to exit.

316. The C shell now writes double quotes around any words in the
    command line it passes to its child processes that contain
    wildcard characters.  This made it possible to relink grep and
    sed with the Microsoft setargv.obj module so they can do
    wildcarding under cmd.exe.  Also, setargv.obj is now linked
    in with xd.exe.  (The fact it wasn't previously was just an

317. Tar now supports C shell-style wildcarding of the list of files
    to be extracted from an archive.  Wildcarding works on all
    entries in the include file (during both extraction and addition).
    A new -T (total) option has been added to total the sizes of all
    selected files.  A new -D (dim) option has been added to cause
    highlighting NOT to be done on any output.  New environment
    variables, TARBINARY and TARASCII, are now recognized.  Each
    may contain a list (separated by white space) of wildcards
    that describe files which should be assumed to be binary or
    ascii, respectively, regardless of content.  The -R option
    didn't work properly with -s; it does now.

318. The pattern match operators, =~ and !~, didn't properly handle
    the case of matches against strings that contained a drive letter
    and a colon.  That's fixed now.

319. The unixprof (UNIX Profile) scripts have been added to the samples
    directory.  When run against a source tree, it produces a listing
    of total number of calls to each of the various UNIX system and library

320. The timestmp.csh and fixup.csh scripts have been added to the
    samples directory.

321. touch now accepts a timestamp that allows granularity down to the
    second.  A new -2 option allows granularity in 2 second increments
    for compatibility with FAT and HPFS partitions.

Fix Level 2.2.30 Changes:

322. A number of fixes were made to tar:
     a) The changes made at release 2.2.29 to tar introduced a bug that
        caused an access violation if tar was invoked without any arguments
        following the last option word.  That's fixed.
     b) A long-standing bug, probably introduced at release 2.2.j, that
        caused problems in certain situations when reading through a pipe
        has been fixed.
     c) A long-standing bug in the heap code suddenly became apparent on
        Intel, totalling crippling tar, when we switched from the SDK
        compiler to VC++ on NT.  The bug was on all platforms but just
        hadn't been visible before and is now fixed. x
     d) Specifying an incorrect bytesex caused tar to go into an infinite
        loop when reading an archive; that's fixed..
     e) Tar now intercepts and ignores (except for a warning message)
        attempts to copy the archive file into itself.
     f) Another bug introduced at 2.2.29 caused the command line
        wildcarding against the filesystem to fail under cmd.exe.
        That's fixed.
     g) The TARBINARY and TARASCII environment variable routines had a
        bug which could cause a crash.  That's fixed.

323. [NT] The demo version of cron now gives an error message and
    refuses to install itself as a service.  (It can't run as a service
    since it must be a child of the demo version of the C shell.)

Fix Level 2.2.31 Changes:

324. Tar now is much more picky about what files it will consider to be
    ASCII.  Previously, if the first 2K bytes of a file was at least
    2/3 ASCII, the whole file was considered ASCII.  Now, tar insists
    that the first 8K cannot contain more than 8 binary characters and
    that, if it's shorter than that, not more than 1/64th of the file may
    be binary.  Also, tar now highlights any files it converts in
    bright yellow, alerting the user to changes it's making.

Fix Level 2.2.32 Changes:

325. A change made at release 2.2.29 to the wildcarding routines broke
    the posxpath.csh sample script and caused pattern matches against
    any drive letter to fail.  That's fixed in both the shell and in

326. Tar now recognized UNC names for extraction.

327. A buffering bug that affected cut, sed, fgrep, grep, uniq and diff
    has been fixed.  This bug caused problems reading files that used only
    a \n, not a \r\n end-of-line convention.

328. [NT] Cron didn't work properly as a service installed in the default
    manner.  Also, it wouldn't respond immediately to stop requests.  These
    problems have been fixed.

329. The timestmp.csh sample script didn't properly handle leading zeros
    in minutes and seconds.  Its does now.

Fix Level 2.2.33 Changes:

330. The "fix" made to cut, sed, fgrep, grep, uniq and diff at 2.2.31 was
    worse than before, causing even worse buffering problems.  This build
    should fix the fix.

331. The postage.csh script in the samples directory has been updated to
    reflect the new U.S. domestic postage rates that went into effect on
    January 1, 1995.

332. [NT] dskread and dskwrite produced spurious complaints about the
    boot record even when used with -x.  That's fixed.

333. The changes made to tar at 2.2.29 caused it to skip over the first
    file specification on the command line if the -s option was used.
    That's fixed.  Also, a new -w option, which causes all files being
    copied to the archive to be shared R/W, has been added.

Fix Level 2.2.34 Changes:

334. Cut, sed, fgrep, grep, uniq and diff still had an occasional
    buffering problem when reading files with lines ending only in
    \n (UNIX-style), not \r\n (NT or OS/2-style).  That's fixed.

335. [NT] cron would not start as a service if the C shell wasn't
    on the system (as distinct from the user's) search path.  Beginning
    with this build, the install operation stores the C shell's search
    path into the registry entry describing the cron service.

Fix Level 2.2.35 Changes:

336. [NT] cron would not start as a service if its home directory
    (set either explicitly or implicitly if no there was no setting
    for home) was the root of a FAT partition.  Also, the interactive
    option wasn't being processed quite properly.  That's fixed.

337. Uuencode and uudecode have been added.  Also, the aliases
    uue and uud have been added to startup.csh.

338. The demo versions have been recompiled/relinked to update an
    old phone number embedded in them to our new phone number.

339. Sed had a bug in the \{...\} span logic that's been fixed.

Fix Level 2.2.36 Changes:

340. [NT] The cl.csh script in the samples directory now pipes both stdout and
    stderr through ferr.

341. The comparison algorithm used by diff has been substantially improved
    to give a far more optimized comparison listing.  Also, the -e option
    has been renamed -E, allowing a new POSIX-compatible -e option (which
    produces an ed script) to be added.  A new -N option was added which
    causes differences in line-end conventions to be ignored.

342. Cut, sed, fgrep, grep, uniq, diff and uudecode now expect that lines
    will end with either \r\n (OS/2 or NT-style) or \n (UNIX style) but
    not \n\r (reversed).  Trying to accept the reversed combination caused
    these line-oriented utilities to disagree with more over what constituted
    a line.  Also, in diff, if a single null line ending with \n was inserted
    in a file ahead of another null line ending with \r\n, it caused both
    lines to mismatch.

343. [NT] More now uses only the window size, not the buffer size for
    vertical scrolling.  This makes it reasonable to use more in a window
    with vertical scroll bars (which many users like so they can refer to
    previous commands).

344. Date now accepts POSIX-compatible format strings as options.

345. The cmp utility has been added.  Use cmp -h for help.

346. The binedit -i option didn't work.  It does now.

Fix Level 2.2.37 Changes:

347. [NT] A bug that caused more to scribble trash after the end of its
    window in a larger buffer if the sequence End-PageDown-PageDown-
    PageUp-PageUp was typed has been fixed.

Fix Level 2.2.38 Changes:

348. [NT] The setrows utility has been added for NT.  Use setrows -h
    for help.

349. The renet.csh utility for restoring unavailable LanMgr network
    resources has been added to the samples directory.

Fix Level 2.2.39 Changes:

350. The sh_2_csh.csh script didn't work if it wasn't given an argument,
    i.e., if it was just run against stdin, due to changes in the way
    null arguments were treated at release 2.2.j.  The script has been
    changed to work properly under the new rules.

Fix Level 2.2.40 Changes:

351. The sort utility has been added.  Under NT, it's named hsort.exe
    and aliased in startup.csh to avoid conflicts with the standard
    MS sort.

352. The quicksort routine used in ls.exe has been improved slightly.

353. Trying to extract a directory by name from an archive with tar
    extracted just the directory, not any of its contents.  That's

354. Wildcarded drive letters with nothing following, e.g., *:,
    failed under both the C shell and in the tar wildcarding
    routines.  That's fixed.

355. [NT] The cl.csh script now knows about VC++ on the Alpha.

356. The table for determining if a character was binary data used
    by diff and tar missed a couple characters.  That's fixed.

Fix Level 2.2.41 Changes:

357. Sort didn't properly treat cases where -n or -N was used on
    the whole record.  Under NT, if it was reading from a file on
    disk (where it used a mapped file), -n and -N caused protection
    violations.  Also, the -f option didn't work right.  All that's

358. sum now supports the POSIX CRC-32 cksum algorithm via the new
    -p option.

Fix Level 2.2.42 Changes:

359. uniq now supports the -f and -s options for skipping an initial
    number of fields or characters in its comparisons.

360. The paste utility has been added.

361. A typo in the help screen for sort has been corrected.

Fix Level 2.2.43 Changes:

362. The C shell was incorrectly freeing up a fast mutex (a Critical
    Section under NT; a RAM semaphore under OS/2) that it didn't own
    in two separate instances.  This was innocuous except under a
    checked build of NT (i.e., one that checks parameters to all API
    calls), where it caused the C shell to crash if one attempted to
    run a script or to run a child process in the background.

363. The C shell was backgrounding all GUI apps run interactively,
    even when the context (e.g., "a; b" or "a && b") suggested there
    might be a serial dependency.  That's fixed.

364. [NT] The ANSI interpretation routines used by the C shell and
    all the utilities now use the visible window, not the whole buffer,
    as the basis for screen clearing, cursor positioning, etc.  The
    major effect is that typing "cls" in a window with a vertical
    scroll bar, clears the window but doesn't discard everything
    else in the buffer.

365. Everything has been recompiled.  The major reasons were to ensure
    that the new ANSI libraries were used everywhere and to take
    advantage of the latest VC++ compilers on Intel and Alpha and
    the new build 944 compiler for PowerPC.  The OS/2 version was
    also rebuilt to so it'd show the same timestamps and version

366. [NT] wtypes.h, objidl.h and oaidl.h have been added to the samples\skip
    file to suppress nuisance warnings generated by compiling with these

367. [NT/PPC] The samples\cl.csh script now knows that on PowerPC
    builds after 944, the compiler is called cl.exe, not mcl.exe.

368. A minor bug in word selection was fixed.

Fix Level 2.2.44 Changes:

369. Grep and sed now accept escape sequences inside [...]-style
    ranges.  Also, sed has a new -N (normalize line ends) option
    that makes it easier to use sed scripts ported from UNIX that
    expect text to use the UNIX convention of a single \n character,
    not a \r\n pair, at the end of each line.

370. A minor typo in the help screen for ls was fixed.

371. The sum -p option didn't properly calculate the POSIX CRC.  It
    should now.

Fix Level 2.2.45 Changes:

372. [NT] A minor (actually, never observed) bug due to a typo in the
    semaphoring of the keyboard inside the C shell was fixed.

Fix Level 2.2.46 Changes:

373. A number of improvements were made to tar:
    1. [NT] With some of the newest high-performance scsi controllers,
       tar wasn't properly aligning its buffers, causing it to fail;
       that's now fixed.
    2. [NT] tar can now automatically detect the blocksize of a tape it's
       trying to read.  Under NT 3.5 or earlier, it just iterates over
       the possibilities, ratcheting by 512 bytes/block at a time.
       Under 3.51 or later, it uses a feature called variable block
       i/o to determine the blocksize directly.
    3. The help screen has been improved considerably with the addition
       of examples.
    4. The old -c option has been renamed the -y option so that a new
       -c option, meaning create a new archive, could be defined per
       the Posix standard.
    5. Tar now uses a default blocksize of 10,240 bytes, per the POSIX
    6. Tar didn't properly identify and preserve the case of filenames
       passed on the command line when writing to an archive.  It does now.
    7. Tar didn't properly handle cases of collisions during extraction
       due to to files whose names differed only in case.  It does now.
    8. When writing to an archive, unless the archive is on a tape
       device, tar now pads only to the next 512-byte boundary, not
       the next blocksize.

374. [NT] The mt utility has been improved.  Under NT 3.51 or later,
    it uses variable block i/o to determine the media blocksize by
    actually reading the tape.  Also, the status output has been
    improved to give additional basic information without having to
    require the verbose option.

375. The help screens for dskwrite and dskread have been improved in
    the examples that mention tar.

376. [NT] The how2tar.{wri,txt} documents have been improved to reflect
    the use of the latest build of tar.

Fix Level 2.2.47 Changes:

377. Minor typos in the help screens for sum, sort, sed, tar, dskread
    and dskwrite were corrected.

Fix Level 2.2.48 Changes:

378. [NT] Under NT 3.5, if the tape device was set for a zero blocksize
    and tar was needed to determine the actual blocksize used on a tape,
    it would fail.  (The workaround was to set the blocksize to a non-zero
    value, e.g.., by using "mt blksize 512" before running tar.)  This
    new build includes a check for this problem under NT 3.5.

Fix Level 2.2.49 Changes:

379. [OS/2] Setting MIXEDCASEDRIVES and cd'ing to a non-existent
    relative path caused the shell to hang.  That's fixed.

380. The PV_Annuity and FV_Annuity formulas in the finance.csh sample
    script were wrong and have been corrected.

381. The trapz.csh script for numeric integration using the trapezoidal
    rule has been added to the samples directory.

Fix Level 2.2.50 Changes:

382. [OS/2] Wildcarding the drive letters didn't work with root
    directories.  For example, "echo [d-j]:\" would cause a crash.
    That's fixed.

383. [NT] The mixedpath function didn't work if any of the segments
    in the name it was given was a short, 8.3 name.  Those names are
    now properly converted to the long versions in mixed case.

384. The -e option didn't cause all input, including that read from
    scripts, to be echoed.  It does now.  A new per-thread shell
    variable, echoallinput works like echoinput except that echoallinput
    is inherited by child threads.  Also, when echoinput was set, the
    shell would print just the first line of any scripts (during the
    course of looking for a #!/bin/csh line at the start).  Scripts
    should, of course, have been echoed completely or not at all.  That's
    all fixed.

385. A new shell variable, OperatingSystem, has been defined which
    tells the name of the operating system on which the shell is running.

386. [NT] New shortname() and longname() functions have been added to
    allow filenames to be shrunk to 8.3 rules or expanded out (if they're
    not already) to long names for Win32 apps.  Also, new editing operators,
    :A (alternate shortname) and :L (longname) have been added.  These
    functions are useful in preparing arguments to be passed to DOS
    or Win3.x applications.

387. A new fullmixedpath() function and corresponding :M editing operator
    have been added.  These return the fullpath in mixed case of a file.

388. A new -C file test operator has been added which tells if a file
    has been compressed.  (Under OS/2 it always returns False.)

389. [NT and Win95] To be more sensible across both NT and Win95, the
    NTVersion variable has been renamed as WinBuild.  The old name
    still works (to avoid breaking any scripts), but new scripts should
    probably use the new name.  Also, the ver.csh script has been changed
    to use the OperatingSystem and WinVersion variables to report more
    accurately on Win95.

Fix Level 2.2.51 Changes:

390. [Win95] The WinBuild number is now masked to just the low-order
    16-bits returned by GetVersionEx; Win95 was putting a version number
    into the high-order bits that made the build number look funny.  E.g.,
    on build 484, the build number was coming back as 0x40001e4.  Masking
    just the low bits give the value 0x1e4 == 484 as really desired.

391. [NT/PPC] IBM and Motorola made a change in the way FP exceptions
    are handled in the math libraries at NT 3.51 RC 2 and later builds.
    That caused unhandled exceptions in the sqrt and other transcendental
    routines.  Also, they've improved the compiler optimization strategies.
    For these and other reasons, the shell and all the utilities have been
    re-compiled from scratch for the final release of 3.51 using the latest

392. [NT] The prsht.h and imm.h headers have been added to the samples\skip

Fix Level 2.2.52 Changes:

392. Under Berkeley Compatibility mode, the C shell now recognizes the
   "else if" combination typed on one line with only a single endif to
   close the structure.

393. Under Berkeley Compatibility mode, the C shell wasn't correctly
    recognizing quoted strings and other substitutions in =~ and !~

394. The C shell now correctly recognizes ${...} variable syntax as
    isolated from anything following, including what previously was
    interpreted as :-style editing operators, which are now treated
    as literal text.

Fix Level 2.2.53 Changes:

395. The C shell wasn't encoding argument words to child processes
    correctly in certain cases involving multiple backslashes.  E.g.,

      echo a\b\c | grep "..*\\"

    didn't work properly.  Similarly, the dskread, dskwrite, tar and
    OS/2 startwin utilities were decoding argv incorrectly in these
    same situations.  All these cases are now fixed.

396. [NT/PPC] Tar wasn't properly converting between the timestamp
    formats used in the tar archive and by Windows NT.  It does now.

397. The f2c.csh and c2f.csh scripts have been added to the samples
    directory for Fahrenheit/Celsius conversions

Fix Level 2.2.54 Changes:

398. ls.exe now knows about the compressed attribute supported
    under NT 3.51.  In long format (-L), a "C" in the attributes means
    the file is compressed; "C" can also be used in selecting file
    types just like the other attributes.  But this also forced the
    previously existing -C option for capitalization to be renamed
    as the -T (True mixed case) option.  Also, ls now has a new -F
    option that causes it to add a backslash following the name of
    any directories listed in its output.

399. ls, tar, mv, cp and rm now accept new READONLYFILES and
    READONLYDIRS environment variables for controlling the color
    used when listing files and directories marked read-only.

400. [NT] chmod.exe now knows how to compress or uncompress files
    and directories using +C or -C.

401. chmod, touch and mkdir have a new -w (warnings only) option that causes
    them to continue even if they encounter problems with some of the files.

402. [NT] mv, cp and rm could generate ANSI escape sequences if -l (logging)
    was used, but those sequences weren't getting displayed properly.
    That's fixed.

403. mkdir now has a new -r (recursive) option that causes it to make
    any missing intermediate directory levels that may be required.

404. The boot sector written by dskwrite has a hidden message with
    contact information for Hamilton Laboratories; that's been updated
    with our new address in Sudbury.

405. The "fix" for args ending in \'s done at 2.2.53 introduced a new
    off-by-one error that could corrupt the heap.  That's fixed.

Fix Level 2.2.55 Changes:

406. The allocate/free code for the C shell now has some additional
    checking added to watch for any possible heap corruption.

407. [NT] The shortname and longname functions and their associated
    :A and :L editing operators expanded "." and ".." names, producing
    erroneous results.  That's fixed.

408. [NT] ls could display the compressed attribute but not select
    based on it.  That's fixed.

409. [NT] If the machine was powered up, then a new tape was loaded,
    tar would fail.  Both tar and mt knew to ignore either a bus reset
    (initial power-on) or media changed status condition, but they
    didn't know to expect both in succession.  That's fixed.

Fix Level 2.2.56 Changes:

410. [NT/Alpha] A code generation error in Visual C++ caused alignment
    exceptions in the C shell and many of the utilities if the Alpha
    was run with "axpalign /enable".  Simplifying the code has avoided
    the problem.

411. If the home directory was set to the root of any drive, then any
    attempt to pass arguments to a child of the form "~\foo" caused
    an assertion failure.  That's fixed.

412. The samples\sh_2_csh\readme file has been updated (finally) with
    our new address and phone numbers.

Fix Level 2.2.57 Changes:

413. The shell would crash if it encountered an error inside the evaluation
    of a quoted string if it had already collected part of the result.
    E.g., echo "$@ $@:-$@" would cause the failure.  That's fixed; you
    now get the appropriate error message and the shell continues.

Fix Level 2.2.58 Changes:

414. Tar didn't properly resolve filenames passed on the command line
    if the MIXEDCASEDRIVES environment variable was set.  That's fixed.

Fix Level 2.2.59 Changes:

415. Xd didn't work right with a radix < 8 if byte or word formatting
    was requested.  That's been fixed.

416. The help screen for tar had an error in the description of
    one of the examples that's been fixed.

417. The C shell's :-style pathediting routines weren't rescanning
    the results and could overlook cases where the results contained
    C shell wildcard characters.  Downstream, this could cause the
    C shell to crash when passing arguments to child processes, e.g.,
    in "myecho $x:A".

418. Multi-character word separators, e.g., >>, inside an alias definition
    containing a history reference were treated as ordinary text during
    any expansion.  That's fixed.

419. Passing a null character to a child process (e.g., myecho a ^0 b)
    from the C shell caused the shell to crash.  Passing it to an
    internal command (e.g., echo a ^0 b) produced garbage.  That's
    now fixed.

420. [NT] The dskread and dskwrite utilities and the blksize sample
    now use page-aligned rather than paragraph-aligned buffers.

421. [NT] A new ps -s option has been added to allow ps to list details
    of all the processes system-wide.

422. sunrise.csh has been added to the samples directory.

423. [NT] The C shell and all the utilities and samples have been
    internationalized to support use of languages such as Russian that
    use non-Latin alphabets.  Non-Latin characters can now be used in
    filenames, wildcards, strings, variable names, etc.

424. [NT] The sed -s option for reading a sed script from stdin didn't
    work.  It does now.

425. Dskwrite now puts "Hamilton", not "IBM 10.2" into the system name
    field immediately preceding the Bios Parameter Block, and "FAT12",
    not "FAT" into the reserved field of the BPB in the boot record when
    formatting a diskette.

Fix Level 2.2.60 Changes:

426. Setting the search path to a null list caused the shell to crash.
    It's hard to know why anyone would want to do this, but it should
    have worked.  It does now.

427. "uuencode infile decodename" didn't work; it complained it couldn't
    open Stdin.  That's fixed.

Fix Level 2.2.61 Changes:

428. [NT] mt and tar weren't correctly examining the version number
    for NT and were incorrectly concluding that variable blocksizes
    weren't supported.  This limited their ability to diagnose unknown

Fix Level 2.2.62 Changes:

429. The shell could trip an assert and crash while building up the
    command line to be passed to a child process in certain cases, e.g.,
    del '$*.out', where del invokes the alias defined in startup.csh.
    That's fixed.

Fix Level 2.2.63 Changes:

430. [NT] Tar would fail because it couldn't set the blocksize when used
    with an Archive Viper 150 QIC drive.  That's fixed; it now just gives
    a warning and continues, using whatever the drive is already set to.

431. [NT] mt status would give any status information other than an
    error message if there was no media in the drive.  It now gives
    that message, but continues to at least give status on the drive
    itself.  Also, it now accepts "eject" as a synonym for "unload".

Fix Level 2.2.64 Changes:

432. sed's w (write file) command didn't know how to create the file
    if it didn't already exist.  That's fixed.  Also, the changes made
    at 2.2.44 to allow line end normalization caused all output from
    a w command to go to stdout, not the intended file.  That also is

433. The sunrise.csh sample script used the exit command rather than
    return if an error was encountered inside the self-loading procedure.
    If it was run a second time, producing the same error, it caused the
    whole shell to exit.  It now uses return.

Fix Level 2.2.65 Changes:

434. [NT] Tar didn't properly handle blocksizes greater than 64K or so.
    That's fixed.

435. The C shell would crash trying to pass certain kinds of command
    line arguments to a child process.  E.g., myecho '\"' would cause
    it to crash.  That's now fixed.

436. [Win95] The ps -s option now knows how to list all processes system-
    wide under Windows 95.

437. [NT] The C shell and ls now work much better inside a GNU emacs buffer.
    Previously, ls complained about not being able to open the display
    to determine the screen size.  It now just quietly assumes an 80-column
    window.  The C shell would hang if it needed to give an error message
    trying to word-wrap on what it thought was a zero-width screen; it
    also now just assumes an 80-column screen.  Also, the C shell was
    setting the console state to make Ctrl-C an interrupt, which made
    it impossible to type the Ctrl-X Ctrl-C combination used to edit
    emacs.  Now, the csh -Y option tells the C shell not to change the
    keyboard state.

438. [Win95] The installation instructions in the readme file for the
    NT version now describe how to do the installation on Windows 95.

439. [Win95] The C shell now incorporates a workaround for what appears
    to be a Win95 bug that caused console apps run as children of the
    C shell with stdin tied to the keyboard to see a spurious \r\n
    when they started up.  In these cases, the C shell now flushes
    the keyboard buffer as it starts the child.

440. [NT] The shell, all the utilities and all the sample files have been
    completely rebuilt using the new VC++ 4.0 compilers on Intel, MIPS
    and Alpha.

441. [NT] The C shell now has a new brand-new color icon.

Fix Level 2.2.66 Changes:

442. [NT] The help screen for ls erroneously listed the OS/2-only -M
    option.  That's been deleted.

443. [NT] A new -2 option has been added to newer and older that allows
    timestamps which fall into the same two-second interval to compare
    equal.  This is useful when files are moved between NTFS (100 nsec
    granularity) and FAT or HPFS (2 sec granularity).

444. A new -d option has been added to diff.  It works just like -D
    except the #else and #endif directives it generates have a comment
    telling what symbol was tested.

445. The C shell now does a better job of supporting the use of \ as
    the escapesym character.

446. [Win95] The installation instructions for Win95 have been further
    improved with discussion of how to customize the conagent used by
    Win95 to run Win32 console apps like the C shell.   Also, csh.ico
    has been added to the bin directory for Intel to allow Win95
    users to use that as the C shell icon.  (Win95 does not appear
    capable of extracting icon resources from Win32 console apps.)

447. [NT] Tar and mt now support a -V option to turn off use of variable
    I/O if the tape drive firmware has a bug.  Mt now correctly reports
    what blocksize the drive is set for, even if variable block i/o was
    used to determine the media blocksize.  (Previously, it always
    reported blocksize 0 if variable block i/o was supported.)  Also,
    invoking tar with no operand now gives the correct message saying
    you need to specify the archive.

448. The C shell now correctly backs up to the beginning of the previous
   quoted string when doing filename completion.  This is especially
   important under Win95 where many of the system directories have
   spaces in their names.

449. Everything has been rebuilt again to insert copyright 1996 notices
    where appropriate.

Fix Level 2.2.67 Changes:

450. In Berkeley compatibility mode, the endif and breaksw aliases
    weren't properly predefined.  That's fixed.

451. If the escape character is set to \, the C shell now edits the
    results of any variable references or output from commands like
    cd or dirs to replace any \'s with /'s.  Also, pwd and ls now
    report paths using /'s, not \'s, when the escape character is
    the backslash.

452. [NT/Win95] Setrows, tar, dskread and dskwrite now contain warnings
    in their help screens of limitations imposed by Windows 95.  Also,
    dskread and dskwrite (which can't be used at all because the raw
    device can't be opened under Win95) now give an explicit message
    to that effect under Win95.

453. [NT] The how2tar.{txt,wri} documents have been updated to mention
    the tar -V option for overriding a drive's claims to support variable-
    block i/o and the -Hoff option for turning off hardware compression.

Fix Level 2.2.68 Changes:

454. "cp a: \" complained about not being able to create an output
    directory "".  That's fixed.  It now copies everything from a: to
    the root.

455. Editing operations are no longer recognized following command
    substitutions in Berkeley Compatibility Mode.

456. Cron wasn't properly watching for escape characters in the command
    fields in a crontab file, making it impossible to embed % characters
    into a command.  That's fixed.

Fix Level 2.2.69 Changes:

457. Cmp's reporting with the -l (all differences) option has been
    corrected to show the values of the differing characters.  The spurious
    message about differences at end-of-file if there were other differences
    elsewhere has been eliminated.  Options have been added for specifying
    any desired radix for reporting offsets and character values and for
    requesting a Posix-compliant report.

Fix Level 2.2.70 Changes:

458. unset didn't work in Berkeley Compatibility Mode; it does now.  Also,
    unset can now be use to discard a local variable.

459. The :x and :q editing operators now work correctly.  :x breaks up
    a string at word boundaries, then single quotes each section.  :q
    just single quotes its argument.  Previously, :q worked on history
    words, but not on run-time variables.  :x didn't quote the resulting
    words and didn't work on history words containing quotes.

460. In Berkeley Compatibility Mode, break now breaks out of the
    enclosing loop and breaksw breaks out of the enclosing switch, even
    if these enclosing structures are several nesting levels outside
    the present scope.

461. set, setenv, alias, proc, local, unset, unsetenv, unalias, unproc
    and unlocal now all accept wildcards to list out or discard all
    the variables, aliases, etc., whose names match the wildcard.

462. Writing a tape using tar -cff (to include drive letters in the file
    names) worked, but there was no way to restore to the specified drives.
    That's fixed.

463. [NT 4.0] A change in the way process data was reported from the
    registry caused ps -s to go into an infinite loop.  That's fixed.

Fix Level 2.2.71 Changes:

464. The fix at 2.2.70 to better implement breaksw in Berkeley Compatibility
    Mode didn't work.  It should be working now.

465. The installation instructions have been improved.

466. An apparently innocuous uninitialized variable reference in the
    filename completion routines has been fixed.

Fix Level 2.2.72 Changes:

467. If the escapesym was set to \, the :t (tail) operator failed in an
    assertion.  That's fixed.

468. [Win95] Writing 0 characters to the console is acceptable under WinNT
    but fails under Win95, causing more to crash on highlighted lines of
    a full 80 characters.  That's fixed.

469. Lots of minor typos have been fixed in the help screens of many of
    the utilities.  All of them have been rebuilt.

470. The fixup.csh sample script now watches for non-existent files
    passed to it as arguments.

471. Minor improvements have been made to the installation instructions.

Fix Level 2.2.73 Changes:

472. Minor typos in the help screens for date, diff, dskread, dskwrite,
     mt, sed, tar, tee, touch, wc and kill have been fixed.

Fix Level 2.2.74 Changes:

473. [NT/Risc] Inadvertently, the new version of newer introduced at
    release 2.2.66 was omitted from the Risc versions.

474. [NT/Risc] The ps -s command to list all processes system-wide
    encountered an alignment exception on the MIPS and Alpha if alignment
    exceptions were enabled.  Though not documented, apparently the
    ReqQueryValueEx api requires aligned buffers, which the C shell and
    cron now use.

475. ls and tar couldn't read files and directories specified with UNC
    names is MixedCaseDrives was set to \\ (meaning all UNC names are
    mixed case.)  That's fixed.

476. The message cmp generated when it found a mismatch had a couple
    typos that have been fixed.

Fix Level 2.2.75 Changes:

477. [NT] The change to cron at 2.2.74 to align buffers used with
    RegQueryValueEx caused cron to fail to operate properly as a service.
    That's fixed.

478. [NT] A minor change was made to the help screen for tar.

Fix Level 2.2.76 Changes:

479. [OS/2] tar -cs didn't work.  It hung in an infinite loop trying
    to write using a zero-length blocksize.  That's fixed.

480. Dskread and dskwrite had a number of bugs that were fixed.  Under
    NT, the -f option didn't work.  Under OS/2, reading/writing non-standard
    data in the boot record didn't work.  All these problems have been

481. "cp \x foobar", where \x is a single-character filename and foobar
    is a non-existant filename in a non-root current directory didn't
    work.  It created an empty foobar directory rather than copying the
    file.  It now works.

482. In Berkeley Compatibility Mode, an endif or endsw that didn't match
    a preceding if or switch, respectively, caused the shell to hang.
    (The shell should have produced error messages and discarded the
    offending token.  Instead, it entered a stuck state.)  Also, if
    breaksw, endif or endsw aliases existed and Berkeley Compatibility
    Mode scripts were run that used these reserved words (predefined
    in this mode with no need for aliases), the shell would hang if the
    scripts were run more than once.  (The shell was locking a critical
    section but not freeing it properly.)  These problems have been

483. In Berkeley Compatibility Mode, onintr now expects a goto label, not
    a statement as an operand, to be more compatible with the older
    BSD C shell.

484. The sort -u option didn't work.  Also, under NT, sort wasn't ignoring
    differences in line ends (\n vs. \r\n) as it should have when comparing
    data read from a file rather than a pipe.  (Files are special-cased
    using NT's mapped file mechanism for better performance and there
    was a bug in sort's parsing of mapped files.)  These problems have
    been fixed.

Fix Level 2.2.77 Changes:

485. "sed s/^^/x/g" didn't work.  The global flag was overriding the ^
    (beginning of line) anchor.  That's fixed.

486. ls didn't show the right colors for readonly system files or
    directories due to bugs in the way it tried to merge the readonly
    color attributes with the system color attributes.  The problem
    could also affect tar, mv, cp and rm.  That's fixed.  Also, although
    it shouldn't have affected them, the C shell, diff, du, more, pwd
    and vol also used that same library, so they've been rebuilt also.

Fix Level 2.2.78 Changes:

487. The shell could crash during filename completion.  E.g., type "ls \wabc",
    move the cursor to the "a", type Tab, then Backspace + \ + Tab.  The
    problem occurred because the cursor would be pointing one past the
    end of a buffer (legal) but not generally aligned on the first character
    of the next buffer as expected by the completion routines.  That's fixed.

Fix Level 2.2.79 Changes:

488. [NT] Tar would complain and quit if, when trying to determine the
    blocksize using fixed block reads on an HP DAT, it tried to back up
    to try again and got an error code indicating it was already at the
    beginning of the tape.  It now knows to ignore that error and continue.

Fix Level 2.2.80 Changes:

489. The change at 2.2.66 to allow the C shell to handle quotes in
    filename completion introduced a bug causing strings with escape
    characters to fail.  That's fixed.

490. A new which.csh script has been added which tells which alias,
    procedure or executable file will be run if a given command is

Fix Level 2.2.81 Changes:

491. Colon editing operators in an alias expansion that involved any
    command or variable substitution caused the shell to hang.  That's

Fix Level 2.2.82 Changes:

492. [NT] Moving a read-only file from one partition to another using
    mv caused the file to lose its read-only attribute.  That's fixed.

493. If the last file in a cpio archive was zero length, it wasn't
    always listed by tar.  That's fixed.

Fix Level 2.2.83 Changes:

494. If an ASCII file was copied to a big-endian tar/cpio archive on disk
    and the length specified in the header required fixup (because \r\n
    line ends were converted to \n's) and that header happened to fall
    on something other than a 4-byte boundary, tar could crash with
    an assertion failure.  That's fixed.

Fix Level 2.2.84 Changes:

495. In Berkeley Compatibility Mode, the C shell now recognizes $var[n-],
    as referring to elements n through last.  Escape sequences are now
    preserved inside single and double quotes.  In those cases where
    escapes are recognized, the Hamilton C shell enhancements for
    sequences such as ^r, ^n, etc., are disabled.  When quotes are
    used in the eof-string for a here document, they must appear exactly
    as used in the original << statement.

496. [NT] The SwitchChars environment variable settings were being ignored
    by the C shell when processing its own command line options.  This was
    deliberate under OS/2 because of the need to work when the C shell
    was used as the default shell but unnecessary under NT.  That's

Fix Level 2.2.85 Changes:

497. A couple minor memory leaks have been fixed.  Under NT, in statements
    involving redirection, buffers were leaked for a while at startup.
    (The leak would fill after a short while and nothing more would
    leak.)  Also, under either NT or OS/2, if a wildcard following a
    redirection operator was ambiguous (i.e., it matched more than one
    filename), the list of names was not freed.

498. Adding onto the end of a cpio archive didn't always work properly;
    tar thought it had run out of data when there was still more in its
    buffers.  That's fixed.  Also, the -s option didn't work properly
    when adding new files to the input.  That also is fixed.

Fix Level 2.2.86 Changes:

499. The min, max, average and read scripts have been added to the
    samples directory.

500. The sh_2_csh conversion utility in the samples directory has been
    improved in a number of ways:
    a) for.sed has been renamed loop.sed and now handles while and
       until loops.
    b) misc.sed now properly rewrites $0 as $scriptname and $1 through $9
       as $0 through $8; it no longer bothers to escape $'s standing alone
       (not needed since build 2.2.g); it now escapes the line end if
       the statement is a pipe that continues on the next line.
    c) expr.sed does a better job of rewriting test statements and now
       properly quotes strings inside expressions.
    d) sh_2_csh.csh now properly handles the case where it should take
       its input from stdin (i.e., no filename is specified) or where
       there are multiple input files (which are concatenated).

501. [Win95] The C shell now knows to flush the input buffer if a child
    is started with stdin connected to the console even if it's run from
    a script or background thread.

502. [NT/Win95] The whoami utility has been added.

503. The new laptop.csh script in the samples directory now offers an
    alternative color scheme that's useful on a laptop computer or with
    a projector.

Fix Level 2.2.87 Changes:

504. ls -l / did not show the filenames if escapesym was set to \ (UNIX-style).
    That's fixed.

505. The C shell's filename completion feature backed up to the preceding
    backquote, if any.  That wasn't sensible and has been fixed.

506. The C shell now insists that an alias is recognized only if it's the
    entire word, not just the first token.  Previously, if an alias "foo"
    existed, defined as "hello", then "foo/bar" was taken as meaning
    "hello bar".  Obviously, the alias expansion should not be done here
    and has been fixed.

507. [NT] The whoami utility has been enhanced to allow it to print the groups
    to which a user belongs.

508. The tar utility has been enhanced in a number of ways:
    a) A separate thread is now used for doing all the low-level i/o to
       read/write the archive.  In most cases, this will have very little
       effect on performance, but when used with a drive lacking any
       hardware buffering, tar may not always have been able to supply
       data fast enough to keep it in streaming mode.  That should no
       longer be a problem.
    b) Continuation tapes are now supported under NT.
    c) Ustar and GNU extension formats for long filenames are now supported.
    d) tar -s didn't work.  It does now.

509. [NT] The line length limitations of all the following utilities have
    been removed:  cut, diff, fgrep, grep, sed, uniq, uuencode, uudecode,
    more, paste and sort.  Also, sort had a bug that caused it to truncate
    the input data without even a warning message if any line was longer
    than 64K characters.  That was fixed also.

510. [OS/2] moreh (the huge more) utility still doesn't support truly
    unlimited length lines, but it will do lines up to 65,000 characters
    long before starting to chop them up into pieces.  Previously, the
    limit was about 4K characters.

Fix Level 2.2.88 Changes:

511. If a read-only, system directory was listed by ls, the colors were
    not reset properly afterward.  That's fixed.

512. [NT 4.0] A bug in NT 4.0 caused it to fail to pass an environment
    string representing the current directory on the current drive when
    starting the C shell.  Children (e.g., pwd) would think they were
    running in the root directory.  This build now has a workaround.

513. Filename completion using Alt-F or Ctrl-F didn't work properly
    if the pattern matched several files.  It does now.  Also, a
    minor resource leak in the filename completion routine has been

514. The getopt utility has been added.

515. The basename.csh and dirname.csh scripts have been added to the
    samples directory.

516. The sh_2_csh scripts have been enhanced as follows:
    a) PATH statements are now special-cased.  E.g.,


       is rewritten as

          set PATH="${PATH};$SRC/bin;$TOOLSDIR/bin"

    b) if the "then" and "do" keywords appear on the same line (separated
       by a semicolon) with the matching "if" or looping construct keyword,
       that's now handled properly.
    c) The -a expression operator is now rewritten as &&.
    d) Expressions containing quoted strings with semicolons, etc.,
       are now handled more sensibly.

Fix Level 2.2.89 Changes:

517. [NT & Win95] The AltGr key wasn't handled properly under Win95 on
    the German keyboard.  Alt-NumericPad key combinations weren't
    recognized at all on the U.S. keyboard and only partially on foreign
    keyboards.  That's fixed.

Fix Level 2.2.90 Changes:

518. The changes made to tar at 2.2.87 introduced a couple bugs.  Listing
    a tar file that ended abruptly could hang.  Trying to append to a tar
    file could crash in some cases.  Trying to append to an archive on
    stdio didn't work.  Also, a long-standing bug caused an incorrect
    error message if no tarfile was specified and the -s (stdio  option)
    was not used instead.  All these bugs should now be corrected.

Fix Level 2.2.91 Changes:

519. [NT] Tar can now handle offsets within an archive up to 2**64 bytes
    (1.84e+7 GB), far more than the previous limit of 2**32 bytes (4.3 GB).
    This improvement was needed now that DAT tapes capable of holding 8GB
    or more have become commonly available.

520. User-defined procedure names were supposed to be case-sensitive
    in the C shell but in fact were not.  That's fixed.

521. The C shell couldn't start .bat or .cmd files if the pathname
    contained spaces or other special characters.  That's fixed.

521. [NT] Stack overflows (usually caused by infinite recursion in a
    user-defined procedure) caused the C shell to crash due to continued
    stack overflows in the diagnostic routines.  Stack overflows are now
    properly handled with a message and a popup.  The C shell still
    can't continue execution, but at least the termination is clean.

522. If the escapesym was set to \, fullpath ../anything would fail,
    claiming the shell was running out of memory.  That's fixed.

523. Colors = none is now recognized to mean turn off all ANSI escape
    sequences from the C shell and all the utilities.  If Colors is
    undefined or set to the null string, that's interpreted as meaning
    "use the colors in effect at the cursor position when the process
    starts up."  Also, we've discovered that the blink attribute is
    actually interpreted by the operating system to mean a bright
    background color (except under OS/2 in full-screen).  The blink
    keyword is now considered obsolete, replaced by "bright" as a
    background color modifier.  The white.csh script has been added
    to the samples directory with an example color scheme using a
    bright white background.

524. [NT] The open utility has been added, which allows an arbitrary
    file to be opened using the application associated with that
    filetype as specified in the registry.

525. [NT] The mt utility can now display offsets and media capacities
    greater than 2**32 as huge integers rather than as <hi>:<lo>

Fix Level 2.2.92 Changes:

526. [NT] The work on improving color support at 2.2.91 introduced a
    bug in that caused highlighting to fail in the C shell and some
    of the utilities.

Fix Level 2.2.93 Changes:

527. [Win95] After running some DOS apps, the console text attributes
    of the first C shell prompt could be scrambled, due to a bug in Win95.
    This build contains a workaround.

Fix Level 2.2.94 Changes:

527. Tar would fail in some assertion statements if fed garbage data as
    an archive file or if it was specifically told to read an archive in
    the wrong bytesex.  That's fixed.

528. A number of random typos were fixed in the help screens in a number
    of builtin and external utilities.  No functional changes were made.

529. The C shell's :e operator could fail if the escapesym was set to \.
    That's fixed.

Fix Level 2.2.95 Changes:

530. Quotes and escape characters weren't processed correctly inside
    tar include files.  That's fixed.

531. Octal escape sequences starting with ^07 or ^7 didn't work properly
    inside wildcards in the shell and in tar.  That's fixed.

532. [OS/2] A fix made at 2.2.90 introduced a bug in processing of command
    line options.  That's fixed.

Fix Level 2.2.96 Changes:

533. A bug in the way the C shell scanned ${...}, $<, $$ and $* variable
    references could cause heap corruptions under rare conditions.  That's

534. [OS/2] The fix at 2.2.85 to fix a minor memory leak caused the
    C shell to hang when a pipeline was run under OS/2 because a lock
    was not being freed.  That's fixed.

535. unproc * caused the C shell to hang under OS/2 and to crash in
    some cases under NT.  That's fixed.

536. [OS/2] unsetenv * caused the C shell to hang under OS/2.  That's

537. [OS/2] Attempting to unsetenv COLORS caused the C shell to crash with
    a protection violation.  That's fixed.

538. The C shell would crash if the :x operator was applied against the
    result of another :-edit of a history reference containing paired quotes.
    For example,

       echo 'now' 'is' 'the' 'time'
       echo !*:s/the/THE/:x

    would fail.  That's fixed.

Fix Level 2.2.97 Changes:

539. Embedded comments have been added.  A "##" token, preceded and
    followed by white space, marks the beginning and end of an embedded
    comment.  For example:

       % echo hello ## comment ## world
       hello world

540. A new per-thread shell variable, scripted, tells if the shell is
    interpreting a command passed on the command line or a shell script
    (but not a sourced script.)

541. A number of improvements were made to Berkeley Compatibility Mode
    to conform more precisely to the behavior of the Berkeley C shell:

    a. The set command now accepts a list of variable names which will
       set to the "set" state (1).  There is no need to type an equal
       sign or a value.  For example:

          set noglob nonomatch

    b. In an expression, character strings are taken as literals.  For

          if ($xyz == -) ....

    c. Comments in the middle of a multi-line statement end at the end
       of that physical line.  They do not run all the way to the end
       of the entire statement.  This was a trick in the Berkeley C shell
       to embed comments into the middle of a statement.  This feature
       is implemented by rewriting these comments as embedded comments
       wherever they occur.
    d. Embedding a newline into a quoted string now has a different
       effect, depending on whether the C shell is running a script
       or not.  If scripted == 1, the newline turns into 2 spaces;
       otherwise, it's preserved as a literal newline.
    e. Inside quotes, the Berkeley C shell required two escape characters
       to escape a newline.  Hamilton C shell will now accept either
       one or two escape characters inside quotes while in Berkeley
       Compatibility Mode as a means of escaping a newline.
    f. It is now possible to test whether a predefined variable is
       set using the $?var (existence) construct in Berkeley mode.
    g. onintr and onintr - are now recognized as enabling or disabling
       interrupts, respectively.

542. If the path variable was set to contain an impossibly long directory
    name, the shell would crash when trying to execute an external program.
    That's fixed.

543. More would crash when up-arrowing through files that contained some
    extremely long lines.  That's fixed.

544. The C shell now allows variables to be named the same as the
    reserved words, e.g., foreach or if or set.

Fix Level 2.2.98 Changes:

545. Tar would crash if it needed to interactively rename a file being
    extracted and the user simply pressed Enter, meaning they wanted to
    accept tar's suggested renaming.  Also, tar had trouble matching
    filenames that started with \ or / when listing or extracting.   Both
    these problems are fixed.

546. Mkdir would print the help screen, rather than the usage message it
    should have generated if you forgot to tell it what you wanted it
    to create.  Also, attempts to recursively create a directory structure
    that started at the root didn't work.  Both these problems are fixed.

Fix Level 2.2.99 Changes:

547. [OS/2] sort -k didn't work.  It'd complain of a usage error.  The
    bug that caused this could also affect paste and uniq.  That's been
    fixed in all these utilities.

548. ls, mv, cp, rm and tar didn't properly construct default color
    values for read-only and system directories.  That's fixed.

Fix Level 2.2.100 Changes:

549. [NT] tar's -a (append) option didn't work properly with tapes.  The
    prompt for continuation tapes specified the wrong tape number (off
    by one) and continuation tapes did not work when listing or extracting
    an archive.  Also, tar could hang if the binary zeros marker (indicating
    end of archive data) was followed by additional blocks.  All these
    problems have been fixed.

550. head, tail and tabs did not consider the NewLine character to be
    a repositioning to the beginning of the line.  That produced strange
    results if they were allowed to do tab expansion on UNIX files with
    only a NewLine at the end of each line.  That's fixed.

551. In Berkeley mode inside backquotes, comments are considered embedded,
    meaning they end at the end of the original source line if the
    line end is escaped, even inside a script.  This change was dictated
    for compatibility with the original Berkeley C shell.

Fix Level 2.2.101 Changes:

552. [NT] The -x (executable) filesystem test didn't work with .csh,
    .cmd and .bat files.  It does now.

Fix Level 2.2.102 Changes:

553. $?0 through $?9 now meaningfully report whether argv[0] through
    $argv[9] are defined.

554. In Berkeley mode, sourcing a script with no arguments (as was required
    by the original Berkeley C shell) causes argv to be unchanged as seen
    by the script.

555. [NT/AXP] On systems with FX32 (the 32-bit Intel simulator) loaded,
    CreateProcess returns a different return code if passed a non-existent
    pathname.  That caused the C shell to generate a spurious message.
    The C shell now knows to expect this new possible return code.  Also,
    as part of the fix, the C shell is now much faster at reporting failure
    when a requested command really can't be found.

556. [NT] A new file, vi-perl.txt, tells where to find excellent vi and
    perl utilities on the Internet.

Fix Level 2.2.103 Changes:

557. paste didn't work properly.  It was off by one on the files and
    wasn't merging in data from the last; occasionally it crashed.  All
    that's fixed.

558. In Berkeley Compatibility Mode, the pattern in a case clause may now
    contain substitutions.

Fix Level 2.2.104 Changes:

559. The fix to 2.2.102 to the source command introduced a bug in Berkeley
    mode that'd cause the shell to crash if one sourced a script from the
    command line that used command substitution.  That's fixed.

560. wc didn't count the last word in a file if the file didn't end with any
    whitespace or end-of-line characters.  The POSIX standard is ambiguous
    on whether this is/is not proper behavior but because most vendors do
    count that last word, the Hamilton wc utility has been changed.

Fix Level 2.2.105 Changes:

561. [NT] Setting the current directory to a shortname didn't work
    properly.  It does now, properly expanding the name out to the
    full path.

562. The variable exists ($?var) function didn't work on MixedCaseDrives,
    CshOptions, NETWORKBUG and SwitchChars.  It does now.

563. [NT] Running NT Backup, then tar, in quick succession would occasionally
    cause tar to fail, reporting that the tape was empty when in fact, the
    drive was simply busy.  This has been fixed.

Fix Level 2.2.106 Changes:

564. [NT] If the initial current directory inherited by the C shell was not
    on the C: drive and the drive letter was in lower case, the C shell did
    not set up its current directories correctly.  That's fixed.

565. It is no longer considered an error if an embedded comment does not
    have a closing ##.  Instead, it's just considered to run until the
    end of the line.  The requirement of a closing ## was breaking too
    many Berkeley C shell existing scripts that had ## at the beginning
    of the line.

566. The nagware popup in the demo version of the C shell now gives our
    new email address and web site URL.

567. A number of messages from the C shell contained advice to type help
    to get additional information about the exception condition.  That
    assumed the user had the help procedure defined and the winhelp sample
    program on his search path, assumptions that weren't always valid.  The
    messages now just give the return code.

568. The a2e.csh and e2a.csh scripts for converting ASCII to EBCDIC and
    back have been added to the samples directory.

569. A number of references to our old email address have been changed
    to reflect our new domain name.

Fix Level 2.2.107 Changes:

570. [Win95/International machines only] Setting an environment variable
    did not work.  The variable was not actually exported to child
    processes.  The C shell was trying to use the UNICODE version of the
    Win32 SetEnvironmentVariable function, which was not supported on Win95.
    This has been corrected.

571. [NT] Additional lines have been added to the samples/skip file to
    filter additional noise-level messages from the compiler involving
    GetFiberData, GetCurrentFiber, math.h and process.h when using the
    ferr filter alias.

Fix Level 2.2.108 Changes:

572. The various filesystem tests, e.g., -d to test if a name is a
    directory, didn't properly lock down the current directories as
    a critical resource and could fail if another thread was active
    changing the current directory.  That's fixed.

Fix Level 2.2.109 Changes:

573. tabs -u didn't work if the TABS environment variable wasn't set.
    That's fixed.  It now properly defaults to TABS=8.

574. tar didn't know to disregard the lengths given for block, character
    and FIFO special devices.  If the archive contained one of these
    files (which have no analog on NT or OS/2 anyway), tar typically
    would complain of a garbled header.  That's fixed.

575. The C shell no longer allows goto statements to goto a label outside
    the scope of a sourced script.  This fixes a long-standing problem
    repeatedly sourcing a script that contains a goto near the beginning
    to a label near the end.  Instead of going to the label at the end,
    the goto went to the label from the previous invocation.  That's fixed.

576. When sourcing a script, the default now is to execute the script but
    not to load it into the history list.  Also, additional options have
    been provided for syntax checking, with/without loading to history.

577. In Berkeley Compatibility Mode, the status result of a pipe has
    been changed to be the rightmost non-zero status, to be more consistent
    with the original C shell.

578. In Berkeley Compatibility Mode, if an error occurred in a sourced
    script, the error message incorrectly showed the name of the script
    that called it.  That's fixed.

579. The timestmp.csh sample script didn't work right if the argument
    was a directory.  It does now.

580. [NT] The open utility didn't work on files specified relative to
    the current directory on another drive due to a limitation in the
    ShellExecuteEx api.  This build contains a workaround.

Fix Level 2.2.110 Changes:

581. [NT] The C shell and all the utilities (in particular, tar, ls, du
    and vol) have all been enhanced to allow the current directory to be
    set to a UNC path.  When the current directory is a UNC path, the
    drive letter will be shown as "@:".  (@ comes just before A in the
    ASCII codeset.)  Previously, the C shell would crash if the user
    attempted to set the current directory to a UNC path.  If it inherited
    a UNC path, the C shell didn't crash, but it didn't work, either.

582. [NT/Alpha] du would fail with a floating point exception on an audio
    CD.  That's fixed.

583. The laptop.csh sample script has been improved to set HIGHLIGHT (used
    by pwd, du, vol, etc.) to bright yellow.

584. [NT] If a path was passed to tar as a shortname on a mixed case drive,
    tar did not properly consider that the mixed case version of the name
    might be longer.  It does now.

585. If the escapesym was set to a \, the C shell was conventionally
    flipping any \ characters appearing in a variable substitution to
    be / characters.  That's fixed.  Also, the C shell will no longer
    perform escape processing on the output of variable and command
    substitutions to be more in keeping generally with the various
    UNIX shells.

586. In Berkeley Compatibility Mode, ignoreerrors will be set to 2 by
    default to be more like the Berkeley UNIX C shell, which continues
    execution even if, e.g., it encounters a nomatch wildcard failure or
    an attempt to execute a non-existent command.

587. The timestmp.csh sample script didn't work if the minutes or seconds
    value in a timestamp was 08 or 09 because it tried to interpret the
    value as octal.  That's fixed.

Fix Level 2.2.111 Changes:

588. Tar didn't properly parse filenames in an archive that contained ".."
    segments and would crash.  That's fixed.

589. [NT] If end-of-data is reached on a tape before any data has been
    found (i.e., the tape is empty), tar no longer bothers prompting for
    a continuation tape.  It just exits.

590. The sh_2_csh\readme file has been updated with our new website address.

Fix Level 2.2.112 Changes:

591. The change at 2.2.102 to improve treatment of argv when sourcing a
    script introduced a problem:  if a script was sourced without any
    arguments in normal mode, any previous argv was lost.  That's fixed.

Fix Level 2.2.113 Changes:

592. More would crash if the Home or End key was pressed when viewing a
    zero-length file.  That's fixed.

593. When reporting a change consisting of 2 or more lines replaced by a
    single line in default listing mode, diff was off by one in its reporting
    of the line number in the new file.  That's fixed.  Also, in that mode,
    diff no longer puts spaces around the "a" (add), "c" (change) or "d"
    delete characters unless requested with the new -s option; this change
    is for better compatibility with UNIX diffs.

594. Paste and sort had a bug in their buffering that could cause them free
    an internal buffer before it was actually free.  The bug could be
    demonstrated with paste under NT:

       % paste
       a  <-- output from paste
       %  <-- new prompt when paste crashes

    This has been fixed.

595. The xargs utility has been added.

596. [NT] The ps -s built-in utility would crash the C shell if one
    of the processes it listed was still starting up and had not yet
    accumulated any runtime.  Also, on some RISC machines under NT 4.0,
    the accumulated _Total time can be impossibly large, causing an
    overflow exception.  All that's been fixed.

597. [NT] A workaround has finally been found that allows redirection
    to CONOUT$ (the console display), in from CONIN$ (the console
    keyboard) or out to/in from CON (display and keyboard) to be inherited
    under NT.

Fix Level 2.2.114 Changes:

598. [NT] Tar would crash if it tried to archive a file that had a
    timestamp earlier than Jan 1, 1970 or later than Feb 7, 2106.  That's
    fixed; dates outside that range are now truncated to the endpoints.

599. The command line editing in the C shell has now been enhanced.  A
    new -P command line option to the C shell tells it that all word-
    oriented operations should treat individual pathname segments as
    separate words.  Also, a bug that caused filename completion to
    be confused by separate words consisting of two quotes (eg., "")
    has been fixed.

600. [NT] If an external command name containing a space (e.g.,
    "c:\program files\hello.exe") was run, argv[0] was incorrectly
    passed as two separate words ("c:\program" + "files\hello.exe").
    That's fixed.  This problem affected both the C shell and cron.

601. [NT] The su (super user), chown (change ownership) and chgrp
    (change group) commands have been added.

602. The env (run a command with a new environment) command has been

603. [NT] Though never reported, it's possible that unsetting an
    environment variable whose name contained foreign characters
    would not have worked.  That's fixed.

604. Minor typos in the xargs help screen were fixed.  Also, when
    using xargs' built-in echo command, xargs now watches for the
    return codes from the write operations to stdout.

605. The entire product has been rebuilt to consider that UNC pathnames
    can be up to 96 characters longer than the longest possible name on
    any given partition.

606. [NT] Cron -status has been dramatically improved to give far more
    complete information about how it's installed and running as a

607. [NT] ls has been enhanced with new -o and -O (owner) and -g and -G
    (group) command line options that cause it to report the owner and/or
    group of a file or directory.

608. [NT] If a hidden environment variable for one of the current
    directories specified a path using /'s rather than \'s, NT has a
    bug that causes it to default to the root on that drive.  The
    C shell now works around that problem by ensuring that it always
    uses backslashes.

609. A bug in the C shell's built-in echo command would cause a
    crash if the string being written was exactly 511 characters long.
    That's fixed.

610. The C shell no longer routinely translates pathnames to lower
    case when setting the path variable.

611. The contact info in the demo versions of the shell and utilities and
    in the readme (install) and readme.too (release notes) files has been
    updated to reflect our new area code.

612. A bug in the buffering algorithm used by paste and sort could
    cause them to produce incorrect results when reading from a pipe,
    particularly if the input contained lots of short records.  That's fixed.

613. [NT] The common routine used by the C shell, env, su and xargs to
    determine what type of application was in an executable file did not
    know about a very old DOS format and would claim they were not
    executable.  That's fixed.

614. The pattern matching routines in the C shell, grep, sed and tar didn't
    treat a - at the end of a [...] list as a literal character.  Instead,
    the - was ignored.  That's fixed.

Fix Level 2.2.115 Changes:

615. [Win95] The enhancement made to ls at 2.2.114 to allow it to list owner
    information caused it to fail to load under Win95 because Win95 omits
    even a stub for one of the required functions.  This has been fixed.

616. [Win95] The chown, chgrp and su utilities would exit with a message
    saying Win95 was not supported even if it was just the help screen
    being requested.  Obviously, you should be able to get help.  That's

617. [NT] Very old builds of NT omitted one of the security functions
    used by su and would cause su to fail to load.  You now get a proper
    error message.

Fix Level 2.2.116 Changes:

618. [NT] The quick fix at 2.2.115 to ls for Win95 broke the -O option,
    preventing ls from doing the poll of other machines on the network.
    (This cause -O to be identical to -o.)  This has been fixed.

619. Sort would crash on very large (million line) files.  That has been

620. The quicksort implementation used in ls and sort had a flaw that could
    produce incorrect results on rare occasions.  That's fixed and the
    result was to improve performance slightly.

621. The new chown and chgrp utilities would complain that a file was on
    a volume that did not support ownership if the filename didn't start
    with a driveletter and colon.  Also, chown didn't know what to do if
    it couldn't get the file attributes of a file or directory it was
    asked to operate on.  That's fixed.

622. more would fail on very large (million line) files.  It would crash,
    it would display incorrect line numbers and incorrect percentages.  Also,
    its appetite for memory could be ferocious doing certain operations such
    as advancing a million lines.  All these problems have been fixed.

623. [NT] ls can now handle filesizes larger than 2**32 bytes = 4 GB in

624. [NT] su and env now have a new -N option which forces child console
    apps to run in a new window.  Also, by default, they now exit rather
    than waiting for the child to complete if the child is running in a
    separate window.  A new -w option means always wait for the child.

625. [NT] su was supposed to prompt for a password if needed.  That feature
    didn't work.  It does now.

626. The C shell's new pathname command line editing using -P didn't
    actually work right.  It does now.  Also, a new -. option means a
    period should also be treated a pathname punctuation character when
    using the -P option.

627. The status variable, which captures the return code from the last
    command that was run, was also being set by any commands run as a
    part of evaluation the command prompt string.  That was certainly
    counter-intuitive and has been fixed; any status results of evaluating
    the prompt are now discarded.

Fix Level 2.3 Changes:

628. [NT] Typos in the help screens in chown, chgrp, env, ls and xargs
    were fixed.

629. [NT] su, env, xargs, would not execute commands whose paths were
    specified as UNC names.  That's fixed.

630. tail -c did not work properly collecting a specified number of bytes
    off the tail end of data read from a pipe.  That's fixed.

631. tar had a number of bugs that were fixed.  Tar would not properly
    resynchronize following after scanning past a garbled header in a
    cpio ASCII or cpio binary file, resulting in repeated spurious messages
    garbled headers on all following files in the archive.  When creating a
    cpio ASCII or cpio binary archive on disk, if it had to fixup a length
    field for an ASCII text file that was converted from NT to UNIX line
    end conventions and that length field happened to fall at just the wrong
    place relative to the buffer boundaries, tar would write an incorrect
    length code.  When extracting from an archive, if a file was listed in
    the archive as starting with "." or ".." (e.g., "./foo"), it could not
    be matched (for extraction) with the same string; it was necessary to
    drop the leading "." or ".." segment, opposite of what should have been

632. sort did not properly consider the preceding field separator as part
    of a field.  This made its count of the fields off by one if the first
    field started with a space.  That's fixed.

633. Moving the cursor forward by word in pathname command line editing
    mode didn't work right in a couple cases.  That's fixed.

634. If a procedure did an "exit 0", the status code from shell was set
    to 1; other values were preserved properly.  That's fixed so that 0
    is now preserved properly also.

635. [NT] The C shell now knows how to run executable binaries and scripts
    that lack any recognizable extension.

636. The C shell now fully supports the #! convention for specifying the
    language processor that should be used to interpret a script.

637. [NT] Installation instructions have been added to allow associating the
   C shell with .csh files.

638. References to the company address have been updated to reflect our
    move on May 1, 1998.

639. A bug in more would cause it to crash in certain situations moving
    around in a file containing lines larger the high water mark for the heap.
    That's fixed.

640. More now allows very long search strings, can use regular expressions
   as search strings and can invert the sense of a match.

641. ls now has a -Q option for quoting any names that contain spaces or
   other special characters and the C shell now has a new :u editing operator
   for unquoting and unescaping.  Together, these changes now make it simple
   to iterate over the contents of a directory that may contain files and
   subdirectories having special characters in their names.

642. Tar now examines the first 32K, not just the first 8K of a file to decide
   if a file is text.  Also, if it guesses wrong, it now issues a warning.

643. [NT] The newer and older -2 option (for rounding to the nearest 2-second
   boundary) didn't work, always reporting that the first file was older than
   the rest, no matter what the actual case.  It works now.

644. [NT] Cron can now be used to interrogate or change the status for any
   service, not just cron itself.

645. Not ranges [^...] did not work properly in the C shell in patterns
   that involved multiple directory levels or in command line editing.  They
   do now.

Fix Level 2.3.a Changes:

646. [NT] On international machines, the setenv command and env utilities
    could fail due a bug in the conversions between Unicode and ASCII.  That's

647. [NT] The dskread and dskwrite utilities now accept a new -S option that
    allows the volume being read/written to be shared with other processes.

648. [NT] Somehow the installation instructions on the distribution
    diskettes never got updated for NT 4.0.  That's fixed.

Fix Level 2.3.b Changes:

649. Tar now supports the new "portable" CPIO format introduced in UNIX
    System V Release 4.

650. Strings now has a new -u option for extracting UNICODE strings as
    ordinary printable ASCII.  It also does a better job of handling
    string terminators, reducing the number of trash lines it prints.

651. More had some long-standing bugs that could bite if one scrolled back
    and forth through text with very, very long lines.  All that's fixed.

Fix Level 2.3.c Changes:

652. A minor improvement was made to the explanation of the strings -u option
    was made in the on-line help.

653. More would fail if page up was attempted on a null file.  That's fixed.

Fix Level 2.3.d Changes:

654. The C shell would only accept #!/bin/csh as an indication that
    a script should be run in Berkeley mode.  It now also accepts

654. du didn't know how to properly report space on a FAT32 partition.
    It does now.

655. ls would occasionally fail if given a UNC resource name that did not
    end in a slash or backslash, e.g., \\x\y$.

656. [NT] The C shell no longer bails out during initialization if it can't
    open a good handle to the keyboard.  It just assumes it's running as a
    detached process (presumably started by CreateProcessAsUser) without
    necessary permissions to access the desktop and window station.

657. The postage.csh sample script has been updated for the new US postal

Fix Level 2.3.e Changes:

658. Escape sequences inside C shell :s/.../.../ search/replace strings
    weren't working and would cause the shell to crash.  That's fixed.

659. The C shell didn't always recognize the #! flags at the beginning of
    a script if there was space following, before the path.  That's fixed.

660. References to $argv[0] in Berkeley mode didn't give the name of the
   script file.  That's fixed.

661. Arg[i] was read-only.  That should have been writable and is now.

662. The rules for validating the size and timestamp fields when reading
    a tar header have been relaxed.  A terminating space or null character
    is no longer required.

663. Tar didn't properly expand a \n as the first character of an ASCII
    file into \r\n.  That works now.

664. New file tests -t (text), -b (binary) and -u (Unicode Ascii text)
    have been added to the C shell.

665. The C shell no longer writes ANSI escapes to stdout during initialization
    if it's just doing a single command from the command line.

Fix Level 2.3.f Changes:

666. The fix to allow argv[i] to be read/written caused following words to
    be discarded.  That's fixed.

Fix Level 2.3.g Changes:

667. The timestmp.csh sample script wasn't quite Y2K correct.  It is now.

668. [NT] Attempting to move a directory that was in use as the current
    directory of a running process should have caused mv to exit immediately
    with an error.  Instead, it'd move all the contents, then complain when
    it couldn't remove the directory itself.  That's fixed.

669. [NT] The ln utility has been added for creating hard links on NTFS

670. [NT] The showdesk utility has been added, allowing everything
    currently open on the desktop (except, optionally, the current
    window) to be minimized to the taskbar.

671. The C shell didn't handle inverted ranges of drive letters
    (e.g., [^c]:*) properly.  That's fixed.

672. The which.csh sample script didn't properly handle commands with
    extensions.  It does now.

Fix Level 2.3.h Changes:

673. [NT] The filebox and dirbox utilities for graphically selecting a file
    or directory have been added.

674. [NT] The setwin utility for hiding the shell window, minimizing it,
    restoring it, etc., has been added.

675. [NT] The shortcut utility has been added for creating or reporting
    a shortcut.

Fix Level 2.3.i Changes:

676. Tar would not properly copy a file or directory from the root of a
    mixed case drive into the archive if the name was specified as a drive
    letter + colon + slash + filename, e.g., c:\hamilton.  That's fixed.
    Another bug that potentially could cause buffer overrun has also been

Fix Level 2.3.j Changes:

677. The diff utility now has a new -o option that allows the maximum
    window size used for comparing the two files to be constrained.  This
    option is intended to hold compute times down to something reasonable
    even if at the expense of a less than perfectly optimal comparison for
    very large (multi-megabyte) files that are very different.

678. [NT] The dirbox utility help screen was incorrect, as if it was for the
    filebox utility.  It should be correct now.  Also, some minor changes were
    made to the option letters and help screen for the filebox utility.
    Also, neither utility was showing their name they'd been invoked by in
    either their help screens or any error messages.  That's fixed.

679. The help screen for cmp failed to document the -- (end of options)
    option.  It does now.

Fix Level 2.3.k Changes:

680. The first character retrieved by a long-form history reference inside a
    quoted string wasn't properly examined for the possibility that it might
    be an escape character.  Thus, the following failed as follows, but
    works now:

      1 C% echo ^"
      2 C% echo "!$ "
      echo "^" "
      csh:  Couldn't find the closing " quote.

681. Cycling with the Tab key through the filenames matched using filename
    completion could crash the shell in situations where the list of matching
    names was sufficiently long.  That's fixed.

682. Command substitutions that evaluated as null strings, e.g.,

      calc `echo`

    could crash the shell by attempting to free a string was in fact not
    allocated on the heap.  That's fixed.

683. Minor changes to the make files and some of the source to allow the
    entire product to be rebuilt for the 64-bit Intel Itanium.

684. [NT] The chown -R (remove ACL) option didn't work.  It does now.

685. [NT] mv and cp now copy the security descriptor and any ACLs associated
    with files or directories being moved or copied, even across partitions.

686. [Win9x] The decimal point key on the number pad didn't work in Num Lock
    mode under Win9x in csh, des, more, su and tar.  (It worked fine under
    WinNT.)  It now works properly on both systems.

687.  head and tail were not supposed to expand tabs if the TABS environment
    variable was not defined.  They did anyway; that's fixed.

688. [Win95] The fix to du at release 2.3.d to support FAT32 partitions
    (on Win98) caused du to fail on Win95.  That's fixed.

Fix Level 2.3.L Changes:

689. The :h and :r editing commands would hang on filenames containing
    illegal colons (e.g., aa:b:c:) and unusual dots (e.g., x..).  That's

690. [NT/x86] Null strings were broken causing incorrect results such as

      % calc `echo` == ''

    due to a bug in a new version of the Microsoft assembler used to build
    the latest versions.  This release incorporates a work-around.

691. [NT] Copying the security descriptor associated with a file occasionally
    caused problems for some customers.  mv and cp now have a -s (simple)
    option to indicate that SD should not be copied.

692. [NT] The showdesk utility didn't wait long enough for all the windows
    to react.

693. The xargs utility now accepts a new -r option allowing the user
    to specify a replacement string that should mark where to insert
    argument words read from stdin into the command template.

694. [NT] The setwin utility now uses a more elegant method of obtaining a
    handle to the console window on those versions of Windows that support it.

695. [Win9x] Trying to change current directory to a UNC name typed with
    forward slashes didn't work.  It does now.

696. [NT] The C shell now captures the service pack level in the new
    WinServicePack shell variable, which is now reported in the ver.csh

697. [NT] Tar can now copy files as large as 68G to/from a tar-format archive;
    for CPIO ASCII archives, the individual filesize limit is 8G; for CPIO
    binary and new portable CPIO archives, the limit is still 4G.  Also, the
    -J and -j options (new portable CPIO formats) didn't work when archiving
    directories; that's fixed.

698. mv, cp and rm now have a -c (continue) option that allow them to continue
    even if one of the input files cannot be processed.

Fix Level 2.3.m Changes:

699. [Win2K] A bad race condition that's been fine for 14 years under OS/2,
    NT and Win9x could cause the shell to fail in pipe statements due to
    the way handle values are more quickly reused under Win2K.  That's fixed.

700. [NT/MIPS] Some integer math was overflowing into FP when it shouldn't
    have.  For example, "@ i = 0; calc i + 2**2" printed 4.000000.  That's

701. The postage.csh sample script has been updated to reflect the latest
    US postage rates.

702. A new decimal.csh sample script has been added which can force a
    string to be interpreted as a decimal number, overcoming the shell's
    usual interpretation of anything starting with zero as octal.

Fix Level 2.3.n Changes:

703. The mv/rm/cp -c (continue) option added at 2.3.L was on all the time,
    not just when selected using the -c flag.  That's fixed.

704. [NT] du didn't work with just a drive letter, it wanted a colon following.
    That wasn't as intended and has been fixed.

Fix Level 2.3.o Changes:

705. All references to our old Waltham address have been updated to reflect
    our move back to Sudbury, Massachusetts.

706. The C shell wasn't properly responding to #!/bin/csh lines at the
    start of a script.  It works now.

707. xargs didn't mention the -r option in help screen.  It does now.

708. [NT] The du -c option didn't work; it always reported on the C: drive.
    That's fixed.

709. The update.csh script has been added to the samples directory.

710. The C shell pattern-matching operators !~ and =~ were supposed to
    treat ':' as an ordinary character.  Instead, it treated it as a
    delimiter.  That's fixed.

Fix Level 3.0 Changes:

711. The longstanding problem with "ps -s | more" is fixed.  Microsoft
    appears to have changed the way the HKEY_PERFORMANCE_DATA\Counters
    object works:  individual names (e.g., "Virtual Bytes") can appear
    multiple times in the list, but only the first counter number is
    actually usable.

712. Support for OS/2, MIPS, PowerPC and Alpha are dropped.

713. All our contact information has been updated.

714. The C shell didn't parse floating point literals of the form nn.nnE-nn
    correctly.  It does now.

715. Postage.csh has been updated with current US postage rates.

    and HIGHLIGHT, so that if you change to something else (e.g., laptop
    colors) then back, everything is restored.

717. The cl.csh sample script has been retired.  (Current versions of cl.exe
    supplied with Microsoft Visual Studio work just fine.)  Also, the
    makecpgm.csh sample script now includes user32.lib.

718. The undocumented csh -Q (quiet) option is now documented.

719. The entire product has been rebuilt using the latest Microsoft
    Visual Studio for Windows XP, though still retaining back-level
    compatibility with earlier Windows releases.

720. The default for MixedCaseDrives (if that variable's not defined) has
    been changed:  Everything is now mixed case, reflecting the fact that
    no one's still using 8.3 filenames anymore.

721. Des is now legal to export, so there's no longer a separate export

722. Shortcut can now be used to set console properties on the shortcut.

723. The C shell will now look for a startup.csh and login.csh file in
    the distribution directory, e.g., d:\Program Files\Hamilton C shell 2003,
    if it doesn't find one in the Home directory.

724. Any inherited value for the SHELL environment variable is discarded;
    the value of SHELL is always set at startup to be the actual path
    to this particular csh.exe.

725. The default colors are changed as follows to assume a white on blue

      Color       Old default             New default

      Deletions   bright red              bright white on red
      Additions   bright green            bright white on green
      MorePrompt  green                   red on white
      MoreFillin  white                   black
      MoreError   bright yellow           bright white on red

727. At last(!), the shell comes with an automated install and uninstall
    using the Microsoft Installer and the Add/Remove Programs applet.

728. The User Guid is now on-line as hypertext and as a Word document.
    PowerPoint slides deck tutorials on the shell and on Tar and MT have
    been added.

729. If a popup was generated (e.g., after the 10th command in the demo)
    after a command that had just scrolled the screen, the popup would be
    off the top of the window.  That's fixed.

Fix Level 3.0.a Changes:

730. The PV_Annuity and FV_Annuity calculations were wrong in finance.csh
    and have been corrected.  Also, the Annuity_PV and Annuity_FV procedures
    have been added.

731. ls encountered a buffer overrun error on any shortname (e.g., c:\progra~1)
    arguments.  That's been fixed.

732. All the hypertext is now Palatino Linotype font rather than Times Roman
    for better readability.

Fix Level 3.0.b Changes:

733. The new auto install would fail on Japanese and other machines with
    localized names for Start Menu\Programs and Desktop.  That's fixed.

734. Chown and chgrp have been substantially reworked to support long Unicode
    filenames and to fix a bug that caused attempts to recursively take (-rT)
    a directory tree to fail.

735. A new -c (continue on error) option has been added to mv, cp and rm.

Fix Level 3.0.c Changes:

736. Tar had a bug that would cause it to crash if it tried to append a small
    file onto an archive on tape that didn't even fill a whole block.  That's

Fix Level 3.0.d Changes:

737. Tar couldn't copy files larger than 4GB (32-bit length) to an archive.
    The new limit is 5.85GB (eleven octal digits.)

Fix Level 3.0.e Changes:

738. Tar would fail when trying to write a continuation tape.  That now

Fix Level 3.0.f Changes:

739. Tar has been substantially improved.  It now supports binary fields in
    a tar header, allowing a maximum filesize of 8.4M petabytes.  Problems
    reading continuation tapes have been fixed and tar now prompts rather
    than simply exiting with an error if it's asked to read a continuation
    tape before the tape has actually been inserted.  After reading a tape,
    tar now ejects as well as rewinds by default.  A new -# option has been
    added as a shortcut for reading and writing the tape drive.  The help
    screen has been somewhat improved.

740. The AllowVistaTapeAccess.csh script and the associated
    AllowVistaTapeAccess.reg file have been added to the Setup directory
    and may be used, as described in the tar -h help screen, to grant
    access to the tape device under Vista Basic or Home Premium.

741. Minor changes were made to chown and chgrp to eliminate a Utf8 sequence
    from the output and to improve the formatting of the help screen.

742. On very rare occasions, the C shell could crash when a thread exited.
    That's fixed.

743. The postage.csh sample script has been updated to reflect the latest
    USPS rate increase as of May 12, 2008.

744. The directory utility has been added.

745. Even if the C shell was installed for "all users," the ACL on it
    would still only allow access to the user who'd installed it.  That's
    fixed; all the files and various start menu shortcuts, etc., are now
    ACL'ed to allow read access by all users and power users and full control
    by administrators, the system, the user who did the installation and
    the creator/owner.

746. The timestmp.csh sample script would fail on dates in 2008 and 2009
    because when it truncated the year to 08 or 09, then tried to print it
    as a 2-digit decimal, the C shell would complain that it wasn't a valid
    octal.  This also affected the fixup.csh sample script, which used

747. The C shell now allows procedure arguments and variable assignments
    of lists of typed values (ints, floats or strings).  Individual elements
    of a variable can themselves be lists of typed values, allowing pseudo-
    two-dimensional arrays.

748. Chained editing operations against variables didn't work properly.  For
    example, $a:2-4:# didn't work.  Also, there was a memory leak in chained
    operations.  Both these problems have been fixed.

749. The vol utility reported a noise value for the high bits of a volume
    serial number due to an uninitialized variable.  That's fixed.

750. The dirname and posxpath sample utilities now return "." if called
    with no argument.  They used to generate error spew.

751. The percentchg sample utility has been added.

752. The read utility didn't work if less than 2 read variables were
    specified.  It now works properly for all cases.

753. The double backquote, `` ... ``, construct has been introduced.  It
    works like the single backquote version of command substitution,
    ` ... `, except that the substituted text is parsed by lines rather
    than words.  This is convenient if the output of the command is a list
    of filenames, one per line, with spaces in the filenames, e.g.,

      25 D% whereis whereis
      D:\Program Files\Hamilton C shell 2003\Bin\whereis.csh
      26 D% mi ``!!``

    It's possible to read a whole file into a variable using this construct.
    For example:

      27 D% @ x = ``cat parse.c``
      28 D% foreach i ($x:q) do calc i; end | mi

    (To avoid having wildcarding being applied to the text, the @-statement
    is used for reading and the :q quoting operator is used in the foreach.)

754. A bug in the wildcarding caused the shell to lock up with a nonsensical
    complaint about running out of memory on seemingly simple constructs
    such as

      echo *\

    has been fixed.

Fix Level 3.0.g Changes:

755. A bug was introduced at 3.0.f that caused floating point values to be
    compared as if they were integers, giving wrong results.  That's fixed.

756. An access violation in echo `` caused by having failed to rebuild one
    of the modules in the C shell in 3.0.f has been fixed.

757. The which sample utility could fail sometimes if used in command
    substitution because it piped data to head to pick off just the first
    item.  If head exited before the first stage completed, the thread would
    exit with a 232 "pipe is being closed" error status.  Which now uses the
    new ``...`` operator with word selection to pick the first line.

758. Fixed typos and arranged options alphabetically in the help screen for

759. Added a comment to the sunrise.csh sample script noting that west
    longitudes and north latitudes are positive.

760. Added mention of the -c option to the option summary lines in the help
    screens for the mv, cp and rm utilities.

761. The AllowVistaTapeAccess.csh and DenyVistaTapeAccess.csh scripts
    now refuse to do anything unless they're run on Vista.  Also, they've
    been moved to the bin directory.

762. The Word and hypertext (HTML) User Guides have been updated.  Also, a
    PDF version has been added.

Fix Level 4.0 Changes:

763. The entire product has been rebuilt under Visual Studio 2008 and a new
    64-bit version has been introduced.  Performance of the 64-bit version
    (measured on an Intel Core i7 machine running 64-bit Vista) is about 2x
    to 3x that of the 32-bit build on the same machine, depending on what's

764. Installation for "all users" is now the default and it no longer requires
    that the installation be run as administrator.

765. The 32-bit version now knows about the 64-bit Vista file system
    redirection mechanism that ordinarily redirects any attempts by 32-bit
    applications to access the \windows\system32 directory to the
    \windows\SysWOW64 directory.   (Vista does this so that 32-bit apps
    will load the 32-bit versions of all the system DLLs.  But it has effect
    of making programs that ship only as 64-bit versions, like telnet.exe,
    inaccessible.)  Once they start up, the C shell and all the utilities now
    disable that redirection, thus allowing them to access the system32

766. The default startup.csh script now unsetenv's the CshTitle variable so
    that if you start a 64-bit version of the C shell from a 32-bit version,
    it'll update the title.

767. The xargs utility has been improved.  If the C shell is used to run the
    command because it appears to be an alias, xargs now allows for the
    possibility the expansion might grow the command by 1024 bytes.  Also,
    xargs used to stop if the child returned any non-zero return code.  That
    was awkward because grep and fgrep return 1 for no matches.  Xargs now
    stops by default only if the return code is > 1.  If it does stop because
    the return code was over the limit, it generates an error message.

768. The postage.csh sample script has been updated to reflect the new US
    postage rates effective May 11, 2009.

769. The deltahrs.csh sample script has been added.

770. The update.csh, ts.csh and duplicat.csh sample scripts now use the
    ``...`` whole-line command substitution operator so they'll work properly
    with filenames containing spaces and special characters.

771. The ls -Q option now inserts escape characters before any special
    characters rather than single-quoting the entire filename.

772. The listreg utility has been added.

773. The shortcut -d (starting directory) option will now be taken as a literal
    rather than expanded to a full path if the first character is a percent
    sign signifying that it's a Windows shell variable, e.g., %USERPROFILE%.

774. The memberi sample script, which does a case-insensitive search to see
    if a given value is a member of a list, has been added and is now used in
    the default login.csh script to determine if the C shell's bin and
    samples directories are already on the search path.

775. The C shell didn't correctly evaluate the path variable if evaluated as
    a typed value in an expression.  It does now.

776. If the C shell is run as administrator on Vista, it prepends
    "Administrator: " to the default title.

777. Cmd.exe has a bug that causes problems running scripts using the /c
    command line option if both the path to the script and at least one
    argument to the script contain spaces.  For example,

      c:\>cat "\Users\Nicole\folder with space\test.cmd"
      echo %1 %2

      c:\>"\users\nicole\folder with space\test.cmd" "hello world"

      c:\>echo "hello world"
      "hello world"

      c:\>cmd /c "\users\nicole\folder with space\test.cmd" "hello world"
      '\users\nicole\folder' is not recognized as an internal or external
      command, operable program or batch file.

    This caused problems for the C shell running commands that invoked .cmd
    or .bat files.  But a workaround, which the C shell now uses is to paste
    an extra set of double quotes around the scriptname and the arguments:

      c:\>cmd /c ""\users\nicole\folder with space\test.cmd" "hello world""

      c:\>echo "hello world"
      "hello world"

778. su required some minor changes for Vista and Win7.  The command line
    argument to CreateProcessAsUser cannot be a pointer to a literal or
    read-only memory.  Also, error mode was adjusted to allow popups if the
    child doesn't start properly (which can happen if you try to su a userid
    that's a member of the administrators group but isn't specifically
    =the= administer userid.

779. The timestmp.csh, basename.csh, percentchg.csh and newfiles.csh sample
    scripts now give error messages or sensible results if invoked without
    any arguments.

780. env now waits for the child to finish if it's running in the same

781. tar no longer quits with an error if it can't read a directory (usually
    because it doesn't have access rights.)  It now just gives a warning and

782. A bug in the set statement that could cause it to fail inside a procedure
    as in this example has been fixed:

      1 C% proc foo()
      2 C? set nonomatch = 2
      3 C? end
      4 C% foo
      5 C% foo
      csh(line 2):  The predefined variable 'nonomatch' cannot be a string.
      > in foo( ) defined at line 1
      < called from line 5

Fix Level 4.0.a Changes:

783. mv, cp and rm are now full Unicode apps.  This means they can now work on
    files and directories with Unicode names they previously couldn't
    manipulate.  Also, error messages when a file or directory is in use by
    another process or if access is denied have been improved.

784. chown no longer requires you specify an owner with the -R (remove ACL)

Fix Level 4.0.b Changes:

785. Formatting of some of the new error messages in mv, cp and rm could crash.
    That's fixed.

786. The uptime sample script has been added.

787. ls is now a full Unicode app and can now traverse directories with long
   Unicode filenames.

788. If argv contained more than one word, references that used expression
   notation would fail.  For example:

    1 C% set argv = hello world
    2 C% calc $argv   # Worked
    hello world
    3 C% calc argv    # Crashed

789. If the output string was exactly 511 characters long, echo would paste
   a superfluous null character onto the end, just before the CR-LF
   combination.  That's fixed.

Fix Level 4.1 Changes:

790. The C shell now knows how to start processes that require elevation.

791. The C shell .msi installation file and all the executables inside it are
    now signed using our new code signing certificate.  This means that when
    you try to install the C shell or anytime elevation is required (in
    particular, when you run su), UAC will post a blue popup indicating that
    the file is from Hamilton Laboratories, a verified publisher.  (Previously,
    UAC showed the yellow popup associated with an unknown publisher.)

792. The su utility has been improved:
      a. It now has a manifest marking it as requiring elevation.
      b. If it's running in a new window because its parent process wasn't
         running elevated, su will:
         1. Size the window and buffer and set up the colors.
         2. Pause, by default, before exiting if it encounters an error
            or displays help information or if the child it starts exits
            with a return code higher than allowed.  (This is to avoid
            messages disappearing before they can be read.)
         3. Use a login shell if it starts the C shell.
      c. "." and ".\." are recognized as aliases for the current user.
         Also, su no longer tries to do a login for the current user; it
         knows it already has the identity and rights it needs.  So it
         treats this case as an elevation instead.
      d. su is now a full Unicode application.
      e. Under Windows 7, GUI applications wouldn't start properly and
         couldn't paint their windows.  That's fixed.  But the Open file
         dialog still fails but this may be a Windows 7 problem related
         to Libraries.

793. Both ``;`` and `;` forms of command substitution used to erroneously
    generate a single word containing the nullstring.  They now properly
    generate no words at all.

794. The which sample utility would generate an error dump if there were
    no matches found.  It now generates no output at all if there are no

795. The 32-bit version of filebox wouldn't run properly on 64-bit Windows 7
    because it tried to turn off filesystem redirection.  That caused the
    GetOpenFileName() system API call to fail.  That's fixed, though it does
    mean the 32-bit version of filebox can't be used to browse the 64-bit
    Windows system directories.

796. chown and chgrp now use the unified longpath code.

797. more now uses the new unified error message code.

798. If the C shell can't find a command, it now sets the status to 2 (file
    not found) instead of 1 (incorrect function.)  This is helpful if you try
    to run a command that's not found with the C shell under either su or xargs.
    su will pause to let you see the message and xargs will stop trying to
    run more commands if the return code > 1.

799. When the C shell is running as administrator, it will now paste
    "Administrator:" onto the front of the console window title when
    it runs a child.

800. The C shell will now change the console window title when it runs a
    command passed on the command line using -c.

801. Searching for a string that's wrapped the end of the line on the screen
    failed to match in more with regex either on or off.  It now works for
    both cases.

802. The C shell's -C and -c options now treat the rest of the command line
    arguments as whole literal words, even if they contain spaces or special
    characters like semicolons and quotes.  The result is that something like
    this now behaves as expected:

       csh -c ls '\Program Files'

803. The C shell no longer insists that commands must end with a new line.
    End-of-file is now accepted.

804. The gi, assoc, ftype, shutdown, reboot, pss, killp and sudo aliases have
    been added to startup.csh.

805. env -i crashed.  It's now fixed.  Also, the start alias in startup.csh
    now uses env -N instead of cmd /c start.

Fix Level 4.1.a Changes:

806. A bug introduced at 4.1 caused several utilities including ls and others
    to crash with an assert failure if the (no longer needed) MIXEDCASEDRIVES
    environment variable was defined.  That's fixed.

807. In sed, if the line number corresponding to the beginning of a range
    was deleted, the range was never entered.  If it was the end of the range,
    the range never exited.  That's fixed.

808. The C shell and utilities now use the same common error message facility.
    The C shell no longer word-wraps its messages.  This also fixes a crash
    that could happen in the C shell due to a buffer overrun in the C shell's
    word wrap code.

809. A bug was introduced into more at 4.1 that caused string search to fail
    to match if there weren't at least 2 characters preceding on the line.
    That's fixed.

810. chown and chgrp could fail to take ownership of some long Unicode paths
    because they hadn't normalized the path and would then crash in the
    error message routine.  That's fixed.

811. The MakeShortcuts setup script used whoami and cacls to set permissions
    but didn't consider the possibility of a user id with a space.  It does now.

812. A change made to su at 4.1 caused it to fail on XP because it didn't give
    sufficient access rights to the desktop and window station to the child.
    That's fixed.

813. A longstanding bug caused the C shell to include the line number in error
    messages even for the current line once either ^C or a blank line was
    typed.  That's fixed.

Fix Level 5.0 Changes:

814. The rcode sample utility now flushes stdout before exiting to ensure that
    its output isn't lost.  (Amazing this bug was there so long.)

815. Fix #813 in 4.1.a traded one bug for another, causing line numbers to fail
    to count blank lines.  That's fixed.

816. The change to the common error message facility at 4.1.a introduced a bug
    that caused the shell to crash when trying to report syntax errors in
    scripts as in the following example.  That's fixed.

      2 C% csh -B
      Hamilton C shell(tm) x64 Release 4.1.a
      Copyright (c) 1988-2010 by Hamilton Laboratories.  All rights reserved.
      [2] 1 C% basename $shell

817. Attempting to mv and cp a relative name from a UNC current directory didn't
    work, producing an error message.  That's fixed.  Also some error messages
    were improved.  By default, mv and cp no longer copy security information;
    to request security information be copied, use the +s option.  This is to
    be more in keeping with Windows convention that security is largely
    inherited through the directory structure.  Also, mv and cp now ignore
    the read-only attribute on a destination directory in keeping with Windows

818. des had buffer overrun bugs in both the input and output routines that
    could cause it to crash.  It was most easily triggered attempting to
    using the -dr options to decrypt a file that wasn't a valid encrypted
    file.  That's fixed.

819. chown -D now uses inheritance rules to construct an ACL, based on the
    ACL on the parent.

820. The splitstring.csh and findinclude.csh scripts have been added to
    the Samples directory.

821. The su utility has been rewritten to use the Secondary Logon service
    when creating a process as a different user and to spawn a child copy
    of itself with the new (either elevated or different user) credentials
    as an interlude that handshakes with the parent so as to pass the
    environment and current directories to command being run.

822. If the current directory is on a UNC drive, filename completion
    always lower-cased the result.  It should have treated the UNC drive
    as normally mixed case.  That's fixed.

823. The pathname editing operators, :h, :r, :t, etc., didn't work sensibly
    on history references containing quotes.  For example,

      1 C% echo 'a b\c d.e f'
      a b\c d.e f
      2 C% echo !$:h
      echo 'a b
      csh:  Couldn't find the closing ' quote.

    The operators now assume that if a closing quote is trimmed off either
    end of a history reference, it should be added back to the final result.
    If a history reference has to be rewritten into a fullpath for editing,
    the operators assume it's safe to remove any paired quotes so long as
    the result is requoted with single quotes.

      1 C% echo 'a b\c d.e f'
      a b\c d.e f
      2 C% echo !$:h
      echo 'a b'
      a b

Fix Level 5.0.a Changes:

824. The fix to the buffer overrun problem in des in 5.0 introduced a
    regression, causing des to occasionally append a few junk characters
    onto the end of a decypted file.  That's fixed.

825. ls "" failed in a needless assert.  It should have simply reported
    that '' (a null filename) does not exist.  That's fixed.

826. Links in the hypertext user guide are no longer underlined, even in
    Google Chrome.

827. chown now works across the network.  Previously, it failed because 
    it tried changing ownership to itself, a foreign userid.  Windows
    only allows locally-known userids as owners.

828. directory now knows to paste a trailing \r\n onto the result.  Also,
    it's now a full Unicode app writing Utf8 output and can accept a list
    of special folder names.

Fix Level 5.0.b Changes:

829. binedit, diff, env, exec, paste, shortcut, sort, su, uniq, uu and
    xargs all had the same off-by-one error in parsing command line options
    that caused them to crash if the last argv word was an option that
    expected an argument in the next word.  They should have given a
    usage error message.  That's fixed.

830. sort had an off-by-one error in the way it parsed fields, causing it
    to include the preceding separator in each field.  That's wrong but
    it usually worked because every comparison always had the same 
    erroneous prefix for both records.  It failed with numeric fields
    if the separator was something other than a comma.  That's fixed.

Fix Level 5.0.c Changes:

831. The C shell had two bugs affecting list value assignments.  One was
    caused by freeing memory that was still in use here:

     1 C% set a = now is the time
     2 C% set b = hello world
     3 C% set c =
     4 C% @ c[0] = 1/7
     5 C% @ c[1] = b
     6 C% @ c[0] = a
     7 C% calc c

   The other was an assignment (=) inside an if that was supposed to
   test (==) if an indexed value was itself a list and if so,
   free the list.

     1 C% set a = now is the time
     2 C% set c =
     3 C% @ c[0] = 1/7
     4 C% @ c[0] = a
     5 C% calc c

832. The C shell had two memory leaks affecting command substitution, e.g.,
    demonstrated running the following with heapstats enabled:

     1 C% for i = 1 to 10 do
     2 C? echo `echo hello`
     3 C? heapstat
     4 C? end

    One leak affected both `...` and ``...`` forms, the other only the
    latter form.  Both leaks have been fixed.

833. If a list was passed to a procedure, it wasn't properly matched to the
    formal arguments.  It did this, which was wrong; $#x should (and now does)
    evaluate to 2.

     1 C% set a = hello world
     2 C% proc f(x)
     3 C? echo $#x $x
     4 C? end
     5 C% @ f(a)
     1 hello world

    x was improperly set to a single "word", consisting of a list of 2 words.
    It should have been set to the list of 2 words.

834. The C shell leaked the result value of an @ statement if the result
    was a list of words or values, not just a number or a string.  E.g.,

     1 C% set a = hello world
     2 C% for i = 1 to 10 do
     3 C? @ b = a
     4 C? heapstat
     5 C? end

    (The calc statement was fine because it always coerced results to strings,
    which it freed.)

835.  The result of substr(), upper(), lower() and reverse() was always
    memory leaked.  That's fixed.

Fix Level 5.0.d Changes:

836.  The sort utility's -n and -N fields now expect integers to be decimal
    only, consistent with the Posix specification.  The old behavior, also
    accepting octal and hex integers, is available as -x and -X.

Fix Level 5.0.e Changes:

837.  The copyright dates in whereis.csh and in all the samples files have
    been updated.

838.  The postage.csh sample script has been updated to reflect US postage
    rates effective January 22, 2012.

839.  If su's parent process was running as administrator, it couldn't tell,
    causing it to think it was running in a new window.  That caused it to
    re-initialize the window and pause before exiting when it shouldn't.
    That's fixed.

Fix Level 5.0.f Changes:

840.  csh -N (no space added after file completion) is now the default.  A
    new -S option allows adding a space.

841.  fullmixedpath with no operand crashed the C shell with an access violation.
    That's fixed.

842.  Exiting a script with a return code of 995 (ERROR_OPERATION_ABORTED)
    was incorrectly interpreted as a Ctrl-C interrupt.  Also, exiting with an
    actual Ctrl-C resulted in status code 995.  The correct status code when
    exiting from an interrupt under Windows is 0.  The problem could be
    demonstrated as follows:

       onintr echo "Someone pressed ctrl+c..."
       echo "exit 995" > testexit.csh

843.  Any readme files that lacked an extension in the distribution have been
    renamed as Readme.txt files.

844.  Labels in sed have been improved.  Sed didn't correctly parse labels in
    : (definition), b (branch) and t (test) operations unless the label name was
    followed by white space.  It should have and now accepts semicolons and
    right curly braces as delimiters, as in this example:

      sed ':top; s/a/b/'   

    Also, branching to a label outside a block used recursion.  That usually
    worked but not if it kept looping; eventually it would overrun the stack,
    as in this example.  (It's an infinite loop but it should still work
    and shouldn't crash.)

      sed ':top ; { P; b top }'

    Labels in sed are now scoped and can be redefined inside a nested {...}
    group and forward references to the nested redefinition work as they
    should.  Labels can also be redefined at a given nesting level.  Previous
    references continue to refer to the previous definition, new references
    refer to the new one.  Branching to a label in an outer group properly
    exits the group, unwinding the stack.  But because they're now scoped,
    it is not possible to branch to a label inside a nested group (just as
    in any other HLL.)  All -e, -f and command line scripts are considered
    to be one big nesting level sharing the same label names.  These examples
    now work:

     sed 'b top; :top; s/a/b/; :top; s/b/C' 
     sed ':top; /a/{s/a/b/; b top}'
     sed 'b top; :top; /a/{b top; :top; s/a/b/; :top; s/b/C/}; /a/{b top}'

845.  If directory is invoked with no foldernames specified as arguments,
    it now lists the symbolic names and locations of all the special
    folders for the individual user or for all users.

846.  The Win32 api GetFileAttributes() fails on \pagefile.sys because the
    file is in use, making it appear the file doesn't exist.  The workaround
    when GetFileAttributes fails is to use FindFirstFile to retrieve the
    attributes.  This change affects the C shell, chgrp, chmod, chown, cmp,
    cp, cron, diff, ln, ls, mkdir, mv, rm, tar, touch and uu.

Fix Level 5.1 Changes:

847.  Fix 846 introduced a regression to the Unicode apps that's now fixed.

848.  The broken sunrise.csh and unixprof samples, the archaic Microsoft
    Word and PDF versions of the User Guide and the archaic PowerPoint
    tutorials and the unnecessary shortcuts to the release notes have
    all been deleted from the distribution.

849.  The default startup.csh setkeys F1 to opening the the user guide.

850.  The output of setkey <no operands> wasn't formatted properly.  It is now.

Fix Level 5.1.a Changes:

851.  Login.csh had a huge mistake in trying to set cdpath to include all
    the *:\"Program Files" directories.  This was very slow if you have
    network drives.  The default cdpath is now just your home directory
    and the desktop directories.  The comments in both login.csh and
    startup.csh have also been updated.

852.  Improvements to the formatting of the user guide including switching
    from Palatino (serif) to Verdana (sans serif) font, using bordered text
    instead of images for the keys on the keyboard (e.g., in the page
    on command line editing), highlighting keywords, command names, etc.,
    with a border and a light blue background and using larger fixed pitch
    font in many of the tables.

Fix Level 5.1.b Changes:

853. sort now has additional options:  -R to normalize line ends,
    -s stable sort and -v verbose output from a -c check sort.  Check
    sorts with -c always reported the input was ordered even if it wasn't;
    that's fixed.

854. filebox -h had a typo.  Use -i to specify an initial directory, not
    -d.  Also, the -e option now follows the same syntax as -f and is
    automatically added to the head of the list of filters.

855. dirbox now uses the new resizable dialog box, the options have been
    reduced to only those that make sense when choosing a file or directory
    and the -i initial path option now works.  If a non-existent path is
    typed into the edit box, the OK button is greyed.

856. Path hashing is now turned on before running startup.csh and login.csh.
    This was causing a problem with the default login.csh script, which
    saved and restored the state but ended up causing login copies to
    run with path hashing turned off.

857. The undocumented -t (text), -b (binary) and -u (unicode) file test
    operators added at 2.3.e have been removed.

858. The -x (executable) and -z (zero length) file test operators weren't
    thread-safe.  They didn't properly setup and release the current
    directories when calling Win32 file operations.  The could fail if
    another thread changed the process directories, e.g.:

       cd .. &; calc -x hello.exe

859. New -t (timestamp) and -s (size) file operators have been added.

    -t returns a string of the form "YYYY-MM-DD hh:mm:ss", e.g.,
    "2012-11-25 14:25:04".  If the path doesn't exist or doesn't have
    a timestamp (as, e.g., is the case for C:\) -t returns null;
    this is not an error.  The -t operator allows times to be compared
    or pattern-matched.  For example

       foreach i ( * ) if (-t $i =~ "2012*") echo $i changed in 2012; end
       if (-t $a > -t $b) echo $a is newer than $b

    -s returns the size in bytes.  If the path doesn't exist or is a
    directory, -s returns null; this is not an error.

Fix Level 5.1.c Changes:

860. sort didn't parse short records properly.  If a key specified a
    character offset that was past the end of a particular record,
    comparisons of that record were unpredictable.  That's fixed.

861. The -l (logging) option for mv, cp and rm had a bug that caused
    them to spew garbage ANSI sequences resulting in black on black

Fix Level 5.2 Changes:

862. The random and xor utilities have been added.

863. The periodic demo version popup appeared when it shouldn't have.
    That's fixed.

864. A bug in the code that executes a compiled set indexed variable
    to a string literal statement was fixed.  It was grabbing the literal
    without making its own copy.  It worked if the compiled statement was
    only executed once, but not if it ever got re-executed, e.g., in a
    loop or a compiled procedure.  When you later tried to access the
    value in the variable, you hit a null pointer.  For example:

      for i = 1 to 2 do
         set x[0] = x
      echo $x  # failed with a null pointer

865. Passing a null string as a parameter to a procedure caused the
    shell to hang.  During evaluation, the null string caused a linked
    list to be built with a loop in it.  This is fixed.

      proc p( a )
         echo $a
      set x =
      @ p( x )  # hung

866.  Aliases have been added to the default startup.csh script for vim
    and gvim, using env to delete the SHELL variable before starting the
    Vim editors.  Vim only knows how to use cmd.exe when "shelling out"
    using the :!  commmands.  If the SHELL variable is defined, Vim uses
    it, but assumes it points to cmd.exe.  

867. Aliases for su and sudo in the default startup.csh script now use
    the env utility to delete the LAYER environment variable before
    invoking su.exe.  This avoids the prompt in the new window appearing
    as "[2] 1 C%".  Also, the LAYER variable is now defined as all caps
    in startup.csh.

868.  A bug in the evaluation of indexed variables caused the shell to
    misinterpret a binary int as a float, causing this to fail.  It's
    now fixed.

      set v = 1 2
      @ v[1] *= 3

869.  If the env -N (new screen) option is specified, env no longer waits
    for the child unless -w is also specified.

870.  The chunk size used by the split utility was calculated as a 32-bit
    signed number, meaning the largest chunk size was 2GB.  Split now
    uses 64-bit unsigned arithmetic, allowing a maximum chunk size of
    roughly 17 exabytes.  (An exabyte is 10**18 bytes.)

871.  The hypertext user guide has been revised with better navigation and
    additional topics.

872.  An uninitialized variable randomly caused sed to crash in branches
    to forward references.  That's fixed.

Fix Level 5.2.a Changes:

873.  mv now sets the security descriptors on the output via inheritance from
    the directory it's moved to.

874.  The mouse wheel is now disabled by default in more on startup but can be
    toggled with the w command.

875.  getopt now preserves switchchars.

876.  A bug in the common error message routine that was intended to report a
    garbled color specification, e.g., "setenv DIRECTORIES = normal", has
    been fixed.

877.  sed will now compare \r\n equal to \n.

Fix Level 5.2.b Changes:

878.  More wouldn't correctly match anything at the end of a line.  That's

Fix Level 5.2.c Changes:

879.  The C shell allowed UNC (\\machine\resource\path) names on the cdpath
    but would crash if you attempted to "cd +c" to one of them.  That's fixed.

Fix Level 5.2.d Changes:

880.  The vectormath.csh sample script has been added.

881.  A bug that caused the C shell to crash randomly when a thread exited,
    caused by failing to lock a shared variable, has been fixed.

882.  A bug that caused the C shell to crash if an argument to a user-
    defined procedure had the same name as a builtin variable has been

Fix Level 5.2.e Changes:

881.  If a here document (using <<) contained a substitution plus a left
    bracket followed immediately by a double quote, the result contained
    a spurious circumflex.  That's fixed.

Fix Level 5.2.f Changes:

882.  The same mistake that caused random crash in thread exit fixed at
    one place in the code at 5.2.d also appeared in two other places, now

Fix Level 5.2.g Changes:

883.  A new -x command line option has been added to the C shell for
    compatibility with GNU tcsh and make. The first argument word is
    taken as the command, to be parsed as a string.  The remaining
    arguments are placed in the shell argv variable.

884.  Additional work chasing the bug described at 881.

885.  Fixed broken links to the User Guide home page in the navigation
    panels on the online man pages for the utilities and samples. 

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.  Ctrl-S and Ctrl-Q flow control to the console window is not supported.

3.  Under Windows 7, the 32-bit version of the C shell can't tell when a child
    console application, e.g., su, will start up as an elevated process in a
    separate window.  So it waits for it to complete rather than automatically
    prompting for a new command.  The workaround is to use the & operator to
    tell the C shell to run it as a background process.

4.  Long Unicode paths (e.g., \\?\c:\Windows) on the command line don't get
    passed to child processes correctly because the wildcarding done by the
    Microsoft setargv and wsetargv library routines fails if the path actually
    exists; it works if the path does not exist.  The workaround is to add an
    extra backslash to the front of the path.

Thank you for using Hamilton C shell.

                  Nicole Hamilton
                  March 5, 2017

                  Hamilton Laboratories
                  16645 NE 46th Street
                  Redmond, WA  98052-5441

     Telephone:   425-497-0102
     Cellphone:   425-765-9574
         Email:   hamilton@hamiltonlabs.com
      Web Site:   https://www.hamiltonlabs.com

Previous | Next