Vendor branch: upgrade tcsh from 6.18.01 to 6.19.00
authorJohn Marino <draco@marino.st>
Wed, 4 Nov 2015 13:14:22 +0000 (14:14 +0100)
committerJohn Marino <draco@marino.st>
Wed, 4 Nov 2015 14:37:04 +0000 (15:37 +0100)
50 files changed:
contrib/tcsh-6/Copyright
contrib/tcsh-6/README
contrib/tcsh-6/complete.tcsh
contrib/tcsh-6/config/bsd4.4
contrib/tcsh-6/config_f.h
contrib/tcsh-6/dotlock.c [new file with mode: 0644]
contrib/tcsh-6/dotlock.h [new file with mode: 0644]
contrib/tcsh-6/ed.chared.c
contrib/tcsh-6/ed.inputl.c
contrib/tcsh-6/ed.refresh.c
contrib/tcsh-6/ed.screen.c
contrib/tcsh-6/ed.term.h
contrib/tcsh-6/gethost.c
contrib/tcsh-6/glob.c
contrib/tcsh-6/patchlevel.h
contrib/tcsh-6/sh.c
contrib/tcsh-6/sh.char.h
contrib/tcsh-6/sh.decls.h
contrib/tcsh-6/sh.dir.c
contrib/tcsh-6/sh.dol.c
contrib/tcsh-6/sh.err.c
contrib/tcsh-6/sh.exec.c
contrib/tcsh-6/sh.exp.c
contrib/tcsh-6/sh.file.c
contrib/tcsh-6/sh.func.c
contrib/tcsh-6/sh.glob.c
contrib/tcsh-6/sh.h
contrib/tcsh-6/sh.hist.c
contrib/tcsh-6/sh.init.c
contrib/tcsh-6/sh.misc.c
contrib/tcsh-6/sh.print.c
contrib/tcsh-6/sh.proc.c
contrib/tcsh-6/sh.sem.c
contrib/tcsh-6/sh.set.c
contrib/tcsh-6/sh.time.c
contrib/tcsh-6/tc.alloc.c
contrib/tcsh-6/tc.const.c
contrib/tcsh-6/tc.decls.h
contrib/tcsh-6/tc.func.c
contrib/tcsh-6/tc.nls.c
contrib/tcsh-6/tc.nls.h
contrib/tcsh-6/tc.printf.c
contrib/tcsh-6/tc.prompt.c
contrib/tcsh-6/tc.str.c
contrib/tcsh-6/tc.who.c
contrib/tcsh-6/tcsh.man
contrib/tcsh-6/tw.color.c
contrib/tcsh-6/tw.comp.c
contrib/tcsh-6/tw.decls.h
contrib/tcsh-6/tw.parse.c

index 6ba10c4..b5049c7 100644 (file)
  * 2. Redistributions in binary form must reproduce the above copyright
  *    notice, this list of conditions and the following disclaimer in the
  *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *     This product includes software developed by the University of
- *     California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
+ * 3. Neither the name of the University nor the names of its contributors
  *    may be used to endorse or promote products derived from this software
  *    without specific prior written permission.
  *
index b05f589..42f944f 100644 (file)
@@ -1,4 +1,4 @@
-This is tcsh version 6.18.01.  Tcsh is a version of the Berkeley
+This is tcsh version 6.19.00.  Tcsh is a version of the Berkeley
 C-Shell, with the addition of: a command line editor, command and file
 name completion, listing, etc. and a bunch of small additions to the
 shell itself.
index 4fb1ad2..a920dfe 100644 (file)
@@ -1,5 +1,5 @@
 #
-# $tcsh: complete.tcsh,v 1.52 2010/05/07 17:54:13 christos Exp $
+# $tcsh: complete.tcsh,v 1.55 2014/09/27 07:08:45 kim Exp $
 # example file using the new completion code
 #
 # Debian GNU/Linux
 # Cleanup by Martin A. Godisch <martin@godisch.de>.
 
 onintr -
-if (! $?prompt) goto end
-
-if ($?tcsh) then
-    if ($tcsh != 1) then
-       set rev=$tcsh:r
-       set rel=$rev:e
-       set pat=$tcsh:e
-       set rev=$rev:r
+if ( ! $?prompt ) goto end
+
+if ( $?tcsh ) then
+  if ( $tcsh != 1 ) then
+    set rev=$tcsh:r:r
+    set rel=$tcsh:r:e
+    if ( $rev > 6 || ( $rev > 5 && $rel > 1 ) ) then
+      set _has_complete=1
     endif
-    if ($rev > 5 && $rel > 1) then
-       set _complete=1
-    endif
-    unset rev rel pat
+  endif
+  unset rev rel
 endif
 
-if ($?_complete) then
-    set noglob
-    if ( ! $?hosts ) set hosts
-    foreach f ("$HOME/.hosts" /usr/local/etc/csh.hosts "$HOME/.rhosts" /etc/hosts.equiv)
-        if ( -r "$f" ) then
-           set hosts = ($hosts `grep -v "+" "$f" | grep -E -v "^#" | tr -s " " "       " | cut -f 1`)
-       endif
-    end
-    if ( -r "$HOME/.netrc" ) then
-       set f=`awk '/machine/ { print $2 }' < "$HOME/.netrc"` >& /dev/null
-       set hosts=($hosts $f)
-    endif
-    if ( -r "$HOME/.ssh/known_hosts" ) then
-       set f=`cat "$HOME/.ssh/known_hosts" | cut -f 1 -d \ ` >& /dev/null
-       set f=`cat "$HOME/.ssh/known_hosts" | cut -f 1 -d \ | sed -e 's/,/ /g'` >& /dev/null
-       set hosts=($hosts $f)
-    endif
-    unset f
-    if ( ! $?hosts ) then
-       set hosts=(hyperion.ee.cornell.edu phaeton.ee.cornell.edu \
-                  guillemin.ee.cornell.edu vangogh.cs.berkeley.edu \
-                  ftp.uu.net prep.ai.mit.edu export.lcs.mit.edu \
-                  labrea.stanford.edu sumex-aim.stanford.edu \
-                  tut.cis.ohio-state.edu)
-    endif
+if ( ! $?_has_complete ) goto end
 
-    complete ywho      n/*/\$hosts/    # argument from list in $hosts
-    complete rsh       p/1/\$hosts/ c/-/"(l n)"/   n/-l/u/ N/-l/c/ n/-/c/ p/2/c/ p/*/f/
-    complete ssh       p/1/\$hosts/ c/-/"(l n)"/   n/-l/u/ N/-l/c/ n/-/c/ p/2/c/ p/*/f/
-    complete xrsh      p/1/\$hosts/ c/-/"(l 8 e)"/ n/-l/u/ N/-l/c/ n/-/c/ p/2/c/ p/*/f/
-    complete rlogin    p/1/\$hosts/ c/-/"(l 8 e)"/ n/-l/u/
-    complete telnet    p/1/\$hosts/ p/2/x:'<port>'/ n/*/n/
-
-    complete cd        p/1/d/          # Directories only
-    complete chdir     p/1/d/
-    complete pushd     p/1/d/
-    complete popd      p/1/d/
-    complete pu        p/1/d/
-    complete po        p/1/d/
-    complete complete  p/1/X/          # Completions only
-    complete uncomplete        n/*/X/
-    complete exec      p/1/c/          # Commands only
-    complete trace     p/1/c/
-    complete strace    p/1/c/
-    complete which     n/*/c/
-    complete where     n/*/c/
-    complete skill     p/1/c/
-    complete dde       p/1/c/ 
-    complete adb       c/-I/d/ n/-/c/ N/-/"(core)"/ p/1/c/ p/2/"(core)"/
-    complete sdb       p/1/c/
-    complete dbx       c/-I/d/ n/-/c/ N/-/"(core)"/ p/1/c/ p/2/"(core)"/
-    complete xdb       p/1/c/
-    complete gdb       n/-d/d/ n/*/c/
-    complete ups       p/1/c/
-    complete set       'c/*=/f/' 'p/1/s/=' 'n/=/f/'
-    complete unset     n/*/s/
-    complete alias     p/1/a/          # only aliases are valid
-    complete unalias   n/*/a/
-    complete xdvi      n/*/f:*.dvi/    # Only files that match *.dvi
-    complete dvips     n/*/f:*.dvi/
-    if ($?traditional_complete) then
-        complete tex   n/*/f:*.tex/    # Only files that match *.tex
-    else
-        complete tex   n/*/f:*.{tex,texi}/     # Files that match *.tex and *.texi
-    endif
-    complete latex     n/*/f:*.{tex,ltx}/
-    complete su                c/--/"(login fast preserve-environment command shell \
-                       help version)"/ c/-/"(f l m p c s -)"/ \
-                       n/{-c,--command}/c/ \
-                       n@{-s,--shell}@'`cat /etc/shells`'@ n/*/u/
-    complete cc        c/-[IL]/d/ \
-              c@-l@'`\ls -1 /usr/lib/lib*.a | sed s%^.\*/lib%%\;s%\\.a\$%%`'@ \
-                       c/-/"(o l c g L I D U)"/ n/*/f:*.[coasi]/
-    complete acc       c/-[IL]/d/ \
-       c@-l@'`\ls -1 /usr/lang/SC1.0/lib*.a | sed s%^.\*/lib%%\;s%\\.a\$%%`'@ \
-                       c/-/"(o l c g L I D U)"/ n/*/f:*.[coasi]/
-    complete gcc       c/-[IL]/d/ \
-                       c/-f/"(caller-saves cse-follow-jumps delayed-branch \
-                              elide-constructors expensive-optimizations \
-                              float-store force-addr force-mem inline \
-                              inline-functions keep-inline-functions \
-                              memoize-lookups no-default-inline \
-                              no-defer-pop no-function-cse omit-frame-pointer \
-                              rerun-cse-after-loop schedule-insns \
-                              schedule-insns2 strength-reduce \
-                              thread-jumps unroll-all-loops \
-                              unroll-loops syntax-only all-virtual \
-                              cond-mismatch dollars-in-identifiers \
-                              enum-int-equiv no-asm no-builtin \
-                              no-strict-prototype signed-bitfields \
-                              signed-char this-is-variable unsigned-bitfields \
-                              unsigned-char writable-strings call-saved-reg \
-                              call-used-reg fixed-reg no-common \
-                              no-gnu-binutils nonnull-objects \
-                              pcc-struct-return pic PIC shared-data \
-                              short-enums short-double volatile)"/ \
-                       c/-W/"(all aggregate-return cast-align cast-qual \
-                              comment conversion enum-clash error format \
-                              id-clash-len implicit missing-prototypes \
-                              no-parentheses pointer-arith return-type shadow \
-                              strict-prototypes switch uninitialized unused \
-                              write-strings)"/ \
-                       c/-m/"(68000 68020 68881 bitfield fpa nobitfield rtd \
-                              short c68000 c68020 soft-float g gnu unix fpu \
-                              no-epilogue)"/ \
-                       c/-d/"(D M N)"/ \
-                       c/-/"(f W vspec v vpath ansi traditional \
-                             traditional-cpp trigraphs pedantic x o l c g L \
-                             I D U O O2 C E H B b V M MD MM i dynamic \
-                             nodtdlib static nostdinc undef)"/ \
-                       c/-l/f:*.a/ \
-                       n/*/f:*.{c,C,cc,o,a,s,i}/
-    complete g++       n/*/f:*.{C,cc,o,s,i}/
-    complete CC        n/*/f:*.{C,cc,cpp,o,s,i}/
-    complete rm        c/--/"(directory force interactive verbose \
-                       recursive help version)"/ c/-/"(d f i v r R -)"/ \
-                       n/*/f:^*.{c,cc,C,h,in}/ # Protect precious files
-    complete vi        n/*/f:^*.[oa]/
-    complete bindkey    N/-a/b/ N/-c/c/ n/-[ascr]/'x:<key-sequence>'/ \
-                       n/-[svedlr]/n/ c/-[vedl]/n/ c/-/"(a s k c v e d l r)"/\
-                       n/-k/"(left right up down)"/ p/2-/b/ \
-                       p/1/'x:<key-sequence or option>'/
-
-    complete find      n/-fstype/"(nfs 4.2)"/ n/-name/f/ \
-                       n/-type/"(c b d f p l s)"/ n/-user/u/ n/-group/g/ \
-                       n/-exec/c/ n/-ok/c/ n/-cpio/f/ n/-ncpio/f/ n/-newer/f/ \
-                       c/-/"(fstype name perm prune type user nouser \
-                            group nogroup size inum atime mtime ctime exec \
-                            ok print ls cpio ncpio newer xdev depth \
-                            daystart follow maxdepth mindepth noleaf version \
-                            anewer cnewer amin cmin mmin true false uid gid \
-                            ilname iname ipath iregex links lname empty path \
-                            regex used xtype fprint fprint0 fprintf \
-                            print0 printf not a and o or)"/ \
-                            n/*/d/
-
-    complete -%*       c/%/j/                  # fill in the jobs builtin
-    complete {fg,bg,stop}      c/%/j/ p/1/"(%)"//
-
-    complete limit     c/-/"(h)"/ n/*/l/
-    complete unlimit   c/-/"(h)"/ n/*/l/
-
-    complete -co*      p/0/"(compress)"/       # make compress completion
-                                               # not ambiguous
-    if ($?traditional_complete) then
-        complete zcat  n/*/f:*.Z/
-    else
-        # "zcat" may be linked to "compress" or "gzip"
-        if (-X zcat) then
-            zcat --version >& /dev/null
-            if ($status != 0) then
-                complete zcat  n/*/f:*.Z/
-            else
-                complete zcat  c/--/"(force help license quiet version)"/ \
-                               c/-/"(f h L q V -)"/ n/*/f:*.{gz,Z,z,zip}/
-           endif
-        endif
-    endif
+if ( ! $?noglob ) set noglob _unset_noglob
 
-    complete finger    c/*@/\$hosts/ n/*/u/@ 
-    complete ping      p/1/\$hosts/
-    complete traceroute        p/1/\$hosts/
-
-    complete {talk,ntalk,phone}        p/1/'`users | tr " " "\012" | uniq`'/ \
-               n/*/\`who\ \|\ grep\ \$:1\ \|\ awk\ \'\{\ print\ \$2\ \}\'\`/
-
-    complete ftp       c/-/"(d i g n v)"/ n/-/\$hosts/ p/1/\$hosts/ n/*/n/
-
-    # this one is simple...
-    #complete rcp c/*:/f/ C@[./\$~]*@f@ n/*/\$hosts/:
-    # From Michael Schroeder <mlschroe@immd4.informatik.uni-erlangen.de> 
-    # This one will rsh to the file to fetch the list of files!
-    complete rcp 'c%*@*:%`set q=$:-0;set q="$q:s/@/ /";set q="$q:s/:/ /";set q=($q " ");rsh $q[2] -l $q[1] ls -dp $q[3]\*`%' 'c%*:%`set q=$:-0;set q="$q:s/:/ /";set q=($q " ");rsh $q[1] ls -dp $q[2]\*`%' 'c%*@%$hosts%:' 'C@[./$~]*@f@'  'n/*/$hosts/:'
-
-    complete dd c/--/"(help version)"/ c/[io]f=/f/ \
-               c/conv=*,/"(ascii ebcdic ibm block unblock \
-                           lcase notrunc ucase swab noerror sync)"/,\
-               c/conv=/"(ascii ebcdic ibm block unblock \
-                         lcase notrunc ucase swab noerror sync)"/,\
-               c/*=/x:'<number>'/ \
-               n/*/"(if of conv ibs obs bs cbs files skip file seek count)"/=
-
-    complete nslookup   p/1/x:'<host>'/ p/2/\$hosts/
-
-    complete ar c/[dmpqrtx]/"(c l o u v a b i)"/ p/1/"(d m p q r t x)"// \
-               p/2/f:*.a/ p/*/f:*.o/
-
-    # these should be merged with the MH completion hacks below - jgotts
-    complete {refile,sprev,snext,scan,pick,rmm,inc,folder,show} \
-               "c@+@F:$HOME/Mail/@"
-
-    # these and interrupt handling from Jaap Vermeulen <jaap@sequent.com>
-    complete {rexec,rxexec,rxterm,rmterm} \
-                       'p/1/$hosts/' 'c/-/(l L E)/' 'n/-l/u/' 'n/-L/f/' \
-                       'n/-E/e/' 'n/*/c/'
-    complete kill      'c/-/S/' 'c/%/j/' \
-                       'n/*/`ps -u $LOGNAME | awk '"'"'{print $1}'"'"'`/'
-
-    # these from Marc Horowitz <marc@cam.ov.com>
-    complete attach 'n/-mountpoint/d/' 'n/-m/d/' 'n/-type/(afs nfs rvd ufs)/' \
-                   'n/-t/(afs nfs rvd ufs)/' 'n/-user/u/' 'n/-U/u/' \
-                   'c/-/(verbose quiet force printpath lookup debug map \
-                         nomap remap zephyr nozephyr readonly write \
-                         mountpoint noexplicit explicit type mountoptions \
-                         nosetuid setuid override skipfsck lock user host)/' \
-                   'n/-e/f/' 'n/*/()/'
-    complete hesinfo   'p/1/u/' \
-                       'p/2/(passwd group uid grplist pcap pobox cluster \
-                             filsys sloc service)/'
-
-    # these from E. Jay Berkenbilt <ejb@ERA.COM>
-    # = isn't always followed by a filename or a path anymore - jgotts
-    if ($?traditional_complete) then
-        complete ./configure \
-                        'c/--*=/f/' 'c/--{cache-file,prefix,exec-prefix,\
-                               bindir,sbindir,libexecdir,datadir,\
-                               sysconfdir,sharedstatedir,localstatedir,\
-                               libdir,includedir,oldincludedir,infodir,\
-                               mandir,srcdir}/(=)//' \
-                        'c/--/(cache-file verbose prefix exec-prefix bindir \
-                               sbindir libexecdir datadir sysconfdir \
-                               sharedstatedir localstatedir libdir \
-                               includedir oldincludedir infodir mandir \
-                               srcdir)//'
-    else
-       complete ./configure \
-                       'c@--{prefix,exec-prefix,bindir,sbindir,libexecdir,datadir,sysconfdir,sharedstatedir,localstatedir,infodir,mandir,srcdir,x-includes,x-libraries}=*@x:<directory e.g. /usr/local>'@ \
-                       'c/--cachefile=*/x:<filename>/' \
-                       'c/--{enable,disable,with}-*/x:<feature>//' \
-                       'c/--*=/x:<directory>//' \
-                       'c/--/(prefix= exec-prefix= bindir= \
-                       sbindir= libexecdir= datadir= sysconfdir= \
-                       sharedstatedir= localstatedir= infodir= \
-                       mandir= srcdir= x-includes= x-libraries= cachefile= \
-                       enable- disable- with- \
-                       help no-create quiet silent version verbose )//'
-    endif
-    complete gs 'c/-sDEVICE=/(x11 cdjmono cdj550 epson eps9high epsonc \
-                             dfaxhigh dfaxlow laserjet ljet4 sparc pbm \
-                             pbmraw pgm pgmraw ppm ppmraw bit)/' \
-               'c/-sOutputFile=/f/' 'c/-s/(DEVICE OutputFile)/=' \
-               'c/-d/(NODISPLAY NOPLATFONTS NOPAUSE)/' 'n/*/f/'
-    complete perl      'n/-S/c/'
-    complete printenv  'n/*/e/'
-    complete sccs      p/1/"(admin cdc check clean comb deledit delget \
-                       delta diffs edit enter fix get help info \
-                       print prs prt rmdel sccsdiff tell unedit \
-                       unget val what)"/
-    complete setenv    'p/1/e/' 'c/*:/f/'
-
-    # these and method of setting hosts from Kimmo Suominen <kim@tac.nyc.ny.us>
-    if ( -f "$HOME/.mh_profile" && -x "`which folders`" ) then 
-
-    if ( ! $?FOLDERS ) setenv FOLDERS "`folders -fast -recurse`"
-    if ( ! $?MHA )     setenv MHA     "`ali | sed -e '/^ /d' -e 's/:.*//'`"
-
-    set folders = ( $FOLDERS )
-    set mha = ( $MHA )
-
-    complete ali \
-        'c/-/(alias nolist list nonormalize normalize nouser user help)/' \
-        'n,-alias,f,'
-
-    complete anno \
-        'c/-/(component noinplace inplace nodate date text help)/' \
-        'c,+,$folders,'  \
-        'n,*,`(mark | sed "s/:.*//";echo next cur prev first last)|tr " " "\12" | sort -u`,'
-
-    complete burst \
-        'c/-/(noinplace inplace noquiet quiet noverbose verbose help)/' \
-        'c,+,$folders,'  \
-        'n,*,`(mark | sed "s/:.*//";echo next cur prev first last)|tr " " "\12" | sort -u`,'
-
-    complete comp \
-        'c/-/(draftfolder draftmessage nodraftfolder editor noedit file form nouse use whatnowproc nowhatnowproc help)/' \
-        'c,+,$folders,'  \
-        'n,-whatnowproc,c,'  \
-        'n,-file,f,'\
-        'n,-form,f,'\
-        'n,*,`(mark | sed "s/:.*//";echo next cur prev first last)|tr " " "\12" | sort -u`,'
-
-    complete dist \
-        'c/-/(noannotate annotate draftfolder draftmessage nodraftfolder editor noedit form noinplace inplace whatnowproc nowhatnowproc help)/' \
-        'c,+,$folders,'  \
-        'n,-whatnowproc,c,'  \
-        'n,-form,f,'\
-        'n,*,`(mark | sed "s/:.*//";echo next cur prev first last)|tr " " "\12" | sort -u`,'
-
-    complete folder \
-        'c/-/(all nofast fast noheader header nopack pack noverbose verbose norecurse recurse nototal total noprint print nolist list push pop help)/' \
-        'c,+,$folders,'  \
-        'n,*,`(mark | sed "s/:.*//";echo next cur prev first last)|tr " " "\12" | sort -u`,'
-
-    complete folders \
-        'c/-/(all nofast fast noheader header nopack pack noverbose verbose norecurse recurse nototal total noprint print nolist list push pop help)/' \
-        'c,+,$folders,'  \
-        'n,*,`(mark | sed "s/:.*//";echo next cur prev first last)|tr " " "\12" | sort -u`,'
-
-    complete forw \
-        'c/-/(noannotate annotate draftfolder draftmessage nodraftfolder editor noedit filter form noformat format noinplace inplace digest issue volume whatnowproc nowhatnowproc help)/' \
-        'c,+,$folders,'  \
-        'n,-whatnowproc,c,'  \
-        'n,-filter,f,'\
-        'n,-form,f,'\
-        'n,*,`(mark | sed "s/:.*//";echo next cur prev first last)|tr " " "\12" | sort -u`,'
-
-    complete inc \
-        'c/-/(audit file noaudit nochangecur changecur file form format nosilent silent notruncate truncate width help)/' \
-        'c,+,$folders,'  \
-        'n,-audit,f,'\
-        'n,-form,f,'
-
-    complete mark \
-        'c/-/(add delete list sequence nopublic public nozero zero help)/' \
-        'c,+,$folders,'  \
-        'n,*,`(mark | sed "s/:.*//";echo next cur prev first last)|tr " " "\12" | sort -u`,'
-
-    complete mhmail \
-        'c/-/(body cc from subject help)/' \
-        'n,-cc,$mha,'  \
-        'n,-from,$mha,'  \
-        'n/*/$mha/'
-
-    complete mhpath \
-        'c/-/(help)/' \
-        'c,+,$folders,'  \
-        'n,*,`(mark | sed "s/:.*//";echo next cur prev first last)|tr " " "\12" | sort -u`,'
-
-    complete msgchk \
-        'c/-/(nodate date nonotify notify help)/' 
-
-    complete msh \
-        'c/-/(prompt noscan scan notopcur topcur help)/' 
-
-    complete next \
-        'c/-/(draft form moreproc nomoreproc length width showproc noshowproc header noheader help)/' \
-        'c,+,$folders,'  \
-        'n,-moreproc,c,'  \
-        'n,-showproc,c,'  \
-        'n,-form,f,'
-
-    complete packf \
-        'c/-/(file help)/' \
-        'c,+,$folders,'  \
-        'n,*,`(mark | sed "s/:.*//";echo next cur prev first last)|tr " " "\12" | sort -u`,'
-
-    complete pick \
-        'c/-/(and or not lbrace rbrace cc date from search subject to othercomponent after before datefield sequence nopublic public nozero zero nolist list help)/' \
-        'c,+,$folders,'  \
-        'n,*,`(mark | sed "s/:.*//";echo next cur prev first last)|tr " " "\12" | sort -u`,'
-
-    complete prev \
-        'c/-/(draft form moreproc nomoreproc length width showproc noshowproc header noheader help)/' \
-        'c,+,$folders,'  \
-        'n,-moreproc,c,'  \
-        'n,-showproc,c,'  \
-        'n,-form,f,'
-
-    complete prompter \
-        'c/-/(erase kill noprepend prepend norapid rapid nodoteof doteof help)/' 
-
-    complete refile \
-        'c/-/(draft nolink link nopreserve preserve src file help)/' \
-        'c,+,$folders,'  \
-        'n,-file,f,'\
-        'n,*,`(mark | sed "s/:.*//";echo next cur prev first last)|tr " " "\12" | sort -u`,'
-
-    complete rmf \
-        'c/-/(nointeractive interactive help)/' \
-        'c,+,$folders,'  
-
-    complete rmm \
-        'c/-/(help)/' \
-        'c,+,$folders,'  \
-        'n,*,`(mark | sed "s/:.*//";echo next cur prev first last)|tr " " "\12" | sort -u`,'
-
-    complete scan \
-        'c/-/(noclear clear form format noheader header width noreverse reverse file help)/' \
-        'c,+,$folders,'  \
-        'n,-form,f,'\
-        'n,-file,f,'\
-        'n,*,`(mark | sed "s/:.*//";echo next cur prev first last)|tr " " "\12" | sort -u`,'
-
-    complete send \
-        'c/-/(alias draft draftfolder draftmessage nodraftfolder filter nofilter noformat format noforward forward nomsgid msgid nopush push noverbose verbose nowatch watch width help)/' \
-        'n,-alias,f,'\
-        'n,-filter,f,'
-
-    complete show \
-        'c/-/(draft form moreproc nomoreproc length width showproc noshowproc header noheader help)/' \
-        'c,+,$folders,'  \
-        'n,-moreproc,c,'  \
-        'n,-showproc,c,'  \
-        'n,-form,f,'\
-        'n,*,`(mark | sed "s/:.*//";echo next cur prev first last)|tr " " "\12" | sort -u`,'
-
-    complete sortm \
-        'c/-/(datefield textfield notextfield limit nolimit noverbose verbose help)/' \
-        'c,+,$folders,'  \
-        'n,*,`(mark | sed "s/:.*//";echo next cur prev first last)|tr " " "\12" | sort -u`,'
-
-    complete vmh \
-        'c/-/(prompt vmhproc novmhproc help)/' \
-        'n,-vmhproc,c,'  
-
-    complete whatnow \
-        'c/-/(draftfolder draftmessage nodraftfolder editor noedit prompt help)/' 
-
-    complete whom \
-        'c/-/(alias nocheck check draft draftfolder draftmessage nodraftfolder help)/' \
-        'n,-alias,f,'
-
-    complete plum \
-        'c/-/()/' \
-        'c,+,$folders,'  \
-        'n,*,`(mark | sed "s/:.*//";echo next cur prev first last)|tr " " "\12" | sort -u`,'
-
-    complete mail \
-        'c/-/()/' \
-        'n/*/$mha/'
+# Old TCSH versions don't define OSTYPE.
+# Use a close approximation instead.
 
-    endif
+if ( ! $?OSTYPE ) then
+  setenv OSTYPE `echo "$HOSTTYPE" | sed -e 's/^(i[3456]86|(amd|x86_)64)-//'`
+endif
 
-    #from Dan Nicolaescu <dann@ics.uci.edu>
-    if ( $?MODULESHOME ) then
-       alias Compl_module 'find ${MODULEPATH:as/:/ /} -name .version -o -name .modulea\* -prune -o -print  | sed `echo "-e s@${MODULEPATH:as%:%/\*@@g -e s@%}/\*@@g"`'
-       complete module 'p%1%(add load unload switch display avail use unuse update purge list clear help initadd initrm initswitch initlist initclear)%' \
-       'n%{unl*,sw*,inits*}%`echo "$LOADEDMODULES:as/:/ /"`%' \
-       'n%{lo*,di*,he*,inita*,initr*}%`eval Compl_module`%' \
-       'N%{sw*,initsw*}%`eval Compl_module`%' 'C%-%(-append)%' 'n%{use,unu*,av*}%d%' 'n%-append%d%' \
-       'C%[^-]*%`eval Compl_module`%'
-    endif
+if ( ! $?hosts ) set hosts
+
+foreach f ( "$HOME/."{,r,ssh/known_}hosts* \
+  /usr/local/etc/csh.hosts /etc/hosts.equiv )
+  if ( -r "$f" ) then
+    set hosts=($hosts `sed \
+      -e 's/#.*//' \
+      -e '/^[+-]@/d' \
+      -e 's/^[-+]//' \
+      -e 's/[[:space:]].*//' \
+      -e 's/,/\n/g' "$f" \
+      | sed -e '/^[.:[:xdigit:][:space:]]*$/d'`)
+  endif
+end
+unset f
+
+if ( -r "$HOME/.netrc" ) then
+  set hosts=($hosts `awk '$1 == "machine" { print $2 }' "$HOME/.netrc"`)
+endif
+
+set hosts=(`echo $hosts | tr ' ' '\012' | sort -u`)
+
+if ( ! $#hosts ) then
+  # This is just a hint for the user.
+  set hosts=(ftp.funet.fi ftp.gnu.org ftp.uu.net)
+endif
+
+complete ywho          n/*/\$hosts/    # argument from list in $hosts
+complete rsh           p/1/\$hosts/ c/-/"(l n)"/   n/-l/u/ N/-l/c/ n/-/c/ p/2/c/ p/*/f/
+complete ssh           p/1/\$hosts/ c/-/"(l n)"/   n/-l/u/ N/-l/c/ n/-/c/ p/2/c/ p/*/f/
+complete xrsh          p/1/\$hosts/ c/-/"(l 8 e)"/ n/-l/u/ N/-l/c/ n/-/c/ p/2/c/ p/*/f/
+complete rlogin        p/1/\$hosts/ c/-/"(l 8 e)"/ n/-l/u/
+complete telnet        p/1/\$hosts/ p/2/x:'<port>'/ n/*/n/
+
+complete cd            p/1/d/          # Directories only
+complete chdir                 p/1/d/
+complete pushd                 p/1/d/
+complete popd          p/1/d/
+complete pu            p/1/d/
+complete po            p/1/d/
+complete complete      p/1/X/          # Completions only
+complete uncomplete    n/*/X/
+complete exec          p/1/c/          # Commands only
+complete trace                 p/1/c/
+complete strace        p/1/c/
+complete which         n/*/c/
+complete where         n/*/c/
+complete skill                 p/1/c/
+complete dde           p/1/c/ 
+complete adb           c/-I/d/ n/-/c/ N/-/"(core)"/ p/1/c/ p/2/"(core)"/
+complete sdb           p/1/c/
+complete dbx           c/-I/d/ n/-/c/ N/-/"(core)"/ p/1/c/ p/2/"(core)"/
+complete xdb           p/1/c/
+complete gdb           n/-d/d/ n/*/c/
+complete ups           p/1/c/
+complete set           'c/*=/f/' 'p/1/s/=' 'n/=/f/'
+complete unset         n/*/s/
+complete alias                 p/1/a/          # only aliases are valid
+complete unalias       n/*/a/
+complete xdvi          n/*/f:*.dvi/
+complete dvips                 n/*/f:*.dvi/
+complete tex           n/*/f:*.{tex,texi}/
+complete latex         n/*/f:*.{tex,ltx}/
+
+complete su \
+  c/--/"(login fast preserve-environment command shell help version)"/ \
+  c/-/"(f l m p c s -)"/ \
+  n/{-c,--command}/c/ \
+  n@{-s,--shell}@'`cat /etc/shells`'@ \
+  n/*/u/
+complete cc \
+  c/-[IL]/d/ \
+  c@-l@'`\ls -1 /usr/lib/lib*.a | sed s%^.\*/lib%%\;s%\\.a\$%%`'@ \
+  c/-/"(o l c g L I D U)"/ n/*/f:*.[coasi]/
+complete acc \
+  c/-[IL]/d/ \
+  c@-l@'`\ls -1 /usr/lang/SC1.0/lib*.a | sed s%^.\*/lib%%\;s%\\.a\$%%`'@ \
+  c/-/"(o l c g L I D U)"/ n/*/f:*.[coasi]/
+complete gcc \
+  c/-[IL]/d/ \
+  c/-f/"(caller-saves cse-follow-jumps delayed-branch elide-constructors \
+       expensive-optimizations float-store force-addr force-mem inline \
+       inline-functions keep-inline-functions memoize-lookups \
+       no-default-inline no-defer-pop no-function-cse omit-frame-pointer \
+       rerun-cse-after-loop schedule-insns schedule-insns2 strength-reduce \
+       thread-jumps unroll-all-loops unroll-loops syntax-only all-virtual \
+       cond-mismatch dollars-in-identifiers enum-int-equiv no-asm no-builtin \
+       no-strict-prototype signed-bitfields signed-char this-is-variable \
+       unsigned-bitfields unsigned-char writable-strings call-saved-reg \
+       call-used-reg fixed-reg no-common no-gnu-binutils nonnull-objects \
+       pcc-struct-return pic PIC shared-data short-enums short-double \
+       volatile)"/ \
+  c/-W/"(all aggregate-return cast-align cast-qual comment conversion \
+       enum-clash error format id-clash-len implicit missing-prototypes \
+       no-parentheses pointer-arith return-type shadow strict-prototypes \
+       switch uninitialized unused write-strings)"/ \
+  c/-m/"(68000 68020 68881 bitfield fpa nobitfield rtd short c68000 c68020 \
+       soft-float g gnu unix fpu no-epilogue)"/ \
+  c/-d/"(D M N)"/ \
+  c/-/"(f W vspec v vpath ansi traditional traditional-cpp trigraphs pedantic \
+       x o l c g L I D U O O2 C E H B b V M MD MM i dynamic nodtdlib static \
+       nostdinc undef)"/ \
+  c/-l/f:*.a/ \
+  n/*/f:*.{c,C,cc,o,a,s,i}/
+complete g++   n/*/f:*.{C,cc,o,s,i}/
+complete CC    n/*/f:*.{C,cc,cpp,o,s,i}/
+complete rm \
+  c/--/"(directory force interactive verbose recursive help version)"/ \
+  c/-/"(d f i v r R -)"/ \
+  n/*/f:^*.{c,cc,C,h,in}/
+  # Protect precious files
+complete vi    n/*/f:^*.[oa]/
+complete bindkey \
+  N/-a/b/ N/-c/c/ n/-[ascr]/'x:<key-sequence>'/ \
+  n/-[svedlr]/n/ c/-[vedl]/n/ c/-/"(a s k c v e d l r)"/ \
+  n/-k/"(left right up down)"/ p/2-/b/ \
+  p/1/'x:<key-sequence or option>'/
+
+complete find \
+  n/-fstype/"(nfs 4.2)"/ \
+  n/-name/f/ \
+  n/-type/"(c b d f p l s)"/ \
+  n/-user/u/ \
+  n/-group/g/ \
+  n/-exec/c/ \
+  n/-ok/c/ \
+  n/-cpio/f/ \
+  n/-ncpio/f/ \
+  n/-newer/f/ \
+  c/-/"(fstype name perm prune type user nouser group nogroup size inum \
+       atime mtime ctime exec ok print ls cpio ncpio newer xdev depth \
+       daystart follow maxdepth mindepth noleaf version anewer cnewer \
+       amin cmin mmin true false uid gid ilname iname ipath iregex links \
+       lname empty path regex used xtype fprint fprint0 fprintf print0 \
+       printf not a and o or)"/ \
+  n/*/d/
+
+complete -%*           c/%/j/                  # fill in the jobs builtin
+complete {fg,bg,stop}  c/%/j/ p/1/"(%)"//
+
+complete limit         c/-/"(h)"/ n/*/l/
+complete unlimit       c/-/"(h)"/ n/*/l/
+
+#complete -co* p/0/"(compress)"/       # make compress completion
+#                                          # not ambiguous
+
+# "zcat" may be linked to "compress" or "gzip"
+if (-X zcat) then
+  zcat --version >& /dev/null
+  if ($status != 0) then
+    complete zcat      n/*/f:*.Z/
+  else
+    complete zcat      c/--/"(force help license quiet version)"/ \
+                       c/-/"(f h L q V -)"/ \
+                       n/*/f:*.{gz,Z,z,zip}/
+  endif
+endif
+
+complete finger        c/*@/\$hosts/ n/*/u/@ 
+complete ping  p/1/\$hosts/
+complete traceroute    p/1/\$hosts/
+
+complete {talk,ntalk,phone} \
+  p/1/'`users | tr " " "\012" | uniq`'/ \
+  n/*/\`who\ \|\ grep\ \$:1\ \|\ awk\ \'\{\ print\ \$2\ \}\'\`/
+
+complete ftp   c/-/"(d i g n v)"/ n/-/\$hosts/ p/1/\$hosts/ n/*/n/
+
+# this one is simple...
+#complete rcp c/*:/f/ C@[./\$~]*@f@ n/*/\$hosts/:
+# From Michael Schroeder <mlschroe@immd4.informatik.uni-erlangen.de> 
+# This one will rsh to the file to fetch the list of files!
+complete rcp 'c%*@*:%`set q=$:-0;set q="$q:s/@/ /";set q="$q:s/:/ /";set q=($q " ");rsh $q[2] -l $q[1] ls -dp $q[3]\*`%' 'c%*:%`set q=$:-0;set q="$q:s/:/ /";set q=($q " ");rsh $q[1] ls -dp $q[2]\*`%' 'c%*@%$hosts%:' 'C@[./$~]*@f@'  'n/*/$hosts/:'
+
+complete dd \
+  c/--/"(help version)"/ c/[io]f=/f/ \
+  c/conv=*,/"(ascii ebcdic ibm block unblock \
+             lcase notrunc ucase swab noerror sync)"/,\
+  c/conv=/"(ascii ebcdic ibm block unblock \
+           lcase notrunc ucase swab noerror sync)"/,\
+  c/*=/x:'<number>'/ \
+  n/*/"(if of conv ibs obs bs cbs files skip file seek count)"/=
+
+complete nslookup   p/1/x:'<host>'/ p/2/\$hosts/
+
+complete ar \
+  c/[dmpqrtx]/"(c l o u v a b i)"/ \
+  p/1/"(d m p q r t x)"// \
+  p/2/f:*.a/ \
+  p/*/f:*.o/
+
+# these should be merged with the MH completion hacks below - jgotts
+complete {refile,sprev,snext,scan,pick,rmm,inc,folder,show} \
+           "c@+@F:$HOME/Mail/@"
+
+# these and interrupt handling from Jaap Vermeulen <jaap@sequent.com>
+complete {rexec,rxexec,rxterm,rmterm} \
+  'p/1/$hosts/' \
+  'c/-/(l L E)/' \
+  'n/-l/u/' \
+  'n/-L/f/' \
+  'n/-E/e/' \
+  'n/*/c/'
+complete kill \
+  'c/-/S/' \
+  'c/%/j/' \
+  'n/*/`ps -u $LOGNAME | awk '"'"'{print $1}'"'"'`/'
+
+# these from Marc Horowitz <marc@cam.ov.com>
+complete attach \
+  'n/-mountpoint/d/' \
+  'n/-m/d/' \
+  'n/-type/(afs nfs rvd ufs)/' \
+  'n/-t/(afs nfs rvd ufs)/' \
+  'n/-user/u/' \
+  'n/-U/u/' \
+  'c/-/(verbose quiet force printpath lookup debug map nomap remap zephyr \
+       nozephyr readonly write mountpoint noexplicit explicit type \
+       mountoptions nosetuid setuid override skipfsck lock user host)/' \
+  'n/-e/f/' \
+  'n/*/()/'
+complete hesinfo \
+  'p/1/u/' \
+  'p/2/(passwd group uid grplist pcap pobox cluster filsys sloc service)/'
+
+complete ./configure \
+  'c@--{prefix,exec-prefix,bindir,sbindir,libexecdir,datadir,sysconfdir,sharedstatedir,localstatedir,infodir,mandir,srcdir,x-includes,x-libraries}=*@x:<directory e.g. /usr/local>'@ \
+  'c/--cachefile=*/x:<filename>/' \
+  'c/--{enable,disable,with}-*/x:<feature>//' \
+  'c/--*=/x:<directory>//' \
+  'c/--/(prefix= exec-prefix= bindir= sbindir= libexecdir= datadir= \
+       sysconfdir= sharedstatedir= localstatedir= infodir= mandir= \
+       srcdir= x-includes= x-libraries= cachefile= enable- disable- \
+       with- help no-create quiet silent version verbose )//'
+
+complete gs \
+  'c/-sDEVICE=/(x11 cdjmono cdj550 epson eps9high epsonc dfaxhigh dfaxlow \
+               laserjet ljet4 sparc pbm pbmraw pgm pgmraw ppm ppmraw bit)/' \
+  'c/-sOutputFile=/f/' 'c/-s/(DEVICE OutputFile)/=' \
+  'c/-d/(NODISPLAY NOPLATFONTS NOPAUSE)/' 'n/*/f/'
+complete perl          'n/-S/c/'
+complete sccs \
+  p/1/"(admin cdc check clean comb deledit delget delta diffs edit enter \
+       fix get help info print prs prt rmdel sccsdiff tell unedit unget \
+       val what)"/
+
+complete printenv      'n/*/e/'
+complete setenv                'p/1/e/' 'c/*:/f/'
+
+# these and method of setting hosts from Kimmo Suominen <kim@tac.nyc.ny.us>
+if ( -f "$HOME/.mh_profile" && -X folders ) then 
+  if ( ! $?FOLDERS ) setenv FOLDERS "`folders -fast -recurse`"
+  if ( ! $?MHA )     setenv MHA     "`ali | sed -e '/^ /d' -e 's/:.*//'`"
+
+  set folders = ( $FOLDERS )
+  set mha = ( $MHA )
+
+  complete ali \
+    'c/-/(alias nolist list nonormalize normalize nouser user help)/' \
+    'n,-alias,f,'
+
+  complete anno \
+    'c/-/(component noinplace inplace nodate date text help)/' \
+    'c,+,$folders,'  \
+    'n,*,`(mark | sed "s/:.*//" ; echo next cur prev first last)|tr " " "\012" | sort -u`,'
+
+  complete burst \
+    'c/-/(noinplace inplace noquiet quiet noverbose verbose help)/' \
+    'c,+,$folders,'  \
+    'n,*,`(mark | sed "s/:.*//" ; echo next cur prev first last)|tr " " "\012" | sort -u`,'
+
+  complete comp \
+    'c/-/(draftfolder draftmessage nodraftfolder editor noedit file form nouse use whatnowproc nowhatnowproc help)/' \
+    'c,+,$folders,'  \
+    'n,-whatnowproc,c,'  \
+    'n,-file,f,'\
+    'n,-form,f,'\
+    'n,*,`(mark | sed "s/:.*//" ; echo next cur prev first last)|tr " " "\012" | sort -u`,'
+
+  complete dist \
+    'c/-/(noannotate annotate draftfolder draftmessage nodraftfolder editor noedit form noinplace inplace whatnowproc nowhatnowproc help)/' \
+    'c,+,$folders,'  \
+    'n,-whatnowproc,c,'  \
+    'n,-form,f,'\
+    'n,*,`(mark | sed "s/:.*//" ; echo next cur prev first last)|tr " " "\012" | sort -u`,'
+
+  complete folder \
+    'c/-/(all nofast fast noheader header nopack pack noverbose verbose norecurse recurse nototal total noprint print nolist list push pop help)/' \
+    'c,+,$folders,'  \
+    'n,*,`(mark | sed "s/:.*//" ; echo next cur prev first last)|tr " " "\012" | sort -u`,'
+
+  complete folders \
+    'c/-/(all nofast fast noheader header nopack pack noverbose verbose norecurse recurse nototal total noprint print nolist list push pop help)/' \
+    'c,+,$folders,'  \
+    'n,*,`(mark | sed "s/:.*//" ; echo next cur prev first last)|tr " " "\012" | sort -u`,'
+
+  complete forw \
+    'c/-/(noannotate annotate draftfolder draftmessage nodraftfolder editor noedit filter form noformat format noinplace inplace digest issue volume whatnowproc nowhatnowproc help)/' \
+    'c,+,$folders,'  \
+    'n,-whatnowproc,c,'  \
+    'n,-filter,f,'\
+    'n,-form,f,'\
+    'n,*,`(mark | sed "s/:.*//" ; echo next cur prev first last)|tr " " "\012" | sort -u`,'
+
+  complete inc \
+    'c/-/(audit file noaudit nochangecur changecur file form format nosilent silent notruncate truncate width help)/' \
+    'c,+,$folders,'  \
+    'n,-audit,f,'\
+    'n,-form,f,'
+
+  complete mark \
+    'c/-/(add delete list sequence nopublic public nozero zero help)/' \
+    'c,+,$folders,'  \
+    'n,*,`(mark | sed "s/:.*//" ; echo next cur prev first last)|tr " " "\012" | sort -u`,'
+
+  complete mhmail \
+    'c/-/(body cc from subject help)/' \
+    'n,-cc,$mha,'  \
+    'n,-from,$mha,'  \
+    'n/*/$mha/'
+
+  complete mhpath \
+    'c/-/(help)/' \
+    'c,+,$folders,'  \
+    'n,*,`(mark | sed "s/:.*//" ; echo next cur prev first last)|tr " " "\012" | sort -u`,'
+
+  complete msgchk \
+    'c/-/(nodate date nonotify notify help)/' 
+
+  complete msh \
+    'c/-/(prompt noscan scan notopcur topcur help)/' 
+
+  complete next \
+    'c/-/(draft form moreproc nomoreproc length width showproc noshowproc header noheader help)/' \
+    'c,+,$folders,'  \
+    'n,-moreproc,c,'  \
+    'n,-showproc,c,'  \
+    'n,-form,f,'
+
+  complete packf \
+    'c/-/(file help)/' \
+    'c,+,$folders,'  \
+    'n,*,`(mark | sed "s/:.*//" ; echo next cur prev first last)|tr " " "\012" | sort -u`,'
+
+  complete pick \
+    'c/-/(and or not lbrace rbrace cc date from search subject to othercomponent after before datefield sequence nopublic public nozero zero nolist list help)/' \
+    'c,+,$folders,'  \
+    'n,*,`(mark | sed "s/:.*//" ; echo next cur prev first last)|tr " " "\012" | sort -u`,'
+
+  complete prev \
+    'c/-/(draft form moreproc nomoreproc length width showproc noshowproc header noheader help)/' \
+    'c,+,$folders,'  \
+    'n,-moreproc,c,'  \
+    'n,-showproc,c,'  \
+    'n,-form,f,'
+
+  complete prompter \
+    'c/-/(erase kill noprepend prepend norapid rapid nodoteof doteof help)/' 
+
+  complete refile \
+    'c/-/(draft nolink link nopreserve preserve src file help)/' \
+    'c,+,$folders,'  \
+    'n,-file,f,'\
+    'n,*,`(mark | sed "s/:.*//" ; echo next cur prev first last)|tr " " "\012" | sort -u`,'
+
+  complete rmf \
+    'c/-/(nointeractive interactive help)/' \
+    'c,+,$folders,'  
+
+  complete rmm \
+    'c/-/(help)/' \
+    'c,+,$folders,'  \
+    'n,*,`(mark | sed "s/:.*//" ; echo next cur prev first last)|tr " " "\012" | sort -u`,'
+
+  complete scan \
+    'c/-/(noclear clear form format noheader header width noreverse reverse file help)/' \
+    'c,+,$folders,'  \
+    'n,-form,f,'\
+    'n,-file,f,'\
+    'n,*,`(mark | sed "s/:.*//" ; echo next cur prev first last)|tr " " "\012" | sort -u`,'
+
+  complete send \
+    'c/-/(alias draft draftfolder draftmessage nodraftfolder filter nofilter noformat format noforward forward nomsgid msgid nopush push noverbose verbose nowatch watch width help)/' \
+    'n,-alias,f,'\
+    'n,-filter,f,'
+
+  complete show \
+    'c/-/(draft form moreproc nomoreproc length width showproc noshowproc header noheader help)/' \
+    'c,+,$folders,'  \
+    'n,-moreproc,c,'  \
+    'n,-showproc,c,'  \
+    'n,-form,f,'\
+    'n,*,`(mark | sed "s/:.*//" ; echo next cur prev first last)|tr " " "\012" | sort -u`,'
+
+  complete sortm \
+    'c/-/(datefield textfield notextfield limit nolimit noverbose verbose help)/' \
+    'c,+,$folders,'  \
+    'n,*,`(mark | sed "s/:.*//" ; echo next cur prev first last)|tr " " "\012" | sort -u`,'
+
+  complete vmh \
+    'c/-/(prompt vmhproc novmhproc help)/' \
+    'n,-vmhproc,c,'  
+
+  complete whatnow \
+    'c/-/(draftfolder draftmessage nodraftfolder editor noedit prompt help)/' 
+
+  complete whom \
+    'c/-/(alias nocheck check draft draftfolder draftmessage nodraftfolder help)/' \
+    'n,-alias,f,'
+
+  complete plum \
+    'c/-/()/' \
+    'c,+,$folders,'  \
+    'n,*,`(mark | sed "s/:.*//" ; echo next cur prev first last)|tr " " "\012" | sort -u`,'
+
+  complete mail \
+    'c/-/()/' \
+    'n/*/$mha/'
+
+endif
+
+#from Dan Nicolaescu <dann@ics.uci.edu>
+if ( $?MODULESHOME ) then
+  alias Compl_module \
+    'find ${MODULEPATH:as/:/ /} -name .version -o -name .modulea\* -prune \
+    -o -print | sed `echo "-e s@${MODULEPATH:as%:%/\*@@g -e s@%}/\*@@g"`'
+  complete module \
+    'p%1%(add load unload switch display avail use unuse update purge list \
+         clear help initadd initrm initswitch initlist initclear)%' \
+    'n%{unl*,sw*,inits*}%`echo "$LOADEDMODULES:as/:/ /"`%' \
+    'n%{lo*,di*,he*,inita*,initr*}%`eval Compl_module`%' \
+    'N%{sw*,initsw*}%`eval Compl_module`%' \
+    'C%-%(-append)%' \
+    'n%{use,unu*,av*}%d%' \
+    'n%-append%d%' \
+    'C%[^-]*%`eval Compl_module`%'
+endif
 
-    # from George Cox
-    complete acroread  'p/*/f:*.{pdf,PDF}/'
-    complete apachectl  'c/*/(start stop restart fullstatus status graceful \
-                       configtest help)/'
-    complete appletviewer      'p/*/f:*.class/'
-    complete bison     'c/--/(debug defines file-prefix= fixed-output-files \
-                       help name-prefix= no-lines no-parser output= \
-                       token-table verbose version yacc)/' \
-                       'c/-/(b d h k l n o p t v y V)/' 'n/-b/f/' 'n/-o/f/' \
-                       'n/-p/f/'
-    complete bzcat     c/--/"(help test quiet verbose license version)"/ \
+# from George Cox
+complete acroread      'p/*/f:*.{pdf,PDF}/'
+complete apachectl     'c/*/(start stop restart fullstatus status graceful \
+                             configtest help)/'
+complete appletviewer  'p/*/f:*.class/'
+complete bison         'c/--/(debug defines file-prefix= fixed-output-files \
+                               help name-prefix= no-lines no-parser output= \
+                               token-table verbose version yacc)/' \
+                       'c/-/(b d h k l n o p t v y V)/' \
+                       'n/-b/f/' 'n/-o/f/' 'n/-p/f/'
+complete bzcat         c/--/"(help test quiet verbose license version)"/ \
                        c/-/"(h t L V -)"/ n/*/f:*.{bz2,tbz}/
-    complete bunzip2   c/--/"(help keep force test stdout quiet verbose \
-                        license version)"/ c/-/"(h k f t c q v L V -)"/ \
+complete bunzip2       c/--/"(help keep force test stdout quiet verbose \
+                               license version)"/ \
+                       c/-/"(h k f t c q v L V -)"/ \
                        n/*/f:*.{bz2,tbz}/
-    complete bzip2     c/--/"(help decompress compress keep force test \
-                       stdout quiet verbose license version small)"/ \
+complete bzip2         c/--/"(help decompress compress keep force test \
+                               stdout quiet verbose license version small)"/ \
                        c/-/"(h d z k f t c q v L V s 1 2 3 4 5 6 7 8 9 -)"/ \
                        n/{-d,--decompress}/f:*.{bz2,tbz}/ \
                        N/{-d,--decompress}/f:*.{bz2,tbz}/ n/*/f:^*.{bz2,tbz}/
-    complete c++       'p/*/f:*.{c++,cxx,c,cc,C,cpp}/'
-    complete co                'p@1@`\ls -1a RCS | sed -e "s/\(.*\),v/\1/"`@'
-    complete crontab   'n/-u/u/'
-    complete camcontrol        'p/1/(cmd debug defects devlist eject inquiry \
-                       modepage negotiate periphlist rescan reset start \
-                       stop tags tur)/'
-    complete ctlinnd   'p/1/(addhist allow begin cancel changegroup \
-                       checkfile drop feedinfo flush flushlogs go hangup \
-                       logmode mode name newgroup param pause readers refile \
-                       reject reload renumber reserve rmgroup send shutdown \
-                       kill throttle trace xabort xexec)/'
-    complete cvs       'c/--/(help help-commands help-synonyms)/' \
-                       'p/1/(add admin annotate checkout commit diff \
-                       edit editors export history import init log login \
-                       logout rdiff release remove rtag status tag unedit \
-                       update watch watchers)/' 'n/-a/(edit unedit commit \
-                       all none)/' 'n/watch/(on off add remove)/'
-    complete svn       'C@file:///@`'"${HOME}/etc/tcsh/complete.d/svn"'`@@' \
+complete c++           'p/*/f:*.{c++,cxx,c,cc,C,cpp}/'
+complete co            'p@1@`\ls -1a RCS | sed -e "s/\(.*\),v/\1/"`@'
+complete crontab       'n/-u/u/'
+complete camcontrol    'p/1/(cmd debug defects devlist eject inquiry \
+                             modepage negotiate periphlist rescan reset \
+                             start stop tags tur)/'
+complete ctlinnd       'p/1/(addhist allow begin cancel changegroup \
+                             checkfile drop feedinfo flush flushlogs go \
+                             hangup logmode mode name newgroup param pause \
+                             readers refile reject reload renumber reserve \
+                             rmgroup send shutdown kill throttle trace \
+                             xabort xexec)/'
+complete cvs           'c/--/(help help-commands help-synonyms)/' \
+                       'p/1/(add admin annotate checkout commit diff edit \
+                             editors export history import init log login \
+                             logout rdiff release remove rtag status tag \
+                             unedit update watch watchers)/' \
+                       'n/-a/(edit unedit commit all none)/' \
+                       'n/watch/(on off add remove)/'
+complete svn           'C@file:///@`'"${HOME}/etc/tcsh/complete.d/svn"'`@@' \
                        'n@ls@(file:/// svn+ssh:// svn://)@@' \
-                       'n@help@(add blame cat checkout \
-                       cleanup commit copy delete export help \
-                       import info list ls lock log merge mkdir \
-                       move propdel propedit propget proplist \
-                       propset resolved revert status switch unlock \
-                       update)@' 'p@1@(add blame cat checkout \
-                       cleanup commit copy delete export help \
-                       import info list ls lock log merge mkdir \
-                       move propdel propedit propget proplist \
-                       propset resolved revert status switch unlock \
-                       update)@'
-    complete cxx       'p/*/f:*.{c++,cxx,c,cc,C,cpp}/'
-    complete detex     'p/*/f:*.tex/'
-    complete edquota    'n/*/u/'
-    complete exec      'p/1/c/'
-    complete ghostview 'p/*/f:*.ps/'
-    complete gv                'p/*/f:*.ps/'
-    complete ifconfig  'p@1@`ifconfig -l`@' 'n/*/(range phase link netmask \
-                       mtu vlandev vlan metric mediaopt down delete \
-                       broadcast arp debug)/'
-    complete imake     'c/-I/d/'
-    complete ipfw      'p/1/(flush add delete list show zero)/' \
+                       'n@help@(add blame cat checkout cleanup commit copy \
+                                 delete export help import info list ls \
+                                 lock log merge mkdir move propdel propedit \
+                                 propget proplist propset resolved revert \
+                                 status switch unlock update)@' \
+                       'p@1@(add blame cat checkout cleanup commit copy \
+                             delete export help import info list ls lock \
+                             log merge mkdir move propdel propedit propget \
+                             proplist propset resolved revert status switch \
+                             unlock update)@'
+
+complete cxx           'p/*/f:*.{c++,cxx,c,cc,C,cpp}/'
+complete detex         'p/*/f:*.tex/'
+complete edquota       'n/*/u/'
+complete exec          'p/1/c/'
+complete ghostview     'p/*/f:*.ps/'
+complete gv            'p/*/f:*.ps/'
+complete ifconfig      'p@1@`ifconfig -l`@' \
+                       'n/*/(range phase link netmask mtu vlandev vlan \
+                           metric mediaopt down delete broadcast arp debug)/'
+complete imake         'c/-I/d/'
+complete ipfw          'p/1/(flush add delete list show zero)/' \
                        'n/add/(allow permit accept pass deny drop reject \
-                       reset count skipto num divert port tee port)/'
-    complete javac     'p/*/f:*.java/'
-    complete ldif2ldbm 'n/-i/f:*.ldif/'
-    complete libtool   'c/--mode=/(compile execute finish install link \
-                       uninstall)/' 'c/--/(config debug dry-run features \
-                       finish help quiet silent version mode=)/'
-    complete libtoolize        'c/--/(automake copy debug dry-run force help ltdl \
-                       ltdl-tar version)/'
-    complete links     'c/-/(assume-codepage async-dns download-dir \
-                       format-cache-size ftp-proxy help http-proxy \
-                       max-connections max-connections-to-host \
-                       memory-cache-size receive-timeout retries \
-                       unrestartable-receive-timeout version)/'
-    complete natd      c/-/'(alias_address config deny_incoming dynamic \
-                       inport interface log log_denied log_facility \
-                       outport outport port pptpalias proxy_only \
-                       proxy_rule redirect_address redirect_port \
-                       reverse same_ports unregistered_only use_sockets \
-                       verbose)'/ 'n@-interface@`ifconfig -l`@'
-    complete netstat   'n@-I@`ifconfig -l`@'
-    complete objdump   'c/--/(adjust-vma= all-headers architecture= \
-                       archive-headers debugging demangle disassemble \
-                       disassemble-all disassemble-zeroes dynamic-reloc \
-                       dynamic-syms endian= file-headers full-contents \
-                       headers help info line-numbers no-show-raw-insn \
-                       prefix-addresses private-headers reloc section-headers \
-                       section=source stabs start-address= stop-address= \
-                       syms target= version wide)/' \
+                               reset count skipto num divert port tee port)/'
+complete javac         'p/*/f:*.java/'
+complete ldif2ldbm     'n/-i/f:*.ldif/'
+complete libtool       'c/--mode=/(compile execute finish install link \
+                                   uninstall)/' \
+                       'c/--/(config debug dry-run features finish help \
+                               quiet silent version mode=)/'
+complete libtoolize    'c/--/(automake copy debug dry-run force help ltdl \
+                               ltdl-tar version)/'
+complete links         'c/-/(assume-codepage async-dns download-dir \
+                             format-cache-size ftp-proxy help http-proxy \
+                             max-connections max-connections-to-host \
+                             memory-cache-size receive-timeout retries \
+                             unrestartable-receive-timeout version)/'
+complete natd          c/-/'(alias_address config deny_incoming dynamic \
+                             inport interface log log_denied log_facility \
+                             outport outport port pptpalias proxy_only \
+                             proxy_rule redirect_address redirect_port \
+                             reverse same_ports unregistered_only use_sockets \
+                             verbose)'/ \
+                       'n@-interface@`ifconfig -l`@'
+complete netstat       'n@-I@`ifconfig -l`@'
+complete objdump       'c/--/(adjust-vma= all-headers architecture= \
+                             archive-headers debugging demangle disassemble \
+                             disassemble-all disassemble-zeroes dynamic-reloc \
+                             dynamic-syms endian= file-headers full-contents \
+                             headers help info line-numbers no-show-raw-insn \
+                             prefix-addresses private-headers reloc \
+                             section-headers section=source stabs \
+                             start-address= stop-address= syms target= \
+                             version wide)/' \
                        'c/-/(a h i f C d D p r R t T x s S l w)/'
-    complete xmodmap   'c/-/(display help grammar verbose quiet n e pm pk \
-                       pke pp)/'
-    complete lynx      'c/-/(accept_all_cookies anonymous assume_charset= \
-                       assume_local_charset= assume_unrec_charset= auth= base \
-                       book buried_news cache= case cfg= child cookie_file= \
-                       cookies core crawl debug_partial display= dump editor= \
-                       emacskeys enable_scrollback error_file= force_html \
-                       force_secure forms_options from ftp get_data head help \
-                       hiddenlinks= historical homepage= image_links index= \
-                       ismap link= localhost mime_header minimal \
-                       newschunksize= newsmaxchunk= nobrowse nocc nocolor \
-                       nofilereferer nolist nolog nopause noprint noredir \
-                       noreferer nostatus number_links partial partial_thres \
-                       pauth= popup post_data preparsed print pseudo_inlines \
-                       raw realm reload restrictions= resubmit_posts rlogin \
-                       selective show_cursor soft_dquotes source stack_dump \
-                       startfile_ok tagsoup telnet term= tlog trace traversal \
-                       underscore useragent= validate verbose version vikeys \
-                       width=)/' 'c/(http|ftp)/$URLS/'
-    complete gmake     'c/{--directory=,--include-dir=}/d/' \
+complete xmodmap       'c/-/(display help grammar verbose quiet n e pm pk \
+                             pke pp)/'
+complete lynx          'c/-/(accept_all_cookies anonymous assume_charset= \
+                             assume_local_charset= assume_unrec_charset= \
+                             auth= base book buried_news cache= case cfg= \
+                             child cookie_file= cookies core crawl \
+                             debug_partial display= dump editor= emacskeys \
+                             enable_scrollback error_file= force_html \
+                             force_secure forms_options from ftp get_data \
+                             head help hiddenlinks= historical homepage= \
+                             image_links index= ismap link= localhost \
+                             mime_header minimal newschunksize= \
+                             newsmaxchunk= nobrowse nocc nocolor \
+                             nofilereferer nolist nolog nopause noprint \
+                             noredir noreferer nostatus number_links \
+                             partial partial_thres pauth= popup post_data \
+                             preparsed print pseudo_inlines raw realm \
+                             reload restrictions= resubmit_posts rlogin \
+                             selective show_cursor soft_dquotes source \
+                             stack_dump startfile_ok tagsoup telnet term= \
+                             tlog trace traversal underscore useragent= \
+                             validate verbose version vikeys width=)/' \
+                       'c/(http|ftp)/$URLS/'
+complete gmake         'c/{--directory=,--include-dir=}/d/' \
                        'c/{--assume-new,--assume-old,--makefile,--new-file,--what-if,--file}/f/' \
                        'c/--/(assume-new= assume-old= debug directory= \
-                       dry-run environment-overrides file= help \
-                       ignore-errors include-dir= jobs[=N] just-print \
-                       keep-going load-average[=N] makefile= max-load[=N] \
-                       new-file= no-builtin-rules no-keep-going \
-                       no-print-directory old-file= print-data-base \
-                       print-directory question quiet recon silent stop \
-                       touch version warn-undefined-variables what-if=)/' \
+                             dry-run environment-overrides file= help \
+                             ignore-errors include-dir= jobs[=N] just-print \
+                             keep-going load-average[=N] makefile= \
+                             max-load[=N] new-file= no-builtin-rules \
+                             no-keep-going no-print-directory old-file= \
+                             print-data-base print-directory question quiet \
+                             recon silent stop touch version \
+                             warn-undefined-variables what-if=)/' \
                        'n@*@`cat -s GNUMakefile Makefile makefile |& sed -n -e "/No such file/d" -e "s/^\([A-Za-z0-9-]*\):.*/\1/p"`@' \
-                       'n/=/f/' 'n/-f/f/'
-    complete mixer     p/1/'(vol bass treble synth pcm speaker mic cd mix \
-                       pcm2 rec igain ogain line1 line2 line3)'/ \
+                       'n/=/f/' \
+                       'n/-f/f/'
+complete mixer         p/1/'(vol bass treble synth pcm speaker mic cd mix \
+                             pcm2 rec igain ogain line1 line2 line3)'/ \
                        p@2@'`mixer $:-1 | awk \{\ print\ \$7\ \}`'@
 
-    complete mpg123    'c/--/(2to1 4to1 8bit aggressive au audiodevice \
-                       auth buffer cdr check doublespeed equalizer frames \
-                       gain halfspeed headphones left lineout list mix mono \
-                       proxy quiet random rate reopen resync right scale \
-                       shuffle single0 single1 skip speaker stdout stereo \
-                       test verbose wav)/'
-    complete mysqladmin        'n/*/(create drop extended-status flush-hosts \
-                       flush-logs flush-status flush-tables flush-privileges \
-                       kill password ping processlist reload refresh \
-                       shutdown status variables version)/'
-    complete mutt      "c@-f=@F:${HOME}/Mail/@" \
-                       n/-a/f/ \
-                       n/-F/f/ n/-H/f/ \
-                       n/-s/x:'<subject line>'/ \
-                       n/-e/x:'<command>'/ \
-                       n@-b@'`cat "${HOME}/.muttrc-alias" | awk '"'"'{print $2 }'"'"\`@ \
-                       n@-c@'`cat "${HOME}/.muttrc-alias" | awk '"'"'{print $2 }'"'"\`@ \
-                       n@*@'`cat "${HOME}/.muttrc-alias" | awk '"'"'{print $2 }'"'"\`@
-    complete ndc       'n/*/(status dumpdb reload stats trace notrace \
-                       querylog start stop restart )/'
-    if ($?traditional_complete) then
-        complete nm \
-               'c/--/(debug-syms defined-only demangle dynamic \
-                       extern-only format= help line-numbers no-demangle \
-                       no-sort numeric-sort portability print-armap \
-                       print-file-name reverse-sort size-sort undefined-only \
-                       version)/' 'p/*/f:^*.{h,C,c,cc}/'
-    else
-       complete nm \
-               'c/--radix=/x:<radix: _o_ctal _d_ecimal he_x_adecimal>/' \
-               'c/--target=/x:<bfdname>/' \
-               'c/--format=/(bsd sysv posix)/n/' \
-               'c/--/(debugsyms extern-only demangle dynamic print-armap \
-                       print-file-name numeric-sort no-sort reverse-sort \
-                       size-sort undefined-only portability target= radix= \
-                       format= defined-only\ line-numbers no-demangle version \
-                       help)//' \
-               'n/*/f:^*.{h,c,cc,s,S}/'
-    endif
-    complete nmap      'n@-e@`ifconfig -l`@' 'p/*/$hostnames/'
-    complete perldoc   'n@*@`\ls -1 /usr/libdata/perl/5.*/pod | sed s%\\.pod.\*\$%%`@'
-    complete postfix    'n/*/(start stop reload abort flush check)/'
-    complete postmap   'n/1/(hash: regexp:)/' 'c/hash:/f/' 'c/regexp:/f/'
-    complete rcsdiff   'p@1@`\ls -1a RCS | sed -e "s/\(.*\),v/\1/"`@'
-    complete X         'c/-/(I a ac allowMouseOpenFail allowNonLocalModInDev \
-                       allowNonLocalXvidtune ar1 ar2 audit auth bestRefresh \
-                       bgamma bpp broadcast bs c cc class co core deferglyphs \
-                       disableModInDev disableVidMode displayID dpi dpms f fc \
-                       flipPixels fn fp gamma ggamma help indirect kb keeptty \
-                       ld lf logo ls nolisten string noloadxkb nolock nopn \
-                       once p pn port probeonly query quiet r rgamma s \
-                       showconfig sp su t terminate to tst v verbose version \
-                       weight wm x xkbdb xkbmap)/'
-    complete users      'c/--/(help version)/' 'p/1/x:"<accounting_file>"/'
-    complete vidcontrol        'p/1/(132x25 132x30 132x43 132x50 132x60 40x25 80x25 \
-                       80x30 80x43 80x50 80x60 EGA_80x25 EGA_80x43 \
-                       VESA_132x25 VESA_132x30 VESA_132x43 VESA_132x50 \
-                       VESA_132x60 VESA_800x600 VGA_320x200 VGA_40x25 \
-                       VGA_80x25 VGA_80x30 VGA_80x50 VGA_80x60)/'
-    complete vim       'n/*/f:^*.[oa]/'
-    complete where     'n/*/c/'
-    complete which     'n/*/c/'
-    complete wmsetbg   'c/-/(display D S a b c d e m p s t u w)/' \
-                       'c/--/(back-color center colors dither help match \
-                       maxscale parse scale smooth tile update-domain \
-                       update-wmaker version workspace)/'
-    complete xdb       'p/1/c/'
-    complete xdvi      'c/-/(allowshell debug display expert gamma hushchars \
-                       hushchecksums hushspecials install interpreter keep \
-                       margins nogrey noinstall nomakepk noscan paper safer \
-                       shrinkbuttonn thorough topmargin underlink version)/' \
-                       'n/-paper/(a4 a4r a5 a5r)/' 'p/*/f:*.dvi/'
-    complete xlock     'c/-/(allowaccess allowroot debug description \
-                       echokeys enablesaver grabmouse grabserver hide inroot \
-                       install inwindow mono mousemotion nolock remote \
-                       resetsaver sound timeelapsed use3d usefirst verbose \
-                       wireframe background batchcount bg bitmap both3d \
-                       count cycles delay delta3d display dpmsoff \
-                       dpmsstandby dpmssuspend endCmd erasedelay erasemode \
-                       erasetime fg font foreground geometry help \
-                       icongeometry info invalid left3d lockdelay logoutCmd \
-                       mailCmd mailIcon message messagefile messagefont \
-                       messagesfile mode name ncolors nice nomailIcon none3d \
-                       parent password planfont program resources right3d \
-                       saturation size startCmd timeout username validate \
-                       version visual)/' 'n/-mode/(ant atlantis ball bat \
-                       blot bouboule bounce braid bubble bubble3d bug cage \
-                       cartoon clock coral crystal daisy dclock decay deco \
-                       demon dilemma discrete drift eyes fadeplot flag flame \
-                       flow forest galaxy gears goop grav helix hop hyper \
-                       ico ifs image invert julia kaleid kumppa lament laser \
-                       life life1d life3d lightning lisa lissie loop lyapunov \
-                       mandelbrot marquee matrix maze moebius morph3d \
-                       mountain munch nose pacman penrose petal pipes puzzle \
-                       pyro qix roll rotor rubik shape sierpinski slip sphere \
-                       spiral spline sproingies stairs star starfish strange \
-                       superquadrics swarm swirl tetris thornbird triangle \
-                       tube turtle vines voters wator wire world worm xjack \
-                       blank bomb random)/' 
-    complete xfig      'c/-/(display)/' 'p/*/f:*.fig/'
-    complete wget      c/--/"(accept= append-output= background cache= \
-                       continue convert-links cut-dirs= debug \
-                       delete-after directory-prefix= domains= \
-                       dont-remove-listing dot-style= exclude-directories= \
-                       exclude-domains= execute= follow-ftp \
-                       force-directories force-html glob= header= help \
-                       http-passwd= http-user= ignore-length \
-                       include-directories= input-file= level= mirror \
-                       no-clobber no-directories no-host-directories \
-                       no-host-lookup no-parent non-verbose \
-                       output-document= output-file= passive-ftp \
-                       proxy-passwd= proxy-user= proxy= quiet quota= \
-                       recursive reject= relative retr-symlinks save-headers \
-                       server-response span-hosts spider timeout= \
-                       timestamping tries= user-agent= verbose version wait=)"/
-
-    # these from Tom Warzeka <tom@waz.cc>
-
-    # this one works but is slow and doesn't descend into subdirectories
-    # complete cd      C@[./\$~]*@d@ \
-    #                  p@1@'`\ls -1F . $cdpath | grep /\$ | sort -u`'@ n@*@n@
-
-    if ( -r /etc/shells ) then
-        complete setenv        p@1@e@ n@DISPLAY@\$hosts@: n@SHELL@'`cat /etc/shells`'@
-    else
-       complete setenv p@1@e@ n@DISPLAY@\$hosts@:
-    endif
-    complete unsetenv  n/*/e/
-
-    set _maildir = /var/mail
-    if (-r "$HOME/.mailrc") then
-        complete mail  c/-/"(e i f n s u v)"/ c/*@/\$hosts/ \
-                       "c@+@F:$HOME/Mail@" C@[./\$~]@f@ n/-s/x:'<subject>'/ \
-                       n@-u@T:$_maildir@ n/-f/f/ \
-                       n@*@'`sed -n s/alias//p "$HOME/.mailrc" | \
-                       tr -s " " "     " | cut -f 2`'@
+complete mpg123                'c/--/(2to1 4to1 8bit aggressive au audiodevice auth \
+                             buffer cdr check doublespeed equalizer frames \
+                             gain halfspeed headphones left lineout list \
+                             mix mono proxy quiet random rate reopen resync \
+                             right scale shuffle single0 single1 skip \
+                             speaker stdout stereo test verbose wav)/'
+complete mysqladmin    'n/*/(create drop extended-status flush-hosts \
+                             flush-logs flush-status flush-tables \
+                             flush-privileges kill password ping \
+                             processlist reload refresh shutdown status \
+                             variables version)/'
+
+complete mutt \
+  "c@-f=@F:${HOME}/Mail/@" \
+  n/-a/f/ \
+  n/-F/f/ \
+  n/-H/f/ \
+  n/-s/x:'<subject line>'/ \
+  n/-e/x:'<command>'/ \
+  n@-b@'`cat "${HOME}/.muttrc-alias" | awk '"'"'{print $2 }'"'"\`@ \
+  n@-c@'`cat "${HOME}/.muttrc-alias" | awk '"'"'{print $2 }'"'"\`@ \
+  n@*@'`cat "${HOME}/.muttrc-alias" | awk '"'"'{print $2 }'"'"\`@
+
+complete ndc   'n/*/(status dumpdb reload stats trace notrace \
+                   querylog start stop restart )/'
+
+complete nm \
+  'c/--radix=/x:<radix: _o_ctal _d_ecimal he_x_adecimal>/' \
+  'c/--target=/x:<bfdname>/' \
+  'c/--format=/(bsd sysv posix)/n/' \
+  'c/--/(debugsyms extern-only demangle dynamic print-armap \
+         print-file-name numeric-sort no-sort reverse-sort \
+         size-sort undefined-only portability target= radix= \
+         format= defined-only\ line-numbers no-demangle version \
+         help)//' \
+  'n/*/f:^*.{h,c,cc,s,S}/'
+
+complete nmap  'n@-e@`ifconfig -l`@' 'p/*/$hostnames/'
+complete perldoc       'n@*@`\ls -1 /usr/libdata/perl/5.*/pod | sed s%\\.pod.\*\$%%`@'
+complete postfix    'n/*/(start stop reload abort flush check)/'
+complete postmap       'n/1/(hash: regexp:)/' 'c/hash:/f/' 'c/regexp:/f/'
+complete rcsdiff       'p@1@`\ls -1a RCS | sed -e "s/\(.*\),v/\1/"`@'
+complete X             'c/-/(I a ac allowMouseOpenFail allowNonLocalModInDev \
+                   allowNonLocalXvidtune ar1 ar2 audit auth bestRefresh \
+                   bgamma bpp broadcast bs c cc class co core deferglyphs \
+                   disableModInDev disableVidMode displayID dpi dpms f fc \
+                   flipPixels fn fp gamma ggamma help indirect kb keeptty \
+                   ld lf logo ls nolisten string noloadxkb nolock nopn \
+                   once p pn port probeonly query quiet r rgamma s \
+                   showconfig sp su t terminate to tst v verbose version \
+                   weight wm x xkbdb xkbmap)/'
+complete users      'c/--/(help version)/' 'p/1/x:"<accounting_file>"/'
+complete vidcontrol    'p/1/(132x25 132x30 132x43 132x50 132x60 40x25 80x25 \
+                   80x30 80x43 80x50 80x60 EGA_80x25 EGA_80x43 \
+                   VESA_132x25 VESA_132x30 VESA_132x43 VESA_132x50 \
+                   VESA_132x60 VESA_800x600 VGA_320x200 VGA_40x25 \
+                   VGA_80x25 VGA_80x30 VGA_80x50 VGA_80x60)/'
+complete vim   'n/*/f:^*.[oa]/'
+complete where 'n/*/c/'
+complete which 'n/*/c/'
+complete wmsetbg       'c/-/(display D S a b c d e m p s t u w)/' \
+                   'c/--/(back-color center colors dither help match \
+                   maxscale parse scale smooth tile update-domain \
+                   update-wmaker version workspace)/'
+complete xdb   'p/1/c/'
+complete xdvi  'c/-/(allowshell debug display expert gamma hushchars \
+                   hushchecksums hushspecials install interpreter keep \
+                   margins nogrey noinstall nomakepk noscan paper safer \
+                   shrinkbuttonn thorough topmargin underlink version)/' \
+                   'n/-paper/(a4 a4r a5 a5r)/' 'p/*/f:*.dvi/'
+complete xlock 'c/-/(allowaccess allowroot debug description \
+                   echokeys enablesaver grabmouse grabserver hide inroot \
+                   install inwindow mono mousemotion nolock remote \
+                   resetsaver sound timeelapsed use3d usefirst verbose \
+                   wireframe background batchcount bg bitmap both3d \
+                   count cycles delay delta3d display dpmsoff \
+                   dpmsstandby dpmssuspend endCmd erasedelay erasemode \
+                   erasetime fg font foreground geometry help \
+                   icongeometry info invalid left3d lockdelay logoutCmd \
+                   mailCmd mailIcon message messagefile messagefont \
+                   messagesfile mode name ncolors nice nomailIcon none3d \
+                   parent password planfont program resources right3d \
+                   saturation size startCmd timeout username validate \
+                   version visual)/' 'n/-mode/(ant atlantis ball bat \
+                   blot bouboule bounce braid bubble bubble3d bug cage \
+                   cartoon clock coral crystal daisy dclock decay deco \
+                   demon dilemma discrete drift eyes fadeplot flag flame \
+                   flow forest galaxy gears goop grav helix hop hyper \
+                   ico ifs image invert julia kaleid kumppa lament laser \
+                   life life1d life3d lightning lisa lissie loop lyapunov \
+                   mandelbrot marquee matrix maze moebius morph3d \
+                   mountain munch nose pacman penrose petal pipes puzzle \
+                   pyro qix roll rotor rubik shape sierpinski slip sphere \
+                   spiral spline sproingies stairs star starfish strange \
+                   superquadrics swarm swirl tetris thornbird triangle \
+                   tube turtle vines voters wator wire world worm xjack \
+                   blank bomb random)/' 
+complete xfig  'c/-/(display)/' 'p/*/f:*.fig/'
+complete wget  c/--/"(accept= append-output= background cache= \
+                   continue convert-links cut-dirs= debug \
+                   delete-after directory-prefix= domains= \
+                   dont-remove-listing dot-style= exclude-directories= \
+                   exclude-domains= execute= follow-ftp \
+                   force-directories force-html glob= header= help \
+                   http-passwd= http-user= ignore-length \
+                   include-directories= input-file= level= mirror \
+                   no-clobber no-directories no-host-directories \
+                   no-host-lookup no-parent non-verbose \
+                   output-document= output-file= passive-ftp \
+                   proxy-passwd= proxy-user= proxy= quiet quota= \
+                   recursive reject= relative retr-symlinks save-headers \
+                   server-response span-hosts spider timeout= \
+                   timestamping tries= user-agent= verbose version wait=)"/
+
+# these from Tom Warzeka <tom@waz.cc>
+
+# this one works but is slow and doesn't descend into subdirectories
+# complete     cd      C@[./\$~]*@d@ \
+#                      p@1@'`\ls -1F . $cdpath | grep /\$ | sort -u`'@ n@*@n@
+
+if ( -r /etc/shells ) then
+    complete setenv    p@1@e@ n@DISPLAY@\$hosts@: n@SHELL@'`cat /etc/shells`'@
+else
+    complete setenv    p@1@e@ n@DISPLAY@\$hosts@:
+endif
+complete unsetenv      n/*/e/
+
+set _maildir = /var/mail
+if (-r "$HOME/.mailrc") then
+    complete mail      c/-/"(e i f n s u v)"/ c/*@/\$hosts/ \
+                   "c@+@F:$HOME/Mail@" C@[./\$~]@f@ n/-s/x:'<subject>'/ \
+                   n@-u@T:$_maildir@ n/-f/f/ \
+                   n@*@'`sed -n s/alias//p "$HOME/.mailrc" | \
+                   tr -s " " " " | cut -f 2`'@
+else
+    complete mail      c/-/"(e i f n s u v)"/ c/*@/\$hosts/ \
+                   "c@+@F:$HOME/Mail@" C@[./\$~]@f@ n/-s/x:'<subject>'/ \
+                   n@-u@T:$_maildir@ n/-f/f/ n/*/u/
+endif
+unset _maildir
+
+if (! $?MANPATH) then
+    if (-r /usr/share/man) then
+       setenv MANPATH /usr/share/man:
     else
-        complete mail  c/-/"(e i f n s u v)"/ c/*@/\$hosts/ \
-                       "c@+@F:$HOME/Mail@" C@[./\$~]@f@ n/-s/x:'<subject>'/ \
-                       n@-u@T:$_maildir@ n/-f/f/ n/*/u/
-    endif
-    unset _maildir
-
-    if (! $?MANPATH) then
-       if (-r /usr/share/man) then
-           setenv MANPATH /usr/share/man:
-       else
-           setenv MANPATH /usr/man:
-       endif
+       setenv MANPATH /usr/man:
     endif
+endif
 
-    if ($?traditional_complete) then
-        # use of $MANPATH from Dan Nicolaescu <dann@ics.uci.edu>
-        # use of 'find' adapted from Lubomir Host <host8@kepler.fmph.uniba.sk>
-        complete man \
-           'n@1@`set q = "$MANPATH:as%:%/man1 %" ; \ls -1 $q |& sed -e s%^.\*:.\*\$%% -e s%\\.1.\*\$%%`@'\
-           'n@2@`set q = "$MANPATH:as%:%/man2 %" ; \ls -1 $q |& sed -e s%^.\*:.\*\$%% -e s%\\.2.\*\$%%`@'\
-           'n@3@`set q = "$MANPATH:as%:%/man3 %" ; \ls -1 $q |& sed -e s%^.\*:.\*\$%% -e s%\\.3.\*\$%%`@'\
-           'n@4@`set q = "$MANPATH:as%:%/man4 %" ; \ls -1 $q |& sed -e s%^.\*:.\*\$%% -e s%\\.4.\*\$%%`@'\
-           'n@5@`set q = "$MANPATH:as%:%/man5 %" ; \ls -1 $q |& sed -e s%^.\*:.\*\$%% -e s%\\.5.\*\$%%`@'\
-           'n@6@`set q = "$MANPATH:as%:%/man6 %" ; \ls -1 $q |& sed -e s%^.\*:.\*\$%% -e s%\\.6.\*\$%%`@'\
-           'n@7@`set q = "$MANPATH:as%:%/man7 %" ; \ls -1 $q |& sed -e s%^.\*:.\*\$%% -e s%\\.7.\*\$%%`@'\
-           'n@8@`set q = "$MANPATH:as%:%/man8 %" ; \ls -1 $q |& sed -e s%^.\*:.\*\$%% -e s%\\.8.\*\$%%`@'\
-           'n@9@`set q = "$MANPATH:as%:%/man9 %" ; \ls -1 $q |& sed -e s%^.\*:.\*\$%% -e s%\\.9.\*\$%%`@'\
-           'n@0@`set q = "$MANPATH:as%:%/man0 %" ; \ls -1 $q |& sed -e s%^.\*:.\*\$%% -e s%\\.0.\*\$%%`@'\
-           'n@n@`set q = "$MANPATH:as%:%/mann %" ; \ls -1 $q |& sed -e s%^.\*:.\*\$%% -e s%\\.n.\*\$%%`@'\
-           'n@o@`set q = "$MANPATH:as%:%/mano %" ; \ls -1 $q |& sed -e s%^.\*:.\*\$%% -e s%\\.o.\*\$%%`@'\
-           'n@l@`set q = "$MANPATH:as%:%/manl %" ; \ls -1 $q |& sed -e s%^.\*:.\*\$%% -e s%\\.l.\*\$%%`@'\
-           'n@p@`set q = "$MANPATH:as%:%/manp %" ; \ls -1 $q |& sed -e s%^.\*:.\*\$%% -e s%\\.p.\*\$%%`@'\
-           c@-@"(- f k M P s S t)"@ n@-f@c@ n@-k@x:'<keyword>'@ n@-[MP]@d@   \
-           'N@-[MP]@`\ls -1 $:-1/man? |& sed -n s%\\..\\+\$%%p`@'            \
-           'n@-[sS]@`\ls -1 $MANPATH:as%:% % |& sed -n s%^man%%p | sort -u`@'\
-           'n@*@`find $MANPATH:as%:% % \( -type f -o -type l \) -printf "%f " |& sed -e "s%find: .*: No such file or directory%%" -e "s%\([^\.]\+\)\.\([^ ]*\) %\1 %g"`@'
-           #n@*@c@ # old way -- commands only
-    else
-        complete man       n@1@'`\ls -1 /usr/man/man1 | sed s%\\.1.\*\$%%`'@ \
-                           n@2@'`\ls -1 /usr/man/man2 | sed s%\\.2.\*\$%%`'@ \
-                           n@3@'`\ls -1 /usr/man/man3 | sed s%\\.3.\*\$%%`'@ \
-                           n@4@'`\ls -1 /usr/man/man4 | sed s%\\.4.\*\$%%`'@ \
-                           n@5@'`\ls -1 /usr/man/man5 | sed s%\\.5.\*\$%%`'@ \
-                           n@6@'`\ls -1 /usr/man/man6 | sed s%\\.6.\*\$%%`'@ \
-                           n@7@'`\ls -1 /usr/man/man7 | sed s%\\.7.\*\$%%`'@ \
-                           n@8@'`\ls -1 /usr/man/man8 | sed s%\\.8.\*\$%%`'@ \
-    n@9@'`[ -r /usr/man/man9 ] && \ls -1 /usr/man/man9 | sed s%\\.9.\*\$%%`'@ \
-    n@0@'`[ -r /usr/man/man0 ] && \ls -1 /usr/man/man0 | sed s%\\.0.\*\$%%`'@ \
-  n@new@'`[ -r /usr/man/mann ] && \ls -1 /usr/man/mann | sed s%\\.n.\*\$%%`'@ \
-  n@old@'`[ -r /usr/man/mano ] && \ls -1 /usr/man/mano | sed s%\\.o.\*\$%%`'@ \
+if ($?traditional_complete) then
+    # use of $MANPATH from Dan Nicolaescu <dann@ics.uci.edu>
+    # use of 'find' adapted from Lubomir Host <host8@kepler.fmph.uniba.sk>
+    complete man \
+       'n@1@`set q = "$MANPATH:as%:%/man1 %" ; \ls -1 $q |& sed -e s%^.\*:.\*\$%% -e s%\\.1.\*\$%%`@'\
+       'n@2@`set q = "$MANPATH:as%:%/man2 %" ; \ls -1 $q |& sed -e s%^.\*:.\*\$%% -e s%\\.2.\*\$%%`@'\
+       'n@3@`set q = "$MANPATH:as%:%/man3 %" ; \ls -1 $q |& sed -e s%^.\*:.\*\$%% -e s%\\.3.\*\$%%`@'\
+       'n@4@`set q = "$MANPATH:as%:%/man4 %" ; \ls -1 $q |& sed -e s%^.\*:.\*\$%% -e s%\\.4.\*\$%%`@'\
+       'n@5@`set q = "$MANPATH:as%:%/man5 %" ; \ls -1 $q |& sed -e s%^.\*:.\*\$%% -e s%\\.5.\*\$%%`@'\
+       'n@6@`set q = "$MANPATH:as%:%/man6 %" ; \ls -1 $q |& sed -e s%^.\*:.\*\$%% -e s%\\.6.\*\$%%`@'\
+       'n@7@`set q = "$MANPATH:as%:%/man7 %" ; \ls -1 $q |& sed -e s%^.\*:.\*\$%% -e s%\\.7.\*\$%%`@'\
+       'n@8@`set q = "$MANPATH:as%:%/man8 %" ; \ls -1 $q |& sed -e s%^.\*:.\*\$%% -e s%\\.8.\*\$%%`@'\
+       'n@9@`set q = "$MANPATH:as%:%/man9 %" ; \ls -1 $q |& sed -e s%^.\*:.\*\$%% -e s%\\.9.\*\$%%`@'\
+       'n@0@`set q = "$MANPATH:as%:%/man0 %" ; \ls -1 $q |& sed -e s%^.\*:.\*\$%% -e s%\\.0.\*\$%%`@'\
+       'n@n@`set q = "$MANPATH:as%:%/mann %" ; \ls -1 $q |& sed -e s%^.\*:.\*\$%% -e s%\\.n.\*\$%%`@'\
+       'n@o@`set q = "$MANPATH:as%:%/mano %" ; \ls -1 $q |& sed -e s%^.\*:.\*\$%% -e s%\\.o.\*\$%%`@'\
+       'n@l@`set q = "$MANPATH:as%:%/manl %" ; \ls -1 $q |& sed -e s%^.\*:.\*\$%% -e s%\\.l.\*\$%%`@'\
+       'n@p@`set q = "$MANPATH:as%:%/manp %" ; \ls -1 $q |& sed -e s%^.\*:.\*\$%% -e s%\\.p.\*\$%%`@'\
+       c@-@"(- f k M P s S t)"@ n@-f@c@ n@-k@x:'<keyword>'@ n@-[MP]@d@   \
+       'N@-[MP]@`\ls -1 $:-1/man? |& sed -n s%\\..\\+\$%%p`@'            \
+       'n@-[sS]@`\ls -1 $MANPATH:as%:% % |& sed -n s%^man%%p | sort -u`@'\
+       'n@*@`find $MANPATH:as%:% % \( -type f -o -type l \) -printf "%f " |& sed -e "s%find: .*: No such file or directory%%" -e "s%\([^\.]\+\)\.\([^ ]*\) %\1 %g"`@'
+       #n@*@c@ # old way -- commands only
+else
+    complete man           n@1@'`\ls -1 /usr/man/man1 | sed s%\\.1.\*\$%%`'@ \
+                       n@2@'`\ls -1 /usr/man/man2 | sed s%\\.2.\*\$%%`'@ \
+                       n@3@'`\ls -1 /usr/man/man3 | sed s%\\.3.\*\$%%`'@ \
+                       n@4@'`\ls -1 /usr/man/man4 | sed s%\\.4.\*\$%%`'@ \
+                       n@5@'`\ls -1 /usr/man/man5 | sed s%\\.5.\*\$%%`'@ \
+                       n@6@'`\ls -1 /usr/man/man6 | sed s%\\.6.\*\$%%`'@ \
+                       n@7@'`\ls -1 /usr/man/man7 | sed s%\\.7.\*\$%%`'@ \
+                       n@8@'`\ls -1 /usr/man/man8 | sed s%\\.8.\*\$%%`'@ \
+n@9@'`[ -r /usr/man/man9 ] && \ls -1 /usr/man/man9 | sed s%\\.9.\*\$%%`'@ \
+n@0@'`[ -r /usr/man/man0 ] && \ls -1 /usr/man/man0 | sed s%\\.0.\*\$%%`'@ \
+n@new@'`[ -r /usr/man/mann ] && \ls -1 /usr/man/mann | sed s%\\.n.\*\$%%`'@ \
+n@old@'`[ -r /usr/man/mano ] && \ls -1 /usr/man/mano | sed s%\\.o.\*\$%%`'@ \
 n@local@'`[ -r /usr/man/manl ] && \ls -1 /usr/man/manl | sed s%\\.l.\*\$%%`'@ \
 n@public@'`[ -r /usr/man/manp ]&& \ls -1 /usr/man/manp | sed s%\\.p.\*\$%%`'@ \
-               c/-/"(- f k P s t)"/ n/-f/c/ n/-k/x:'<keyword>'/ n/-P/d/ \
-               N@-P@'`\ls -1 $:-1/man? | sed s%\\..\*\$%%`'@ n/*/c/
-    endif
-
-    complete ps                c/-t/x:'<tty>'/ c/-/"(a c C e g k l S t u v w x)"/ \
-                       n/-k/x:'<kernel>'/ N/-k/x:'<core_file>'/ n/*/x:'<PID>'/
-    complete compress  c/-/"(c f v b)"/ n/-b/x:'<max_bits>'/ n/*/f:^*.Z/
-    complete uncompress        c/-/"(c f v)"/                        n/*/f:*.Z/
-
-    complete uuencode  p/1/f/ p/2/x:'<decode_pathname>'/ n/*/n/
-    complete uudecode  c/-/"(f)"/ n/-f/f:*.{uu,UU}/ p/1/f:*.{uu,UU}/ n/*/n/
-
-    complete xhost     c/[+-]/\$hosts/ n/*/\$hosts/
-    complete xpdf      c/-/"(z g remote raise quit cmap rgb papercolor       \
-                             eucjp t1lib freetype ps paperw paperh level1    \
-                             upw fullscreen cmd q v h help)"/                \
-                       n/-z/x:'<zoom (-5 .. +5) or "page" or "width">'/      \
-                       n/-g/x:'<geometry>'/ n/-remote/x:'<name>'/            \
-                       n/-rgb/x:'<number>'/ n/-papercolor/x:'<color>'/       \
-                       n/-{t1lib,freetype}/x:'<font_type>'/                  \
-                       n/-ps/x:'<PS_file>'/ n/-paperw/x:'<width>'/           \
-                       n/-paperh/x:'<height>'/ n/-upw/x:'<password>'/        \
-                       n/-/f:*.{pdf,PDF}/                                    \
-                       N/-{z,g,remote,rgb,papercolor,t1lib,freetype,ps,paperw,paperh,upw}/f:*.{pdf,PDF}/ \
-                       N/-/x:'<page>'/ p/1/f:*.{pdf,PDF}/ p/2/x:'<page>'/
-
-    complete tcsh      c/-D*=/'x:<value>'/ c/-D/'x:<name>'/ \
-                       c/-/"(b c d D e f F i l m n q s t v V x X -version)"/ \
-                       n/-c/c/ n/{-l,--version}/n/ n/*/'f:*.{,t}csh'/
-
-    complete rpm       c/--/"(query verify nodeps nofiles nomd5 noscripts    \
-                       nogpg nopgp install upgrade freshen erase allmatches  \
-                       notriggers repackage test rebuild recompile initdb    \
-                       rebuilddb addsign resign querytags showrc setperms    \
-                       setugids all file group package querybynumber qf      \
-                       triggeredby whatprovides whatrequires changelog       \
-                       configfiles docfiles dump filesbypkg info last list   \
-                       provides queryformat requires scripts state triggers  \
-                       triggerscripts allfiles badreloc excludepath checksig \
-                       excludedocs force hash ignoresize ignorearch ignoreos \
-                       includedocs justdb noorder oldpackage percent prefix  \
-                       relocate replace-files replacepkgs buildroot clean    \
-                       nobuild rmsource rmspec short-circuit sign target     \
-                       help version quiet rcfile pipe dbpath root specfile)"/\
-                       c/-/"(q V K i U F e ba bb bp bc bi bl bs ta tb tp tc  \
-                       ti tl ts a f g p c d l R s h ? v vv -)"/              \
-               n/{-f,--file}/f/ n/{-g,--group}/g/ n/--pipe/c/ n/--dbpath/d/  \
-               n/--querybynumber/x:'<number>'/ n/--triggeredby/x:'<package>'/\
-               n/--what{provides,requires}/x:'<capability>'/ n/--root/d/     \
-               n/--{qf,queryformat}/x:'<format>'/ n/--buildroot/d/           \
-               n/--excludepath/x:'<oldpath>'/  n/--prefix/x:'<newpath>'/     \
-               n/--relocate/x:'<oldpath=newpath>'/ n/--target/x:'<platform>'/\
-               n/--rcfile/x:'<filelist>'/ n/--specfile/x:'<specfile>'/       \
-               n/{-[iUFep],--{install,upgrade,freshen,erase,package}}/f:*.rpm/
-
-    # these conform to the latest GNU versions available at press time ...
-    # updates by John Gotts <jgotts@engin.umich.edu>
-    if (-X emacs) then
-      # TW note:  if your version of GNU Emacs supports the "--version" option,
-      #           uncomment this line and comment the next to automatically
-      #           detect the version, else set "_emacs_ver" to your version.
-      #set _emacs_ver=`emacs --version | sed -e 's%GNU Emacs %%' -e q | cut -d . -f1-2`
-      set _emacs_ver=21.3
-      set _emacs_dir=`which emacs | sed s%/bin/emacs%%` 
-      complete emacs   c/--/"(batch terminal display no-windows no-init-file \
-                               user debug-init unibyte multibyte version help \
-                               no-site-file funcall load eval insert kill)"/ \
-                        c/-/"(t d nw q u f l -)"/ c/+/x:'<line_number>'/ \
-                       n/{-t,--terminal}/x:'<terminal>'/ n/{-d,--display}/x:'<display>'/ \
-                       n/{-u,--user}/u/ n/{-f,--funcall}/x:'<lisp_function>'/ \
-                       n@{-l,--load}@F:$_emacs_dir/share/emacs/$_emacs_ver/lisp@ \
-                       n/--eval/x:'<expression>'/ n/--insert/f/ n/*/f:^*[\#~]/
-      unset _emacs_ver _emacs_dir
-    endif
+           c/-/"(- f k P s t)"/ n/-f/c/ n/-k/x:'<keyword>'/ n/-P/d/ \
+           N@-P@'`\ls -1 $:-1/man? | sed s%\\..\*\$%%`'@ n/*/c/
+endif
 
-    complete gzcat     c/--/"(force help license quiet version)"/ \
-                       c/-/"(f h L q V -)"/ n/*/f:*.{gz,Z,z,zip}/
-    complete gzip      c/--/"(stdout to-stdout decompress uncompress \
-                       force help list license no-name quiet recurse \
-                       suffix test verbose version fast best)"/ \
-                       c/-/"(c d f h l L n q r S t v V 1 2 3 4 5 6 7 8 9 -)"/\
-                       n/{-S,--suffix}/x:'<file_name_suffix>'/ \
-                       n/{-d,--{de,un}compress}/f:*.{gz,Z,z,zip,taz,tgz}/ \
-                       N/{-d,--{de,un}compress}/f:*.{gz,Z,z,zip,taz,tgz}/ \
-                       n/*/f:^*.{gz,Z,z,zip,taz,tgz}/
-    complete {gunzip,ungzip} c/--/"(stdout to-stdout force help list license \
-                       no-name quiet recurse suffix test verbose version)"/ \
-                       c/-/"(c f h l L n q r S t v V -)"/ \
-                       n/{-S,--suffix}/x:'<file_name_suffix>'/ \
-                       n/*/f:*.{gz,Z,z,zip,taz,tgz}/
-    complete zgrep     c/-*A/x:'<#_lines_after>'/ c/-*B/x:'<#_lines_before>'/\
-                       c/-/"(A b B c C e f h i l n s v V w x)"/ \
-                       p/1/x:'<limited_regular_expression>'/ N/-*e/f/ \
-                       n/-*e/x:'<limited_regular_expression>'/ n/-*f/f/ n/*/f/
-    complete zegrep    c/-*A/x:'<#_lines_after>'/ c/-*B/x:'<#_lines_before>'/\
-                       c/-/"(A b B c C e f h i l n s v V w x)"/ \
-                       p/1/x:'<full_regular_expression>'/ N/-*e/f/ \
-                       n/-*e/x:'<full_regular_expression>'/ n/-*f/f/ n/*/f/
-    complete zfgrep    c/-*A/x:'<#_lines_after>'/ c/-*B/x:'<#_lines_before>'/\
-                       c/-/"(A b B c C e f h i l n s v V w x)"/ \
-                       p/1/x:'<fixed_string>'/ N/-*e/f/ \
-                       n/-*e/x:'<fixed_string>'/ n/-*f/f/ n/*/f/
-    complete znew      c/-/"(f t v 9 P K)"/ n/*/f:*.Z/
-    complete zmore     n/*/f:*.{gz,Z,z,zip}/
-    complete zfile     n/*/f:*.{gz,Z,z,zip,taz,tgz}/
-    complete ztouch    n/*/f:*.{gz,Z,z,zip,taz,tgz}/
-    complete zforce    n/*/f:^*.{gz,tgz}/
-
-    complete dcop 'p/1/`$:0`/ /' \
-       'p/2/`$:0 $:1 | awk \{print\ \$1\}`/ /' \
-       'p/3/`$:0 $:1 $:2 | sed "s%.* \(.*\)(.*%\1%"`/ /'
-
-
-    complete grep      c/-*A/x:'<#_lines_after>'/ c/-*B/x:'<#_lines_before>'/\
-                       c/--/"(extended-regexp fixed-regexp basic-regexp \
-                       regexp file ignore-case word-regexp line-regexp \
-                       no-messages revert-match version help byte-offset \
-                       line-number with-filename no-filename quiet silent \
-                       text directories recursive files-without-match \
-                       files-with-matches count before-context after-context \
-                       context binary unix-byte-offsets)"/ \
-                       c/-/"(A a B b C c d E e F f G H h i L l n q r s U u V \
-                               v w x)"/ \
-                       p/1/x:'<limited_regular_expression>'/ N/-*e/f/ \
-                       n/-*e/x:'<limited_regular_expression>'/ n/-*f/f/ n/*/f/
-    complete egrep     c/-*A/x:'<#_lines_after>'/ c/-*B/x:'<#_lines_before>'/\
-                       c/--/"(extended-regexp fixed-regexp basic-regexp \
-                       regexp file ignore-case word-regexp line-regexp \
-                       no-messages revert-match version help byte-offset \
-                       line-number with-filename no-filename quiet silent \
-                       text directories recursive files-without-match \
-                       files-with-matches count before-context after-context \
-                       context binary unix-byte-offsets)"/ \
-                       c/-/"(A a B b C c d E e F f G H h i L l n q r s U u V \
-                               v w x)"/ \
-                       p/1/x:'<full_regular_expression>'/ N/-*e/f/ \
-                       n/-*e/x:'<full_regular_expression>'/ n/-*f/f/ n/*/f/
-    complete fgrep     c/-*A/x:'<#_lines_after>'/ c/-*B/x:'<#_lines_before>'/\
-                       c/--/"(extended-regexp fixed-regexp basic-regexp \
-                       regexp file ignore-case word-regexp line-regexp \
-                       no-messages revert-match version help byte-offset \
-                       line-number with-filename no-filename quiet silent \
-                       text directories recursive files-without-match \
-                       files-with-matches count before-context after-context \
-                       context binary unix-byte-offsets)"/ \
-                       c/-/"(A a B b C c d E e F f G H h i L l n q r s U u V \
-                               v w x)"/ \
-                       p/1/x:'<fixed_string>'/ N/-*e/f/ \
-                       n/-*e/x:'<fixed_string>'/ n/-*f/f/ n/*/f/
-
-    complete sed       c/--/"(quiet silent version help expression file)"/   \
-                       c/-/"(n V e f -)"/ n/{-e,--expression}/x:'<script>'/  \
-                       n/{-f,--file}/f:*.sed/ N/-{e,f,-{file,expression}}/f/ \
-                       n/-/x:'<script>'/ N/-/f/ p/1/x:'<script>'/ p/2/f/
-
-    complete users     c/--/"(help version)"/ p/1/x:'<accounting_file>'/
-    complete who       c/--/"(heading idle count mesg message writable help \
-                       version)"/ c/-/"(H i m q s T w u -)"/ \
-                       p/1/x:'<accounting_file>'/ n/am/"(i)"/ n/are/"(you)"/
-
-    complete chown     c/--/"(changes dereference no-dereference silent \
-                       quiet reference recursive verbose help version)"/ \
-                       c/-/"(c f h R v -)"/ C@[./\$~]@f@ c/*[.:]/g/ \
-                       n/-/u/: p/1/u/: n/*/f/
-    complete chgrp     c/--/"(changes no-dereference silent quiet reference \
-                       recursive verbose help version)"/ \
-                       c/-/"(c f h R v -)"/ n/-/g/ p/1/g/ n/*/f/
-    complete chmod     c/--/"(changes silent quiet verbose reference \
-                       recursive help version)"/ c/-/"(c f R v)"/
-    complete df                c/--/"(all block-size human-readable si inodes \
-                       kilobytes local megabytes no-sync portability sync \
-                       type print-type exclude-type help version)"/ \
-                       c/-/"(a H h i k l m P T t v x)"/
-    complete du                c/--/"(all block-size bytes total dereference-args \
-                       human-readable si kilobytes count-links dereference \
-                       megabytes separate-dirs summarize one-file-system \
-                       exclude-from exclude max-depth help version"/ \
-                       c/-/"(a b c D H h k L l m S s X x)"/
-
-    complete cat       c/--/"(number-nonblank number squeeze-blank show-all \
-                       show-nonprinting show-ends show-tabs help version)"/ \
-                       c/-/"(A b E e n s T t u v -)"/ n/*/f/
-    complete mv                c/--/"(backup force interactive update verbose suffix \
-                       version-control help version)"/ \
-                       c/-/"(b f i S u V v -)"/ \
-                       n/{-S,--suffix}/x:'<suffix>'/ \
-                       n/{-V,--version-control}/"(t numbered nil existing \
-                       never simple)"/ n/-/f/ N/-/d/ p/1/f/ p/2/d/ n/*/f/
-    complete cp                c/--/"(archive backup no-dereference force \
-                       interactive link preserve parents sparse recursive \
-                       symbolic-link suffix update verbose version-control \
-                       one-file-system help version)"/ \
-                       c/-/"(a b d f i l P p R r S s u V v x -)"/ \
-                       n/-*r/d/ n/{-S,--suffix}/x:'<suffix>'/ \
-                       n/{-V,--version-control}/"(t numbered nil existing \
-                       never simple)"/ n/-/f/ N/-/d/ p/1/f/ p/2/d/ n/*/f/
-    complete ln                c/--/"(backup directory force no-dereference \
-                       interactive symbolic suffix verbose version-control \
-                       help version)"/ \
-                       c/-/"(b d F f i n S s V v -)"/ \
-                       n/{-S,--suffix}/x:'<suffix>'/ \
-                       n/{-V,--version-control}/"(t numbered nil existing \
-                       never simple)"/ n/-/f/ N/-/x:'<link_name>'/ \
-                       p/1/f/ p/2/x:'<link_name>'/
-    complete touch     c/--/"(date reference time help version)"/ \
-                       c/-/"(a c d f m r t -)"/ \
-                       n/{-d,--date}/x:'<date_string>'/ \
-                       c/--time/"(access atime mtime modify use)"/ \
-                       n/{-r,--file}/f/ n/-t/x:'<time_stamp>'/ n/*/f/
-    complete mkdir     c/--/"(mode parents verbose help version)"/ \
-                       c/-/"(p m -)"/ \
-                       n/{-m,--mode}/x:'<mode>'/ n/*/d/
-    complete rmdir     c/--/"(ignore-fail-on-non-empty parents verbose help \
-                       version)"/ c/-/"(p -)"/ n/*/d/
-    complete env       'c/*=/f/' 'p/1/e/=/' 'p/2/c/'
-
-    complete tar       c/-[Acru]*/"(b B C f F g G h i l L M N o P \
-                       R S T v V w W X z Z)"/ \
-                       c/-[dtx]*/"( B C f F g G i k K m M O p P \
-                       R s S T v w x X z Z)"/ \
-                       p/1/"(A c d r t u x -A -c -d -r -t -u -x \
-                       --catenate --concatenate --create --diff --compare \
-                       --delete --append --list --update --extract --get \
-                       --help --version)"/ \
-                       c/--/"(catenate concatenate create diff compare \
-                       delete append list update extract get atime-preserve \
-                       block-size read-full-blocks directory checkpoint file \
-                       force-local info-script new-volume-script incremental \
-                       listed-incremental dereference ignore-zeros \
-                       ignore-failed-read keep-old-files starting-file \
-                       one-file-system tape-length modification-time \
-                       multi-volume after-date newer old-archive portability \
-                       to-stdout same-permissions preserve-permissions \
-                       absolute-paths preserve record-number remove-files \
-                       same-order preserve-order same-owner sparse \
-                       files-from null totals verbose label version \
-                       interactive confirmation verify exclude exclude-from \
-                       compress uncompress gzip ungzip use-compress-program \
-                       block-compress help version)"/ \
-                       c/-/"(b B C f F g G h i k K l L m M N o O p P R s S \
-                       T v V w W X z Z 0 1 2 3 4 5 6 7 -)"/ \
-                       C@/dev@f@ \
-                       n/-c*f/x:'<new_tar_file, device_file, or "-">'/ \
-                       n/{-[Adrtux]j*f,--file}/f:*.{tar.bz2,tbz}/ \
-                       n/{-[Adrtux]z*f,--file}/f:*.{tar.gz,tgz}/ \
-                       n/{-[Adrtux]Z*f,--file}/f:*.{tar.Z,taz}/ \
-                       n/{-[Adrtux]*f,--file}/f:*.tar/ \
-                       N/{-xj*f,--file}/'`tar -tjf $:-1`'/ \
-                       N/{-xz*f,--file}/'`tar -tzf $:-1`'/ \
-                       N/{-xZ*f,--file}/'`tar -tZf $:-1`'/ \
-                       N/{-x*f,--file}/'`tar -tf $:-1`'/ \
-                       n/--use-compress-program/c/ \
-                       n/{-b,--block-size}/x:'<block_size>'/ \
-                       n/{-V,--label}/x:'<volume_label>'/ \
-                       n/{-N,--{after-date,newer}}/x:'<date>'/ \
-                       n/{-L,--tape-length}/x:'<tape_length_in_kB>'/ \
-                       n/{-C,--directory}/d/ \
-                       N/{-C,--directory}/'`\ls $:-1`'/ \
-                       n/-[0-7]/"(l m h)"/
-
-    switch ( "$OSTYPE" )
-    case "linux":
-      # Linux filesystems
-      complete  mount  c/-/"(a f F h l n o r s t U v V w)"/ n/-[hV]/n/ \
-                       n/-o/x:'<options>'/ n/-t/x:'<vfstype>'/ \
-                       n/-L/x:'<label>'/ n/-U/x:'<uuid>'/ \
-                       n@*@'`grep -v "^#" /etc/fstab | tr -s " " "      " | cut -f 2`'@
-      complete umount  c/-/"(a h n r t v V)"/ n/-t/x:'<vfstype>'/ \
-                         n/*/'`mount | cut -d " " -f 3`'/
-      breaksw
-    case "sunos*":
-    case "solaris":
-      # Solaris filesystems
-      complete  mount  c/-/"(a F m o O p r v V)"/ n/-p/n/ n/-v/n/ \
-                       n/-o/x:'<FSType_options>'/ \
-                       n@-F@'`\ls -1 /usr/lib/fs`'@ \
-                       n@*@'`grep -v "^#" /etc/vfstab | tr -s " " "     " | cut -f 3`'@
-      complete umount  c/-/"(a o V)"/ n/-o/x:'<FSType_options>'/ \
-                       n/*/'`mount | cut -d " " -f 1`'/
-      complete  mountall       c/-/"(F l r)"/ n@-F@'`\ls -1 /usr/lib/fs`'@
-      complete umountall       c/-/"(F h k l r s)"/ n@-F@'`\ls -1 /usr/lib/fs`'@ \
-                       n/-h/'`df -k | cut -s -d ":" -f 1 | sort -u`'/
-      breaksw
-    case "cygwin":
-      # Cygwin mounts
-      complete  mount  c/-/"(b c f h m o p s t u v x E X)"/ n/-[hmpv]/n/ \
-                       n/-c/x:'/'/ \
-                       n/-o/"(user system binary text exec notexec cygexec nosuid managed)"/ \
-                       n@*@'`mount -p | tail -1 | cut -d " " -f 1 | xargs ls -1 | awk '"'"'{print $1":/"; } END{print "//";}'"'"'`'@
-      complete umount  c/-/"(A c h s S u U v)"/ n/-[AhSUv]/n/ \
-                       n@*@'`mount | grep -v noumount | cut -d " " -f 3`'@
-      breaksw
-    default:
-      breaksw
-    endsw
-
-    # these deal with NIS (formerly YP); if it's not running you don't need 'em
-    if (-X domainname) then
-      set _domain = "`domainname`"
-      set _ypdir  = /var/yp    # directory where NIS (YP) maps are kept
-      if ("$_domain" != "" && "$_domain" != "noname") then
-        complete domainname p@1@D:$_ypdir@" " n@*@n@
-        complete ypcat     c@-@"(d k t x)"@ n@-x@n@ n@-d@D:$_ypdir@" " \
-                           N@-d@\`\\ls\ -1\ $_ypdir/\$:-1\ \|\ sed\ -n\ s%\\\\.pag\\\$%%p\`@ \
-                           n@*@\`\\ls\ -1\ $_ypdir/$_domain\ \|\ sed\ -n\ s%\\\\.pag\\\$%%p\`@
-        complete ypmatch    c@-@"(d k t x)"@ n@-x@n@ n@-d@D:$_ypdir@" " \
-                           N@-d@x:'<key ...>'@ n@-@x:'<key ...>'@ p@1@x:'<key ...>'@ \
-                           n@*@\`\\ls\ -1\ $_ypdir/$_domain\ \|\ sed\ -n\ s%\\\\.pag\\\$%%p\`@
-        complete ypwhich    c@-@"(d m t x V1 V2)"@ n@-x@n@ n@-d@D:$_ypdir@" " \
-                           n@-m@\`\\ls\ -1\ $_ypdir/$_domain\ \|\ sed\ -n\ s%\\\\.pag\\\$%%p\`@ \
-                           N@-m@n@ n@*@\$hosts@
-      endif
-      unset _domain _ypdir
-    endif
+complete ps            c/-t/x:'<tty>'/ c/-/"(a c C e g k l S t u v w x)"/ \
+                   n/-k/x:'<kernel>'/ N/-k/x:'<core_file>'/ n/*/x:'<PID>'/
+complete compress      c/-/"(c f v b)"/ n/-b/x:'<max_bits>'/ n/*/f:^*.Z/
+complete uncompress    c/-/"(c f v)"/                        n/*/f:*.Z/
+
+complete uuencode      p/1/f/ p/2/x:'<decode_pathname>'/ n/*/n/
+complete uudecode      c/-/"(f)"/ n/-f/f:*.{uu,UU}/ p/1/f:*.{uu,UU}/ n/*/n/
+
+complete xhost c/[+-]/\$hosts/ n/*/\$hosts/
+complete xpdf  c/-/"(z g remote raise quit cmap rgb papercolor       \
+                         eucjp t1lib freetype ps paperw paperh level1    \
+                         upw fullscreen cmd q v h help)"/                \
+                   n/-z/x:'<zoom (-5 .. +5) or "page" or "width">'/      \
+                   n/-g/x:'<geometry>'/ n/-remote/x:'<name>'/            \
+                   n/-rgb/x:'<number>'/ n/-papercolor/x:'<color>'/       \
+                   n/-{t1lib,freetype}/x:'<font_type>'/                  \
+                   n/-ps/x:'<PS_file>'/ n/-paperw/x:'<width>'/           \
+                   n/-paperh/x:'<height>'/ n/-upw/x:'<password>'/        \
+                   n/-/f:*.{pdf,PDF}/                                    \
+                   N/-{z,g,remote,rgb,papercolor,t1lib,freetype,ps,paperw,paperh,upw}/f:*.{pdf,PDF}/ \
+                   N/-/x:'<page>'/ p/1/f:*.{pdf,PDF}/ p/2/x:'<page>'/
+
+complete tcsh  c/-D*=/'x:<value>'/ c/-D/'x:<name>'/ \
+                   c/-/"(b c d D e f F i l m n q s t v V x X -version)"/ \
+                   n/-c/c/ n/{-l,--version}/n/ n/*/'f:*.{,t}csh'/
+
+complete rpm   c/--/"(query verify nodeps nofiles nomd5 noscripts    \
+                   nogpg nopgp install upgrade freshen erase allmatches  \
+                   notriggers repackage test rebuild recompile initdb    \
+                   rebuilddb addsign resign querytags showrc setperms    \
+                   setugids all file group package querybynumber qf      \
+                   triggeredby whatprovides whatrequires changelog       \
+                   configfiles docfiles dump filesbypkg info last list   \
+                   provides queryformat requires scripts state triggers  \
+                   triggerscripts allfiles badreloc excludepath checksig \
+                   excludedocs force hash ignoresize ignorearch ignoreos \
+                   includedocs justdb noorder oldpackage percent prefix  \
+                   relocate replace-files replacepkgs buildroot clean    \
+                   nobuild rmsource rmspec short-circuit sign target     \
+                   help version quiet rcfile pipe dbpath root specfile)"/\
+                   c/-/"(q V K i U F e ba bb bp bc bi bl bs ta tb tp tc  \
+                   ti tl ts a f g p c d l R s h ? v vv -)"/              \
+           n/{-f,--file}/f/ n/{-g,--group}/g/ n/--pipe/c/ n/--dbpath/d/  \
+           n/--querybynumber/x:'<number>'/ n/--triggeredby/x:'<package>'/\
+           n/--what{provides,requires}/x:'<capability>'/ n/--root/d/     \
+           n/--{qf,queryformat}/x:'<format>'/ n/--buildroot/d/           \
+           n/--excludepath/x:'<oldpath>'/  n/--prefix/x:'<newpath>'/     \
+           n/--relocate/x:'<oldpath=newpath>'/ n/--target/x:'<platform>'/\
+           n/--rcfile/x:'<filelist>'/ n/--specfile/x:'<specfile>'/       \
+           n/{-[iUFep],--{install,upgrade,freshen,erase,package}}/f:*.rpm/
+
+# these conform to the latest GNU versions available at press time ...
+# updates by John Gotts <jgotts@engin.umich.edu>
+if (-X emacs) then
+  # TW note:  if your version of GNU Emacs supports the "--version" option,
+  #           uncomment this line and comment the next to automatically
+  #           detect the version, else set "_emacs_ver" to your version.
+  #set _emacs_ver=`emacs --version | sed -e 's%GNU Emacs %%' -e q | cut -d . -f1-2`
+  set _emacs_ver=21.3
+  set _emacs_dir=`which emacs | sed s%/bin/emacs%%` 
+  complete emacs       c/--/"(batch terminal display no-windows no-init-file \
+                          user debug-init unibyte multibyte version help \
+                          no-site-file funcall load eval insert kill)"/ \
+                   c/-/"(t d nw q u f l -)"/ c/+/x:'<line_number>'/ \
+                   n/{-t,--terminal}/x:'<terminal>'/ n/{-d,--display}/x:'<display>'/ \
+                   n/{-u,--user}/u/ n/{-f,--funcall}/x:'<lisp_function>'/ \
+                   n@{-l,--load}@F:$_emacs_dir/share/emacs/$_emacs_ver/lisp@ \
+                   n/--eval/x:'<expression>'/ n/--insert/f/ n/*/f:^*[\#~]/
+  unset _emacs_ver _emacs_dir
+endif
 
-    complete make \
-       'n/-f/f/' \
-       'c/*=/f/' \
-       'n@*@`cat -s GNUmakefile Makefile makefile |& sed -n -e "/No such file/d" -e "/^[^     #].*:/s/:.*//p"`@'
+complete gzcat c/--/"(force help license quiet version)"/ \
+                   c/-/"(f h L q V -)"/ n/*/f:*.{gz,Z,z,zip}/
+complete gzip  c/--/"(stdout to-stdout decompress uncompress \
+                   force help list license no-name quiet recurse \
+                   suffix test verbose version fast best)"/ \
+                   c/-/"(c d f h l L n q r S t v V 1 2 3 4 5 6 7 8 9 -)"/\
+                   n/{-S,--suffix}/x:'<file_name_suffix>'/ \
+                   n/{-d,--{de,un}compress}/f:*.{gz,Z,z,zip,taz,tgz}/ \
+                   N/{-d,--{de,un}compress}/f:*.{gz,Z,z,zip,taz,tgz}/ \
+                   n/*/f:^*.{gz,Z,z,zip,taz,tgz}/
+complete {gunzip,ungzip} c/--/"(stdout to-stdout force help list license \
+                   no-name quiet recurse suffix test verbose version)"/ \
+                   c/-/"(c f h l L n q r S t v V -)"/ \
+                   n/{-S,--suffix}/x:'<file_name_suffix>'/ \
+                   n/*/f:*.{gz,Z,z,zip,taz,tgz}/
+complete zgrep c/-*A/x:'<#_lines_after>'/ c/-*B/x:'<#_lines_before>'/\
+                   c/-/"(A b B c C e f h i l n s v V w x)"/ \
+                   p/1/x:'<limited_regular_expression>'/ N/-*e/f/ \
+                   n/-*e/x:'<limited_regular_expression>'/ n/-*f/f/ n/*/f/
+complete zegrep        c/-*A/x:'<#_lines_after>'/ c/-*B/x:'<#_lines_before>'/\
+                   c/-/"(A b B c C e f h i l n s v V w x)"/ \
+                   p/1/x:'<full_regular_expression>'/ N/-*e/f/ \
+                   n/-*e/x:'<full_regular_expression>'/ n/-*f/f/ n/*/f/
+complete zfgrep        c/-*A/x:'<#_lines_after>'/ c/-*B/x:'<#_lines_before>'/\
+                   c/-/"(A b B c C e f h i l n s v V w x)"/ \
+                   p/1/x:'<fixed_string>'/ N/-*e/f/ \
+                   n/-*e/x:'<fixed_string>'/ n/-*f/f/ n/*/f/
+complete znew  c/-/"(f t v 9 P K)"/ n/*/f:*.Z/
+complete zmore n/*/f:*.{gz,Z,z,zip}/
+complete zfile n/*/f:*.{gz,Z,z,zip,taz,tgz}/
+complete ztouch        n/*/f:*.{gz,Z,z,zip,taz,tgz}/
+complete zforce        n/*/f:^*.{gz,tgz}/
+
+complete dcop 'p/1/`$:0`/ /' \
+    'p/2/`$:0 $:1 | awk \{print\ \$1\}`/ /' \
+    'p/3/`$:0 $:1 $:2 | sed "s%.* \(.*\)(.*%\1%"`/ /'
+
+
+complete grep  c/-*A/x:'<#_lines_after>'/ c/-*B/x:'<#_lines_before>'/\
+                   c/--/"(extended-regexp fixed-regexp basic-regexp \
+                   regexp file ignore-case word-regexp line-regexp \
+                   no-messages revert-match version help byte-offset \
+                   line-number with-filename no-filename quiet silent \
+                   text directories recursive files-without-match \
+                   files-with-matches count before-context after-context \
+                   context binary unix-byte-offsets)"/ \
+                   c/-/"(A a B b C c d E e F f G H h i L l n q r s U u V \
+                           v w x)"/ \
+                   p/1/x:'<limited_regular_expression>'/ N/-*e/f/ \
+                   n/-*e/x:'<limited_regular_expression>'/ n/-*f/f/ n/*/f/
+complete egrep c/-*A/x:'<#_lines_after>'/ c/-*B/x:'<#_lines_before>'/\
+                   c/--/"(extended-regexp fixed-regexp basic-regexp \
+                   regexp file ignore-case word-regexp line-regexp \
+                   no-messages revert-match version help byte-offset \
+                   line-number with-filename no-filename quiet silent \
+                   text directories recursive files-without-match \
+                   files-with-matches count before-context after-context \
+                   context binary unix-byte-offsets)"/ \
+                   c/-/"(A a B b C c d E e F f G H h i L l n q r s U u V \
+                           v w x)"/ \
+                   p/1/x:'<full_regular_expression>'/ N/-*e/f/ \
+                   n/-*e/x:'<full_regular_expression>'/ n/-*f/f/ n/*/f/
+complete fgrep c/-*A/x:'<#_lines_after>'/ c/-*B/x:'<#_lines_before>'/\
+                   c/--/"(extended-regexp fixed-regexp basic-regexp \
+                   regexp file ignore-case word-regexp line-regexp \
+                   no-messages revert-match version help byte-offset \
+                   line-number with-filename no-filename quiet silent \
+                   text directories recursive files-without-match \
+                   files-with-matches count before-context after-context \
+                   context binary unix-byte-offsets)"/ \
+                   c/-/"(A a B b C c d E e F f G H h i L l n q r s U u V \
+                           v w x)"/ \
+                   p/1/x:'<fixed_string>'/ N/-*e/f/ \
+                   n/-*e/x:'<fixed_string>'/ n/-*f/f/ n/*/f/
+
+complete sed   c/--/"(quiet silent version help expression file)"/   \
+                   c/-/"(n V e f -)"/ n/{-e,--expression}/x:'<script>'/  \
+                   n/{-f,--file}/f:*.sed/ N/-{e,f,-{file,expression}}/f/ \
+                   n/-/x:'<script>'/ N/-/f/ p/1/x:'<script>'/ p/2/f/
+
+complete users c/--/"(help version)"/ p/1/x:'<accounting_file>'/
+complete who   c/--/"(heading idle count mesg message writable help \
+                   version)"/ c/-/"(H i m q s T w u -)"/ \
+                   p/1/x:'<accounting_file>'/ n/am/"(i)"/ n/are/"(you)"/
+
+complete chown c/--/"(changes dereference no-dereference silent \
+                   quiet reference recursive verbose help version)"/ \
+                   c/-/"(c f h R v -)"/ C@[./\$~]@f@ c/*[.:]/g/ \
+                   n/-/u/: p/1/u/: n/*/f/
+complete chgrp c/--/"(changes no-dereference silent quiet reference \
+                   recursive verbose help version)"/ \
+                   c/-/"(c f h R v -)"/ n/-/g/ p/1/g/ n/*/f/
+complete chmod c/--/"(changes silent quiet verbose reference \
+                   recursive help version)"/ c/-/"(c f R v)"/
+complete df            c/--/"(all block-size human-readable si inodes \
+                   kilobytes local megabytes no-sync portability sync \
+                   type print-type exclude-type help version)"/ \
+                   c/-/"(a H h i k l m P T t v x)"/
+complete du            c/--/"(all block-size bytes total dereference-args \
+                   human-readable si kilobytes count-links dereference \
+                   megabytes separate-dirs summarize one-file-system \
+                   exclude-from exclude max-depth help version"/ \
+                   c/-/"(a b c D H h k L l m S s X x)"/
+
+complete cat   c/--/"(number-nonblank number squeeze-blank show-all \
+                   show-nonprinting show-ends show-tabs help version)"/ \
+                   c/-/"(A b E e n s T t u v -)"/ n/*/f/
+complete mv            c/--/"(backup force interactive update verbose suffix \
+                   version-control help version)"/ \
+                   c/-/"(b f i S u V v -)"/ \
+                   n/{-S,--suffix}/x:'<suffix>'/ \
+                   n/{-V,--version-control}/"(t numbered nil existing \
+                   never simple)"/ n/-/f/ N/-/d/ p/1/f/ p/2/d/ n/*/f/
+complete cp            c/--/"(archive backup no-dereference force \
+                   interactive link preserve parents sparse recursive \
+                   symbolic-link suffix update verbose version-control \
+                   one-file-system help version)"/ \
+                   c/-/"(a b d f i l P p R r S s u V v x -)"/ \
+                   n/-*r/d/ n/{-S,--suffix}/x:'<suffix>'/ \
+                   n/{-V,--version-control}/"(t numbered nil existing \
+                   never simple)"/ n/-/f/ N/-/d/ p/1/f/ p/2/d/ n/*/f/
+complete ln            c/--/"(backup directory force no-dereference \
+                   interactive symbolic suffix verbose version-control \
+                   help version)"/ \
+                   c/-/"(b d F f i n S s V v -)"/ \
+                   n/{-S,--suffix}/x:'<suffix>'/ \
+                   n/{-V,--version-control}/"(t numbered nil existing \
+                   never simple)"/ n/-/f/ N/-/x:'<link_name>'/ \
+                   p/1/f/ p/2/x:'<link_name>'/
+complete touch c/--/"(date reference time help version)"/ \
+                   c/-/"(a c d f m r t -)"/ \
+                   n/{-d,--date}/x:'<date_string>'/ \
+                   c/--time/"(access atime mtime modify use)"/ \
+                   n/{-r,--file}/f/ n/-t/x:'<time_stamp>'/ n/*/f/
+complete mkdir c/--/"(mode parents verbose help version)"/ \
+                   c/-/"(p m -)"/ \
+                   n/{-m,--mode}/x:'<mode>'/ n/*/d/
+complete rmdir c/--/"(ignore-fail-on-non-empty parents verbose help \
+                   version)"/ c/-/"(p -)"/ n/*/d/
+complete env   'c/*=/f/' 'p/1/e/=/' 'p/2/c/'
+
+complete tar   c/-[Acru]*/"(b B C f F g G h i l L M N o P \
+                   R S T v V w W X z Z)"/ \
+                   c/-[dtx]*/"( B C f F g G i k K m M O p P \
+                   R s S T v w x X z Z)"/ \
+                   p/1/"(A c d r t u x -A -c -d -r -t -u -x \
+                   --catenate --concatenate --create --diff --compare \
+                   --delete --append --list --update --extract --get \
+                   --help --version)"/ \
+                   c/--/"(catenate concatenate create diff compare \
+                   delete append list update extract get atime-preserve \
+                   block-size read-full-blocks directory checkpoint file \
+                   force-local info-script new-volume-script incremental \
+                   listed-incremental dereference ignore-zeros \
+                   ignore-failed-read keep-old-files starting-file \
+                   one-file-system tape-length modification-time \
+                   multi-volume after-date newer old-archive portability \
+                   to-stdout same-permissions preserve-permissions \
+                   absolute-paths preserve record-number remove-files \
+                   same-order preserve-order same-owner sparse \
+                   files-from null totals verbose label version \
+                   interactive confirmation verify exclude exclude-from \
+                   compress uncompress gzip ungzip use-compress-program \
+                   block-compress help version)"/ \
+                   c/-/"(b B C f F g G h i k K l L m M N o O p P R s S \
+                   T v V w W X z Z 0 1 2 3 4 5 6 7 -)"/ \
+                   C@/dev@f@ \
+                   n/-c*f/x:'<new_tar_file, device_file, or "-">'/ \
+                   n/{-[Adrtux]j*f,--file}/f:*.{tar.bz2,tbz}/ \
+                   n/{-[Adrtux]z*f,--file}/f:*.{tar.gz,tgz}/ \
+                   n/{-[Adrtux]Z*f,--file}/f:*.{tar.Z,taz}/ \
+                   n/{-[Adrtux]*f,--file}/f:*.tar/ \
+                   N/{-xj*f,--file}/'`tar -tjf $:-1`'/ \
+                   N/{-xz*f,--file}/'`tar -tzf $:-1`'/ \
+                   N/{-xZ*f,--file}/'`tar -tZf $:-1`'/ \
+                   N/{-x*f,--file}/'`tar -tf $:-1`'/ \
+                   n/--use-compress-program/c/ \
+                   n/{-b,--block-size}/x:'<block_size>'/ \
+                   n/{-V,--label}/x:'<volume_label>'/ \
+                   n/{-N,--{after-date,newer}}/x:'<date>'/ \
+                   n/{-L,--tape-length}/x:'<tape_length_in_kB>'/ \
+                   n/{-C,--directory}/d/ \
+                   N/{-C,--directory}/'`\ls $:-1`'/ \
+                   n/-[0-7]/"(l m h)"/
+
+switch ( "$OSTYPE" )
+case linux:
+  # Linux filesystems
+  complete  mount      c/-/"(a f F h l n o r s t U v V w)"/ n/-[hV]/n/ \
+                   n/-o/x:'<options>'/ n/-t/x:'<vfstype>'/ \
+                   n/-L/x:'<label>'/ n/-U/x:'<uuid>'/ \
+                   n@*@'`grep -v "^#" /etc/fstab | tr -s " " "  " | cut -f 2`'@
+  complete umount      c/-/"(a h n r t v V)"/ n/-t/x:'<vfstype>'/ \
+                     n/*/'`mount | cut -d " " -f 3`'/
+  breaksw
+case sunos*:
+case solaris:
+  # Solaris filesystems
+  complete  mount      c/-/"(a F m o O p r v V)"/ n/-p/n/ n/-v/n/ \
+                   n/-o/x:'<FSType_options>'/ \
+                   n@-F@'`\ls -1 /usr/lib/fs`'@ \
+                   n@*@'`grep -v "^#" /etc/vfstab | tr -s " " "         " | cut -f 3`'@
+  complete umount      c/-/"(a o V)"/ n/-o/x:'<FSType_options>'/ \
+                   n/*/'`mount | cut -d " " -f 1`'/
+  complete  mountall   c/-/"(F l r)"/ n@-F@'`\ls -1 /usr/lib/fs`'@
+  complete umountall   c/-/"(F h k l r s)"/ n@-F@'`\ls -1 /usr/lib/fs`'@ \
+                   n/-h/'`df -k | cut -s -d ":" -f 1 | sort -u`'/
+  breaksw
+case cygwin:
+  # Cygwin mounts
+  complete  mount      c/-/"(b c f h m o p s t u v x E X)"/ n/-[hmpv]/n/ \
+                   n/-c/x:'/'/ \
+                   n/-o/"(user system binary text exec notexec cygexec nosuid managed)"/ \
+                   n@*@'`mount -p | tail -1 | cut -d " " -f 1 | xargs ls -1 | awk '"'"'{print $1":/"; } END{print "//";}'"'"'`'@
+  complete umount      c/-/"(A c h s S u U v)"/ n/-[AhSUv]/n/ \
+                   n@*@'`mount | grep -v noumount | cut -d " " -f 3`'@
+  breaksw
+endsw
+
+# these deal with NIS (formerly YP); if it's not running you don't need 'em
+if (-X domainname) then
+  set _domain = "`domainname`"
+  set _ypdir  = /var/yp        # directory where NIS (YP) maps are kept
+  if ("$_domain" != "" && "$_domain" != "noname") then
+    complete domainname p@1@D:$_ypdir@" " n@*@n@
+    complete ypcat         c@-@"(d k t x)"@ n@-x@n@ n@-d@D:$_ypdir@" " \
+                       N@-d@\`\\ls\ -1\ $_ypdir/\$:-1\ \|\ sed\ -n\ s%\\\\.pag\\\$%%p\`@ \
+                       n@*@\`\\ls\ -1\ $_ypdir/$_domain\ \|\ sed\ -n\ s%\\\\.pag\\\$%%p\`@
+    complete ypmatch    c@-@"(d k t x)"@ n@-x@n@ n@-d@D:$_ypdir@" " \
+                       N@-d@x:'<key ...>'@ n@-@x:'<key ...>'@ p@1@x:'<key ...>'@ \
+                       n@*@\`\\ls\ -1\ $_ypdir/$_domain\ \|\ sed\ -n\ s%\\\\.pag\\\$%%p\`@
+    complete ypwhich    c@-@"(d m t x V1 V2)"@ n@-x@n@ n@-d@D:$_ypdir@" " \
+                       n@-m@\`\\ls\ -1\ $_ypdir/$_domain\ \|\ sed\ -n\ s%\\\\.pag\\\$%%p\`@ \
+                       N@-m@n@ n@*@\$hosts@
+  endif
+  unset _domain _ypdir
+endif
 
-    if ( -f /etc/printcap ) then
-       set printers=(`sed -n -e "/^[^     #].*:/s/:.*//p" /etc/printcap`)
+complete make \
+    'n/-f/f/' \
+    'c/*=/f/' \
+    'n@*@`cat -s GNUmakefile Makefile makefile |& sed -n -e "/No such file/d" -e "/^[^     #].*:/s/:.*//p"`@'
 
-       complete lpr    'c/-P/$printers/'
-       complete lpq    'c/-P/$printers/'
-       complete lprm   'c/-P/$printers/'
-       complete lpquota        'p/1/(-Qprlogger)/' 'c/-P/$printers/'
-       complete dvips  'c/-P/$printers/' 'n/-o/f:*.{ps,PS}/' 'n/*/f:*.dvi/'
-       complete dvilj  'p/*/f:*.dvi/'
-    endif
+if ( -f /etc/printcap ) then
+    set printers=(`sed -n -e "/^[^     #].*:/s/:.*//p" /etc/printcap`)
 
-    # From Alphonse Bendt
-    complete ant \
-        'n/-f/f:*.xml/' \
-             'n@*@`cat build.xml | sed -n -e "s/[ \t]*<target[\t\n]*name=.\([a-zA-Z0-9_:]*\).*/\1/p"`@'
-
-    if ($?P4CLIENT && -X perl) then
-       # This is from Greg Allen.
-       set p4cmds=(add branch branches commands change changes client clients \
-           counter counters delete depot depots describe diff diff2 \
-           edit filelog files fix fixes fstat group groups have help \
-           info integrate integrated job jobs jobspec label labels \
-           labelsync lock obliterate opened passwd print protect rename \
-           reopen resolve resolved revert review reviews set submit \
-           sync triggers unlock user users verify where)
-       complete p4 'p/1/$p4cmds/' 'n/help/$p4cmds/' \
-           'n%{-l,label}%`p4 labels | sed "s/Label \([^ ]*\) .*/\1/"`%' \
-           'n%-t%`p4 $:1s | sed "s/[^ ]* \([^ ]*\) .*/\1/"`%' \
-           'c%*@%`p4 labels | sed "s/Label \([^ ]*\) .*/\1/"`%' \
-           'c@//*/*@`p4 files $:-0... |& perl -nle "m%\Q$:-0\E([^#][^/# ] \
-           *)%;print "\$"1 if \\\!/no such/&&\!"\$"h{"\$"1}++"`@@' \
-           'c@//@`p4 depots | sed "s/Depot \([^ ]*\) .*/\1/"`@/@'
-    endif
+    complete lpr    'c/-P/$printers/'
+    complete lpq    'c/-P/$printers/'
+    complete lprm   'c/-P/$printers/'
+    complete lpquota        'p/1/(-Qprlogger)/' 'c/-P/$printers/'
+    complete dvips  'c/-P/$printers/' 'n/-o/f:*.{ps,PS}/' 'n/*/f:*.dvi/'
+    complete dvilj     'p/*/f:*.dvi/'
+endif
 
+# From Alphonse Bendt
+complete ant \
+     'n/-f/f:*.xml/' \
+         'n@*@`cat build.xml | sed -n -e "s/[ \t]*<target[\t\n]*name=.\([a-zA-Z0-9_:]*\).*/\1/p"`@'
+
+if ($?P4CLIENT && -X perl) then
+    # This is from Greg Allen.
+    set p4cmds=(add branch branches commands change changes client clients \
+       counter counters delete depot depots describe diff diff2 \
+       edit filelog files fix fixes fstat group groups have help \
+       info integrate integrated job jobs jobspec label labels \
+       labelsync lock obliterate opened passwd print protect rename \
+       reopen resolve resolved revert review reviews set submit \
+       sync triggers unlock user users verify where)
+    complete p4 'p/1/$p4cmds/' 'n/help/$p4cmds/' \
+       'n%{-l,label}%`p4 labels | sed "s/Label \([^ ]*\) .*/\1/"`%' \
+       'n%-t%`p4 $:1s | sed "s/[^ ]* \([^ ]*\) .*/\1/"`%' \
+       'c%*@%`p4 labels | sed "s/Label \([^ ]*\) .*/\1/"`%' \
+       'c@//*/*@`p4 files $:-0... |& perl -nle "m%\Q$:-0\E([^#][^/# ] \
+       *)%;print "\$"1 if \\\!/no such/&&\!"\$"h{"\$"1}++"`@@' \
+       'c@//@`p4 depots | sed "s/Depot \([^ ]*\) .*/\1/"`@/@'
+endif
 
-    if (! $?traditional_complete) then
-        uncomplete vi
-        uncomplete vim
-        complete {vi,vim,gvim,nvi,elvis}       n/*/f:^*.{o,a,so,sa,aux,dvi,log,fig,bbl,blg,bst,idx,ilg,ind,toc}/
-        complete {ispell,spell,spellword}      'n@-d@`ls /usr/lib/ispell/*.aff | sed -e "s/\.aff//" `@' 'n/*/f:^*.{o,a,so,sa,aux,dvi,log,fig,bbl,blg,bst,idx,ilg,ind,toc}/'
-        complete elm   'n/-[Ai]/f/' 'c@=@F:$HOME/Mail/@' 'n/-s/x:\<subject\>/'
-        complete ncftp 'n@*@`sed -e '1,2d' $HOME/.ncftp/bookmarks | cut -f 1,2 -d "," | tr "," "\012" | sort | uniq ` '@
-        complete bibtex        'n@*@`ls *.aux | sed -e "s/\.aux//"`'@
-        complete dvi2tty       n/*/f:*.dvi/    # Only files that match *.dvi
-       uncomplete gv
-       uncomplete ghostview
-        complete {gv,ghostview}        'n/*/f:*.{ps,eps,epsi}/'
-        complete enscript \
-               'c/--/(columns= pages= header= no-header truncate-lines \
-                       line-numbers setpagedevice= escapes font= \
-                       header-font= fancy-header no-job-header \
-                       highlight-bars indent= filter= borders page-prefeed \
-                       no-page-prefeed lineprinter lines-per-page= mail \
-                       media= copies= newline= output= missing-characters \
-                       printer= quiet silent landscape portrait \
-                       baselineskip= statusdict= title= tabsize= underlay= \
-                       verbose version encoding pass-through download-font= \
-                       filter-stdin= help highlight-bar-gray= list-media \
-                       list-options non-printable-format= page-label-format= \
-                       printer-options= ul-angle= ul-font= ul-gray= \
-                       ul-position= ul-style= \
-                    )/'
-    endif
 
-    complete dpkg \
-               'c/--{admindir,instdir,root}=/d/' \
-               'c/--debug=/n/' \
-               'c/--{admindir,debug,instdir,root}/(=)//' \
-               'c/--/(admindir= debug= instdir= root= \
-                       assert-support-predepends assert-working-epoch \
-                       audit auto-deconfigure clear-avail \
-                       compare-versions configure contents control \
-                       extract force-bad-path field \
-                       force-configure-any force-conflicts \
-                       force-depends force-depends-version force-help \
-                       force-hold force-non-root \
-                       force-overwrite-diverted \
-                       force-remove-essential force-remove-reinstreq \
-                       forget-old-unavail fsys-tarfile get-selections \
-                       help ignore-depends info install largemem \
-                       license list listfiles merge-avail no-act \
-                       pending predep-package print-architecture \
-                       print-gnu-build-architecture \
-                       print-installation-architecture print-avail \
-                       purge record-avail recursive refuse-downgrade \
-                       remove search set-selections selected-only \
-                       skip-same-version smallmem status unpack \
-                       update-avail version vextract \
-                     )//' \
-               'n/{-l}/`dpkg -l|awk \{print\ \$2\}`/' \
-               'n/*/f:*.deb'/
-    complete dpkg-deb     'c/--{build}=/d/' \
-                          'c/--/(build contents info field control extract \
-                                vextract fsys-tarfile help version \
-                                license)//' \
-                          'n/*/f:*.deb/'
-    complete apt-get \
-               'c/--/(build config-file diff-only download-only \
-                  fix-broken fix-missing force-yes help ignore-hold no-download \
-                  no-upgrade option print-uris purge reinstall quiet simulate \
-                  show-upgraded target-release tar-only version yes )/' \
-               'c/-/(b c= d f h m o= q qq s t x y )/' \
-               'n/{source,build-dep}/x:<pkgname>/' \
-               'n/{remove}/`dpkg -l|grep ^ii|awk \{print\ \$2\}`/' \
-               'n/{install}/`apt-cache pkgnames | sort`/' \
-               'C/*/(update upgrade dselect-upgrade source \
-                  build-dep check clean autoclean install remove)/'
-    complete apt-cache \
-               'c/--/(all-versions config-file generate full help important \
-               names-only option pkg-cache quiet recurse src-cache version )/' \
-               'c/-/(c= h i o= p= q s= v)/' \
-               'n/{search}/x:<regex>/' \
-               'n/{pkgnames,policy,show,showpkg,depends,dotty}/`apt-cache pkgnames | sort`/' \
-               'C/*/(add gencaches showpkg stats dump dumpavail unmet show \
-               search depends pkgnames dotty policy )/'
-
-    unset noglob
-    unset _complete
-    unset traditional_complete
+if (! $?traditional_complete) then
+    uncomplete vi
+    uncomplete vim
+    complete {vi,vim,gvim,nvi,elvis}   n/*/f:^*.{o,a,so,sa,aux,dvi,log,fig,bbl,blg,bst,idx,ilg,ind,toc}/
+    complete {ispell,spell,spellword}  'n@-d@`ls /usr/lib/ispell/*.aff | sed -e "s/\.aff//" `@' 'n/*/f:^*.{o,a,so,sa,aux,dvi,log,fig,bbl,blg,bst,idx,ilg,ind,toc}/'
+    complete elm       'n/-[Ai]/f/' 'c@=@F:$HOME/Mail/@' 'n/-s/x:\<subject\>/'
+    complete ncftp     'n@*@`sed -e '1,2d' $HOME/.ncftp/bookmarks | cut -f 1,2 -d "," | tr "," "\012" | sort | uniq ` '@
+    complete bibtex    'n@*@`ls *.aux | sed -e "s/\.aux//"`'@
+    complete dvi2tty   n/*/f:*.dvi/    # Only files that match *.dvi
+    uncomplete gv
+    uncomplete ghostview
+    complete {gv,ghostview}    'n/*/f:*.{ps,eps,epsi}/'
+    complete enscript \
+           'c/--/(columns= pages= header= no-header truncate-lines \
+                   line-numbers setpagedevice= escapes font= \
+                   header-font= fancy-header no-job-header \
+                   highlight-bars indent= filter= borders page-prefeed \
+                   no-page-prefeed lineprinter lines-per-page= mail \
+                   media= copies= newline= output= missing-characters \
+                   printer= quiet silent landscape portrait \
+                   baselineskip= statusdict= title= tabsize= underlay= \
+                   verbose version encoding pass-through download-font= \
+                   filter-stdin= help highlight-bar-gray= list-media \
+                   list-options non-printable-format= page-label-format= \
+                   printer-options= ul-angle= ul-font= ul-gray= \
+                   ul-position= ul-style= \
+                )/'
 endif
 
+complete dpkg \
+           'c/--{admindir,instdir,root}=/d/' \
+           'c/--debug=/n/' \
+           'c/--{admindir,debug,instdir,root}/(=)//' \
+           'c/--/(admindir= debug= instdir= root= \
+                   assert-support-predepends assert-working-epoch \
+                   audit auto-deconfigure clear-avail \
+                   compare-versions configure contents control \
+                   extract force-bad-path field \
+                   force-configure-any force-conflicts \
+                   force-depends force-depends-version force-help \
+                   force-hold force-non-root \
+                   force-overwrite-diverted \
+                   force-remove-essential force-remove-reinstreq \
+                   forget-old-unavail fsys-tarfile get-selections \
+                   help ignore-depends info install largemem \
+                   license list listfiles merge-avail no-act \
+                   pending predep-package print-architecture \
+                   print-gnu-build-architecture \
+                   print-installation-architecture print-avail \
+                   purge record-avail recursive refuse-downgrade \
+                   remove search set-selections selected-only \
+                   skip-same-version smallmem status unpack \
+                   update-avail version vextract \
+                 )//' \
+           'n/{-l}/`dpkg -l|awk \{print\ \$2\}`/' \
+           'n/*/f:*.deb'/
+complete dpkg-deb         'c/--{build}=/d/' \
+                      'c/--/(build contents info field control extract \
+                            vextract fsys-tarfile help version \
+                            license)//' \
+                      'n/*/f:*.deb/'
+complete apt-get \
+           'c/--/(build config-file diff-only download-only \
+              fix-broken fix-missing force-yes help ignore-hold no-download \
+              no-upgrade option print-uris purge reinstall quiet simulate \
+              show-upgraded target-release tar-only version yes )/' \
+           'c/-/(b c= d f h m o= q qq s t x y )/' \
+           'n/{source,build-dep}/x:<pkgname>/' \
+           'n/{remove}/`dpkg -l|grep ^ii|awk \{print\ \$2\}`/' \
+           'n/{install}/`apt-cache pkgnames | sort`/' \
+           'C/*/(update upgrade dselect-upgrade source \
+              build-dep check clean autoclean install remove)/'
+complete apt-cache \
+           'c/--/(all-versions config-file generate full help important \
+           names-only option pkg-cache quiet recurse src-cache version )/' \
+           'c/-/(c= h i o= p= q s= v)/' \
+           'n/{search}/x:<regex>/' \
+           'n/{pkgnames,policy,show,showpkg,depends,dotty}/`apt-cache pkgnames | sort`/' \
+           'C/*/(add gencaches showpkg stats dump dumpavail unmet show \
+           search depends pkgnames dotty policy )/'
+
+switch ( "${OSTYPE}" )
+case FreeBSD:
+  set commands=()
+  foreach p (fast force one quiet "")
+    foreach c (enabled poll rcvar reload restart start status stop)
+      set commands=($commands $p$c)
+    end
+  end
+  complete service \
+    n/-R/n/ \
+    n/-e/n/ \
+    n/-l/n/ \
+    n/-r/n/ \
+    c/-/"(R e l r v)"/ \
+    p/2/"($commands)"/ \
+    p@1@'`service -l`'@
+  unset commands c p
+  breaksw
+case linux:
+  if ( -d /etc/init.d ) then
+    set rcdir=/etc/init.d/
+  else
+    set rcdir=/etc/rc.d/
+  endif
+  complete service \
+    p/2/"(--full-restart force-reload reload restart start stop status)"/ \
+    c/--/"(help status-all version)"/ \
+    c/-/"(- h)"/ \
+    p@1@F:$rcdir@
+  unset rcdir
+  breaksw
+endsw
+
+if ( $?_unset_noglob ) unset noglob _unset_noglob
+
 end:
-       onintr
+unset _has_complete
+onintr
index e799d1c..9932d13 100644 (file)
@@ -98,6 +98,7 @@
 
 #elif defined(__APPLE__)
 # define SYSMALLOC
+# define BSD_STYLE_COLORLS
 #endif
 
 #endif /* _h_config */
index 433730e..ffd3a18 100644 (file)
@@ -1,4 +1,4 @@
-/* $Header: /p/tcsh/cvsroot/tcsh/config_f.h,v 3.47 2011/02/05 20:34:55 christos Exp $ */
+/* $Header: /p/tcsh/cvsroot/tcsh/config_f.h,v 3.50 2015/02/22 16:31:54 christos Exp $ */
 /*
  * config_f.h -- configure various defines for tcsh
  *
@@ -50,7 +50,7 @@
  * WIDE_STRINGS        Represent strings using wide characters
  *             Allows proper function in multibyte encodings like UTF-8
  */
-#if defined (SHORT_STRINGS) && defined (NLS) && !defined (WINNT_NATIVE) && !defined(_OSD_POSIX)
+#if defined (SHORT_STRINGS) && defined (NLS) && !defined (WINNT_NATIVE) && !defined(_OSD_POSIX) && SIZEOF_WCHAR_T > 1
 # define WIDE_STRINGS
 # if SIZEOF_WCHAR_T < 4
 #  define UTF16_STRINGS
  *             This can be much slower and no memory statistics will be
  *             provided.
  */
-#if defined(__MACHTEN__) || defined(PURIFY) || defined(MALLOC_TRACE) || defined(_OSD_POSIX) || defined(__MVS__) || defined (__CYGWIN__) || defined(__GLIBC__)
+#if defined(__MACHTEN__) || defined(PURIFY) || defined(MALLOC_TRACE) || defined(_OSD_POSIX) || defined(__MVS__) || defined (__CYGWIN__) || defined(__GLIBC__) || defined(__OpenBSD__) || defined(__APPLE__)
 # define SYSMALLOC
 #else
 # undef SYSMALLOC
diff --git a/contrib/tcsh-6/dotlock.c b/contrib/tcsh-6/dotlock.c
new file mode 100644 (file)
index 0000000..b5fa207
--- /dev/null
@@ -0,0 +1,180 @@
+/*     $NetBSD: dotlock.c,v 1.11 2009/10/21 01:07:46 snj Exp $ */
+
+/*
+ * Copyright (c) 1996 Christos Zoulas.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+#include "sh.h"
+RCSID("$tcsh: dotlock.c,v 3.3 2014/03/09 00:11:54 christos Exp $");
+
+#include <stdio.h>
+#ifndef O_SYNC
+#define O_SYNC 0
+#endif
+
+#include "dotlock.h"
+
+static int create_exclusive(const char *);
+/*
+ * Create a unique file. O_EXCL does not really work over NFS so we follow
+ * the following trick: [Inspired by  S.R. van den Berg]
+ *
+ * - make a mostly unique filename and try to create it.
+ * - link the unique filename to our target
+ * - get the link count of the target
+ * - unlink the mostly unique filename
+ * - if the link count was 2, then we are ok; else we've failed.
+ */
+static int
+create_exclusive(const char *fname)
+{
+       char path[MAXPATHLEN], hostname[MAXHOSTNAMELEN + 1];
+       const char *ptr;
+       struct timeval tv;
+       pid_t pid;
+       size_t ntries, cookie;
+       int fd, serrno;
+       struct stat st;
+
+       (void)gettimeofday(&tv, NULL);
+       (void)gethostname(hostname, sizeof(hostname));
+       hostname[sizeof(hostname) - 1] = '\0';
+       pid = getpid();
+
+       cookie = pid ^ tv.tv_usec;
+
+       /*
+        * We generate a semi-unique filename, from hostname.(pid ^ usec)
+        */
+       if ((ptr = strrchr(fname, '/')) == NULL)
+               ptr = fname;
+       else
+               ptr++;
+
+       (void)snprintf(path, sizeof(path), "%.*s.%s.%lx",
+           (int)(ptr - fname), fname, hostname, (u_long)cookie);
+
+       /*
+        * We try to create the unique filename.
+        */
+       for (ntries = 0; ntries < 5; ntries++) {
+               fd = open(path, O_WRONLY|O_CREAT|O_TRUNC|O_EXCL|O_SYNC, 0);
+               if (fd != -1) {
+                       (void)close(fd);
+                       break;
+               }
+               else if (errno == EEXIST)
+                       continue;
+               else
+                       return -1;
+       }
+
+       /*
+        * We link the path to the name
+        */
+       if (link(path, fname) == -1)
+               goto bad;
+
+       /*
+        * Note that we stat our own exclusively created name, not the
+        * destination, since the destination can be affected by others.
+        */
+       if (stat(path, &st) == -1)
+               goto bad;
+
+       (void)unlink(path);
+
+       /*
+        * If the number of links was two (one for the unique file and one
+        * for the lock), we've won the race
+        */
+       if (st.st_nlink != 2) {
+               errno = EEXIST;
+               return -1;
+       }
+       return 0;
+
+bad:
+       serrno = errno;
+       (void)unlink(path);
+       errno = serrno;
+       return -1;
+}
+
+/*
+ * fname -- Pathname to lock
+ * pollinterval -- Interval (miliseconds) to check for lock, -1 return
+ */
+int
+dot_lock(const char *fname, int pollinterval)
+{
+       char path[MAXPATHLEN];
+       sigset_t nset, oset;
+       int retval;
+
+       (void)sigemptyset(&nset);
+       (void)sigaddset(&nset, SIGHUP);
+       (void)sigaddset(&nset, SIGINT);
+       (void)sigaddset(&nset, SIGQUIT);
+       (void)sigaddset(&nset, SIGTERM);
+       (void)sigaddset(&nset, SIGTTIN);
+       (void)sigaddset(&nset, SIGTTOU);
+       (void)sigaddset(&nset, SIGTSTP);
+       (void)sigaddset(&nset, SIGCHLD);
+
+       (void)snprintf(path, sizeof(path), "%s.lock", fname);
+
+       retval = -1;
+       for (;;) {
+               handle_pending_signals();
+               (void)sigprocmask(SIG_BLOCK, &nset, &oset);
+               if (create_exclusive(path) != -1) {
+                       (void)sigprocmask(SIG_SETMASK, &oset, NULL);
+                       retval = 0;
+                       break;
+               }
+               else
+                       (void)sigprocmask(SIG_SETMASK, &oset, NULL);
+
+               if (errno != EEXIST)
+                       break;
+
+               if (pollinterval) {
+                       if (pollinterval == -1) {
+                               errno = EEXIST;
+                               break;
+                       }
+                       (void)usleep((unsigned int)pollinterval * 1000);
+               }
+       }
+       handle_pending_signals();
+       return retval;
+}
+
+void
+dot_unlock(const char *fname)
+{
+       char path[MAXPATHLEN];
+
+       (void)snprintf(path, sizeof(path), "%s.lock", fname);
+       (void)unlink(path);
+}
diff --git a/contrib/tcsh-6/dotlock.h b/contrib/tcsh-6/dotlock.h
new file mode 100644 (file)
index 0000000..2046a92
--- /dev/null
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 1996 Christos Zoulas.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef _DOTLOCK_H_
+#define _DOTLOCK_H_ 1
+
+/*
+ * fname -- Pathname to lock
+ * pollinterval -- Interval (miliseconds) to check for lock, -1 return
+ */
+int dot_lock(const char *fname, int pollinterval);
+void dot_unlock(const char *fname);
+
+#endif /* #ifndef _DOTLOCK_H_ */
index 8d00326..3c52f12 100644 (file)
@@ -1,4 +1,4 @@
-/* $Header: /p/tcsh/cvsroot/tcsh/ed.chared.c,v 3.98 2010/05/08 00:37:39 christos Exp $ */
+/* $Header: /p/tcsh/cvsroot/tcsh/ed.chared.c,v 3.99 2014/03/09 00:20:26 christos Exp $ */
 /*
  * ed.chared.c: Character editing functions.
  */
@@ -72,7 +72,7 @@
 
 #include "sh.h"
 
-RCSID("$tcsh: ed.chared.c,v 3.98 2010/05/08 00:37:39 christos Exp $")
+RCSID("$tcsh: ed.chared.c,v 3.99 2014/03/09 00:20:26 christos Exp $")
 
 #include "ed.h"
 #include "tw.h"
@@ -941,7 +941,7 @@ c_push_kill(Char *start, Char *end)
 
 /* Save InputBuf etc in SavedBuf etc for restore after cmd exec */
 static void
-c_save_inputbuf()
+c_save_inputbuf(void)
 {
     SavedBuf.len = 0;
     Strbuf_append(&SavedBuf, InputBuf);
@@ -953,7 +953,7 @@ c_save_inputbuf()
 }
 
 CCRETVAL
-GetHistLine()
+GetHistLine(void)
 {
     struct Hist *hp;
     int     h;
index df17f87..ad3f324 100644 (file)
@@ -1,4 +1,4 @@
-/* $Header: /p/tcsh/cvsroot/tcsh/ed.inputl.c,v 3.71 2010/12/22 17:26:04 christos Exp $ */
+/* $Header: /p/tcsh/cvsroot/tcsh/ed.inputl.c,v 3.73 2012/10/19 15:23:32 christos Exp $ */
 /*
  * ed.inputl.c: Input line handling.
  */
@@ -32,7 +32,7 @@
  */
 #include "sh.h"
 
-RCSID("$tcsh: ed.inputl.c,v 3.71 2010/12/22 17:26:04 christos Exp $")
+RCSID("$tcsh: ed.inputl.c,v 3.73 2012/10/19 15:23:32 christos Exp $")
 
 #include "ed.h"
 #include "ed.defns.h"          /* for the function names */
@@ -683,7 +683,7 @@ GetNextCommand(KEYCMD *cmdnum, Char *ch)
 #ifdef DSPMBYTE
             _enable_mbdisp &&
 #else
-            MB_CUR_MAX == 1 &&
+            MB_LEN_MAX == 1 &&
 #endif
             !adrof(STRnokanji) && (*ch & META)) {
            MetaNext = 0;
@@ -800,17 +800,13 @@ GetNextChar(Char *cp)
                return -1;
            }
        }
-       if (AsciiOnly) {
-           *cp = (unsigned char)*cbuf;
-       } else {
-           cbp++;
-           if (normal_mbtowc(cp, cbuf, cbp) == -1) {
-               reset_mbtowc();
-               if (cbp < MB_CUR_MAX)
-                   continue; /* Maybe a partial character */
-               /* And drop the following bytes, if any */
-               *cp = (unsigned char)*cbuf | INVALID_BYTE;
-           }
+       cbp++;
+       if (normal_mbtowc(cp, cbuf, cbp) == -1) {
+           reset_mbtowc();
+           if (cbp < MB_CUR_MAX)
+               continue; /* Maybe a partial character */
+           /* And drop the following bytes, if any */
+           *cp = (unsigned char)*cbuf | INVALID_BYTE;
        }
        break;
     }
index e1e574d..32f9a4e 100644 (file)
@@ -1,4 +1,4 @@
-/* $Header: /p/tcsh/cvsroot/tcsh/ed.refresh.c,v 3.47 2011/02/27 00:14:51 christos Exp $ */
+/* $Header: /p/tcsh/cvsroot/tcsh/ed.refresh.c,v 3.50 2015/05/04 15:31:13 christos Exp $ */
 /*
  * ed.refresh.c: Lower level screen refreshing functions
  */
@@ -32,7 +32,7 @@
  */
 #include "sh.h"
 
-RCSID("$tcsh: ed.refresh.c,v 3.47 2011/02/27 00:14:51 christos Exp $")
+RCSID("$tcsh: ed.refresh.c,v 3.50 2015/05/04 15:31:13 christos Exp $")
 
 #include "ed.h"
 /* #define DEBUG_UPDATE */
@@ -1299,7 +1299,7 @@ ClearDisp(void)
     CursorV = 0;               /* clear the display buffer */
     CursorH = 0;
     for (i = 0; i < TermV; i++)
-       (void) memset(Display[i], 0, TermH * sizeof(Display[0][0]));
+       (void) memset(Display[i], 0, (TermH + 1) * sizeof(Display[0][0]));
     OldvcV = 0;
     litlen = 0;
 }
index 8bcbdac..7a86b36 100644 (file)
@@ -1,4 +1,4 @@
-/* $Header: /p/tcsh/cvsroot/tcsh/ed.screen.c,v 3.78 2011/02/27 00:14:38 christos Exp $ */
+/* $Header: /p/tcsh/cvsroot/tcsh/ed.screen.c,v 3.81 2014/03/15 21:25:11 christos Exp $ */
 /*
  * ed.screen.c: Editor/termcap-curses interface
  */
@@ -32,7 +32,7 @@
  */
 #include "sh.h"
 
-RCSID("$tcsh: ed.screen.c,v 3.78 2011/02/27 00:14:38 christos Exp $")
+RCSID("$tcsh: ed.screen.c,v 3.81 2014/03/15 21:25:11 christos Exp $")
 
 #include "ed.h"
 #include "tc.h"
@@ -994,14 +994,14 @@ SetAttributes(Char atr)
 int highlighting = 0;
 
 void
-StartHighlight()
+StartHighlight(void)
 {
     (void) tputs(Str(T_mr), 1, PUTPURE);
     highlighting = 1;
 }
 
 void
-StopHighlight()
+StopHighlight(void)
 {
     (void) tputs(Str(T_me), 1, PUTPURE);
     highlighting = 0;
@@ -1437,7 +1437,8 @@ GetTermCaps(void)
     if (i <= 0) {
        if (i == -1) {
 #if (SYSVREL == 0) || defined(IRIS3D)
-           xprintf(CGETS(7, 20, "%s: Cannot open /etc/termcap.\n"), progname);
+           xprintf(CGETS(7, 20,
+               "%s: The terminal database could not be opened.\n"), progname);
        }
        else if (i == 0) {
 #endif /* SYSVREL */
@@ -1625,7 +1626,6 @@ ChangeSize(int lins, int cols)
        if ((tptr = getenv("TERMCAP")) != NULL) {
            /* Leave 64 characters slop in case we enlarge the termcap string */
            Char    termcap[TC_BUFSIZE+64], backup[TC_BUFSIZE+64], *ptr;
-           Char buf[4];
 
            ptr = str2short(tptr);
            (void) Strncpy(termcap, ptr, TC_BUFSIZE);
index 9ae8328..517af37 100644 (file)
@@ -1,4 +1,4 @@
-/* $Header: /p/tcsh/cvsroot/tcsh/ed.term.h,v 1.18 2007/07/05 14:13:06 christos Exp $ */
+/* $Header: /p/tcsh/cvsroot/tcsh/ed.term.h,v 1.19 2015/03/25 19:53:16 christos Exp $ */
 /*
  * ed.term.h: Local terminal header
  */
 # endif /* masscomp */
 #endif /* CBRK */
 #ifndef CMIN
-# define CMIN          CEOF
+# if VMIN == VEOF
+#  define CMIN         CEOF
+# else
+#  define CMIN         1
+# endif
 #endif /* CMIN */
 #ifndef CTIME
-# define CTIME         CEOL
+# if VTIME == VEOL
+#  define CTIME                CEOL
+# else
+#  define CTIME                0
+# endif
 #endif /* CTIME */
 
 /*
index 65c9a29..2cd9696 100644 (file)
@@ -1,4 +1,4 @@
-/* $Header: /p/tcsh/cvsroot/tcsh/gethost.c,v 1.15 2012/01/15 17:14:54 christos Exp $ */
+/* $Header: /p/tcsh/cvsroot/tcsh/gethost.c,v 1.19 2014/03/09 00:11:54 christos Exp $ */
 /*
  * gethost.c: Create version file from prototype
  */
@@ -32,7 +32,7 @@
  */
 #include "sh.h"
 
-RCSID("$tcsh: gethost.c,v 1.15 2012/01/15 17:14:54 christos Exp $")
+RCSID("$tcsh: gethost.c,v 1.19 2014/03/09 00:11:54 christos Exp $")
 
 #ifdef SCO
 # define perror __perror
@@ -150,11 +150,17 @@ cat(const char *a, const char *b, size_t len)
        char *r;
 
        if (len == 0)
-               len = strlen(b);
-       l = strlen(a) + len + 1;
+               len = strlen(b) + 1;
+       if (a)
+           l = strlen(a) + len;
+       else
+           l = len;
        if ((r = malloc(l)) == NULL)
                abort();
-       snprintf(r, l, "%s%.*s", a, (int)len, b);
+       if (a)
+           snprintf(r, l, "%s%.*s", a, (int)len, b);
+       else
+           snprintf(r, l, "%.*s", (int)len, b);
        return r;
 }
 
@@ -165,19 +171,22 @@ explode(const char *defs)
        static char *buf;
        size_t len;
        const char *ptr, *bptr, *eptr = NULL, *name;
-       size_t buflen = 0;
 
        if (strstr(defs, "#machine(" /* ) */))
                return defs;
+       if (!strstr(defs, def))
+               return defs;
 
        free(buf);
-       buf = strdup("("); /* ) */
+       buf = NULL;
        for (ptr = defs; (bptr = strstr(ptr, def)) != NULL; ptr = eptr + 1) {
                if (ptr != bptr)
-                       buf = cat(buf, ptr, bptr - ptr);
+                       buf = cat(buf, ptr, bptr - ptr + 1);
+               buf = cat(buf, "(", 0); /* ) */
                if ((eptr = strchr(ptr + sizeof(def) - 1, ')')) == NULL) {
                        (void) fprintf(stderr, "%s: missing close paren `%s'\n",
                            pname, defs);
+                       free(buf);
                        return defs;
                }
                buf = cat(buf, bptr, eptr - bptr + 1);
@@ -186,26 +195,29 @@ explode(const char *defs)
                if (len < 1) {
                        (void) fprintf(stderr, "%s: empty define `%s'\n",
                            pname, defs);
+                       free(buf);
                        return defs;
                }
-               if (*name != '_') {
+               if (*name != '_' && (*name != 'M' && name[1] != '_')) {
                        char *undername = malloc(len + 10);
-                       buf = cat(buf, " || defined(", 0);
+                       if (undername == NULL)
+                               abort();
+                       buf = cat(buf, ") || defined(", 0);
                        snprintf(undername, len + 10, "__%.*s__)", (int)len,
                            name);
                        buf = cat(buf, undername, len + 5);
-                       buf = cat(buf, " || defined(", 0);
+                       buf = cat(buf, ") || defined(", 0);
                        snprintf(undername, len + 10, "__%.*s)", (int)len,
                            name);
                        buf = cat(buf, undername, len + 3);
                }
+               buf = cat(buf, "))", 0);
        }
        if (!eptr) {
            (void) fprintf(stderr, "%s: invalid input `%s'\n", pname, defs);
            return defs;
         }
        buf = cat(buf, eptr + 1, 0);
-       buf = cat(buf, ")", 0);
        return buf;
 }
        
@@ -292,8 +304,8 @@ main(int argc, char *argv[])
                               pname, fname, lineno);
                break;
            }
-           (void) fprintf(stdout, "\n#if %s\n# define %s\n#endif\n\n", stmt,
-                          defs);
+           (void) fprintf(stdout, "\n#if %s\n# define %s\n#endif\n\n",
+               explode(stmt), defs);
            break;
 
        case T_NONE:
@@ -340,7 +352,7 @@ main(int argc, char *argv[])
 #ifdef LINEDIRECTIVE
                (void) fprintf(stdout, "# %d \"%s\"\n", lineno + 1, fname);
 #endif /* LINEDIRECTIVE */
-               (void) fprintf(stdout, "#if %s\n", defs);
+               (void) fprintf(stdout, "#if (%s)\n", explode(defs));
                inprocess = 1;
            }
            else {
index 3680403..e321f6f 100644 (file)
@@ -433,6 +433,7 @@ glob(const char *pattern, int flags, int (*errfunc) (const char *, int),
            dest = copy;
            src = pattern;
            while (*src != EOS) {
+               /* Don't interpret quotes. The spec does not say we should do */
                if (*src == QUOTE) {
                    if (*++src == EOS)
                        --src;
index 53009aa..edcc71c 100644 (file)
@@ -1,4 +1,4 @@
-/* $Header: /p/tcsh/cvsroot/tcsh/patchlevel.h,v 3.180 2012/02/13 16:33:50 christos Exp $ */
+/* $Header: /p/tcsh/cvsroot/tcsh/patchlevel.h,v 3.185 2015/05/21 21:38:12 christos Exp $ */
 /*
  * patchlevel.h: Our life story.
  */
@@ -7,8 +7,8 @@
 
 #define ORIGIN "Astron"
 #define REV 6
-#define VERS 18
-#define PATCHLEVEL 1
-#define DATE "2012-02-14"
+#define VERS 19
+#define PATCHLEVEL 0
+#define DATE "2015-05-21"
 
 #endif /* _h_patchlevel */
index dcd9116..b760f04 100644 (file)
@@ -1,4 +1,4 @@
-/* $Header: /p/tcsh/cvsroot/tcsh/sh.c,v 3.174 2011/11/29 18:38:54 christos Exp $ */
+/* $Header: /p/tcsh/cvsroot/tcsh/sh.c,v 3.185 2015/05/10 13:28:54 christos Exp $ */
 /*
  * sh.c: Main shell routines
  */
@@ -39,7 +39,7 @@ char    copyright[] =
  All rights reserved.\n";
 #endif /* not lint */
 
-RCSID("$tcsh: sh.c,v 3.174 2011/11/29 18:38:54 christos Exp $")
+RCSID("$tcsh: sh.c,v 3.185 2015/05/10 13:28:54 christos Exp $")
 
 #include "tc.h"
 #include "ed.h"
@@ -78,7 +78,8 @@ extern int NLSMapsAreInited;
  * ported to Apple Unix (TM) (OREO)  26 -- 29 Jun 1987
  */
 
-jmp_buf_t reslab;
+jmp_buf_t reslab IZERO_STRUCT;
+struct wordent paraml IZERO_STRUCT;
 
 static const char tcshstr[] = "tcsh";
 
@@ -250,10 +251,11 @@ main(int argc, char **argv)
     int osetintr;
     struct sigaction oparintr;
 
-    (void)memset(&reslab, 0, sizeof(reslab));
 #ifdef WINNT_NATIVE
     nt_init();
 #endif /* WINNT_NATIVE */
+
+    (void)memset(&reslab, 0, sizeof(reslab));
 #if defined(NLS_CATALOGS) && defined(LC_MESSAGES)
     (void) setlocale(LC_MESSAGES, "");
 #endif /* NLS_CATALOGS && LC_MESSAGES */
@@ -355,6 +357,7 @@ main(int argc, char **argv)
 
     /* Default history size to 100 */
     setcopy(STRhistory, str2short("100"), VAR_READWRITE);
+    sethistory(100);
 
     tempv = argv;
     ffile = SAVE(tempv[0]);
@@ -477,6 +480,9 @@ main(int argc, char **argv)
      */
     initdesc();
 
+    cdtohome = 1;
+    setv(STRcdtohome, SAVE(""), VAR_READWRITE);
+
     /*
      * Get and set the tty now
      */
@@ -493,6 +499,7 @@ main(int argc, char **argv)
     }
     else
        setv(STRtty, cp = SAVE(""), VAR_READWRITE);
+
     /*
      * Initialize the shell variables. ARGV and PROMPT are initialized later.
      * STATUS is also munged in several places. CHILD is munged when
@@ -797,6 +804,8 @@ main(int argc, char **argv)
 #ifdef COLOR_LS_F
     if ((tcp = getenv("LS_COLORS")) != NULL)
        parseLS_COLORS(str2short(tcp));
+    if ((tcp = getenv("LSCOLORS")) != NULL)
+       parseLSCOLORS(str2short(tcp));
 #endif /* COLOR_LS_F */
 
     doldol = putn((tcsh_number_t)getpid());    /* For $$ */
@@ -818,7 +827,7 @@ main(int argc, char **argv)
 #else /* !WINNT_NATIVE */
 #ifdef HAVE_MKSTEMP
     {
-       char *tmpdir = getenv ("TMPDIR");
+       const char *tmpdir = getenv ("TMPDIR");
        if (!tmpdir)
            tmpdir = "/tmp";
        shtemp = Strspl(SAVE(tmpdir), SAVE("/sh" TMP_TEMPLATE)); /* For << */
@@ -1215,14 +1224,14 @@ main(int argc, char **argv)
 
 #ifdef NeXT
            /* NeXT 2.0 /usr/etc/rlogind, does not set our process group! */
-           if (shpgrp == 0) {
+           if (f != -1 && shpgrp == 0) {
                shpgrp = getpid();
                (void) setpgid(0, shpgrp);
                (void) tcsetpgrp(f, shpgrp);
            }
 #endif /* NeXT */
 #ifdef BSDJOBS                 /* if we have tty job control */
-           if (grabpgrp(f, shpgrp) != -1) {
+           if (f != -1 && grabpgrp(f, shpgrp) != -1) {
                /*
                 * Thanks to Matt Day for the POSIX references, and to
                 * Paul Close for the SGI clarification.
@@ -1904,6 +1913,8 @@ pintr1(int wantnl)
     {
        (void) Cookedmode();
        GettingInput = 0;
+       if (evalvec)
+           doneinp = 1;
     }
     drainoline();
 #ifdef HAVE_GETPWENT
@@ -2178,6 +2189,7 @@ dosource(Char **t, struct command *c)
     cleanup_push(file, xfree);
     xfree(f);
     t = glob_all_or_error(t);
+    cleanup_push(t, blk_cleanup);
     if ((!srcfile(file, 0, hflg, t)) && (!hflg) && (!bequiet))
        stderror(ERR_SYSTEM, file, strerror(errno));
     cleanup_until(file);
index e284860..8ba340c 100644 (file)
@@ -1,4 +1,4 @@
-/* $Header: /p/tcsh/cvsroot/tcsh/sh.char.h,v 3.36 2010/05/08 00:36:02 christos Exp $ */
+/* $Header: /p/tcsh/cvsroot/tcsh/sh.char.h,v 3.37 2014/05/09 19:22:49 christos Exp $ */
 /*
  * sh.char.h: Table for spotting special characters quickly
  *           Makes for very obscure but efficient coding.
@@ -167,15 +167,15 @@ extern tcshuc _cmap_lower[], _cmap_upper[];
 #define iscmdmeta(c)   cmap((c), _CMD)
 #ifdef WIDE_STRINGS
 #define letter(c)      (((c) & QUOTE) ? 0 :  \
-                        (iswalpha((tcshuc) (c)) || (c) == '_'))
+                        (iswalpha((c)) || (c) == '_'))
 #define alnum(c)       (((c) & QUOTE) ? 0 :  \
-                        (iswalnum((tcshuc) (c)) || (c) == '_'))
+                        (iswalnum((c)) || (c) == '_'))
 #else
 #define letter(c)      (((Char)(c) & QUOTE) ? 0 :  \
-                        ((isalpha((tcshuc) (c)) && !(cmap((c), _PUN))) \
+                        ((isalpha((c)) && !(cmap((c), _PUN))) \
                          || (c) == '_'))
 #define alnum(c)       (((Char)(c) & QUOTE) ? 0 :  \
-                        ((isalnum((tcshuc) (c)) && !(cmap((c), _PUN))) \
+                        ((isalnum((c)) && !(cmap((c), _PUN))) \
                          || (c) == '_'))
 
 #endif
index db90288..f8b6939 100644 (file)
@@ -1,4 +1,4 @@
-/* $Header: /p/tcsh/cvsroot/tcsh/sh.decls.h,v 3.62 2011/02/25 23:58:34 christos Exp $ */
+/* $Header: /p/tcsh/cvsroot/tcsh/sh.decls.h,v 3.64 2013/12/08 22:53:09 christos Exp $ */
 /*
  * sh.decls.h   External declarations from sh*.c
  */
@@ -78,6 +78,7 @@ extern        void              loaddirs      (Char *);
 extern void              Dfix          (struct command *);
 extern Char             *Dfix1         (Char *);
 extern void              heredoc       (Char *);
+extern  Char            *randsuf       (void);
 
 /*
  * sh.err.c
@@ -221,6 +222,7 @@ extern      char             *fmthist       (int, ptr_t);
 extern void              rechist       (Char *, int);
 extern void              loadhist      (Char *, int);
 extern void              displayHistStats(const char *);
+extern void              sethistory    (int);
 
 /*
  * sh.init.c
index ab89855..1342af0 100644 (file)
@@ -1,4 +1,4 @@
-/* $Header: /p/tcsh/cvsroot/tcsh/sh.dir.c,v 3.82 2011/10/16 16:25:05 christos Exp $ */
+/* $Header: /p/tcsh/cvsroot/tcsh/sh.dir.c,v 3.84 2014/10/28 18:40:46 christos Exp $ */
 /*
  * sh.dir.c: Directory manipulation functions
  */
@@ -33,7 +33,7 @@
 #include "sh.h"
 #include "ed.h"
 
-RCSID("$tcsh: sh.dir.c,v 3.82 2011/10/16 16:25:05 christos Exp $")
+RCSID("$tcsh: sh.dir.c,v 3.84 2014/10/28 18:40:46 christos Exp $")
 
 /*
  * C Shell - directory management
@@ -501,7 +501,9 @@ dochngd(Char **v, struct command *c)
     cp = (dflag & DIR_OLD) ? varval(STRowd) : *v;
 
     if (cp == NULL) {
-       if ((cp = varval(STRhome)) == STRNULL || *cp == 0)
+       if (!cdtohome)
+           stderror(ERR_NAME | ERR_TOOFEW);
+       else if ((cp = varval(STRhome)) == STRNULL || *cp == 0)
            stderror(ERR_NAME | ERR_NOHOMEDIR);
        if (chdir(short2str(cp)) < 0)
            stderror(ERR_NAME | ERR_CANTCHANGE);
index 45b10e0..5f41c4d 100644 (file)
@@ -1,4 +1,4 @@
-/* $Header: /p/tcsh/cvsroot/tcsh/sh.dol.c,v 3.83 2011/01/25 20:10:46 christos Exp $ */
+/* $Header: /p/tcsh/cvsroot/tcsh/sh.dol.c,v 3.87 2014/08/13 23:39:34 amold Exp $ */
 /*
  * sh.dol.c: Variable substitutions
  */
@@ -32,7 +32,7 @@
  */
 #include "sh.h"
 
-RCSID("$tcsh: sh.dol.c,v 3.83 2011/01/25 20:10:46 christos Exp $")
+RCSID("$tcsh: sh.dol.c,v 3.87 2014/08/13 23:39:34 amold Exp $")
 
 /*
  * C shell
@@ -825,9 +825,8 @@ setDolp(Char *cp)
                    (void) Strcpy(np + diff, rhsub);
                    (void) Strcpy(np + diff + rhlen, dp + lhlen);
 
-                   dp = np + diff + 1;
                    xfree(cp);
-                   cp = np;
+                   dp = cp = np;
                    cp[--len] = '\0';
                    didmod = 1;
                    if (diff >= (ssize_t)len)
@@ -920,6 +919,19 @@ inheredoc_cleanup(void *dummy)
     inheredoc = 0;
 }
 
+Char *
+randsuf(void) {
+#ifndef WINNT_NATIVE
+       struct timeval tv;
+       (void) gettimeofday(&tv, NULL);
+       return putn((((tcsh_number_t)tv.tv_sec) ^ 
+           ((tcsh_number_t)tv.tv_usec) ^
+           ((tcsh_number_t)getpid())) & 0x00ffffff);
+#else
+    return putn(getpid());
+#endif
+}
+
 /*
  * Form a shell temporary file (in unit 0) from the words
  * of the shell input up to EOF or a line the same as "term".
@@ -950,7 +962,6 @@ heredoc(Char *term)
 #else /* !HAVE_MKSTEMP */
     char   *tmp;
 # ifndef WINNT_NATIVE
-    struct timeval tv;
 
 again:
 # endif /* WINNT_NATIVE */
@@ -966,11 +977,8 @@ again:
 # ifndef WINNT_NATIVE
        if (errno == EEXIST) {
            if (unlink(tmp) == -1) {
-               (void) gettimeofday(&tv, NULL);
                xfree(shtemp);
-               mbp = putn((((tcsh_number_t)tv.tv_sec) ^ 
-                   ((tcsh_number_t)tv.tv_usec) ^
-                   ((tcsh_number_t)getpid())) & 0x00ffffff);
+               mbp = randsuf();
                shtemp = Strspl(STRtmpsh, mbp);
                xfree(mbp);
            }
index e157d6a..75de839 100644 (file)
@@ -1,4 +1,4 @@
-/* $Header: /p/tcsh/cvsroot/tcsh/sh.err.c,v 3.55 2011/02/25 23:58:34 christos Exp $ */
+/* $Header: /p/tcsh/cvsroot/tcsh/sh.err.c,v 3.56 2014/08/17 02:56:37 amold Exp $ */
 /*
  * sh.err.c: Error printing routines. 
  */
@@ -34,7 +34,7 @@
 #include "sh.h"
 #include <assert.h>
 
-RCSID("$tcsh: sh.err.c,v 3.55 2011/02/25 23:58:34 christos Exp $")
+RCSID("$tcsh: sh.err.c,v 3.56 2014/08/17 02:56:37 amold Exp $")
 
 /*
  * C Shell
@@ -380,10 +380,10 @@ struct cleanup_entry
 #endif
 };
 
-static struct cleanup_entry *cleanup_stack; /* = NULL; */
-static size_t cleanup_sp; /* = 0; Next free entry */
-static size_t cleanup_mark; /* = 0; Last entry to handle before unwinding */
-static size_t cleanup_stack_size; /* = 0 */
+static struct cleanup_entry *cleanup_stack INIT_ZERO; /* = NULL; */
+static size_t cleanup_sp INIT_ZERO; /* = 0; Next free entry */
+static size_t cleanup_mark INIT_ZERO; /* = 0; Last entry to handle before unwinding */
+static size_t cleanup_stack_size INIT_ZERO; /* = 0 */
 
 /* fn() will be run with all signals blocked, so it should not do anything
    risky. */
index 2b41a53..14f9445 100644 (file)
@@ -1,4 +1,4 @@
-/* $Header: /p/tcsh/cvsroot/tcsh/sh.exec.c,v 3.79 2011/02/25 23:58:34 christos Exp $ */
+/* $Header: /p/tcsh/cvsroot/tcsh/sh.exec.c,v 3.80 2014/07/11 14:57:55 christos Exp $ */
 /*
  * sh.exec.c: Search, find, and execute a command!
  */
@@ -32,7 +32,7 @@
  */
 #include "sh.h"
 
-RCSID("$tcsh: sh.exec.c,v 3.79 2011/02/25 23:58:34 christos Exp $")
+RCSID("$tcsh: sh.exec.c,v 3.80 2014/07/11 14:57:55 christos Exp $")
 
 #include "tc.h"
 #include "tw.h"
@@ -1070,6 +1070,9 @@ dowhere(Char **v, struct command *c)
 {
     int found = 1;
     USE(c);
+
+    if (adrof(STRautorehash))
+       dohash(NULL, NULL);
     for (v++; *v; v++)
        found &= find_cmd(*v, 1);
     /* Make status nonzero if any command is not found. */
@@ -1166,7 +1169,11 @@ retry:
                return rval;
        }
     }
-    if (adrof(STRautorehash) && !rehashed && havhash) {
+    /*
+     * If we are printing, we are being called from dowhere() which it 
+     * has rehashed already
+     */
+    if (!prt && adrof(STRautorehash) && !rehashed && havhash) {
        dohash(NULL, NULL);
        rehashed = 1;
        goto retry;
index abb1764..16a966b 100644 (file)
@@ -1,4 +1,4 @@
-/* $Header: /p/tcsh/cvsroot/tcsh/sh.exp.c,v 3.58 2011/12/25 15:21:50 christos Exp $ */
+/* $Header: /p/tcsh/cvsroot/tcsh/sh.exp.c,v 3.61 2012/11/28 13:45:11 christos Exp $ */
 /*
  * sh.exp.c: Expression evaluations
  */
@@ -32,7 +32,7 @@
  */
 #include "sh.h"
 
-RCSID("$tcsh: sh.exp.c,v 3.58 2011/12/25 15:21:50 christos Exp $")
+RCSID("$tcsh: sh.exp.c,v 3.61 2012/11/28 13:45:11 christos Exp $")
 
 #include "tw.h"
 
@@ -172,6 +172,7 @@ sh_access(const Char *fname, int mode)
                    mode <<= 3;
                    break;
                }
+           xfree(groups);
        }
     }
 # endif /* NGROUPS_MAX */
@@ -322,7 +323,7 @@ exp2c(Char ***vp, int ignore)
        cleanup_push(p2, xfree);
        etracc("exp2c p2", p2, vp);
        if (!(ignore & TEXP_IGNORE))
-           switch (i) {
+           switch ((int)i) {
 
            case EQEQ:
                i = eq(p1, p2);
@@ -367,7 +368,7 @@ exp3(Char ***vp, int ignore)
        cleanup_push(p2, xfree);
        etracc("exp3 p2", p2, vp);
        if (!(ignore & TEXP_IGNORE))
-           switch (i) {
+           switch ((int)i) {
 
            case GTR:
                i = egetn(p1) > egetn(p2);
@@ -632,7 +633,7 @@ filetest(Char *cp, Char ***vp, int ignore)
     int altout = 0;
     Char *ft = cp, *dp, *ep, *strdev, *strino, *strF, *str, valtest = '\0',
     *errval = STR0;
-    char *string, string0[22 + MB_LEN_MAX + 1];        // space for 64 bit octal
+    char *string, string0[22 + MB_LEN_MAX + 1];        /* space for 64 bit octal */
     time_t footime;
     struct passwd *pw;
     struct group *gr;
index dff07ab..d7300c6 100644 (file)
@@ -1,4 +1,4 @@
-/* $Header: /p/tcsh/cvsroot/tcsh/sh.file.c,v 3.37 2010/02/09 20:21:49 christos Exp $ */
+/* $Header: /p/tcsh/cvsroot/tcsh/sh.file.c,v 3.38 2015/03/07 18:07:46 christos Exp $ */
 /*
  * sh.file.c: File completion for csh. This file is not used in tcsh.
  */
@@ -33,7 +33,7 @@
 #include "sh.h"
 #include "ed.h"
 
-RCSID("$tcsh: sh.file.c,v 3.37 2010/02/09 20:21:49 christos Exp $")
+RCSID("$tcsh: sh.file.c,v 3.38 2015/03/07 18:07:46 christos Exp $")
 
 #if defined(FILEC) && defined(TIOCSTI)
 
@@ -231,7 +231,7 @@ pushback(const Char *string)
 # ifdef POSIX
     (void) tcgetattr(SHOUT, &tty);
 # else
-    (void) ioctl(SHOUT, TCSETAW, (ioctl_t) &tty);
+    (void) ioctl(SHOUT, TCGETA, (ioctl_t) &tty);
 # endif /* POSIX */
     tty_normal = tty;
     tty.c_lflag &= ~(ECHOKE | ECHO | ECHOE | ECHOK | ECHONL |
index d3b890f..fe24d76 100644 (file)
@@ -1,4 +1,4 @@
-/* $Header: /p/tcsh/cvsroot/tcsh/sh.func.c,v 3.162 2011/02/26 00:07:06 christos Exp $ */
+/* $Header: /p/tcsh/cvsroot/tcsh/sh.func.c,v 3.173 2015/05/04 17:10:45 christos Exp $ */
 /*
  * sh.func.c: csh builtin functions
  */
@@ -32,7 +32,7 @@
  */
 #include "sh.h"
 
-RCSID("$tcsh: sh.func.c,v 3.162 2011/02/26 00:07:06 christos Exp $")
+RCSID("$tcsh: sh.func.c,v 3.173 2015/05/04 17:10:45 christos Exp $")
 
 #include "ed.h"
 #include "tw.h"
@@ -799,8 +799,16 @@ search(int type, int level, Char *goal)
            break;
 
        case TC_IF:
-           while (getword(&word))
+           while (getword(&word)) {
+               if (intty) {
+                   histent->word = Strsave(word.s);
+                   histent->next = xmalloc(sizeof(*histent));
+                   histent->next->prev = histent;
+                   histent = histent->next;
+               }
                continue;
+           }
+           
            if ((type == TC_IF || type == TC_ELSE) &&
                eq(word.s, STRthen))
                level++;
@@ -893,7 +901,7 @@ search(int type, int level, Char *goal)
 static struct wordent *
 histgetword(struct wordent *histent) 
 {
-    int found = 0, first;
+    int first;
     eChar c, d;
     int e;
     struct Strbuf *tmp;
@@ -917,7 +925,6 @@ histgetword(struct wordent *histent)
        if (c == '\n') 
            goto nl;
        unreadc(c);
-       found = 1;
        first = 1;
        do {
            e = (c == '\\');
@@ -1381,7 +1388,7 @@ dosetenv(Char **v, struct command *c)
        stderror(ERR_NAME | ERR_VARBEGIN);
     do {
        lp++;
-    } while (alnum(*lp));
+    } while (alnum(*lp) || *lp == '.');
     if (*lp != '\0')
        stderror(ERR_NAME | ERR_VARALNUM);
 
@@ -1543,6 +1550,11 @@ dosetenv(Char **v, struct command *c)
        cleanup_until(lp);
        return;
     }
+    if (eq(vp, STRLSCOLORS)) {
+        parseLSCOLORS(lp);
+       cleanup_until(lp);
+       return;
+    }
 #endif /* COLOR_LS_F */
 
 #ifdef SIG_WINDOW
@@ -1670,6 +1682,8 @@ dounsetenv(Char **v, struct command *c)
 #ifdef COLOR_LS_F
                else if (eq(name, STRLS_COLORS))
                    parseLS_COLORS(n);
+               else if (eq(name, STRLSCOLORS))
+                   parseLSCOLORS(n);
 #endif /* COLOR_LS_F */
 #ifdef NLS_CATALOGS
                else if (eq(name, STRNLSPATH)) {
@@ -1927,6 +1941,14 @@ struct limits limits[] =
     { RLIMIT_NOFILE,   "descriptors", 1,       ""              },
 # endif /* RLIMIT_NOFILE */
 
+# ifdef RLIMIT_NPTS
+    { RLIMIT_NPTS,     "pseudoterminals", 1,   ""              },
+# endif /* RLIMIT_NPTS */
+
+# ifdef RLIMIT_KQUEUES
+    { RLIMIT_KQUEUES,  "kqueues",      1,      ""              },
+# endif /* RLIMIT_KQUEUES */
+
 # ifdef RLIMIT_CONCUR
     { RLIMIT_CONCUR,   "concurrency", 1,       "thread(s)"     },
 # endif /* RLIMIT_CONCUR */
@@ -1939,6 +1961,10 @@ struct limits limits[] =
     { RLIMIT_NPROC,    "maxproc",      1,      ""              },
 # endif /* RLIMIT_NPROC */
 
+# ifdef RLIMIT_NTHR
+    { RLIMIT_NTHR,     "maxthread",    1,      ""              },
+# endif /* RLIMIT_NTHR */
+
 # if defined(RLIMIT_OFILE) && !defined(RLIMIT_NOFILE)
     { RLIMIT_OFILE,    "openfiles",    1,      ""              },
 # endif /* RLIMIT_OFILE && !defined(RLIMIT_NOFILE) */
@@ -1955,6 +1981,10 @@ struct limits limits[] =
     { RLIMIT_LOCKS,    "maxlocks",     1,      ""              }, 
 # endif /* RLIMIT_LOCKS */ 
 
+# ifdef RLIMIT_POSIXLOCKS
+    { RLIMIT_POSIXLOCKS,"posixlocks",  1,      ""              },
+# endif /* RLIMIT_POSIXLOCKS */
+
 # ifdef RLIMIT_SIGPENDING 
     { RLIMIT_SIGPENDING,"maxsignal",   1,      ""              }, 
 # endif /* RLIMIT_SIGPENDING */ 
index 16be77e..71279de 100644 (file)
@@ -1,4 +1,4 @@
-/* $Header: /p/tcsh/cvsroot/tcsh/sh.glob.c,v 3.82 2011/02/27 00:15:17 christos Exp $ */
+/* $Header: /p/tcsh/cvsroot/tcsh/sh.glob.c,v 3.89 2015/05/05 14:27:20 christos Exp $ */
 /*
  * sh.glob.c: Regular expression expansion
  */
@@ -32,7 +32,7 @@
  */
 #include "sh.h"
 
-RCSID("$tcsh: sh.glob.c,v 3.82 2011/02/27 00:15:17 christos Exp $")
+RCSID("$tcsh: sh.glob.c,v 3.89 2015/05/05 14:27:20 christos Exp $")
 
 #include "tc.h"
 #include "tw.h"
@@ -781,13 +781,12 @@ backeval(struct blk_buf *bb, struct Strbuf *word, Char *cp, int literal)
                stderror(ERR_OLD);
            alias(&paraml);
            t = syntax(paraml.next, &paraml, 0);
-           if (t == NULL)
-               return;
            cleanup_push(t, syntax_cleanup);
            /* The F_BACKQ flag must set so the job output is correct if
             * printexitvalue is set.  If it's not set, the job output
             * will have "Exit N" appended where N is the exit status. */
-           t->t_dflg = F_BACKQ|F_NOFORK;
+           if (t)
+                   t->t_dflg = F_BACKQ|F_NOFORK;
            if (seterr)
                stderror(ERR_OLD);
 #ifdef SIGTSTP
@@ -881,7 +880,7 @@ backeval(struct blk_buf *bb, struct Strbuf *word, Char *cp, int literal)
        if (c != 0 && (cnt || literal))
            pword(bb, word);
        hadnl = 0;
-    } while (c > 0);
+    } while (c >= 0);
  eof:
     cleanup_until(&pvec[0]);
     pwait();
index 691add3..608fc99 100644 (file)
@@ -1,4 +1,4 @@
-/* $Header: /p/tcsh/cvsroot/tcsh/sh.h,v 3.165 2011/04/14 18:25:25 christos Exp $ */
+/* $Header: /p/tcsh/cvsroot/tcsh/sh.h,v 3.174 2015/05/10 13:29:28 christos Exp $ */
 /*
  * sh.h: Catch it all globals and includes file!
  */
@@ -127,6 +127,11 @@ typedef int eChar;
 #if !defined(__inline) && !defined(__GNUC__) && !defined(_MSC_VER)
 #define __inline
 #endif
+#ifdef _MSC_VER
+#define TCSH_PTRDIFF_T_FMT "I"
+#else
+#define TCSH_PTRDIFF_T_FMT "t"
+#endif
 /* Elide unused argument warnings */
 #define USE(a) (void) (a)
 #define TCSH_IGNORE(a) tcsh_ignore((intptr_t)a)
@@ -428,9 +433,7 @@ typedef long tcsh_number_t;
 # if (defined(_SS_SIZE) || defined(_SS_MAXSIZE)) && defined(HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY)
 #  if !defined(__APPLE__) /* Damnit, where is getnameinfo() folks? */
 #   if !defined(sgi)
-#    if !defined(__CYGWIN__)
-#     define INET6
-#    endif /* __CYGWIN__ */
+#    define INET6
 #   endif /* sgi */
 #  endif /* __APPLE__ */
 # endif
@@ -440,21 +443,7 @@ typedef long tcsh_number_t;
 #ifdef PURIFY
 /* exit normally, allowing purify to trace leaks */
 # define _exit         exit
-typedef  int           pret_t;
-#else /* !PURIFY */
-/*
- * If your compiler complains, then you can either
- * throw it away and get gcc or, use the following define
- * and get rid of the typedef.
- * [The 4.2/3BSD vax compiler does not like that]
- * Both MULTIFLOW and PCC compilers exhbit this bug.  -- sterling@netcom.com
- */
-# if (defined(vax) || defined(uts) || defined(MULTIFLOW) || defined(PCC)) && !defined(__GNUC__)
-#  define pret_t void
-# else /* !((vax || uts || MULTIFLOW || PCC) && !__GNUC__) */
-typedef void pret_t;
-# endif /* (vax || uts || MULTIFLOW || PCC) && !__GNUC__ */
-#endif /* PURIFY */
+#endif /* !PURIFY */
 
 /*
  * ASCII vs. EBCDIC
@@ -573,7 +562,7 @@ EXTERN int    neednote IZERO;       /* Need to pnotify() */
 EXTERN int    noexec IZERO;    /* Don't execute, just syntax check */
 EXTERN int    pjobs IZERO;     /* want to print jobs if interrupted */
 EXTERN int    setintr IZERO;   /* Set interrupts on/off -> Wait intr... */
-EXTERN int    handle_intr IZERO;/* Are we currently handling an interrupt? */
+EXTERN int    handle_interrupt IZERO;/* Are we currently handling an interrupt? */
 EXTERN int    havhash IZERO;   /* path hashing is available */
 EXTERN int    editing IZERO;   /* doing filename expansion and line editing */
 EXTERN int    noediting IZERO; /* initial $term defaulted to noedit */
@@ -585,7 +574,8 @@ EXTERN int    isdiagatty IZERO;/* is SHDIAG a tty */
 EXTERN int    is1atty IZERO;   /* is file descriptor 1 a tty (didfds mode) */
 EXTERN int    is2atty IZERO;   /* is file descriptor 2 a tty (didfds mode) */
 EXTERN int    arun IZERO;      /* Currently running multi-line-aliases */
-EXTERN int     implicit_cd IZERO;/* implicit cd enabled?(1=enabled,2=verbose) */
+EXTERN int    implicit_cd IZERO;/* implicit cd enabled?(1=enabled,2=verbose) */
+EXTERN int    cdtohome IZERO;  /* cd without args goes home */
 EXTERN int    inheredoc IZERO; /* Currently parsing a heredoc */
 /* We received a window change event */
 EXTERN volatile sig_atomic_t windowchg IZERO;
@@ -1020,10 +1010,6 @@ EXTERN Char  **alvec IZERO_STRUCT,
  * Filename/command name expansion variables
  */
 
-#ifdef __CYGWIN__
-# undef MAXPATHLEN
-#endif /* __CYGWIN__ */
-
 #ifndef MAXPATHLEN
 # ifdef PATH_MAX
 #  define MAXPATHLEN PATH_MAX
@@ -1065,7 +1051,7 @@ EXTERN struct Hist {
     unsigned Hhash;                     /* hash value of command line */
 }       Histlist IZERO_STRUCT;
 
-EXTERN struct wordent paraml;  /* Current lexical word list */
+extern struct wordent paraml;  /* Current lexical word list */
 EXTERN int     eventno;                /* Next events number */
 EXTERN int     lastev;         /* Last event reference (default) */
 
index 6a12737..e03ea77 100644 (file)
@@ -1,4 +1,4 @@
-/* $Header: /p/tcsh/cvsroot/tcsh/sh.hist.c,v 3.53 2011/01/24 18:10:26 christos Exp $ */
+/* $Header: /p/tcsh/cvsroot/tcsh/sh.hist.c,v 3.60 2015/02/22 21:59:00 christos Exp $ */
 /*
  * sh.hist.c: Shell history expansions and substitutions
  */
  */
 #include "sh.h"
 
-RCSID("$tcsh: sh.hist.c,v 3.53 2011/01/24 18:10:26 christos Exp $")
+RCSID("$tcsh: sh.hist.c,v 3.60 2015/02/22 21:59:00 christos Exp $")
 
+#include <stdio.h>     /* for rename(2), grr. */
 #include <assert.h>
 #include "tc.h"
+#include "dotlock.h"
 
 extern int histvalid;
 extern struct Strbuf histline;
@@ -68,12 +70,12 @@ static      void    hfree   (struct Hist *);
 
 static const int fastMergeErase = 1;
 static unsigned histCount = 0;         /* number elements on history list */
+static int histlen = 0;
 static struct Hist *histTail = NULL;     /* last element on history list */
 static struct Hist *histMerg = NULL;    /* last element merged by Htime */
 
 static void insertHistHashTable(struct Hist *, unsigned);
 
-
 /* Insert new element (hp) in history list after specified predecessor (pp). */
 static void
 hinsert(struct Hist *hp, struct Hist *pp)
@@ -107,7 +109,7 @@ hremove(struct Hist *hp)
 
 /* Prune length of history list to specified size by history variable. */
 PG_STATIC void
-discardExcess(int histlen)
+discardExcess(int hlen)
 {
     struct Hist *hp, *np;
     if (histTail == NULL) {
@@ -117,23 +119,23 @@ discardExcess(int histlen)
     /* Prune dummy entries from the front, then old entries from the back. If
      * the list is still too long scan the whole list as before.  But only do a
      * full scan if the list is more than 6% (1/16th) too long. */
-    while (histCount > (unsigned)histlen && (np = Histlist.Hnext)) {
-        if (eventno - np->Href >= histlen || histlen == 0)
+    while (histCount > (unsigned)hlen && (np = Histlist.Hnext)) {
+        if (eventno - np->Href >= hlen || hlen == 0)
             hremove(np), hfree(np);
         else
             break;
     }
-    while (histCount > (unsigned)histlen && (np = histTail) != &Histlist) {
-        if (eventno - np->Href >= histlen || histlen == 0)
+    while (histCount > (unsigned)hlen && (np = histTail) != &Histlist) {
+        if (eventno - np->Href >= hlen || hlen == 0)
             hremove(np), hfree(np);
         else
             break;
     }
-    if (histCount - (histlen >> 4) <= (unsigned)histlen)
+    if (histCount - (hlen >> 4) <= (unsigned)hlen)
        return;                         /* don't bother doing the full scan */
-    for (hp = &Histlist; histCount > (unsigned)histlen &&
+    for (hp = &Histlist; histCount > (unsigned)hlen &&
        (np = hp->Hnext) != NULL;)
-        if (eventno - np->Href >= histlen || histlen == 0)
+        if (eventno - np->Href >= hlen || hlen == 0)
             hremove(np), hfree(np);
         else
             hp = np;
@@ -145,20 +147,9 @@ savehist(
   struct wordent *sp,
   int mflg)                            /* true if -m (merge) specified */
 {
-    int histlen = 0;
-    Char   *cp;
-
     /* throw away null lines */
     if (sp && sp->next->word[0] == '\n')
        return;
-    cp = varval(STRhistory);
-    while (*cp) {
-       if (!Isdigit(*cp)) {
-           histlen = 0;
-           break;
-       }
-       histlen = histlen * 10 + *cp++ - '0';
-    }
     if (sp)
         (void) enthist(++eventno, sp, 1, mflg, histlen);
     discardExcess(histlen);
@@ -711,9 +702,9 @@ discardHistHashTable(void)
 
 /* Computes a new hash table size, when the current one is too small. */
 static unsigned
-getHashTableSize(int histlen)
+getHashTableSize(int hlen)
 {
-    unsigned target = histlen * 2;
+    unsigned target = hlen * 2;
     unsigned e = 5;
     unsigned size;
     while ((size = 1<<e) < target)
@@ -729,17 +720,16 @@ getHashTableSize(int histlen)
 
 /* Create the hash table or resize, if necessary. */
 static void
-createHistHashTable(int histlen)
+createHistHashTable(int hlen)
 {
-    if (histlen == 0) {
+    if (hlen == 0) {
        discardHistHashTable();
         return;
     }
-    if (histlen < 0) {
-        histlen = getn(varval(STRhistory));
-       if (histlen == 0)
+    if (hlen < 0) {
+       if (histlen <= 0)
            return;                     /* no need for hash table */
-       assert(histlen > 0);
+       hlen = histlen;
     }
     if (histHashTable != NULL) {
        if (histCount < histHashTableLength * 3 / 4)
@@ -747,7 +737,7 @@ createHistHashTable(int histlen)
        discardHistHashTable();         /* too small */
     }
     histHashTableLength = getHashTableSize(
-       histlen > (int)histCount ? histlen : (int)histCount);
+       hlen > (int)histCount ? hlen : (int)histCount);
     histHashTable = xmalloc(histHashTableLength * sizeof(struct Hist *));
     memset(histHashTable, 0, histHashTableLength * sizeof(struct Hist *));
     assert(histHashTable[0] == emptyHTE);
@@ -934,7 +924,7 @@ enthist(
   struct wordent *lp,
   int docopy,
   int mflg,                            /* true if merge requested */
-  int histlen)                         /* -1 if unknown */
+  int hlen)                            /* -1 if unknown */
 {
     struct Hist *p = NULL, *pp = &Histlist, *pTime = NULL;
     struct Hist *np;
@@ -944,7 +934,7 @@ enthist(
     if ((dp = varval(STRhistdup)) != STRNULL) {
        if (eq(dp, STRerase)) {
            /* masaoki@akebono.tky.hp.com (Kobayashi Masaoki) */
-            createHistHashTable(histlen);
+            createHistHashTable(hlen);
             lpHash = hashhist(lp);
             assert(lpHash != 0);
             p = findHistHashTable(lp, lpHash);
@@ -963,7 +953,7 @@ enthist(
            }
        }
        else if (eq(dp, STRall)) {
-            createHistHashTable(histlen);
+            createHistHashTable(hlen);
             lpHash = hashhist(lp);
             assert(lpHash != 0);
             p = findHistHashTable(lp, lpHash);
@@ -1031,7 +1021,7 @@ enthist(
     else
         pp = &Histlist;                 /* insert at beginning of history */
     hinsert(np, pp);
-    if (lpHash && histlen != 0)                /* erase & all modes use hash table */
+    if (lpHash && hlen != 0)           /* erase & all modes use hash table */
         insertHistHashTable(np, lpHash);
     else
         discardHistHashTable();
@@ -1053,6 +1043,8 @@ hfree(struct Hist *hp)
 PG_STATIC void
 phist(struct Hist *hp, int hflg)
 {
+    if (hp->Href < 0)
+       return;
     if (hflg & HIST_ONLY) {
        int old_output_raw;
 
@@ -1220,13 +1212,21 @@ fmthist(int fmt, ptr_t ptr)
     }
 }
 
+static void
+dotlock_cleanup(void* lockpath)
+{
+       dot_unlock((char*)lockpath);
+}
+
 /* Save history before exiting the shell. */
 void
 rechist(Char *fname, int ref)
 {
-    Char    *snum;
+    Char    *snum, *rs;
     int     fp, ftmp, oldidfds;
     struct varent *shist;
+    char path[MAXPATHLEN];
+    struct stat st;
     static Char   *dumphist[] = {STRhistory, STRmhT, 0, 0};
 
     if (fname == NULL && !ref) 
@@ -1255,12 +1255,14 @@ rechist(Char *fname, int ref)
      * with numerous shells being in simultaneous use. Imagine
      * any kind of window system. All these shells 'share' the same 
      * ~/.history file for recording their command line history. 
-     * Currently the automatic merge can only succeed when the shells
-     * nicely quit one after another. 
+     * We try to handle the case of multiple shells trying to merge
+     * histories at the same time, by creating semi-unique filenames
+     * and saving the history there first and then trying to rename
+     * them in the proper history file.
      *
      * Users that like to nuke their environment require here an atomic
-     *         loadhist-creat-dohist(dumphist)-close
-     * sequence.
+     * loadhist-creat-dohist(dumphist)-close sequence which is given
+                * by optional lock parameter to savehist.
      *
      * jw.
      */ 
@@ -1271,16 +1273,49 @@ rechist(Char *fname, int ref)
      */
     oldidfds = didfds;
     didfds = 0;
-    if ((shist = adrof(STRsavehist)) != NULL && shist->vec != NULL)
-       if (shist->vec[1] && eq(shist->vec[1], STRmerge))
+    if ((shist = adrof(STRsavehist)) != NULL && shist->vec != NULL) {
+       size_t i;
+       int merge = 0, lock = 0;
+
+       for (i = 1; shist->vec[i]; i++) {
+           if (eq(shist->vec[i], STRmerge))
+               merge++;
+           if (eq(shist->vec[i], STRlock))
+               lock++;
+       }
+
+       if (merge) {
+           if (lock) {
+#ifndef WINNT_NATIVE
+               char *lockpath = strsave(short2str(fname));
+               cleanup_push(lockpath, xfree);
+               /* Poll in 100 miliseconds interval to obtain the lock. */
+               if ((dot_lock(lockpath, 100) == 0))
+                   cleanup_push(lockpath, dotlock_cleanup);
+#endif
+           }
            loadhist(fname, 1);
+       }
+    }
+    rs = randsuf();
+    xsnprintf(path, sizeof(path), "%S.%S", fname, rs);
+    xfree(rs);
 
-    fp = xcreat(short2str(fname), 0600);
-    cleanup_until(fname);
+    fp = xcreat(path, 0600);
     if (fp == -1) {
        didfds = oldidfds;
+       cleanup_until(fname);
        return;
     }
+    /* Try to preserve ownership and permissions of the original history file */
+#ifndef WINNT_NATIVE
+    if (stat(short2str(fname), &st) != -1) {
+       TCSH_IGNORE(fchown(fp, st.st_uid, st.st_gid));
+       TCSH_IGNORE(fchmod(fp, st.st_mode));
+    }
+#else
+    UNREFERENCED_PARAMETER(st);
+#endif
     ftmp = SHOUT;
     SHOUT = fp;
     dumphist[2] = snum;
@@ -1288,6 +1323,8 @@ rechist(Char *fname, int ref)
     xclose(fp);
     SHOUT = ftmp;
     didfds = oldidfds;
+    (void)rename(path, short2str(fname));
+    cleanup_until(fname);
 }
 
 
@@ -1317,3 +1354,10 @@ loadhist(Char *fname, int mflg)
            hp->Hnum = hp->Href = n--;
     }
 }
+
+void
+sethistory(int n)
+{
+    histlen = n;
+    discardExcess(histlen);
+}
index aacff5b..e36d951 100644 (file)
@@ -1,4 +1,4 @@
-/* $Header: /p/tcsh/cvsroot/tcsh/sh.init.c,v 3.63 2006/08/23 01:49:32 mitr Exp $ */
+/* $Header: /p/tcsh/cvsroot/tcsh/sh.init.c,v 3.64 2013/02/11 13:51:16 christos Exp $ */
 /*
  * sh.init.c: Function and signal tables
  */
@@ -32,7 +32,7 @@
  */
 #include "sh.h"
 
-RCSID("$tcsh: sh.init.c,v 3.63 2006/08/23 01:49:32 mitr Exp $")
+RCSID("$tcsh: sh.init.c,v 3.64 2013/02/11 13:51:16 christos Exp $")
 
 #include "ed.h"
 #include "tw.h"
@@ -214,7 +214,7 @@ int nsrchn = sizeof srchn / sizeof *srchn;
  */
 
 /* We define NUMSIG to avoid changing NSIG or MAXSIG */
-#if defined(POSIX) && !defined(__CYGWIN__)
+#if defined(POSIX) && (!defined(__CYGWIN__) || defined (__x86_64__))
 # define NUMSIG 65
 #else /* !POSIX */
 # define NUMSIG 33
index 08ec30d..1e381c1 100644 (file)
@@ -1,4 +1,4 @@
-/* $Header: /p/tcsh/cvsroot/tcsh/sh.misc.c,v 3.46 2010/05/08 00:41:58 christos Exp $ */
+/* $Header: /p/tcsh/cvsroot/tcsh/sh.misc.c,v 3.49 2015/05/04 15:31:13 christos Exp $ */
 /*
  * sh.misc.c: Miscelaneous functions
  */
@@ -32,7 +32,7 @@
  */
 #include "sh.h"
 
-RCSID("$tcsh: sh.misc.c,v 3.46 2010/05/08 00:41:58 christos Exp $")
+RCSID("$tcsh: sh.misc.c,v 3.49 2015/05/04 15:31:13 christos Exp $")
 
 static int     renum   (int, int);
 static  Char  **blkend (Char **);
@@ -533,14 +533,16 @@ xclose(int fildes)
     if (fildes < 0)
        return;
     while (close(fildes) == -1 && errno == EINTR)
-       handle_pending_signals();
+       if (handle_pending_signals())
+           break;
 }
 
 void
 xclosedir(DIR *dirp)
 {
     while (closedir(dirp) == -1 && errno == EINTR)
-       handle_pending_signals();
+       if (handle_pending_signals())
+           break;
 }
 
 int
@@ -549,7 +551,8 @@ xcreat(const char *path, mode_t mode)
     int res;
 
     while ((res = creat(path, mode)) == -1 && errno == EINTR)
-       handle_pending_signals();
+       if (handle_pending_signals())
+           break;
     return res;
 }
 
@@ -560,7 +563,8 @@ xdup2(int fildes, int fildes2)
     int res;
 
     while ((res = dup2(fildes, fildes2)) == -1 && errno == EINTR)
-       handle_pending_signals();
+       if (handle_pending_signals())
+           break;
     return res;
 }
 #endif
@@ -572,7 +576,8 @@ xgetgrgid(gid_t xgid)
 
     errno = 0;
     while ((res = getgrgid(xgid)) == NULL && errno == EINTR) {
-       handle_pending_signals();
+       if (handle_pending_signals())
+           break;
        errno = 0;
     }
     return res;
@@ -585,7 +590,8 @@ xgetpwnam(const char *name)
 
     errno = 0;
     while ((res = getpwnam(name)) == NULL && errno == EINTR) {
-       handle_pending_signals();
+       if (handle_pending_signals())
+           break;
        errno = 0;
     }
     return res;
@@ -598,7 +604,8 @@ xgetpwuid(uid_t xuid)
 
     errno = 0;
     while ((res = getpwuid(xuid)) == NULL && errno == EINTR) {
-       handle_pending_signals();
+       if (handle_pending_signals())
+           break;
        errno = 0;
     }
     return res;
@@ -611,7 +618,8 @@ xopen(const char *path, int oflag, ...)
 
     if ((oflag & O_CREAT) == 0) {
        while ((res = open(path, oflag)) == -1 && errno == EINTR)
-           handle_pending_signals();
+           if (handle_pending_signals())
+               break;
     } else {
        va_list ap;
        mode_t mode;
@@ -623,7 +631,8 @@ xopen(const char *path, int oflag, ...)
        mode = va_arg(ap, int);
        va_end(ap);
        while ((res = open(path, oflag, mode)) == -1 && errno == EINTR)
-           handle_pending_signals();
+           if (handle_pending_signals())
+               break;
     }
     return res;
 }
@@ -636,7 +645,8 @@ xread(int fildes, void *buf, size_t nbyte)
     /* This is where we will be blocked most of the time, so handle signals
        that didn't interrupt any system call. */
     do
-      handle_pending_signals();
+      if (handle_pending_signals())
+         break;
     while ((res = read(fildes, buf, nbyte)) == -1 && errno == EINTR);
     return res;
 }
@@ -649,7 +659,8 @@ xtcsetattr(int fildes, int optional_actions, const struct termios *termios_p)
 
     while ((res = tcsetattr(fildes, optional_actions, termios_p)) == -1 &&
           errno == EINTR)
-       handle_pending_signals();
+       if (handle_pending_signals())
+           break;
     return res;
 }
 #endif
@@ -662,7 +673,8 @@ xwrite(int fildes, const void *buf, size_t nbyte)
     /* This is where we will be blocked most of the time, so handle signals
        that didn't interrupt any system call. */
     do
-      handle_pending_signals();
+      if (handle_pending_signals())
+         break;
     while ((res = write(fildes, buf, nbyte)) == -1 && errno == EINTR);
     return res;
 }
index f32d422..b87beba 100644 (file)
@@ -1,4 +1,4 @@
-/* $Header: /p/tcsh/cvsroot/tcsh/sh.print.c,v 3.36 2011/05/25 20:17:20 christos Exp $ */
+/* $Header: /p/tcsh/cvsroot/tcsh/sh.print.c,v 3.37 2015/05/10 13:29:28 christos Exp $ */
 /*
  * sh.print.c: Primitive Output routines.
  */
@@ -32,7 +32,7 @@
  */
 #include "sh.h"
 
-RCSID("$tcsh: sh.print.c,v 3.36 2011/05/25 20:17:20 christos Exp $")
+RCSID("$tcsh: sh.print.c,v 3.37 2015/05/10 13:29:28 christos Exp $")
 
 #include "ed.h"
 
@@ -231,13 +231,13 @@ flush(void)
        return;
     if (GettingInput && !Tty_raw_mode && linp < &linbuf[sizeof linbuf - 10])
        return;
-    if (handle_intr)
-       exitset = 1;
+    if (handle_interrupt)
+       exitset = 1;
 
     if (interrupted) {
        interrupted = 0;
        linp = linbuf;          /* avoid recursion as stderror calls flush */
-       if (handle_intr)
+       if (handle_interrupt)
            fixerror();
        else
            stderror(ERR_SILENT);
@@ -298,11 +298,11 @@ flush(void)
        case EDQUOT:
 #endif
        /* Nothing to do, but die */
-           if (handle_intr == 0)
+           if (handle_interrupt == 0)
                xexit(1);
            /*FALLTHROUGH*/
        default:
-           if (handle_intr)
+           if (handle_interrupt)
                fixerror();
            else
                stderror(ERR_SILENT);
index f2356d1..ce37c4d 100644 (file)
@@ -1,4 +1,4 @@
-/* $Header: /p/tcsh/cvsroot/tcsh/sh.proc.c,v 3.121 2012/01/25 15:34:41 christos Exp $ */
+/* $Header: /p/tcsh/cvsroot/tcsh/sh.proc.c,v 3.127 2015/02/22 21:40:14 christos Exp $ */
 /*
  * sh.proc.c: Job manipulations
  */
@@ -32,7 +32,7 @@
  */
 #include "sh.h"
 
-RCSID("$tcsh: sh.proc.c,v 3.121 2012/01/25 15:34:41 christos Exp $")
+RCSID("$tcsh: sh.proc.c,v 3.127 2015/02/22 21:40:14 christos Exp $")
 
 #include "ed.h"
 #include "tc.h"
@@ -507,6 +507,7 @@ pjwait(struct process *pp)
     cleanup_push(&oset, sigprocmask_cleanup);
     pause_mask = oset;
     sigdelset(&pause_mask, SIGCHLD);
+    sigaddset(&pause_mask, SIGINT);
     for (;;) {
        (void)handle_pending_signals();
        jobflags = 0;
@@ -593,22 +594,44 @@ void
 dowait(Char **v, struct command *c)
 {
     struct process *pp;
+
+    /* the current block mask to be able to restore */
+    sigset_t old_mask;
+
+    /* block mask for critical section: OLD_MASK U {SIGCHLD} */
+    sigset_t block_mask;
+
+    /* ignore those during blocking sigsuspend:
+       OLD_MASK / {SIGCHLD, possibly(SIGINT)} */
     sigset_t pause_mask;
+
     int opintr_disabled, gotsig;
 
     USE(c);
     USE(v);
     pjobs++;
+
     sigprocmask(SIG_BLOCK, NULL, &pause_mask);
     sigdelset(&pause_mask, SIGCHLD);
     if (setintr)
        sigdelset(&pause_mask, SIGINT);
+
+    /* critical section, block also SIGCHLD */
+    sigprocmask(SIG_BLOCK, NULL, &block_mask);
+    sigaddset(&block_mask, SIGCHLD);
+    sigprocmask(SIG_BLOCK, &block_mask, &old_mask);
+
+    /* detect older SIGCHLDs and remove PRUNNING flag from proclist */
+    (void)handle_pending_signals();
+
 loop:
     for (pp = proclist.p_next; pp; pp = pp->p_next)
        if (pp->p_procid &&     /* pp->p_procid == pp->p_jobid && */
            pp->p_flags & PRUNNING) {
-           (void)handle_pending_signals();
+           /* wait for (or pick up alredy blocked) SIGCHLD */
            sigsuspend(&pause_mask);
+
+           /* make the 'wait' interuptable by CTRL-C */
            opintr_disabled = pintr_disabled;
            pintr_disabled = 0;
            gotsig = handle_pending_signals();
@@ -618,6 +641,8 @@ loop:
            goto loop;
        }
     pjobs = 0;
+
+    sigprocmask(SIG_SETMASK, &old_mask, NULL);
 }
 
 /*
@@ -978,6 +1003,7 @@ pprint(struct process *pp, int flag)
     tp = pp;
     status = reason = -1;
     jobflags = 0;
+    haderr = 1;        /* Print statuc to stderr */
     do {
 #ifdef BACKPIPE
        /*
@@ -1186,6 +1212,7 @@ prcomd:
            xprintf("       ");
        ptprint(tp);
     }
+    haderr = 0;
     return (jobflags);
 }
 
@@ -1833,12 +1860,12 @@ pfork(struct command *t, int wanttty)
            (void) signal(SIGHUP, SIG_IGN);
        if (t->t_dflg & F_NICE) {
            int nval = SIGN_EXTEND_CHAR(t->t_nice);
-#ifdef HAVE_SETPRIORITY
+#if defined(HAVE_SETPRIORITY) && defined(PRIO_PROCESS)
            if (setpriority(PRIO_PROCESS, 0, nval) == -1 && errno)
                stderror(ERR_SYSTEM, "setpriority", strerror(errno));
-#else /* !HAVE_SETPRIORITY */
+#else /* !HAVE_SETPRIORITY || !PRIO_PROCESS */
            (void) nice(nval);
-#endif /* !HAVE_SETPRIORITY */
+#endif /* HAVE_SETPRIORITY  && PRIO_PROCESS */
        }
 #ifdef F_VER
         if (t->t_dflg & F_VER) {
index c880974..a10e876 100644 (file)
@@ -1,4 +1,4 @@
-/* $Header: /p/tcsh/cvsroot/tcsh/sh.sem.c,v 3.86 2011/02/25 23:24:19 christos Exp $ */
+/* $Header: /p/tcsh/cvsroot/tcsh/sh.sem.c,v 3.88 2014/09/08 18:52:15 christos Exp $ */
 /*
  * sh.sem.c: I/O redirections and job forking. A touchy issue!
  *          Most stuff with builtins is incorrect
@@ -33,7 +33,7 @@
  */
 #include "sh.h"
 
-RCSID("$tcsh: sh.sem.c,v 3.86 2011/02/25 23:24:19 christos Exp $")
+RCSID("$tcsh: sh.sem.c,v 3.88 2014/09/08 18:52:15 christos Exp $")
 
 #include "tc.h"
 #include "tw.h"
@@ -346,10 +346,6 @@ execute(struct command *t, volatile int wanttty, int *pipein, int *pipeout,
         * not pipedout, niced, nohupped, or &'d. It would be nice(?) to not
         * fork in some of these cases.
         */
-       /*
-        * Prevent forking cd, pushd, popd, chdir cause this will cause the
-        * shell not to change dir!
-        */
 #ifdef BACKPIPE
        /*
         * Can't have NOFORK for the tail of a pipe - because it is not the
@@ -358,11 +354,26 @@ execute(struct command *t, volatile int wanttty, int *pipein, int *pipeout,
         */
        if (t->t_dflg & F_PIPEIN)
            t->t_dflg &= ~(F_NOFORK);
+#else
+       /*
+        * "command | builtin" may cause major misbehaviour as noted in
+        * in the BUGS file entry
+        * Subject: Redirected input to built-in functions misbehaves badly
+        * forking when the builtin is the end of the pipe corrects the
+        * problem.
+        */
+       if (bifunc && (t->t_dflg & F_PIPEIN))
+           t->t_dflg &= ~(F_NOFORK);
 #endif /* BACKPIPE */
+       /*
+        * Prevent forking cd, pushd, popd, chdir cause this will cause the
+        * shell not to change dir! (XXX: but only for nice?)
+        */
        if (bifunc && (bifunc->bfunct == (bfunc_t)dochngd ||
                       bifunc->bfunct == (bfunc_t)dopushd ||
                       bifunc->bfunct == (bfunc_t)dopopd))
            t->t_dflg &= ~(F_NICE);
+
        if (((t->t_dflg & F_TIME) || ((t->t_dflg & F_NOFORK) == 0 &&
             (!bifunc || t->t_dflg &
              (F_PIPEOUT | F_AMPERSAND | F_NICE | F_NOHUP | F_HUP)))) ||
@@ -560,13 +571,13 @@ execute(struct command *t, volatile int wanttty, int *pipein, int *pipeout,
                        (void) signal(SIGHUP, SIG_DFL);
                    if (t->t_dflg & F_NICE) {
                        int nval = SIGN_EXTEND_CHAR(t->t_nice);
-# ifdef HAVE_SETPRIORITY
+# if defined(HAVE_SETPRIORITY) && defined(PRIO_PROCESS)
                        if (setpriority(PRIO_PROCESS, 0, nval) == -1 && errno)
                                stderror(ERR_SYSTEM, "setpriority",
                                    strerror(errno));
-# else /* !HAVE_SETPRIORITY */
+# else /* !HAVE_SETPRIORITY || !PRIO_PROCESS */
                        (void) nice(nval);
-# endif /* HAVE_SETPRIORITY */
+# endif /* HAVE_SETPRIORITY && PRIO_PROCESS */
                    }
 # ifdef F_VER
                    if (t->t_dflg & F_VER) {
index 0f98a2b..7498169 100644 (file)
@@ -1,4 +1,4 @@
-/* $Header: /p/tcsh/cvsroot/tcsh/sh.set.c,v 3.83 2012/01/15 17:15:28 christos Exp $ */
+/* $Header: /p/tcsh/cvsroot/tcsh/sh.set.c,v 3.86 2014/10/28 18:40:46 christos Exp $ */
 /*
  * sh.set.c: Setting and Clearing of variables
  */
@@ -32,7 +32,7 @@
  */
 #include "sh.h"
 
-RCSID("$tcsh: sh.set.c,v 3.83 2012/01/15 17:15:28 christos Exp $")
+RCSID("$tcsh: sh.set.c,v 3.86 2014/10/28 18:40:46 christos Exp $")
 
 #include "ed.h"
 #include "tw.h"
@@ -195,6 +195,9 @@ update_vars(Char *vp)
     else if (eq(vp, STRkillring)) {
        SetKillRing((int)getn(varval(vp)));
     }
+    else if (eq(vp, STRhistory)) {
+       sethistory((int)getn(varval(vp)));
+    }
 #ifndef HAVENOUTMP
     else if (eq(vp, STRwatch)) {
        resetwatch();
@@ -203,6 +206,9 @@ update_vars(Char *vp)
     else if (eq(vp, STRimplicitcd)) {
        implicit_cd = ((eq(varval(vp), STRverbose)) ? 2 : 1);
     }
+    else if (eq(vp, STRcdtohome)) {
+       cdtohome = 1;
+    }
 #ifdef COLOR_LS_F
     else if (eq(vp, STRcolor)) {
        set_color_context();
@@ -780,12 +786,16 @@ unset(Char **v, struct command *c)
        symlinks = 0;
     if (adrof(STRimplicitcd) == 0)
        implicit_cd = 0;
+    if (adrof(STRcdtohome) == 0)
+       cdtohome = 0;
     if (adrof(STRkillring) == 0)
        SetKillRing(0);
     if (did_edit && noediting && adrof(STRedit) == 0)
        noediting = 0;
     if (did_roe && adrof(STRrecognize_only_executables) == 0)
        tw_cmd_free();
+    if (adrof(STRhistory) == 0)
+       sethistory(0);
 #ifdef COLOR_LS_F
     if (adrof(STRcolor) == 0)
        set_color_context();
index beed4c9..23fc7d7 100644 (file)
@@ -1,4 +1,4 @@
-/* $Header: /p/tcsh/cvsroot/tcsh/sh.time.c,v 3.35 2010/12/09 15:39:29 christos Exp $ */
+/* $Header: /p/tcsh/cvsroot/tcsh/sh.time.c,v 3.36 2013/03/18 21:00:46 christos Exp $ */
 /*
  * sh.time.c: Shell time keeping and printing.
  */
@@ -32,7 +32,7 @@
  */
 #include "sh.h"
 
-RCSID("$tcsh: sh.time.c,v 3.35 2010/12/09 15:39:29 christos Exp $")
+RCSID("$tcsh: sh.time.c,v 3.36 2013/03/18 21:00:46 christos Exp $")
 
 #ifdef SUNOS4
 # include <machine/param.h>
@@ -158,12 +158,12 @@ donice(Char **v, struct command *c)
        nval = 4;
     else if (*v        == 0 && any("+-", cp[0]))
        nval = getn(cp);
-#ifdef HAVE_SETPRIORITY
+#if defined(HAVE_SETPRIORITY) && defined(PRIO_PROCESS)
     if (setpriority(PRIO_PROCESS, 0, nval) == -1 && errno)
        stderror(ERR_SYSTEM, "setpriority", strerror(errno));
-#else /* !HAVE_SETPRIORITY */
+#else /* !HAVE_SETPRIORITY || !PRIO_PROCESS */
     (void) nice(nval);
-#endif /* HAVE_SETPRIORITY */
+#endif /* HAVE_SETPRIORITY && PRIO_PROCESS */
 }
 
 #ifdef BSDTIMES
index f38df2c..b87f9e9 100644 (file)
@@ -1,4 +1,4 @@
-/* $Header: /p/tcsh/cvsroot/tcsh/tc.alloc.c,v 3.50 2011/12/30 20:55:24 christos Exp $ */
+/* $Header: /p/tcsh/cvsroot/tcsh/tc.alloc.c,v 3.53 2015/02/22 16:31:54 christos Exp $ */
 /*
  * tc.alloc.c (Caltech) 2/21/82
  * Chris Kingsley, kingsley@cit-20.
 #ifdef HAVE_MALLINFO
 #include <malloc.h>
 #endif
+#if defined(HAVE_SBRK) && !defined(__APPLE__)
+#define USE_SBRK
+#endif
 
-RCSID("$tcsh: tc.alloc.c,v 3.50 2011/12/30 20:55:24 christos Exp $")
+RCSID("$tcsh: tc.alloc.c,v 3.53 2015/02/22 16:31:54 christos Exp $")
 
 #define RCHECK
 #define DEBUG
@@ -66,7 +69,7 @@ out_of_memory (void)
 {
     static const char msg[] = "Out of memory\n";
 
-    write(didfds ? 2 : SHDIAG, msg, strlen(msg));
+    TCSH_IGNORE(write(didfds ? 2 : SHDIAG, msg, strlen(msg)));
     _exit(1);
 }
 #endif
@@ -459,7 +462,7 @@ malloc_usable_size(M_U_S_CONST void *ptr)
     const union overhead *op = (const union overhead *)
        (((const char *) ptr) - MEMALIGN(sizeof(*op)));
     if (op->ov_magic == MAGIC)
-           return 1 << (op->ov_index + 2);
+           return 1 << (op->ov_index + 3);
     else
            return 0;
 }
@@ -513,19 +516,19 @@ smalloc(size_t n)
 
     n = n ? n : 1;
 
-#ifdef HAVE_SBRK
+#ifdef USE_SBRK
     if (membot == NULL)
        membot = sbrk(0);
-#endif /* HAVE_SBRK */
+#endif /* USE_SBRK */
 
     if ((ptr = malloc(n)) == NULL)
        out_of_memory();
-#ifndef HAVE_SBRK
+#ifndef USE_SBRK
     if (memtop < ((char *) ptr) + n)
        memtop = ((char *) ptr) + n;
     if (membot == NULL)
        membot = ptr;
-#endif /* !HAVE_SBRK */
+#endif /* !USE_SBRK */
     return ((memalign_t) ptr);
 }
 
@@ -536,19 +539,19 @@ srealloc(ptr_t p, size_t n)
 
     n = n ? n : 1;
 
-#ifdef HAVE_SBRK
+#ifdef USE_SBRK
     if (membot == NULL)
        membot = sbrk(0);
-#endif /* HAVE_SBRK */
+#endif /* USE_SBRK */
 
     if ((ptr = (p ? realloc(p, n) : malloc(n))) == NULL)
        out_of_memory();
-#ifndef HAVE_SBRK
+#ifndef USE_SBRK
     if (memtop < ((char *) ptr) + n)
        memtop = ((char *) ptr) + n;
     if (membot == NULL)
        membot = ptr;
-#endif /* !HAVE_SBRK */
+#endif /* !USE_SBRK */
     return ((memalign_t) ptr);
 }
 
@@ -560,22 +563,22 @@ scalloc(size_t s, size_t n)
     n *= s;
     n = n ? n : 1;
 
-#ifdef HAVE_SBRK
+#ifdef USE_SBRK
     if (membot == NULL)
        membot = sbrk(0);
-#endif /* HAVE_SBRK */
+#endif /* USE_SBRK */
 
     if ((ptr = malloc(n)) == NULL)
        out_of_memory();
 
     memset (ptr, 0, n);
 
-#ifndef HAVE_SBRK
+#ifndef USE_SBRK
     if (memtop < ((char *) ptr) + n)
        memtop = ((char *) ptr) + n;
     if (membot == NULL)
        membot = ptr;
-#endif /* !HAVE_SBRK */
+#endif /* !USE_SBRK */
 
     return ((memalign_t) ptr);
 }
@@ -625,9 +628,9 @@ showall(Char **v, struct command *c)
            (unsigned long) sbrk(0));
 #else /* SYSMALLOC */
 #ifndef HAVE_MALLINFO
-#ifdef HAVE_SBRK
+#ifdef USE_SBRK
     memtop = sbrk(0);
-#endif /* HAVE_SBRK */
+#endif /* USE_SBRK */
     xprintf(CGETS(19, 12, "Allocated memory from 0x%lx to 0x%lx (%ld).\n"),
            (unsigned long) membot, (unsigned long) memtop, 
            (unsigned long) (memtop - membot));
index 641e234..e71d2ae 100644 (file)
@@ -1,4 +1,4 @@
-/* $Header: /p/tcsh/cvsroot/tcsh/tc.const.c,v 3.98 2011/04/14 18:25:26 christos Exp $ */
+/* $Header: /p/tcsh/cvsroot/tcsh/tc.const.c,v 3.104 2014/10/28 18:40:46 christos Exp $ */
 /*
  * sh.const.c: String constants for tcsh.
  */
@@ -32,7 +32,7 @@
  */
 #include "sh.h"
 
-RCSID("$tcsh: tc.const.c,v 3.98 2011/04/14 18:25:26 christos Exp $")
+RCSID("$tcsh: tc.const.c,v 3.104 2014/10/28 18:40:46 christos Exp $")
 
 Char STRlogout[]       = { 'l', 'o', 'g', 'o', 'u', 't', '\0' };
 Char STRautologout[]   = { 'a', 'u', 't', 'o', 'l', 'o', 'g', 'o', 'u', 't', 
@@ -85,6 +85,7 @@ Char STRVENDOR[]      = { 'V', 'E', 'N', 'D', 'O', 'R', '\0' };
 Char STRMACHTYPE[]     = { 'M', 'A', 'C', 'H', 'T', 'Y', 'P', 'E', '\0' };
 Char STROSTYPE[]       = { 'O', 'S', 'T', 'Y', 'P', 'E', '\0' };
 Char STRedit[]         = { 'e', 'd', 'i', 't', '\0' };
+Char STReditors[]      = { 'e', 'd', 'i', 't', 'o', 'r', 's', '\0' };
 Char STRaddsuffix[]    = { 'a', 'd', 'd', 's', 'u', 'f', 'f', 'i', 'x',
                            '\0' };
 Char STRcsubstnonl[]   = { 'c', 's', 'u', 'b', 's', 't', 'n', 'o', 'n', 'l',
@@ -113,6 +114,7 @@ Char STRmhT[]               = { '-', 'h', 'T', '\0' };
 Char STRmm[]           = { '-', 'm', '\0' };
 Char STRmr[]           = { '-', 'r', '\0' };
 Char STRmerge[]                = { 'm', 'e', 'r', 'g', 'e', '\0' };
+Char STRlock[]         = { 'l', 'o', 'c', 'k', '\0' };
 Char STRtildothist[]   = { '~', '/', '.', 'h', 'i', 's', 't', 'o', 'r', 
                            'y', '\0' };
 
@@ -430,8 +432,9 @@ Char STRrmstar[]    = { 'r', 'm', 's', 't', 'a', 'r', '\0' };
 Char STRrm[]           = { 'r', 'm', '\0' };
 Char STRhighlight[]    = { 'h', 'i', 'g', 'h', 'l', 'i', 'g', 'h', 't', '\0' };
 
-Char STRimplicitcd[] = { 'i', 'm', 'p', 'l', 'i', 'c', 'i', 't',
-                         'c', 'd', '\0' };
+Char STRimplicitcd[]   = { 'i', 'm', 'p', 'l', 'i', 'c', 'i', 't',
+                           'c', 'd', '\0' };
+Char STRcdtohome[]     = { 'c', 'd', 't', 'o', 'h', 'o', 'm', 'e', '\0' };
 Char STRkillring[]     = { 'k', 'i', 'l', 'l', 'r', 'i', 'n', 'g', '\0' };
 Char STRkilldup[]      = { 'k', 'i', 'l', 'l', 'd', 'u', 'p', '\0' };
 Char STRshlvl[]                = { 's', 'h', 'l', 'v', 'l', '\0' };
@@ -450,12 +453,12 @@ Char STRLC_MONETARY[]     = { 'L', 'C', '_', 'M', 'O', 'N', 'E', 'T', 'A',
                            'R', 'Y', '\0' };
 Char STRNOREBIND[]     = { 'N', 'O', 'R', 'E', 'B', 'I', 'N', 'D', '\0' };
 
-#if defined(SIG_WINDOW) || defined (_VMS_POSIX)         
+#if defined(SIG_WINDOW) || defined(SIGWINCH) || defined(SIGWINDOW) || defined (_VMS_POSIX)      
 /* atp - problem with declaration of str{lines,columns} in sh.func.c (1277) */
 Char STRLINES[]                = { 'L', 'I', 'N', 'E', 'S', '\0'};
 Char STRCOLUMNS[]      = { 'C', 'O', 'L', 'U', 'M', 'N', 'S', '\0'};
 Char STRTERMCAP[]      = { 'T', 'E', 'R', 'M', 'C', 'A', 'P', '\0'};
-#endif /* SIG_WINDOW  || _VMS_POSIX */
+#endif /* SIG_WINDOW  || SIGWINCH || SIGWINDOW || _VMS_POSIX */
 
 #if defined (_OSD_POSIX)  /* BS2000 needs this variable set to "SHELL" */
 Char STRPROGRAM_ENVIRONMENT[] = { 'P', 'R', 'O', 'G', 'R', 'A', 'M',
@@ -491,6 +494,7 @@ Char STRmmcolormauto[]      = { '-', 'G', '\0' };
 Char STRmmcolormauto[] = { '-', '-', 'c', 'o', 'l', 'o', 'r', '=', 'a', 'u', 't', 'o', '\0' };
 #endif /* BSD_STYLE_COLORLS */
 Char STRLS_COLORS[]    = { 'L', 'S', '_', 'C', 'O', 'L', 'O', 'R', 'S', '\0' };
+Char STRLSCOLORS[]     = { 'L', 'S', 'C', 'O', 'L', 'O', 'R', 'S', '\0' };
 #endif /* COLOR_LS_F */
 
 Char STRls[]           = { 'l', 's', '\0' };
index de8ec55..fc4e8a8 100644 (file)
@@ -1,4 +1,4 @@
-/* $Header: /p/tcsh/cvsroot/tcsh/tc.decls.h,v 3.65 2010/02/09 20:26:13 christos Exp $ */
+/* $Header: /p/tcsh/cvsroot/tcsh/tc.decls.h,v 3.66 2012/06/21 18:49:11 christos Exp $ */
 /*
  * tc.decls.h: Function declarations from all the tcsh modules
  */
@@ -226,15 +226,15 @@ extern    int               getv          (Char *);
 #ifndef __GNUC__
 #define __attribute__(a)
 #endif
-extern pret_t            xprintf       (const char *, ...)
+extern int               xprintf       (const char *, ...)
     __attribute__((__format__(__printf__, 1, 2)));
-extern pret_t            xsnprintf     (char *, size_t, const char *, ...)
+extern int               xsnprintf     (char *, size_t, const char *, ...)
     __attribute__((__format__(__printf__, 3, 4)));
 extern char             *xasprintf     (const char *, ...)
     __attribute__((__format__(__printf__, 1, 2)));
-extern pret_t            xvprintf      (const char *, va_list)
+extern int               xvprintf      (const char *, va_list)
     __attribute__((__format__(__printf__, 1, 0)));
-extern pret_t            xvsnprintf    (char *, size_t, const char *, va_list)
+extern int               xvsnprintf    (char *, size_t, const char *, va_list)
     __attribute__((__format__(__printf__, 3, 0)));
 extern char             *xvasprintf    (const char *, va_list)
     __attribute__((__format__(__printf__, 1, 0)));
index b13fe04..e72bbe0 100644 (file)
@@ -1,4 +1,4 @@
-/* $Header: /p/tcsh/cvsroot/tcsh/tc.func.c,v 3.148 2011/12/14 16:36:44 christos Exp $ */
+/* $Header: /p/tcsh/cvsroot/tcsh/tc.func.c,v 3.153 2014/10/11 21:52:26 christos Exp $ */
 /*
  * tc.func.c: New tcsh builtins.
  */
@@ -32,7 +32,7 @@
  */
 #include "sh.h"
 
-RCSID("$tcsh: tc.func.c,v 3.148 2011/12/14 16:36:44 christos Exp $")
+RCSID("$tcsh: tc.func.c,v 3.153 2014/10/11 21:52:26 christos Exp $")
 
 #include "ed.h"
 #include "ed.defns.h"          /* for the function names */
@@ -193,7 +193,7 @@ void
 dolist(Char **v, struct command *c)
 {
     Char **globbed;
-    int     i, k;
+    int     i, k, ret = 0;
     struct stat st;
 
     USE(c);
@@ -333,8 +333,11 @@ dolist(Char **v, struct command *c)
                        xputchar('\n');
                    print_by_column(STRNULL, &v[i], k - i, FALSE);
                }
+               haderr = 1;
                xprintf("%S: %s.\n", tmp, strerror(err));
+               haderr = 0;
                i = k + 1;
+               ret = 1;
            }
            else if (S_ISDIR(st.st_mode)) {
                Char   *cp;
@@ -372,6 +375,8 @@ dolist(Char **v, struct command *c)
                xputchar('\n');
            print_by_column(STRNULL, &v[i], k - i, FALSE);
        }
+       if (ret)
+           stderror(ERR_SILENT);
     }
 
     cleanup_until(globbed);
@@ -481,6 +486,19 @@ dowhich(Char **v, struct command *c)
        setcopy(STRstatus, STR1, VAR_READWRITE);
 }
 
+static int
+findvv(Char **vv, const char *cp)
+{
+    for (; vv && *vv; vv++) {
+       size_t i;
+       for (i = 0; (*vv)[i] && (*vv)[i] == cp[i]; i++)
+           continue;
+       if ((*vv)[i] == '\0' && cp[i] == '\0')
+           return 1;
+    }
+    return 0;
+}
+
 /* PWP: a hack to start up your stopped editor on a single keystroke */
 /* jbs - fixed hack so it worked :-) 3/28/89 */
 
@@ -492,6 +510,8 @@ find_stop_ed(void)
     char *cp, *p;
     size_t epl, vpl;
     int pstatus;
+    struct varent *varp;
+    Char **vv;
 
     if ((ep = getenv("EDITOR")) != NULL) {     /* if we have a value */
        if ((p = strrchr(ep, '/')) != NULL)     /* if it has a path */
@@ -515,6 +535,11 @@ find_stop_ed(void)
     if (pcurrent == NULL)      /* see if we have any jobs */
        return NULL;            /* nope */
 
+    if ((varp = adrof(STReditors)) != NULL)
+       vv = varp->vec;
+    else
+       vv = NULL;
+
     retp = NULL;
     for (pp = proclist.p_next; pp; pp = pp->p_next)
        if (pp->p_procid == pp->p_jobid) {
@@ -542,7 +567,7 @@ find_stop_ed(void)
 
            /* if we find either in the current name, fg it */
            if (strncmp(ep, cp, epl) == 0 ||
-               strncmp(vp, cp, vpl) == 0) {
+               strncmp(vp, cp, vpl) == 0 || findvv(vv, cp)) {
 
                /*
                 * If there is a choice, then choose the current process if
@@ -733,7 +758,7 @@ auto_lock(void)
        pp = xgetpass("Password:");
 
        crpp = XCRYPT(pw, pp, srpp);
-       if ((strcmp(crpp, srpp) == 0)
+       if ((crpp && strcmp(crpp, srpp) == 0)
 #ifdef AFS
            || (ka_UserAuthenticateGeneral(KA_USERAUTH_VERSION,
                                           afsname,     /* name */
@@ -1109,7 +1134,7 @@ rmstar(struct wordent *cp)
 #endif /* RMDEBUG */
     Char   *charac;
     char    c;
-    int     ask, doit, star = 0, silent = 0;
+    int     ask, doit, star = 0, silent = 0, opintr_disabled;
 
     if (!adrof(STRrmstar))
        return;
@@ -1119,6 +1144,8 @@ rmstar(struct wordent *cp)
     we = cp->next;
     while (*we->word == ';' && we != cp)
        we = we->next;
+    opintr_disabled = pintr_disabled;
+    pintr_disabled = 0;
     while (we != cp) {
 #ifdef RMDEBUG
        if (*tag)
@@ -1195,6 +1222,7 @@ rmstar(struct wordent *cp)
            xprintf("%S ", we->word);
     }
 #endif /* RMDEBUG */
+    pintr_disabled = opintr_disabled;
     return;
 }
 
index 7cc6e42..d420a7a 100644 (file)
@@ -1,4 +1,4 @@
-/* $Header: /p/tcsh/cvsroot/tcsh/tc.nls.c,v 3.23 2010/02/12 22:17:20 christos Exp $ */
+/* $Header: /p/tcsh/cvsroot/tcsh/tc.nls.c,v 3.25 2015/05/04 15:31:13 christos Exp $ */
 /*
  * tc.nls.c: NLS handling
  */
@@ -32,7 +32,7 @@
  */
 #include "sh.h"
 
-RCSID("$tcsh: tc.nls.c,v 3.23 2010/02/12 22:17:20 christos Exp $")
+RCSID("$tcsh: tc.nls.c,v 3.25 2015/05/04 15:31:13 christos Exp $")
 
 
 #ifdef WIDE_STRINGS
index 3de76c7..97dad66 100644 (file)
@@ -1,4 +1,4 @@
-/* $Header: /p/tcsh/cvsroot/tcsh/tc.nls.h,v 3.14 2011/02/25 23:57:21 christos Exp $ */
+/* $Header: /p/tcsh/cvsroot/tcsh/tc.nls.h,v 3.16 2015/05/04 15:31:13 christos Exp $ */
 /*
  * tc.nls.h: NLS support
  *
index 8db69d5..27da029 100644 (file)
@@ -1,4 +1,4 @@
-/* $Header: /p/tcsh/cvsroot/tcsh/tc.printf.c,v 3.35 2006/03/02 18:46:45 christos Exp $ */
+/* $Header: /p/tcsh/cvsroot/tcsh/tc.printf.c,v 3.37 2014/02/28 17:10:31 christos Exp $ */
 /*
  * tc.printf.c: A public-domain, minimal printf/sprintf routine that prints
  *            through the putchar() routine.  Feel free to use for
@@ -34,7 +34,7 @@
  */
 #include "sh.h"
 
-RCSID("$tcsh: tc.printf.c,v 3.35 2006/03/02 18:46:45 christos Exp $")
+RCSID("$tcsh: tc.printf.c,v 3.37 2014/02/28 17:10:31 christos Exp $")
 
 #ifdef lint
 #undef va_arg
@@ -46,9 +46,9 @@ RCSID("$tcsh: tc.printf.c,v 3.35 2006/03/02 18:46:45 christos Exp $")
 static char snil[] = "(nil)";
 
 static void    xaddchar        (int);
-static void    doprnt          (void (*) (int), const char *, va_list);
+static int     doprnt          (void (*) (int), const char *, va_list);
 
-static void
+static int
 doprnt(void (*addchar) (int), const char *sfmt, va_list ap)
 {
     char *bp;
@@ -68,8 +68,8 @@ doprnt(void (*addchar) (int), const char *sfmt, va_list ap)
     int fmt;
     unsigned char pad = ' ';
     int     flush_left = 0, f_width = 0, prec = INF, hash = 0;
-    int            do_long = 0, do_size_t = 0;
-    int     sign = 0;
+    int            do_long = 0, do_size_t = 0, do_ptrdiff_t = 0;
+    int     sign = 0, count = 0;
     int     attributes = 0;
 
 
@@ -77,6 +77,7 @@ doprnt(void (*addchar) (int), const char *sfmt, va_list ap)
     for (; *f; f++) {
        if (*f != '%') {        /* then just out the char */
            (*addchar) (((unsigned char)*f) | attributes);
+           count++;
        }
        else {
            f++;                /* skip the % */
@@ -131,6 +132,10 @@ doprnt(void (*addchar) (int), const char *sfmt, va_list ap)
                do_size_t++;
                f++;
            }
+           if (*f == 't') {    /* ptrdiff_t format */
+               do_ptrdiff_t++;
+               f++;
+           }
 
            fmt = (unsigned char) *f;
            if (fmt != 'S' && fmt != 'Q' && isupper(fmt)) {
@@ -171,13 +176,19 @@ doprnt(void (*addchar) (int), const char *sfmt, va_list ap)
                    *bp++ = '-';
                f_width = f_width - (int) (bp - buf);
                if (!flush_left)
-                   while (f_width-- > 0) 
+                   while (f_width-- > 0)  {
                        (*addchar) (pad | attributes);
-               for (bp--; bp >= buf; bp--) 
+                       count++;
+                   }
+               for (bp--; bp >= buf; bp--)  {
                    (*addchar) (((unsigned char) *bp) | attributes);
+                   count++;
+               }
                if (flush_left)
-                   while (f_width-- > 0)
+                   while (f_width-- > 0) {
                        (*addchar) (' ' | attributes);
+                       count++;
+                   }
                break;
 
            case 'p':
@@ -192,6 +203,8 @@ doprnt(void (*addchar) (int), const char *sfmt, va_list ap)
                case 0:
                    if (do_size_t)
                        u = va_arg(ap, size_t);
+                   else if (do_ptrdiff_t)
+                       u = va_arg(ap, ptrdiff_t);
                    else
                        u = va_arg(ap, unsigned int);
                    break;
@@ -234,19 +247,24 @@ doprnt(void (*addchar) (int), const char *sfmt, va_list ap)
                }
                i = f_width - (int) (bp - buf);
                if (!flush_left)
-                   while (i-- > 0)
+                   while (i-- > 0) {
                        (*addchar) (pad | attributes);
+                       count++;
+                   }
                for (bp--; bp >= buf; bp--)
                    (*addchar) (((unsigned char) *bp) | attributes);
                if (flush_left)
-                   while (i-- > 0)
+                   while (i-- > 0) {
                        (*addchar) (' ' | attributes);
+                       count++;
+                   }
                break;
 
 
            case 'c':
                i = va_arg(ap, int);
                (*addchar) (i | attributes);
+               count++;
                break;
 
            case 'S':
@@ -259,23 +277,31 @@ doprnt(void (*addchar) (int), const char *sfmt, va_list ap)
                }
                f_width = f_width - Strlen(Bp);
                if (!flush_left)
-                   while (f_width-- > 0)
+                   while (f_width-- > 0) {
                        (*addchar) ((int) (pad | attributes));
+                       count++;
+                   }
                for (i = 0; *Bp && i < prec; i++) {
                    char cbuf[MB_LEN_MAX];
                    size_t pos, len;
 
-                   if (fmt == 'Q' && *Bp & QUOTE)
+                   if (fmt == 'Q' && *Bp & QUOTE) {
                        (*addchar) ('\\' | attributes);
+                       count++;
+                   }
                    len = one_wctomb(cbuf, *Bp & CHAR);
-                   for (pos = 0; pos < len; pos++)
+                   for (pos = 0; pos < len; pos++) {
                        (*addchar) ((unsigned char)cbuf[pos] | attributes
                                    | (*Bp & ATTRIBUTES));
+                       count++;
+                   }
                    Bp++;
                }
                if (flush_left)
-                   while (f_width-- > 0)
+                   while (f_width-- > 0) {
                        (*addchar) (' ' | attributes);
+                       count++;
+                   }
                break;
 #endif /* SHORT_STRINGS */
 
@@ -287,17 +313,24 @@ lcase_s:
                    bp = snil;
                f_width = f_width - strlen(bp);
                if (!flush_left)
-                   while (f_width-- > 0)
+                   while (f_width-- > 0) {
                        (*addchar) (pad | attributes);
+                       count++;
+                   }
                for (i = 0; *bp && i < prec; i++) {
-                   if (fmt == 'q' && *bp & QUOTE)
+                   if (fmt == 'q' && *bp & QUOTE) {
                        (*addchar) ('\\' | attributes);
+                       count++;
+                   }
                    (*addchar) (((unsigned char) *bp & TRIM) | attributes);
+                   count++;
                    bp++;
                }
                if (flush_left)
-                   while (f_width-- > 0)
+                   while (f_width-- > 0) {
                        (*addchar) (' ' | attributes);
+                       count++;
+                   }
                break;
 
            case 'a':
@@ -306,17 +339,19 @@ lcase_s:
 
            case '%':
                (*addchar) ('%' | attributes);
+               count++;
                break;
 
            default:
                break;
            }
            flush_left = 0, f_width = 0, prec = INF, hash = 0;
-           do_size_t = 0, do_long = 0;
+           do_ptrdiff_t = 0, do_size_t = 0, do_long = 0;
            sign = 0;
            pad = ' ';
        }
     }
+    return count;
 }
 
 
@@ -331,56 +366,49 @@ xaddchar(int c)
 }
 
 
-pret_t
+int
 /*VARARGS*/
 xsnprintf(char *str, size_t size, const char *fmt, ...)
 {
+    int count;
     va_list va;
     va_start(va, fmt);
 
     xstring = str;
     xestring = str + size - 1;
-    doprnt(xaddchar, fmt, va);
+    count = doprnt(xaddchar, fmt, va);
     va_end(va);
     *xstring++ = '\0';
-#ifdef PURIFY
-    return 1;
-#endif
+    return count;
 }
 
-pret_t
+int
 /*VARARGS*/
 xprintf(const char *fmt, ...)
 {
+    int count;
     va_list va;
     va_start(va, fmt);
-    doprnt(xputchar, fmt, va);
+    count = doprnt(xputchar, fmt, va);
     va_end(va);
-#ifdef PURIFY
-    return 1;
-#endif
+    return count;
 }
 
-
-pret_t
+int
 xvprintf(const char *fmt, va_list va)
 {
-    doprnt(xputchar, fmt, va);
-#ifdef PURIFY
-    return 1;
-#endif
+    return doprnt(xputchar, fmt, va);
 }
 
-pret_t
+int
 xvsnprintf(char *str, size_t size, const char *fmt, va_list va)
 {
+    int count;
     xstring = str;
     xestring = str + size - 1;
-    doprnt(xaddchar, fmt, va);
+    count = doprnt(xaddchar, fmt, va);
     *xstring++ = '\0';
-#ifdef PURIFY
-    return 1;
-#endif
+    return count;
 }
 
 char *
@@ -435,18 +463,18 @@ xasprintf(const char *fmt, ...)
 int 
 fprintf(FILE *fp, const char* fmt, ...)
 {
+    int count;
     va_list va;
     va_start(va, fmt);
-    doprnt(xputchar, fmt, va);
+    count = doprnt(xputchar, fmt, va);
     va_end(va);
-    return 1;
+    return count;
 }
 
 int 
 vfprintf(FILE *fp, const char *fmt, va_list va)
 {
-    doprnt(xputchar, fmt, va);
-    return 1;
+    return doprnt(xputchar, fmt, va);
 }
 
 #endif /* PURIFY */
index 2ac2355..2279188 100644 (file)
@@ -1,4 +1,4 @@
-/* $Header: /p/tcsh/cvsroot/tcsh/tc.prompt.c,v 3.70 2011/10/27 22:41:06 christos Exp $ */
+/* $Header: /p/tcsh/cvsroot/tcsh/tc.prompt.c,v 3.71 2014/08/23 09:07:57 christos Exp $ */
 /*
  * tc.prompt.c: Prompt printing stuff
  */
@@ -32,7 +32,7 @@
  */
 #include "sh.h"
 
-RCSID("$tcsh: tc.prompt.c,v 3.70 2011/10/27 22:41:06 christos Exp $")
+RCSID("$tcsh: tc.prompt.c,v 3.71 2014/08/23 09:07:57 christos Exp $")
 
 #include "ed.h"
 #include "tw.h"
@@ -213,7 +213,22 @@ tprintf(int what, const Char *fmt, const char *str, time_t tim, ptr_t info)
                }
                break;
            case '#':
+#ifdef __CYGWIN__
+               /* Check for being member of the Administrators group */
+               {
+                       gid_t grps[NGROUPS_MAX];
+                       int grp, gcnt;
+
+                       gcnt = getgroups(NGROUPS_MAX, grps);
+# define DOMAIN_GROUP_RID_ADMINS 544
+                       for (grp = 0; grp < gcnt; ++grp)
+                               if (grps[grp] == DOMAIN_GROUP_RID_ADMINS)
+                                       break;
+                       Scp = (grp < gcnt) ? PRCHROOT : PRCH;
+               }
+#else
                Scp = (uid == 0 || euid == 0) ? PRCHROOT : PRCH;
+#endif
                if (Scp != '\0')
                    Strbuf_append1(&buf, attributes | Scp);
                break;
index ca00721..f43a2dc 100644 (file)
@@ -1,4 +1,4 @@
-/* $Header: /p/tcsh/cvsroot/tcsh/tc.str.c,v 3.42 2012/01/10 21:34:31 christos Exp $ */
+/* $Header: /p/tcsh/cvsroot/tcsh/tc.str.c,v 3.46 2015/05/04 15:31:13 christos Exp $ */
 /*
  * tc.str.c: Short string package
  *          This has been a lesson of how to write buggy code!
@@ -36,7 +36,7 @@
 #include <assert.h>
 #include <limits.h>
 
-RCSID("$tcsh: tc.str.c,v 3.42 2012/01/10 21:34:31 christos Exp $")
+RCSID("$tcsh: tc.str.c,v 3.46 2015/05/04 15:31:13 christos Exp $")
 
 #define MALLOC_INCR    128
 #ifdef WIDE_STRINGS
@@ -559,7 +559,7 @@ short2qstr(const Char *src)
 }
 
 struct blk_buf *
-bb_alloc()
+bb_alloc(void)
 {
     return xcalloc(1, sizeof(struct blk_buf));
 }
@@ -590,10 +590,14 @@ bb_cleanup(void *xbb)
     struct blk_buf *bb;
     size_t i;
 
-    bb = xbb;
-    for (i = 0; i < bb->len; i++)
-       xfree(bb->vec[i]);
-    xfree(bb->vec);
+    bb = (struct blk_buf *)xbb;
+    if (bb->vec) {
+       for (i = 0; i < bb->len; i++)
+           xfree(bb->vec[i]);
+       xfree(bb->vec);
+    }
+    bb->vec = NULL;
+    bb->len = 0;
 }
 
 void
index 6759109..45900de 100644 (file)
@@ -1,4 +1,4 @@
-/* $Header: /p/tcsh/cvsroot/tcsh/tc.who.c,v 3.57 2012/01/17 20:53:38 christos Exp $ */
+/* $Header: /p/tcsh/cvsroot/tcsh/tc.who.c,v 3.59 2012/11/15 02:55:08 christos Exp $ */
 /*
  * tc.who.c: Watch logins and logouts...
  */
@@ -32,7 +32,7 @@
  */
 #include "sh.h"
 
-RCSID("$tcsh: tc.who.c,v 3.57 2012/01/17 20:53:38 christos Exp $")
+RCSID("$tcsh: tc.who.c,v 3.59 2012/11/15 02:55:08 christos Exp $")
 
 #include "tc.h"
 
@@ -65,6 +65,8 @@ RCSID("$tcsh: tc.who.c,v 3.57 2012/01/17 20:53:38 christos Exp $")
 #  define TCSH_PATH_UTMP "/var/run/utx.active"
 # elif defined(__hpux)
 #  define TCSH_PATH_UTMP "/etc/utmpx"
+# elif defined(IBMAIX) && defined(UTMP_FILE)
+#  define TCSH_PATH_UTMP UTMP_FILE
 # endif
 # if defined(TCSH_PATH_UTMP) || !defined(HAVE_UTMP_H)
 #  define utmp utmpx
index cb0709e..4fa59d2 100644 (file)
@@ -1,3 +1,4 @@
+.\"
 .\" Copyright (c) 1980, 1990, 1993
 .\"    The Regents of the University of California.  All rights reserved.
 .\"
 .\" 
 .\" - Use `', not '' or "", except of course in shell syntax examples.
 .\"   '' at the beginning of a line will vanish!
+.\"
+.\" - Use \` for literal back-quote (`).
+.\"
+.\" - Use \e for literal backslash (\).
 .\" 
 .\" - Use \-, not -.
 .\" 
@@ -72,7 +77,7 @@
 .\"   used here if you can. In particular, please don't use nroff commands
 .\"   which aren't already used herein.
 .\" 
-.TH TCSH 1 "14 February 2012" "Astron 6.18.01"
+.TH TCSH 1 "21 May 2015" "Astron 6.19.00"
 .SH NAME
 tcsh \- C shell with file name completion and command line editing
 .SH SYNOPSIS
@@ -160,7 +165,7 @@ it is used under a debugger.  Job control is disabled. (u)
 Command input is taken from the standard input.
 .TP 4
 .B \-t
-The shell reads and executes a single line of input.  A `\\' may be used to
+The shell reads and executes a single line of input.  A `\e' may be used to
 escape the newline at the end of this line and continue onto another line.
 .TP 4
 .B \-v
@@ -408,7 +413,7 @@ README          main.c          meal            side.o
 .br
 condiments.h    main.c~
 .br
-> set fignore = (.o \\~)
+> set fignore = (.o \e~)
 .br
 > emacs ma[^D]
 .br
@@ -420,7 +425,7 @@ main.c   main.c~  main.o
 .PP
 `main.c~' and `main.o' are ignored by completion (but not listing),
 because they end in suffixes in \fBfignore\fR.
-Note that a `\\' was needed in front of `~' to prevent it from being
+Note that a `\e' was needed in front of `~' to prevent it from being
 expanded to \fBhome\fR as described under \fBFilename substitution\fR.
 \fBfignore\fR is ignored if only one completion is possible.
 .PP
@@ -534,10 +539,6 @@ not register a misspelling.
 Like completion, spelling correction works anywhere in the line,
 pushing the rest of the line to the right and possibly leaving
 extra characters to the right of the cursor.
-.PP
-Beware: spelling correction is not guaranteed to work the way one intends,
-and is provided mostly as an experimental feature.
-Suggestions and improvements are welcome.
 .SS "Editor commands (+)"
 `bindkey' lists key bindings and `bindkey \-l' lists and briefly describes
 editor commands.
@@ -760,7 +761,7 @@ unless bound to another command.
 .B spell-line \fR(M-$)
 Attempts to correct the spelling of each word in the input buffer, like
 \fIspell-word\fR, but ignores words whose first character is one of
-`\-', `!', `^' or `%', or which contain `\\', `*' or `?', to avoid problems
+`\-', `!', `^' or `%', or which contain `\e', `*' or `?', to avoid problems
 with switches, substitutions and the like.
 See \fBSpelling correction\fR.
 .TP 8
@@ -816,16 +817,16 @@ discarded before further parsing.
 .PP
 A special character (including a blank or tab) may be prevented from having
 its special meaning, and possibly made part of another word, by preceding it
-with a backslash (`\\') or enclosing it in single (`''), double (`"') or
-backward (``') quotes.  When not otherwise quoted a newline preceded by a `\\'
+with a backslash (`\e') or enclosing it in single (`''), double (`"') or
+backward (`\`') quotes.  When not otherwise quoted a newline preceded by a `\e'
 is equivalent to a blank, but inside quotes this sequence results in a
 newline.
 .PP
 Furthermore, all \fBSubstitutions\fR (see below) except \fBHistory substitution\fR
 can be prevented by enclosing the strings (or parts of strings)
 in which they appear with single quotes or by quoting the crucial character(s)
-(e.g., `$' or ``' for \fBVariable substitution\fR or \fBCommand substitution\fR respectively)
-with `\\'.  (\fBAlias substitution\fR is no exception: quoting in any way any
+(e.g., `$' or `\`' for \fBVariable substitution\fR or \fBCommand substitution\fR respectively)
+with `\e'.  (\fBAlias substitution\fR is no exception: quoting in any way any
 character of a word for which an \fIalias\fR has been defined prevents
 substitution of the alias.  The usual way of quoting an alias is to precede it
 with a backslash.) \fBHistory substitution\fR is prevented by
@@ -847,7 +848,7 @@ those parts of the string which need quoting, using different types of quoting
 to do so if appropriate.
 .PP
 The \fBbackslash_quote\fR shell variable (q.v.) can be set to make backslashes
-always quote `\\', `'', and `"'.  (+) This may make complex quoting tasks
+always quote `\e', `'', and `"'.  (+) This may make complex quoting tasks
 easier, but it can cause syntax errors in \fIcsh\fR(1) scripts.
 .SS Substitutions
 We now describe the various transformations the shell performs on the input in
@@ -880,7 +881,7 @@ command in the current command, or fix spelling mistakes in the previous
 command with little typing and a high degree of confidence.
 .PP
 History substitutions begin with the character `!'.  They may begin anywhere in
-the input stream, but they do not nest.  The `!' may be preceded by a `\\' to
+the input stream, but they do not nest.  The `!' may be preceded by a `\e' to
 prevent its special meaning; for convenience, a `!' is passed unchanged when it
 is followed by a blank, tab, newline, `=' or `('.  History substitutions also
 occur when an input line begins with `^'.  This special abbreviation will be
@@ -1046,8 +1047,8 @@ Substitute \fIl\fR for \fIr\fR.
 \fIl\fR is simply a string like \fIr\fR, not a regular expression as in
 the eponymous \fIed\fR(1) command.
 Any character may be used as the delimiter in place of `/';
-a `\\' can be used to quote the delimiter inside \fIl\fR and \fIr\fR.
-The character `&' in the \fIr\fR is replaced by \fIl\fR; `\\' also quotes `&'.
+a `\e' can be used to quote the delimiter inside \fIl\fR and \fIr\fR.
+The character `&' in the \fIr\fR is replaced by \fIl\fR; `\e' also quotes `&'.
 If \fIl\fR is empty (``''), the \fIl\fR from a previous substitution or the
 \fIs\fR from a previous search or event number in event specification is used.
 The trailing delimiter may be omitted if it is immediately followed by a newline.
@@ -1187,7 +1188,7 @@ After the input line is aliased and parsed, and before each command is
 executed, variable substitution is performed keyed by `$' characters.  This
 expansion can be prevented by preceding the `$' with a `\e' except within `"'s
 where it \fIalways\fR occurs, and within `''s where it \fInever\fR occurs.
-Strings quoted by ``' are interpreted later (see \fBCommand substitution\fR
+Strings quoted by `\`' are interpreted later (see \fBCommand substitution\fR
 below) so `$' substitution does not occur there until later,
 if at all.  A `$' is passed unchanged if followed by a blank, tab, or
 end-of-line.
@@ -1316,7 +1317,7 @@ shell, the command name is substituted separately from the argument list.  This
 occurs very late, after input-output redirection is performed, and in a child
 of the main shell.
 .SS "Command substitution"
-Command substitution is indicated by a command enclosed in ``'.  The output
+Command substitution is indicated by a command enclosed in `\`'.  The output
 from such a command is broken into separate words at blanks, tabs and newlines,
 and null words are discarded.  The output is variable and command substituted
 and put in place of the original string.
@@ -1401,7 +1402,7 @@ The \fBglobstar\fR shell variable can be set to allow `**' or `***' as
 a file glob pattern that matches any string of characters including `/',
 recursively traversing any existing sub-directories.  For example, 
 `ls **.c' will list all the .c files in the current directory tree.
-If used by itself, it will match match zero or more sub-directories
+If used by itself, it will match zero or more sub-directories
 (e.g. `ls /usr/include/**/time.h' will list any file named `time.h'
 in the /usr/include directory tree; `ls /usr/include/**time.h' will match 
 any file in the /usr/include directory tree ending in `time.h'; and
@@ -1549,9 +1550,9 @@ expanded) as the standard input.
 Read the shell input up to a line which is identical to \fIword\fR.  \fIword\fR
 is not subjected to variable, filename or command substitution, and each input
 line is compared to \fIword\fR before any substitutions are done on this input
-line.  Unless a quoting `\e', `"', `' or ``' appears in \fIword\fR variable and
+line.  Unless a quoting `\e', `"', `' or `\`' appears in \fIword\fR variable and
 command substitution is performed on the intervening lines, allowing `\e' to
-quote `$', `\e' and ``'.  Commands which are substituted have all blanks, tabs,
+quote `$', `\e' and `\`'.  Commands which are substituted have all blanks, tabs,
 and newlines preserved, except for the final newline which is dropped.  The
 resultant text is placed in an anonymous temporary file which is given to the
 command as standard input.
@@ -1746,7 +1747,7 @@ rather than to the file to which the link points (+) *
 see if it has the specified relationship to the real user.  If \fIfile\fR
 does not exist or is inaccessible or, for the operators indicated by `*',
 if the specified file type does not exist on the current system,
-then all enquiries return false, i.e., `0'.
+then all inquiries return false, i.e., `0'.
 .PP
 These operators may be combined for conciseness: `\-\fIxy file\fR' is
 equivalent to `\-\fIx file\fR && \-\fIy file\fR'.  (+) For example, `\-fx' is true
@@ -2262,7 +2263,7 @@ The ASCII character corresponding to the octal number \fInnn\fR
 .RE
 .PP
 `\e' nullifies the special meaning of the following character, if it has
-any, notably `\\' and `^'.
+any, notably `\e' and `^'.
 .RE
 .TP 8
 .B bs2cmd \fIbs2000-command\fR (+)
@@ -2293,14 +2294,16 @@ A label in a \fIswitch\fR statement as discussed below.
 .TP 8
 .B cd \fR[\fB\-p\fR] [\fB\-l\fR] [\fB\-n\fR|\fB\-v\fR] [\I--\fR] [\fIname\fR]
 If a directory \fIname\fR is given, changes the shell's working directory
-to \fIname\fR.  If not, changes to \fBhome\fR.
+to \fIname\fR.  If not, changes to \fBhome\fR, unless the \fBcdtohome\fR
+variable is not set, in which case a \fIname\fR is required.
 If \fIname\fR is `\-' it is interpreted as the previous working directory
 (see \fBOther substitutions\fR).  (+)
 If \fIname\fR is not a subdirectory of the current directory
 (and does not begin with `/', `./' or `../'), each component of the variable
 \fBcdpath\fR is checked to see if it has a subdirectory \fIname\fR.  Finally, if
 all else fails but \fIname\fR is a shell variable whose value
-begins with `/', then this is tried to see if it is a directory.
+begins with `/' or '.', then this is tried to see if it is a directory, and
+the \fB\-p\fR option is implied.
 .RS +8
 .PP
 With \fB\-p\fR, prints the final directory stack, just like \fIdirs\fR.
@@ -2309,7 +2312,7 @@ as on \fIdirs\fR, and they imply \fB\-p\fR.  (+)
 Using \fB\-\-\fR forces a break from option processing so the next word
 is taken as the directory \fIname\fR even if it begins with '\-'. (+)
 .PP
-See also the \fBimplicitcd\fR shell variable.
+See also the \fBimplicitcd\fR and \fBcdtohome\fR shell variables.
 .RE
 .TP 8
 .B chdir
@@ -2428,7 +2431,7 @@ Words from the variable \fIvar\fR
 (...)
 Words from the given list
 .TP 8
-`...`
+\`...\`
 Words from the output of command
 .PD
 .RE
@@ -2445,7 +2448,7 @@ completion.  If null, no character is appended.  If omitted (in which
 case the fourth delimiter can also be omitted), a slash is appended to
 directories and a space to other words.
 .PP
-\fIcommand\fR invoked from `...` version has additional environment
+\fIcommand\fR invoked from \`...\` version has additional environment
 variable set, the variable name is \%\fBCOMMAND_LINE\fR\% and
 contains (as its name indicates) contents of the current (already
 typed in) command line. One can examine and use contents of the
@@ -2526,7 +2529,7 @@ rtfm.mit.edu tesla.ee.cornell.edu uunet.uu.net
 .PP
 or from a command run at completion time:
 .IP "" 4
-> complete kill 'p/*/`ps | awk \\{print\\ \\$1\\}`/'
+> complete kill 'p/*/\`ps | awk \e{print\e \e$1\e}\`/'
 .br
 > kill \-9 [^D]
 .br
@@ -2587,7 +2590,7 @@ again the order in which the completions are specified.
 .PP
 Finally, here's a complex example for inspiration:
 .IP "" 4
-> complete find \\
+> complete find \e
 .br
 \&'n/\-name/f/' 'n/\-newer/f/' 'n/\-{,n}cpio/f/' \e
 .br
@@ -2618,8 +2621,6 @@ and completes anything not otherwise completed to a directory.  Whew.
 .PP
 Remember that programmed completions are ignored if the word being completed
 is a tilde substitution (beginning with `~') or a variable (beginning with `$').
-\fIcomplete\fR is an experimental feature, and the syntax may change
-in future versions of the shell.
 See also the \fIuncomplete\fR builtin command.
 .RE
 .TP 8
@@ -2684,7 +2685,7 @@ or does not have that capability).  One might use this to make the output
 from a shell script less verbose on slow terminals, or limit command
 output to the number of lines on the screen:
 .IP "" 4
-> set history=`echotc lines`
+> set history=\`echotc lines\`
 .br
 > @ history\-\-
 .PP
@@ -2693,9 +2694,9 @@ One should use double quotes when setting a shell variable to a terminal
 capability string, as in the following example that places the date in
 the status line:
 .IP "" 4
-> set tosl="`echotc ts 0`"
+> set tosl="\`echotc ts 0\`"
 .br
-> set frsl="`echotc fs`"
+> set frsl="\`echotc fs\`"
 .br
 > echo \-n "$tosl";date; echo \-n "$frsl"
 .PP
@@ -2814,8 +2815,10 @@ number, at most that many lines are saved.  If the second word of
 existing history file instead of replacing it (if there is one) and
 sorted by time stamp.  (+) Merging is intended for an environment like
 the X Window System
-with several shells in simultaneous use.  Currently it succeeds
-only when the shells quit nicely one after another.
+with several shells in simultaneous use.  If the second word of \fBsavehist\fR
+is `merge' and the third word is set to `lock', the history file update
+will be serialized with other shell sessions that would possibly like
+to merge history at exactly the same time.
 .PP
 With \fB\-L\fR, the shell appends \fIfilename\fR, which is presumably a
 history list saved by the \fB\-S\fR option or the \fBsavehist\fR mechanism,
@@ -2958,6 +2961,12 @@ may allocate per \fIbrk()\fR system call
 \fIdescriptors\fR or \fIopenfiles\fR
 the maximum number of open files for this process
 .TP
+\fIpseudoterminals\fR
+the maximum number of pseudo-terminals for this user
+.TP
+\fIkqueues\fR
+the maximum number of kqueues allocated for this process
+.TP
 \fIconcurrency\fR
 the maximum number of threads for this process
 .TP
@@ -2967,6 +2976,13 @@ the maximum size which a process may lock into memory using mlock(2)
 \fImaxproc\fR
 the maximum number of simultaneous processes for this user id
 .TP
+\fImaxthread\fR
+the maximum number of simultaneous threads (lightweight processes) for this
+user id
+.TP
+\fIthreads\fR
+the maximum number of threads for this process
+.TP
 \fIsbsize\fR
 the maximum size of socket buffer usage for this user
 .TP
@@ -2976,6 +2992,9 @@ the maximum amount of swap space reserved or used for this user
 \fImaxlocks\fR
 the maximum number of locks for this user
 .TP
+\fIposixlocks\fR
+the maximum number of POSIX advisory locks for this user
+.TP
 \fImaxsignal\fR
 the maximum number of pending signals for this user
 .TP
@@ -3212,12 +3231,13 @@ For example,
 .PD
 .RS +8
 .IP "" 4
-> sched 11:00 echo It\\'s eleven o\\'clock.
+> sched 11:00 echo It\e's eleven o\e'clock.
 .PP
 causes the shell to echo `It's eleven o'clock.' at 11 AM.
 The time may be in 12-hour AM/PM format
 .IP "" 4
-> sched 5pm set prompt='[%h] It\\'s after 5; go home: >'
+.\" TODO
+> sched 5pm set prompt='[%h] It\e's after 5; go home: >'
 .PP
 or may be relative to the current time:
 .IP "" 4
@@ -3615,7 +3635,7 @@ whenever the environment variable changes the shell changes the corresponding
 shell variable to match (unless the shell variable is read-only) and vice
 versa.  Note that although \fBcwd\fR and \fBPWD\fR have identical meanings, they
 are not synchronized in this manner, and that the shell automatically
-interconverts the different formats of \fBpath\fR and \fBPATH\fR.
+converts between the different formats of \fBpath\fR and \fBPATH\fR.
 .TP 8
 .B addsuffix \fR(+)
 If set, filename completion adds `/' to the end of directories and a space
@@ -3629,6 +3649,11 @@ the local username for kerberos authentication.
 .B ampm \fR(+)
 If set, all times are shown in 12-hour AM/PM format.
 .TP 8
+.B anyerror \fR(+)
+This variable selects what is propagated to the value of the
+\fBstatus\fR variable. For more information see the description of the
+\fBstatus\fR variable below.
+.TP 8
 .B argv
 The arguments to the shell.  Positional parameters are taken from \fBargv\fR,
 i.e., `$1' is replaced by `$argv[1]', etc.
@@ -3672,7 +3697,8 @@ command completion or spelling correction attempt if set to `complete' or
 cases.
 .TP 8
 .B backslash_quote \fR(+)
-If set, backslashes (`\\') always quote `\\', `'', and `"'.  This may make
+.\" TODO
+If set, backslashes (`\e') always quote `\e', `'', and `"'.  This may make
 complex quoting tasks easier, but it can cause syntax errors in \fIcsh\fR(1)
 scripts.
 .TP 8
@@ -3685,6 +3711,11 @@ default `tcsh'.
 A list of directories in which \fIcd\fR should search for
 subdirectories if they aren't found in the current directory.
 .TP 8
+.B cdtohome \fR(+)
+If not set, \fIcd\fR requires a directory \fIname\fR, and will not go to the
+\fBhome\fR directory if it's omitted.
+This is set by default.
+.TP 8
 .B color
 If set, it enables color display for the builtin \fBls\-F\fR and it passes
 \fB\-\-color=auto\fR to \fBls\fR.  Alternatively, it can be set to only
@@ -3721,7 +3752,7 @@ commands, instead of starting a new one.
 Same as continue, but the shell will execute:
 .RS +8
 .IP "" 4
-echo `pwd` $argv > ~/.<cmd>_pause; %<cmd>
+echo \`pwd\` $argv > ~/.<cmd>_pause; %<cmd>
 .RE
 .TP 8
 .B correct \fR(+)
@@ -3831,13 +3862,14 @@ The style of the \fIecho\fR builtin.  May be set to
 .PD 0
 .TP 8
 bsd
-Don't echo a newline if the first argument is `\-n'.
+Don't echo a newline if the first argument is `\-n'; the default for \fIcsh\fR.
 .TP 8
 sysv
 Recognize backslashed escape sequences in echo strings.
 .TP 8
 both
-Recognize both the `\-n' flag and backslashed escape sequences; the default.
+Recognize both the `\-n' flag and backslashed escape sequences; the default
+for \fItcsh\fR.
 .TP 8
 none
 Recognize neither.
@@ -3884,7 +3916,7 @@ with `.' except for `.' and `..'
 If set, the `**' and `***' file glob patterns will match any string of 
 characters including `/' traversing any existing sub-directories.  (e.g. 
 `ls **.c' will list all the .c files in the current directory tree).
-If used by itself, it will match match zero or more sub-directories
+If used by itself, it will match zero or more sub-directories
 (e.g. `ls /usr/include/**/time.h' will list any file named `time.h'
 in the /usr/include directory tree; whereas `ls /usr/include/**time.h'
 will match any file in the /usr/include directory tree ending in `time.h').
@@ -3937,7 +3969,7 @@ also the \fItoggle-literal-history\fR editor command.
 .B history
 The first word indicates the number of history events to save.  The
 optional second word (+) indicates the format in which history is
-printed; if not given, `%h\\t%T\\t%R\\n' is used.  The format sequences
+printed; if not given, `%h\et%T\et%R\en' is used.  The format sequences
 are described below under \fBprompt\fR; note the variable meaning of
 `%R'.  Set to `100' by default.
 .TP 8
@@ -4278,7 +4310,7 @@ Set by default to `%# ' in interactive shells.
 .TP 8
 .B prompt2 \fR(+)
 The string with which to prompt in \fIwhile\fR and \fIforeach\fR loops and
-after lines ending in `\\'.
+after lines ending in `\e'.
 The same format sequences may be used as in \fBprompt\fR (q.v.);
 note the variable meaning of `%R'.
 Set by default to `%R? ' in interactive shells.
@@ -4329,14 +4361,19 @@ entries are saved.
 .B savehist
 If set, the shell does `history \-S' before exiting.
 If the first word is set to a number, at most that many lines are saved.
-(The number must be less than or equal to \fBhistory\fR.)
+(The number should be less than or equal to the number \fBhistory\fR entries;
+if it is set to greater than the number of \fBhistory\fR settings, only
+\fBhistory\fR entries will be saved)
 If the second word is set to `merge', the history list is merged with
 the existing history file instead of replacing it (if there is one) and
-sorted by time stamp and the most recent events are retained.  (+)
+sorted by time stamp and the most recent events are retained.
+If the second word of \fBsavehist\fR is `merge' and the third word is set to
+`lock', the history file update will be serialized with other shell sessions
+that would possibly like to merge history at exactly the same time. (+)
 .TP 8
 .B sched \fR(+)
 The format in which the \fIsched\fR builtin command prints scheduled events;
-if not given, `%h\\t%T\\t%R\\n' is used.
+if not given, `%h\et%T\et%R\en' is used.
 The format sequences are described above under \fBprompt\fR;
 note the variable meaning of `%R'.
 .TP 8
@@ -4353,17 +4390,22 @@ Reset to 1 in login shells.
 See also \fBloginsh\fR.
 .TP 8
 .B status
-The status returned by the last command, unless the variable
-.B anyerror
-is set, and any error in a pipeline or a backquote expansion will be
-propagated (this is the default
-.B csh
-behavior, and the current
-.B tcsh
-default). If it terminated
-abnormally, then 0200 is added to the status.  Builtin commands
-which fail return exit status `1', all other builtin commands
-return status `0'.
+The exit status from the last command or backquote expansion, or any
+command in a pipeline is propagated to \fBstatus\fR.  (This is also the
+default \fBcsh\fR behavior.)
+This default does not match what POSIX mandates (to return the
+status of the last command only). To match the POSIX behavior, you need
+to unset \fBanyerror\fR.
+.RS +8
+.PP
+If the \fBanyerror\fR variable is unset, the exit status of a pipeline
+is determined only from the last command in the pipeline, and the exit
+status of a backquote expansion is \fInot\fR propagated to \fBstatus\fR.
+.PP
+If a command terminated abnormally, then 0200 is added to the status.
+Builtin commands which fail return exit status `1', all other builtin
+commands return status `0'.
+.RE
 .TP 8
 .B symlinks \fR(+)
 Can be set to several different values to control symbolic link (`symlink')
@@ -5201,7 +5243,7 @@ pipe(2), setrlimit(2), sigvec(2), stat(2), umask(2), vfork(2), wait(2),
 malloc(3), setlocale(3), tty(4), a.out(5), termcap(5), environ(7),
 termio(7), Introduction to the C Shell
 .SH VERSION
-This manual documents tcsh 6.18.01 (Astron) 2012-02-14.
+This manual documents tcsh 6.19.00 (Astron) 2015-05-21.
 .SH AUTHORS
 .PD 0
 .TP 2
index 31a1d2d..21c6b70 100644 (file)
@@ -1,4 +1,4 @@
-/* $Header: /p/tcsh/cvsroot/tcsh/tw.color.c,v 1.27 2010/08/19 05:52:19 christos Exp $ */
+/* $Header: /p/tcsh/cvsroot/tcsh/tw.color.c,v 1.32 2014/07/07 19:53:51 christos Exp $ */
 /*
  * tw.color.c: builtin color ls-F
  */
@@ -32,7 +32,7 @@
  */
 #include "sh.h"
 
-RCSID("$tcsh: tw.color.c,v 1.27 2010/08/19 05:52:19 christos Exp $")
+RCSID("$tcsh: tw.color.c,v 1.32 2014/07/07 19:53:51 christos Exp $")
 
 #include "tw.h"
 #include "ed.h"
@@ -91,13 +91,66 @@ static Variable variables[] = {
     VAR(NOS, "ca", "30;41"),    /* File with capability */
 };
 
+#define nvariables (sizeof(variables)/sizeof(variables[0]))
+
 enum FileType {
     VDir, VSym, VOrph, VPipe, VSock, VDoor, VBlock, VChr, VExe,
-    VFile, VNormal, VMiss, VLeft, VRight, VEnd
+    VFile, VNormal, VMiss, VLeft, VRight, VEnd, VSuid, VSgid, VSticky,
+    VOther, Vstird, VReset, Vhard, Vhard2, VCap
+};
+
+/*
+ * Map from LSCOLORS entry index to Variable array index
+ */
+static const uint8_t map[] = {
+    VDir,      /* Directory */
+    VSym,      /* Symbolic Link */
+    VSock,     /* Socket */
+    VPipe,     /* Named Pipe */
+    VExe,      /* Executable */
+    VBlock,    /* Block Special */
+    VChr,      /* Character Special */
+    VSuid,     /* Setuid Executable */
+    VSgid,     /* Setgid Executable */
+    VSticky,   /* Directory writable to others and sticky */
+    VOther,    /* Directory writable to others but not sticky */
 };
 
-#define nvariables (sizeof(variables)/sizeof(variables[0]))
 
+
+enum ansi {
+    ANSI_RESET_ON = 0,         /* reset colors/styles (white on black) */
+    ANSI_BOLD_ON = 1,          /* bold on */
+    ANSI_ITALICS_ON = 3,       /* italics on */
+    ANSI_UNDERLINE_ON = 4,     /* underline on */
+    ANSI_INVERSE_ON = 7,       /* inverse on */
+    ANSI_STRIKETHROUGH_ON = 9, /* strikethrough on */
+    ANSI_BOLD_OFF = 21,                /* bold off */
+    ANSI_ITALICS_OFF = 23,     /* italics off */
+    ANSI_UNDERLINE_OFF = 24,   /* underline off */
+    ANSI_INVERSE_OFF = 27,     /* inverse off */
+    ANSI_STRIKETHROUGH_OFF = 29,/* strikethrough off */
+    ANSI_FG_BLACK = 30,                /* fg black */
+    ANSI_FG_RED = 31,          /* fg red */
+    ANSI_FG_GREEN = 32,                /* fg green */
+    ANSI_FG_YELLOW = 33,       /* fg yellow */
+    ANSI_FG_BLUE = 34,         /* fg blue */
+    ANSI_FG_MAGENTA = 35,      /* fg magenta */
+    ANSI_FG_CYAN = 36,         /* fg cyan */
+    ANSI_FG_WHITE = 37,                /* fg white */
+    ANSI_FG_DEFAULT = 39,      /* fg default (white) */
+    ANSI_BG_BLACK = 40,                /* bg black */
+    ANSI_BG_RED = 41,          /* bg red */
+    ANSI_BG_GREEN = 42,                /* bg green */
+    ANSI_BG_YELLOW = 43,       /* bg yellow */
+    ANSI_BG_BLUE = 44,         /* bg blue */
+    ANSI_BG_MAGENTA = 45,      /* bg magenta */
+    ANSI_BG_CYAN = 46,         /* bg cyan */
+    ANSI_BG_WHITE = 47,                /* bg white */
+    ANSI_BG_DEFAULT = 49,      /* bg default (black) */
+};
+#define TCSH_BOLD      0x80
+       
 typedef struct {
     Str            extension;  /* file extension */
     Str            color;      /* color string */
@@ -167,6 +220,104 @@ getstring(char **dp, const Char **sp, Str *pd, int f)
     return *s == (Char)f;
 }
 
+static void
+init(size_t colorlen, size_t extnum)
+{
+    size_t i;
+
+    xfree(extensions);
+    for (i = 0; i < nvariables; i++)
+       variables[i].color = variables[i].defaultcolor;
+    if (colorlen == 0 && extnum == 0) {
+       extensions = NULL;
+       colors = NULL;
+    } else {
+       extensions = xmalloc(colorlen + extnum * sizeof(*extensions));
+       colors = extnum * sizeof(*extensions) + (char *)extensions;
+    }
+    nextensions = 0;
+}
+
+static int
+color(Char x)
+{
+    int c;
+    static const char ccolors[] = "abcdefghx";
+    char *p;
+    if (Isupper(x)) {
+       x = Tolower(x);
+       c |= TCSH_BOLD;
+    } else
+       c = 0;
+
+    if (x == '\0' || (p = strchr(ccolors, x)) == NULL)
+       return -1;
+    return 30 + (p - ccolors);
+}
+
+static void
+makecolor(char **c, int fg, int bg, Str *v)
+{
+    int l;
+    if (fg & 0x80)
+       l = xsnprintf(*c, 12, "%.2d;%.2d;%.2d;%.2d", ANSI_BOLD_ON,
+           fg & ~TCSH_BOLD, (10 + bg) & ~TCSH_BOLD, ANSI_BOLD_OFF);
+       l = xsnprintf(*c, 6, "%.2d;%.2d",
+           fg & ~TCSH_BOLD, (10 + bg) & ~TCSH_BOLD);
+
+    v->s = *c;
+    v->len = l;
+    *c += l + 1;
+}
+
+/* parseLSCOLORS():
+ *     Parse the LSCOLORS environment variable
+ */
+static const Char *xv; /* setjmp clobbering */
+void
+parseLSCOLORS(const Char *value)
+{
+    size_t i, len, clen;
+    jmp_buf_t osetexit;
+    size_t omark;
+    xv = value;
+
+    if (xv == NULL) {
+       init(0, 0);
+       return;
+    }
+
+    len = Strlen(xv);
+    len >>= 1;
+    clen = len * 12;   /* "??;??;??;??\0" */
+    init(clen, 0);
+
+    /* Prevent from crashing if unknown parameters are given. */
+    omark = cleanup_push_mark();
+    getexit(osetexit);
+
+    /* init pointers */
+
+    if (setexit() == 0) {
+       const Char *v = xv;
+       char *c = colors;
+
+       int fg, bg;
+       for (i = 0; i < len; i++) {
+           fg = color(*v++);
+           if (fg == -1)
+               stderror(ERR_BADCOLORVAR, v[-1], '?');
+
+           bg = color(*v++);
+           if (bg == -1)
+               stderror(ERR_BADCOLORVAR, '?', v[-1]);
+           makecolor(&c, fg, bg, &variables[map[i]].color);
+       }
+
+    }
+    cleanup_pop_mark(omark);
+    resexit(osetexit);
+}
 
 /* parseLS_COLORS():
  *     Parse the LS_COLORS environment variable
@@ -183,16 +334,11 @@ parseLS_COLORS(const Char *value)
 
     (void) &e;
 
-    /* init */
-    xfree(extensions);
-    for (i = 0; i < nvariables; i++)
-       variables[i].color = variables[i].defaultcolor;
-    colors = NULL;
-    extensions = NULL;
-    nextensions = 0;
 
-    if (value == NULL)
+    if (value == NULL) {
+       init(0, 0);
        return;
+    }
 
     len = Strlen(value);
     /* allocate memory */
@@ -200,14 +346,13 @@ parseLS_COLORS(const Char *value)
     for (v = value; *v; v++)
        if ((*v & CHAR) == ':')
            i++;
-    extensions = xmalloc(len + i * sizeof(Extension));
-    colors = i * sizeof(Extension) + (char *)extensions;
-    nextensions = 0;
+
+    init(len, i);
 
     /* init pointers */
     v = value;
     c = colors;
-    e = &extensions[0];
+    e = extensions;
 
     /* Prevent from crashing if unknown parameters are given. */
 
@@ -216,43 +361,43 @@ parseLS_COLORS(const Char *value)
 
     if (setexit() == 0) {
 
-    /* parse */
-    while (*v) {
-       switch (*v & CHAR) {
-       case ':':
-           v++;
-           continue;
-
-       case '*':               /* :*ext=color: */
-           v++;
-           if (getstring(&c, &v, &e->extension, '=') &&
-               0 < e->extension.len) {
+       /* parse */
+       while (*v) {
+           switch (*v & CHAR) {
+           case ':':
                v++;
-               getstring(&c, &v, &e->color, ':');
-               e++;
                continue;
-           }
-           break;
-
-       default:                /* :vl=color: */
-           if (v[0] && v[1] && (v[2] & CHAR) == '=') {
-               for (i = 0; i < nvariables; i++)
-                   if ((Char)variables[i].variable[0] == (v[0] & CHAR) &&
-                       (Char)variables[i].variable[1] == (v[1] & CHAR))
-                       break;
-               if (i < nvariables) {
-                   v += 3;
-                   getstring(&c, &v, &variables[i].color, ':');
+
+           case '*':           /* :*ext=color: */
+               v++;
+               if (getstring(&c, &v, &e->extension, '=') &&
+                   0 < e->extension.len) {
+                   v++;
+                   getstring(&c, &v, &e->color, ':');
+                   e++;
                    continue;
                }
-               else
-                   stderror(ERR_BADCOLORVAR, v[0], v[1]);
+               break;
+
+           default:            /* :vl=color: */
+               if (v[0] && v[1] && (v[2] & CHAR) == '=') {
+                   for (i = 0; i < nvariables; i++)
+                       if ((Char)variables[i].variable[0] == (v[0] & CHAR) &&
+                           (Char)variables[i].variable[1] == (v[1] & CHAR))
+                           break;
+                   if (i < nvariables) {
+                       v += 3;
+                       getstring(&c, &v, &variables[i].color, ':');
+                       continue;
+                   }
+                   else
+                       stderror(ERR_BADCOLORVAR, v[0], v[1]);
+               }
+               break;
            }
-           break;
+           while (*v && (*v & CHAR) != ':')
+               v++;
        }
-       while (*v && (*v & CHAR) != ':')
-           v++;
-    }
     }
 
     cleanup_pop_mark(omark);
@@ -264,15 +409,15 @@ parseLS_COLORS(const Char *value)
 /* put_color():
  */
 static void
-put_color(const Str *color)
+put_color(const Str *colorp)
 {
     size_t  i;
-    const char  *c = color->s;
+    const char  *c = colorp->s;
     int           original_output_raw = output_raw;
 
     output_raw = TRUE;
     cleanup_push(&original_output_raw, output_raw_restore);
-    for (i = color->len; 0 < i; i--)
+    for (i = colorp->len; 0 < i; i--)
        xputchar(*c++);
     cleanup_until(&original_output_raw);
 }
@@ -286,12 +431,12 @@ print_color(const Char *fname, size_t len, Char suffix)
     size_t  i;
     char   *filename = short2str(fname);
     char   *last = filename + len;
-    Str           *color = &variables[VFile].color;
+    Str           *colorp = &variables[VFile].color;
 
     switch (suffix) {
     case '>':                  /* File is a symbolic link pointing to
                                 * a directory */
-       color = &variables[VDir].color;
+       colorp = &variables[VDir].color;
        break;
     case '+':                  /* File is a hidden directory [aix] or
                                 * context dependent [hpux] */
@@ -301,7 +446,7 @@ print_color(const Char *fname, size_t len, Char suffix)
        for (i = 0; i < nvariables; i++)
            if (variables[i].suffix != NOS &&
                (Char)variables[i].suffix == suffix) {
-               color = &variables[i].color;
+               colorp = &variables[i].color;
                break;
            }
        if (i == nvariables) {
@@ -310,7 +455,7 @@ print_color(const Char *fname, size_t len, Char suffix)
                    && strncmp(last - extensions[i].extension.len,
                               extensions[i].extension.s,
                               extensions[i].extension.len) == 0) {
-                 color = &extensions[i].color;
+                 colorp = &extensions[i].color;
                break;
            }
        }
@@ -318,7 +463,7 @@ print_color(const Char *fname, size_t len, Char suffix)
     }
 
     put_color(&variables[VLeft].color);
-    put_color(color);
+    put_color(colorp);
     put_color(&variables[VRight].color);
 }
 
index 475262d..39926f4 100644 (file)
@@ -1,4 +1,4 @@
-/* $Header: /p/tcsh/cvsroot/tcsh/tw.comp.c,v 1.42 2007/10/01 21:52:00 christos Exp $ */
+/* $Header: /p/tcsh/cvsroot/tcsh/tw.comp.c,v 1.44 2014/07/24 10:50:15 christos Exp $ */
 /*
  * tw.comp.c: File completion builtin
  */
@@ -32,7 +32,7 @@
  */
 #include "sh.h"
 
-RCSID("$tcsh: tw.comp.c,v 1.42 2007/10/01 21:52:00 christos Exp $")
+RCSID("$tcsh: tw.comp.c,v 1.44 2014/07/24 10:50:15 christos Exp $")
 
 #include "tw.h"
 #include "ed.h"
@@ -46,7 +46,7 @@ static Char           **tw_find       (Char *, struct varent *, int);
 static Char             *tw_tok        (Char *);
 static int               tw_pos        (Char *, int);
 static void              tw_pr         (Char **);
-static int               tw_match      (const Char *, const Char *);
+static int               tw_match      (const Char *, const Char *, int);
 static void              tw_prlist     (struct varent *);
 static const Char       *tw_dollar     (const Char *,Char **, size_t, Char **,
                                         Char, const char *);
@@ -248,14 +248,15 @@ tw_tok(Char *str)
  *     in a prefix of the string.
  */
 static int
-tw_match(const Char *str, const Char *pat)
+tw_match(const Char *str, const Char *pat, int exact)
 {
     const Char *estr;
-    int rv = Gnmatch(str, pat, &estr);
+    int rv = exact ? Gmatch(str, pat) : Gnmatch(str, pat, &estr);
 #ifdef TDEBUG
-    xprintf("Gnmatch(%s, ", short2str(str));
+    xprintf("G%smatch(%s, ", exact ? "" : "n", short2str(str));
     xprintf("%s, ", short2str(pat));
-    xprintf("%s) = %d [%d]\n", short2str(estr), rv, estr - str);
+    xprintf("%s) = %d [%" TCSH_PTRDIFF_T_FMT "d]\n", short2str(estr), rv,
+       estr - str);
 #endif /* TDEBUG */
     return (int) (rv ? estr - str : -1);
 }
@@ -525,6 +526,7 @@ tw_complete(const Char *line, Char **word, Char **pat, int looking, eChar *suf)
             *pos = NULL;       /* scratch pointer                      */
        int   cmd, res;
         Char  sep;             /* the command and separator characters */
+       int   exact;
 
        if (ptr[0] == '\0')
            continue;
@@ -599,6 +601,7 @@ tw_complete(const Char *line, Char **word, Char **pat, int looking, eChar *suf)
        }
 #endif /* TDEBUG */
 
+       exact = 0;
        switch (cmd) {
        case 'p':                       /* positional completion */
 #ifdef TDEBUG
@@ -614,12 +617,14 @@ tw_complete(const Char *line, Char **word, Char **pat, int looking, eChar *suf)
 
        case 'N':                       /* match with the next-next word */
        case 'n':                       /* match with the next word */
+           exact = 1;
+           /*FALLTHROUGH*/
        case 'c':                       /* match with the current word */
        case 'C':
 #ifdef TDEBUG
            xprintf("%c: ", cmd);
 #endif /* TDEBUG */
-           if ((n = tw_match(pos, ran)) < 0) {
+           if ((n = tw_match(pos, ran, exact)) < 0) {
                cleanup_until(ran);
                continue;
            }
index 912b40e..b849823 100644 (file)
@@ -1,4 +1,4 @@
-/* $Header: /p/tcsh/cvsroot/tcsh/tw.decls.h,v 3.22 2006/01/12 18:15:25 christos Exp $ */
+/* $Header: /p/tcsh/cvsroot/tcsh/tw.decls.h,v 3.23 2012/06/21 17:40:40 christos Exp $ */
 /*
  * tw.decls.h: Tenex external declarations
  */
@@ -125,6 +125,7 @@ extern       int              tw_complete           (const Char *, Char **,
 extern  void             set_color_context     (void);
 extern  void             print_with_color      (const Char *, size_t, Char);
 extern  void             parseLS_COLORS        (const Char *);
+extern  void             parseLSCOLORS         (const Char *);
 #endif /* COLOR_LS_F */
 
 #endif /* _h_tw_decls */
index dc32dba..5899638 100644 (file)
@@ -1,4 +1,4 @@
-/* $Header: /p/tcsh/cvsroot/tcsh/tw.parse.c,v 3.133 2011/04/14 14:33:05 christos Exp $ */
+/* $Header: /p/tcsh/cvsroot/tcsh/tw.parse.c,v 3.136 2015/05/04 15:31:13 christos Exp $ */
 /*
  * tw.parse.c: Everyone has taken a shot in this futile effort to
  *            lexically analyze a csh line... Well we cannot good
@@ -35,7 +35,7 @@
  */
 #include "sh.h"
 
-RCSID("$tcsh: tw.parse.c,v 3.133 2011/04/14 14:33:05 christos Exp $")
+RCSID("$tcsh: tw.parse.c,v 3.136 2015/05/04 15:31:13 christos Exp $")
 
 #include "tw.h"
 #include "ed.h"
@@ -1236,7 +1236,7 @@ static Char
 tw_suffix(int looking, struct Strbuf *word, const Char *exp_dir, Char *exp_name)
 {
     Char *ptr;
-    Char *dollar;
+    Char *dol;
     struct varent *vp;
 
     (void) strip(exp_name);
@@ -1258,8 +1258,8 @@ tw_suffix(int looking, struct Strbuf *word, const Char *exp_dir, Char *exp_name)
        else if ((ptr = tgetenv(exp_name)) == NULL || *ptr == '\0')
            return ' ';
 
-       if ((dollar = Strrchr(word->s, '$')) != 0 && 
-           dollar[1] == '{' && Strchr(dollar, '}') == NULL)
+       if ((dol = Strrchr(word->s, '$')) != 0 && 
+           dol[1] == '{' && Strchr(dol, '}') == NULL)
          return '}';
 
        return isadirectory(exp_dir, ptr) ? '/' : ' ';