From: Nancy Blachman <decvax!decwrl!sun!idi!resonex!nancy@Ucb-Vax.ARPA>
To: net.unix, net.unix-wizards, net.sources
Subject: Actual tricks, shells, csh aliases and the like, 1 of 3
Date: 16 Oct 84 21:20:53 GMT
Organization: Resonex Inc., Sunnyvale, CA

> [Know anybody with a GREAT .login or .cshrc?]

> I'm interested in collecting the little tricks, shell scripts, awk
> hacks, csh aliases, and such that people have built to make their daily
> life a little easier or more automatic.  Being a fairly new system
> administrator I don't have the big toolbox that years of messing around
> will leave you with.  If you have any hacks you're proud of (or that
> you aren't proud of, but which work anyway), and you're willing to make
> them public, mail them to me.  I'll collect, collate, shuffle, sort,
> munge, judge, select and discard them and then "summarize to the net".

This article concentrates on  aliases, and .cshrc and .login files I received
in response to my solicitation. The second article in this series focuses
shell scripts. The third article centers on C programs and awk scripts.

/\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\/
> Nancy Blachman {allegra,hplabs,ihnp4,sun}!resonex!nancy  (408)720 8600 x37 <
/\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\/

::::::::::::::
aliases/1
::::::::::::::
Date: Thu, 13 Sep 84 07:27:35 est
From: ihnp4!pur-ee!davy (Dave Curry)
To: ihnp4!resonex!nancy
Subject: aliases

Nancy:

        Here's a few handy aliases to put your current working
directory into your prompt:

alias cd chdir \!:\* \; set prompt='${cwd}\[!\]\ ' \; setenv CWD '$cwd'
alias pd pushd \!:\* \; set prompt='${cwd}\[!\]\ ' \; setenv CWD '$cwd'
alias pp popd \!:\* \; set prompt='${cwd}\[!\]\ ' \; setenv CWD '$cwd'

These put the current directory into the environment also, this is
for an editor used here locally which uses this information.  You can delete
that part if you don't need it.

--Dave Curry
ihnp4!pur-ee!davy



::::::::::::::
aliases/2
::::::::::::::
From: hplabs!sdcrdcf!sdcsvax!greg (Greg Noel)
Date: Thu, 13 Sep 84 10:57:51 pdt
Return-Address: ucbvax!sdcsvax!greg or Greg@NOSC
Organization: NCR Corporation, Torrey Pines
To: sdcrdcf!hplabs!resonex!nancy
Subject: Re: Tricks, shell and awk scripts, csh aliases and the like

I have three little gems from my bag of tricks that I'd like to show you,
all for the C shell.  The first is an alias for the `pwd' command:
        alias pwd       echo \$cwd
The built-in variable `cwd' always contains the current working directory,
and since `echo' is a built-in command, this is MUCH faster than invoking
a program to calculate the actual location.  The only problem (and I don't
have a solution) is that it gets confused by symbolic links to directories.

The second one is something that turns the directory structure from something
passive into something active:
        alias come      if -e .greg_come source .greg_come
        alias go        if -e .greg_go   source .greg_go
        alias cd        go \; set prev = \$cwd \; chdir \!\* \; \
                                echo \$prev ==\\\> \$cwd \; come
What this does is cause the shell to look for a specific file whenever it
transfers into a directory, and if it is there, source it.  Also, whenever
you leave a directory, it looks for a different file and sources that before
leaving.  I use this to set up location-specific aliases or to have something
happen auto-magicly whenever I work in some diretory -- for example, changing
into my `play' directory invokes a menu that will set up the environment and
run game programs -- different save files for `rogue' or other stuff that
I don't want to carry around with me all the time.  It's more flexible than
it seems at first glance; the only thing I can suggest is to try it and you
will keep finding new ways to use it.

The last one is really a replacement for the `pushd' and `popd' commands --
I didn't like the way they worked, so I did these.  It seperates the action
of pushing a directory from the action of changing directories.  I wanted
this since I also have a whole bunch of aliases to move between widely-
seperated portions of the filesystem (something I do a lot) and it was
easier for me to type `push; u test' (which pushes the current directory
and takes me into the `test' subdirectory of something interesting) than
to type `pushd /long/complicated/path/test'.  This isn't terribly original,
but the gem, and something I find VERY useful is the `back' command, which
takes you to the directory you last left, so you can bouce back and forth
between two directories -- one is the source location and one the test
location, for example.  Anyway, here's what it looks like:
        alias push      set dirstack = \( \$cwd \$dirstack \) \; \
                                echo Pushing \\\[\$\#dirstack] \$cwd \; \!\*
        alias pop       cd \$dirstack\[1] \; set dirstack = \( \$dirstack\[2-] \)
        alias back      set dirstack = \( \$prev \$dirstack \) \; pop
        alias pp        set x = \$dirstack\[1] dirstack\[1] = \$cwd \; cd \$x
Notice that it interacts with the previous alias for `cd' in that it expects
the variable `prev' to have the previous directory (which is what `cd' leaves
in it).  The `pp' alias is sometimes useful -- it pushes the current directory
while transfering to the old top of stack, a simultaneous push-pop.

I hope you found these interesting and entertaining.

-- Greg Noel, NCR Torrey Pines       Greg@sdcsvax.UUCP or Greg@nosc.ARPA

::::::::::::::
cshrc/1
::::::::::::::
From: <hplabs!tektronix!jerryp>
Date: Thursday, 13 Sep 84 09:48:55 PDT
To: resonex!nancy, jerryp
Subject: Re: Tricks, shell and awk scripts, csh aliases and the like

Nancy,

I'll mail you a few .cshrc and .login files.  Unfortunately, I'm short on
time... so I can't comment a lot... but I'd be glad to answer any questions
you've got about how they work.

A summary of them:

1)  This .cshrc file comes from the tektronix!tekred machine in Redmond,
Oregon.  Its neat feature is that, when a user "su"'s to someone else's
account, their prompt changes
from    %
to      account>
where the "su"'d name appears before the >.  Very nice, I think.

Also, they do a standard thing around here.  The first line [if ($?prompt)]
checks to see if the .cshrc is being scanned by an interactive shell.  If so,
the commands below are executed.  If not (like a shell escape from "vi"), the
commands aren't executed.  This really speeds up shell escapes!  (I do the
same thing, in a different way, in my .cshrc file.)


2)  This is my .login file.  I should mention that I've got my own calendar
system that's updated every morning at 1 AM by "at".  It sits in my
".calendar" directory.  You'll see a lot of that stuff in the .login file.


3 & 4)  I have *two* .cshrc files.  One, ".cshrc", is the standard file.  It
contains a limited list of aliases and setup commands.  The other, ".cshrc2",
is one I source when I'll be logged on for a long time and doing a lot of
work.  The .cshrc2 has time-saving aliases like "alias m more" in it.

At login, the .cshrc is always read.  This sets my prompt to something like
        <directory,#>
where # is the C-shell history number.  Also, since my system is so busy, I
have a "quick login" setup in .cshrc to let me see my mail immediately and
logout without doing anything else, if I want to.  This quick-login has a
        $
prompt set... the Bourne-shell prompt.

If I want an extended login, I execute the alias "res" (from .cshrc).  It sets
alarms automatically (for meetings, etc... from my .calendar directory) and
re-sets my prompt to something like
        [directory,#]
That way, I know that I've got all my aliases available.

Since my system is overloaded, this dual-.cshrc system saves me time and
hassle... .cshrc2 takes a long time to source.


--Jerry Peek, UNIX Training Instructor, Tektronix, Inc.
US Mail:   MS 76-036, P.O. Box 500, Beaverton, OR 97077
uucp:      {allegra,decvax,hplabs,ihnp4,mit-eddie,ucbvax}!tektronix!jerryp
CSnet:     jerryp@tek
ARPAnet:   jerryp.tek@csnet-relay
Phone:     503/627-1603


---------------------------------------------------------------------------
FILE #1 (.cshrc):

if ($?prompt) then
        set history=20
        set path=(. $home/bin /usr/local /usr/tek /usr/public /usr/ucb /bin /usr/bin)
        set mail=(300 /usr/spool/mail/$home:t /etc/motd)
        source ~/.aliases

        set prompt=`whoami | sed -e 's/ .*//' -e 's/user=//'`
        if ($prompt == $user || $prompt == "") then
                set prompt="% "
        else
                set prompt="$prompt> "
        endif
endif
---------------------------------------------------------------------------
FILE #2 (.login):
uptime                  # show system load
set ignoreeof           # do not logout on EOF (^D)
set noclobber           # do not overwrite files with > or >>
cp ~/.exrc8 ~/.exrc     # set up vi/ex to environment in ~/.exrc8
setenv EDIT /usr/ucb/vi # set default editor to vi
setenv PRINTER uph      # if type "man -Tlpr", use "uph" to store for printing
setenv NEWSBOX ~        # save news (readnews "s") in home directory or beneath

set noglob; eval `tset -srQm 'plugboard:?4025'`; unset noglob

stty new crt            # new tty driver, crt terminal, see newtty(4)
stty tostop hup         # stop background jobs on output, hangup hw on logout
limit filesize 2000     # do not write file > 2,000,000 bytes
limit coredumpsize 0    # prevent core dumps when csh bombs
touch .llog             # set correct last login time for finger
if ($TERM == 'tek4023' || $TERM =~ aaa*inv ) then
        # KEEP more FROM USING THE ul OPTION AND MESSING UP DISPLAY:
        setenv MORE -u
else if (($TERM == qume5) || ($TERM == dumb)) then
        mesg n
        exit 0
endif

# immediate notification (every 60 seconds) of mail:
set mail = (60 /usr/spool/mail/$user /etc/motd)

# check /etc/motd for changes; if any, show them and (maybe) add to calendar:
diff ~/.calendar/last.motd /etc/motd >! /tmp/motd.diff
if ( $status != 0 ) then
        echo "< = old MOTD ... > = new MOTD"
        more /tmp/motd.diff
        echo "To read the new MOTD into the calendar, answer y.  To ignore it, answer q."
        echo -n "Otherwise, hit RETURN: "
        set ans = $<
        if ($ans == "y") then
                cat /etc/motd | tee -a ~/.calendar/calendar >! ~/.calendar/last.motd
                vi + ~/.calendar/calendar
                echo "To reset *today's* calendars, type 'calendar.set -F'."
        else if ($ans == "q") then
                cat /etc/motd >! ~/.calendar/last.motd
        endif
endif

echo "--------------------"
inc             # put new mail, if any, in ~/.mail/inbox

echo "--------------------"

set time = 10   # for jobs that take longer than 10, show how long
# IF THERE ARE LOGIN MESSAGES, SHOW THEM:
if !(-z ~/.calendar/mesg.login) then
        echo "Here are the login messages, "`date '+%a %D'`
        echo ""
        doublespace ~/.calendar/mesg.login
endif

echo "For an uptime graph, type 'upgr'."
---------------------------------------------------------------------------
FILE #3 (.cshrc):
# if this is a non-interactive shell, quit.
if ( ! $?prompt) exit 0

# save login system search path, removing leading "." (thanx to tekig!danr):
if ( ! $?SYSPATH ) setenv SYSPATH "$path[2-]"

# set default places to find commands (put current and .bin directories first):
set path=(. ~/.bin $SYSPATH /usr/public{,/texthelp} /usr3/{barbaraz/.,tcomm/}bin)

# CHECK FOR QUICK LOGIN:
if (! $?LOGGEDIN) then
        echo -n "For quick login (Bourne shell), answer y; otherwise, press RETURN: "
        if ( "$<" =~ y* ) then
                echo "To continue with login, press control-D; to logout, type 'stty 0'"
                /bin/sh -i
                echo "Continuing with standard login..."
        endif
endif
setenv LOGGEDIN x

# set cd search path for directory names which aren't sub-directories:
set cdpath=(~ `finddirs ~/training{,/*} /usr3/tcomm/unix{,/*}` ~/.bin ~/.log ~/.mail ~/stuff ~/tape*)

set history=1000        # keep the last 1000 commands in history

# use /usr/public/prompt to get massaged directory name for prompt-setting:
set prompt = "<`prompt ~ $cwd`,"{\!}"> "

# edit my calendar:
alias calen 'vi ~/.calendar/calendar; echo '"To reset today\'s calendars, type calendar.set -F"''

# change directory, reset prompt:
alias cd 'chdir \!*; set prompt = "<`prompt ~ $cwd`,"{\!}"> "'

# add to specified .log directory
alias log 'echo "Put a .ze at end of file, unless last log of this set.";vi + ~/.log/`cat ~/.log/latestlog`/\!*'

# create newterm command to allow terminal-type change
alias newterm 'set noglob;eval `tset -srQ \!*`;unset noglob'

# sets alarms (if any) and sources '.cshrc2' (my other alias list)
alias res '~/.bin/alarm.set ; source ~/.cshrc2'

alias todo 'vi ~/todo\!*'       # change one of the "to do" lists
---------------------------------------------------------------------------
FILE #4 (.cshrc2):

# notify immediately when background jobs are finished
set notify

# prompt with current directory name, history number:
alias s_p 'set prompt = "[`prompt ~ $cwd`,"{\!}"] "'
s_p

# set 'vi' for 4-character tabs/shifts:
alias 4vi 'cp ~/.exrc{4,}; echo "MODE: programming"'

# set 'vi' for 8-character tabs/shifts:
alias 8vi 'cp ~/.exrc{8,}; echo "MODE: text"'

# set 'vi' for quick work (no .exrc file):
alias qvi 'rm ~/.exrc; echo "MODE: quick"'

# easy way to compile "C" programs (ring bell if filename ends with ".c"):
alias C 'if ("\!*" =~ *.c) yes ;mv \!* ,\!*;echo \!*.c" SENT TO cc";cc \!*.c -o \!*;if (-e \!*) chmod 311 \!*'

# show alarms that (may be) set... and message explaining them:
alias alarms 'echo "These alarms have been set:";cat ~/.calendar/mesg.alarm; \ps | fgrep ".bin/nleave"'

# change back to previous directory:
alias c- 'set x=$cwd; chdir $lastdir; s_p; set lastdir=$x'

# edit my calendar:
alias calen 'v8 ~/.calendar/calendar; echo '"To reset today\'s calendars, type calendar.set -F"''

# see today's calendars:
alias cals 'cat ~/.calendar/mesg.*'

# save current directory for 'c-', change directory, reset prompt:
alias cd 'set lastdir=$cwd; chdir \!*; s_p'

# see mail without inc'ing it:
alias checkm 'see /usr/spool/mail/jerryp'

# same as 'cd', but lists directory, too:
alias cl 'set lastdir=$cwd; chdir \!*; ls -F; s_p'

# same as 'cl', but gives long list:
alias cll 'set lastdir=$cwd; chdir \!*; ls -l; s_p'

alias f 'grep "^\!*" /etc/passwd'       # quick version of "finger -s"

alias H 'history -r | fgrep "\!*"'      # find something in history list
alias h history 5       # show last five lines
alias hi history 10     # show last ten lines
alias his history 20    # show last twenty lines
alias hist 'history 40|m'       # show last forty lines; pipe to 'more'
alias histo 'history 70|m'      # show last seventy lines; pipe to 'more'

# send output of command to 'pr' (with command as header), then to uph:
alias hpr '\!* | pr -h "\!*" | uph'

alias j 'jobs -l >! /tmp/j$$; pushin /tmp/j$$; rm /tmp/j$$'
# show job status (process numbers, too) squeezed onto one line each

alias lc 'ls *.c'       # list all C source code in this directory

# add to specified .log directory
alias log 'echo "Put a .ze at end of file, unless last log of this set.";v8 + ~/.log/`cat ~/.log/latestlog`/\!*'

# list executable files, 5 columns, sorted across 80-wide line:
alias lx 'lf -1 | fgrep \* | pr -t -5 -l1 -w80'

alias m more            # shortened form of 'more' command

# faster pwd (singlequotes prevent expansion before it's executed):
alias pwd 'echo $cwd'

# re-start inverse video on Ann Arbors:
alias reinv 'echo "[7m";clear'

# lock terminal until ^C and login password are entered:
alias somb /usr3/jos/bin/somb

alias showm 'inc;show'  # get new mail

# give more info (how much time I've used) when using "status":
alias status 'source ~/.bin/status'

alias tcpr 'tcprint -p12 -m5 -ff \!* &'         # typical quick "tcprint" use

alias todo 'v8 ~/todo\!*'       # change one of the "to do" lists

alias up uptime

# make uptime graph:
alias upgr '(nohup uptime_graph ~/,up`date +%m%d.%H%M` &)'

# show uptime today's graph:
alias upsh 'uptime_show -20 ~/,up`date +%m%d`*'

# 'vi' for programming:
alias v4 '4vi;vi \!*'

# 'vi' for standard text:
alias v8 '8vi;vi \!*'

# call 'vi' with a search (must use 8vi because search requires a 'wrapscan')
alias vs '8vi; vi +/\!*'

alias write '/usr4/danr/bin/rite -c \!*'   # show each character as it's typed

#UNUSED ALIASES:
#alias cd 'set lastdir=$cwd;chdir \!*;set prompt="`~/.bin/prompt`"'
# change to maps directory:
#alias maps 'cd /usr/spool/news/lib/maps;echo "switching to newsa";su newsa;set $user=jerryp;c-'
# keep "at" job from dying because of long EXINIT:
#alias niterun 'setenv EXINIT "set sw=8";\niterun \!*;8vi'
#alias du ~danr/bin/du  # improved version of "directory usage" query
# format text, save in file".ty", then show it on the crt:
#alias typeup '~/.bin/type \!* >! \!*:r; more \!*:r'
# give description of 'ps' codes before doing the 'ps':
#alias ps 'cat ~/.ps.man;\ps \!*'
# easy way to compile and run "C" programs
# (ring bell if filename ends with ".c"):
#alias c 'if ("\!*" =~ *.c) yes ;mv \!* ,\!*;echo \!*.c" SENT TO cc";cc \!*.c -o \!*;echo "press ^C to stop execution";sleep 2;./\!*'
# easy way to change editor environment files:
#alias adde 'vi ~/.exrc\!*; set ex=(`cat ~/.exrc\!*`); setenv EXINIT "$ex"'
#alias rmm '\rmm \!* &'  # remove mail in background
# faster "man" listings:
#alias man 'echo "man -q:"; \man -q \!*'
# improved spell routine (write-protected dictionary):
#alias spel 'chmod +w ~/.misspell; /usr/public/spel \!*;chmod -w ~/.misspell'
# show whether using ~/.exrc4 or ~/.exrc8:
#alias vi 'echo "MODE: "$EXSTAT;/usr/ucb/vi \!*'
#alias comp '8vi;\comp \!*'     # set 'vi' for text before doing the 'comp'
# show last ten users of "tcprint" program:
#alias tcp tail /usr3/tcomm/.tcprint/log
# favorite "ps" (gives PID, PPID, STAT, TT, TIME, and long description):
#alias p 'ps lwx | cut -c12-22,53- | nfold'

::::::::::::::
cshrc/2
::::::::::::::
Date: Thu, 13 Sep 84 02:16:31 edt
From: ihnp4!seismo!umcp-cs!chris (Chris Torek)
To: ihnp4!resonex!nancy
Subject: Re:  Tricks, shell and awk scripts, ...

Actually Re: [Know anybody with a GREAT .login or .cshrc?]:

I don't know about *great*, but I'm probably one of the candidates for
*slowest* . . . .  FYA (For Your Amusement), here's my .login and .cshrc
on this machine (they're not the same on tove, gyre, gymble, and eneevax).

Chris

: Run this shell script with "sh" not "csh"
PATH=:/bin:/usr/bin:/usr/ucb
export PATH
all=FALSE
if [ $1x = -ax ]; then
        all=TRUE
fi
/bin/echo 'Extracting .cshrc'
sed 's/^X//' <<'//go.sysin dd *' >.cshrc
#
if ($?prompt) then
echo -n '['
set path=(. ~chris/bin ~chris/sys /usr/local/bin /g/local /usr/ucb /bin /usr/bin /usr/games /etc /usr/hosts)
echo -n 'cshrc]'
set ignoreeof history=100 time=2 mail=(10 /usr/spool/mail/chris) cdpath=(~ /g/VOTRAX ~/bin /g/chris ..) S=/usr/spool/uucp CICO=/usr/lib/uucp/uucico
alias hh history;alias h 'history 20';alias j jobs;alias o popd
alias status 'echo $status';alias so source;alias bye logout
alias p pushd;alias done 'echo ';alias kb "rm -i .*.bak *.bak .*.CKP *.CKP"
alias kc "rm -i .*.CKP *.CKP";alias e emacs;alias @@term 'kill -9 $$'
alias af ~chris/af/af;alias cdl "cd \!:1;ls \!:2*";alias lsl "ls -li"
alias lsa "ls -A";alias lsla "ls -lai";alias up "cd ..";alias upl "cd ..;ls"
alias cdll "cd \!:1;lsl \!:2*";alias lsld "lsl -d";alias lslg "lsl -g"
alias upll "cd ..;lsl";alias pl "pushd \!:1;ls \!:2*";alias z logout
alias pll "pushd \!:1;lsl \!:2*";alias ol "popd;ls";alias oll "popd;lsl"
alias cdla "cd \!:1;lsla \!:2*";alias v80 'echo -n "[?2l";set term=VT52'
alias v132 'echo -n "[?2l";set term=VT52.132';alias ansi 'echo -n "<"'
alias fix 'stty newcrt erase  kill ';alias ca 'ex "+1,.|q"'
alias own 'cp \!:1 /tmp/own$$;rm -f \!:1;mv /tmp/own$$ \!:1'
alias save 'cp \!:1 \!:1.old;chmod a-w \!:1.old;chmod +w \!:1'
alias c80 'echo -n "[?3l";set term=DT80';alias suspend 'suspend;dirs'
alias col80 'echo -n "[?3l";colnum 80';alias a alias
alias c132 'echo -n "[?3h";set term=DT80.132'
alias col132 'echo -n "[?3h";colnum 132'
alias hold 'echo -n "[H[J[12;20H[5mI'"'"'ll be right back[m[20H";lock;echo -n "[H[J"'
alias feed '(sleep 3000;echo Feeding time\\!)&'
alias open 'set noglob;eval `/usr/chris/bin/open \!:*`;unset noglob'
alias loav /usr/mark/bin/load
setenv VISUAL /usr/ucb/vi;setenv EDITOR /usr/local/bin/emacs
setenv EPATH :/usr/chris/emacs:/usr/israel/emacs:/usr/emacs/loclib:/usr/emacs/maclib
alias dir ls;alias era rm;alias printman /usr/man/printman;alias d dirs
alias clx 'rm -f /tmp/X_lock.\!:1 /usr/spool/uucp/LCK..\!:1'
alias aasize 'set noglob;eval `/usr/local/bin/aasize \!:1`;unset noglob'
alias aasave 'set noglob;eval `/usr/local/bin/aasave \!:1`;unset noglob'
alias down 'cd `echo */|awk '\''{print $1}'\''`;echo $cwd'
alias downl 'down;ls';alias downll 'down;lsl';alias mark 'set \!:1=$cwd'
alias lso 'lsla | sort +4 -rn';alias edenv 'source ~chris/bin/edenv'
alias aibib 'echo \!*|lookbib -n -p /usr/randy/papers/airefs|page'
alias checkque /usr/lib/mmdf/checkque;alias sum-dial /usr/lib/mmdf/sum-dial
alias deliver 'sh -c "HOME=/ /usr/lib/mmdf/deliver \!:*"'
alias ll 'ls -l';alias tm 'telnet 128.8.0.8'; alias  uptime
endif
umask 22
if ($?prompt) then
        set prompt='[\!] '
        echo ''
endif
//go.sysin dd *
made=TRUE
if [ $made = TRUE ]; then
        /bin/chmod 644 .cshrc
        /bin/echo -n '  '; /bin/ls -ld .cshrc
fi
/bin/echo 'Extracting .login'
sed 's/^X//' <<'//go.sysin dd *' >.login
#
stty erase ^H kill ^X intr  decctlq nl0 cr0 ff0
cd;setenv TERMCAP /usr/chris/.termcap
# cp .exrc1 .exrc
# Set up the terminal
# 4025=Tek4025 sd=dialup x1=Xer 1750 GG=Gigi d4=GT40 aaa=AAA else DT80
# if (`slowtty` == y) then
#       cp .mailrc2 .mailrc
# else
#       cp .mailrc1 .mailrc
# endif
set wantbaud=0
top:
switch ($TERM)
case su:
case network:
        set wantbaud=1
case sd:
case unknown:
        set term=`/ful/chris/bin/selterm`
        goto top
case 4025:
        stty crt tabs;tabset.tek
        breaksw
case h6:
case hp:
case hp2623:
case hp2626:
        stty tabs crt
        breaksw
case v550:
        stty crt;set prompt='[7m[\!][m '
        breaksw
case GG:
        stty crt;unsetenv TERMCAP;set prompt='[7m[\!][m '
        breaksw
case d4:
        set term=gt40;stty crt
        breaksw
case aaa:
case aaa-60:
        set term=aaa prompt='[7m[\!][m ';stty tabs crt;unsetenv TERMCAP
        aakey -f /ful/chris/.aakeys
        if (`tty` =~ /dev/tty*) then
                echo -n 'Lines? [30] '
                set lines=$<
                if ($lines != ) then
                        aasize $lines
                endif
        endif
        breaksw
case h19:
case h19a:
case kb:
        set term=h19a prompt='[7m[\!][m ';stty tabs crt crtkill
        breaksw
case Dq:
case DT80:
case D5:
case vt100:
        set term=DT80 prompt='[7m[\!][m '
        echo -n '[?4l';stty crt
        breaksw
default:
        unsetenv TERMCAP;echo "Wonder what $TERM is?"
        breaksw
endsw
if ($wantbaud == 1) then
        selbaud
endif
unset wantbaud lines
# mailcount
checknews
setenv ROGUEOPTS 'jump,ask,terse,flush,passgo,fruit=hregfx'
setenv PAGER /usr/ucb/page
setenv SPELL_LISTS /ful/chris/.splist
alias logout 'source /ful/chris/.logout.';alias exit logout
# /usr/games/fortune
w; # calend; /usr/chris/bin/ac 22:00
echo ----------------------------------------------------------
# rehist .history
//go.sysin dd *
made=TRUE
if [ $made = TRUE ]; then
        /bin/chmod 644 .login
        /bin/echo -n '  '; /bin/ls -ld .login
fi

::::::::::::::
cshrc/3
::::::::::::::
Date: Fri, 14 Sep 84 14:59:01 pdt
From: hplabs!sdcrdcf!sdcsvax!sdcc6!loral!hlb (Howard Brandell)
To: sdcc6!sdcsvax!sdcrdcf!hplabs!resonex!nancy
Subject: .cshrc

I am sending my entire .cshrc file because I have some things in it
that help me out.

Firstly, note the aliases that allow me to selectively read those
newsgroups of interest.  Aha! You may say I can put it all in the
.newsrc file and have the system inform me when there is news and
read it out simultaneously.  But, sometimes we get news during the
course of the day and I like to check my favorites continuously.

Also, not the aliases for tip.  These allow me to dial my remote
locations with both spped and accuracy. As an aside,  I have
created a .tiprc file which logs all my remote host conversation
into a file.  In this way, nothing is lost.  Note the 'rt' command
which allows me to purge tiplog.

alias a alias
a sd   "msg,gju,glw,kay,sdi"
a ds   "chmod 600 .signature"
a es   "chmod 640 .signature"
a vc   "ccalc"
a m    "mail"
a p    "more"
a rk   "readnews -n net.kids"
a ra   "readnews -n net.micro.apple"
a ri   "readnews -n net.micro.pc"
a rs   "readnews -n sdnet.computing"
a rb   "readnews -n net.sport.baseball"
a rn   "readnews -n net.columbia"
a rw   "readnews -n net.wanted"
a rl   "readnews -n net.legal"
a r    "readnews"
a logs "readnews -n net.sources -l>sources.log"
a motd "cat /etc/motd|more"
a h   "history -r \!*|more"
a t1  "tip 561-7271"
a t2   "tip 452-1869"
a t3   "tip 283-1538"
a t4   "tip 692-1961"
a t5   "tip 270-1166"
a t6   "tip 217-1900"
a rt   "rm tiplog"
a bye   logout
a cd    "cd \!* ; dirs"
a term  'set noglob; eval `tset -n -s \!*`'
a wat   "ps -au | more"
a pv    printenv
a j     "jobs -l"
a f     "finger|more"
a l     ls -F

if ( $?prompt == 1 ) then
        set prompt="\!: "
        set mail=(60 /usr/spool/mail/$USER)
endif
set history =   24
set cdpath = (. ~)

Also note the aliases for the more mundane commands, like mail
and more -c.

Hope this has been of some help.  Please disregard my earlier
transmission as I had some operational difficulties.  Thx.

::::::::::::::
cshrc/4
::::::::::::::
From: sun!dagobah!mike
Date: Mon, 17 Sep 84 23:27:05 pdt
To: sun!resonex!nancy
Subject: .cshrc

set mail=(10 /usr/spool/mail/$user)
set path=(. ~/bin /usr/lfl/bin /usr/ucb /bin /usr/bin /usr/hosts /usr/suntool)
set cdpath  = ( . .. ~ /usr /u0 /u1 /audio)
set mail=(10 /usr/spool/mail/$user)
set msgs=(10 /usr/msgs/bounds)
set history = 50

source  ~/.aliases
set D = /net/dagobah/u0/mike
set d = /net/dim/u0/mike
set k = /net/kessel/u0/mike
set n = /net/nellybell/u0/mike
if (! $?HOST) setenv HOST `hostname`
alias s_prompt 'set prompt = "[$HOST\\\!$cwd]\\
% "'
alias cd 'cd \!*; s_prompt'
s_prompt


::::::::::::::
cshrc/5
::::::::::::::
From: sun!dagobah!mike
Date: Mon, 17 Sep 84 23:27:19 pdt
To: sun!resonex!nancy
Subject: .aliases

alias alice     cu -s 1200 2016654115
alias rabbit    cu -s 1200 2016654150
alias yale      cu -s 1200 2034323510
alias ajax      cu -s 1200 2015828265

alias ts        'setenv TERM `tset - \!* -Q`;set term = $TERM;unsetenv TERMCAP;'
alias aa        "ts aaa-26; aaapf"
alias aaa       aa

alias h         history
alias l         'ls -Fa'
alias lp        l -t
alias ll        'ls -laF | more'
alias wo        /u0/td/bin/who
alias m         'make \!* >>& errors &'
alias mail      Mail
alias ml        /bin/mail
alias lm        ml
alias rml       'rm -f /usr/spool/mail/mike'
alias RM        '/bin/rm -rf'
alias clean     'rm *.o core errors a.out'
alias CLEAN     'RM *.o core errors a.out ~/.REMOVED; mkdir ~/.REMOVED'
alias die       'clear; kill -HUP $$'
alias tlog      tail -f /usr/spool/uucp/LOGFILE
alias ter       tail -f errors

  #
  # For job control:
  # Use 'fg' to bring job into the foreground, 'bg' to run job in background.
  #   'v', to restart vi editor
  #   'W', to restart ice editor
  #   'j', to list out jobs
  #   'k', to kill jobs; 'k 2' kills job [2]; 'k' kills the most recent job (+).
alias v       %vi
alias j       jobs
alias k       'kill %\!*'
alias sysline ~/bin/sysline -Dhmrj


::::::::::::::
cshrc/6
::::::::::::::
Date: Fri, 21 Sep 84 01:17:43 cdt
From: ihnp4!uiucdcs!liberte (Daniel LaLiberte)
To: sun!resonex!nancy
Subject: .cshrc trick

I like my recursive prompt that shows the depth of shell calls with added
">"s.  It also gives a different prompt for my superuser which has the same
home.  Additionally, we have several vaxes, uiucdcs*, networked with
ethernet.  Upgrades are easier with the same .cshrc on all machines.


...
if (! $?PROMPT) setenv PROMPT ""        # initialize
setenv PROMPT "$PROMPT>"                # add ">"
if ($?prompt) then
        set sys = `hostname`
        if ("$prompt" == "% ") then     # regular user
                set prompt = `echo $sys | sed s/uiucdcs//`
        else if ("$prompt" == "# ") then        # super user
                set prompt = "$sys#"
        endif
        set prompt = "$prompt\!$PROMPT "
endif


My login prompt (on uiucdcs) is:

1>

A csh call will produce:

1>>

Remote login to uiucdcsb, for example:

b1>

Superuser on uiucdcsb:

uiucdcsb#1>>


I have an alarm script and a spooled rcp that both use `at`.

Daniel LaLiberte
ihnp4!uiucdcs!liberte


::::::::::::::
cshrc/7
::::::::::::::
Date: Sun, 7 Oct 84 20:35:02 pdt
From: Ken Greer <hplabs!kg>
To: resonex!nancy
Subject: Xmas is early this year...

Here's what I thought were the most interesting things in my
csh profile.

1. Prompt is (curdir hist#), or [curdir hist#] if running as su.
   The brackets stack, so if I login as kg and su to kgsu, my prompt
   is [(curdir hist#)] indicating my previous shell was non-su.
   In both cases, the current directory always appears in prompt.

2. On that subject, I heartily recommend a separate su login
   for each su-er on a system.  This lets everyone have their
   own profile, and when they quit you don't have to change the su passwd,
   just remove their su.

3. The directory stuff. (I prefer it to pushd/popd.)
   ds   - displays directory stack (set to length DSSIZE below).
   go # - go to directory item number #
   back - go to previous directory.
   cd   - stack current directory and go to a new one.  Oldest directories
          fall off end of stack (whose size is DSSIZE).

4. The "e" and "ec" commands let you edit the last or any command.
   If works with a special program.  Would you like that?

5. Delete/Undelete - special program.  Lets you recover deleted
   files up to three days (user selectable).

6. Do you know about my tcsh?  Not sure how it fits in with tricks though.

                                -Ken


# Fancy prompt...
if ($?prompt) then
if (! $?LEFTPROMPT) setenv LEFTPROMPT ""
if (! $?RIGHTPROMPT) setenv RIGHTPROMPT ""
if (`whoami` == root) then
        setenv LEFTPROMPT '['"$LEFTPROMPT"
        setenv RIGHTPROMPT "$RIGHTPROMPT"']'
   set path=(~/bin /usr/local/etc /etc /usr/local/bin /usr/ucb /bin /usr/bin .)
else
        setenv LEFTPROMPT '('"$LEFTPROMPT"
        setenv RIGHTPROMPT "$RIGHTPROMPT"')'
        set path=(~/bin /usr/local/bin /usr/ucb /bin /usr/bin .)
endif
alias setprompt 'set prompt = "${LEFTPROMPT}${cwd} \\!${RIGHTPROMPT} "'
setprompt
alias a alias

# directory manipulation...
set DSSIZE = 10
if (! $?DS) set DS = (~)
a back  'set xx=$DS[$#DS] DS[$#DS]=$cwd; chdir $xx; unset xx; setprompt'
a go    'set xx=$DS[\!*] DS[\!*]=$cwd; chdir $xx; unset xx; setprompt'
a ds    'echo $DS | tr " " "\012" | cat -n'
a cd   'if ($#DS >= $DSSIZE) shift DS; set DS = ($DS $cwd);chdir \!*; setprompt'

# virtual remove...
a rm    del
a rm!   /bin/rm

# edit command...
a e     '/usr/local/bin/ec \!-1:q'
a ec    '/usr/local/bin/ec "\!*:q"'

# misc...
a j     jobs
a ls    '/usr/ucb/ls -F'
a tag   '/usr/ucb/vi -ta \!*'
a ts    'set noglob;eval `tset -s -Q \!*`'
a wd    'echo $cwd'
endif


::::::::::::::
cshrc/8
::::::::::::::
Date: Thu, 13 Sep 84 08:36:47 edt
From: sun!decvax!genrad!teddy!dls (Diana L. Syriac)
To: genrad!decvax!decwrl!sun!idi!resonex!nancy
Subject: Re: Tricks, shell and awk scripts, csh aliases and the like

I'm sorry, I don't really have any "tricks" to make life easier, I'm also
a rather new Unix user....except for one:
        I use setenv a lot to define a bunch of directories that I use
        a lot.  For example, I have in my .cshrc:
                setenv obc ~doc/rts/obc
        So anytime I want to get to that directory (or just look at it), I
        just type:      ls $obc/filename
        These environment variables work inside of mail as well as inside of
        emacs.
I suppose you already have that one from other people.

We also have on our system some "local" programs that make life a lot easier:
We have an "lf" and "dir" that replaces "ls" and "ls -l", but with an added
feature:  directories are displayed in bold letter, executables are displayed
in reverse video and special files are displayed in flashing letters.  It's
quite easy to see at a glance what the files are or where you want to go.

We also have a "pushd" and "popd" which replace the "cd" command.
        pushd directory
will pushd a directory onto the "stack", and change to it.  After you're
finished with that directory, just typing
        popd
will put you back to where you were.  There is a "dirs" command to
allow you to look at the "stack" to see where you are, where you've been.
If you use "cd" instead, it's smart enough to change your stack and replace
the current directory with the one specified in "cd". And if you just say
"pushd" by itself, it will SWAP the current directory with the last directory
you were in, making it very easy to toggle between two directories.

Other things that we've done:
        Built a script for the nroff command that is used by most people
on the system, including macros and some "local" filters to make it look
nice on terminal, line printer, and diablo.  I have also created a little
program which can be used in conjunction with nroff to produce "change bars"
at the left margin of documents.  We used the change bars quite a lot under
vms rno.
        We have a set of programs that produce "C" listings, with a table
of contents showing all files AND routines, page numbered and file numbered,
each file has a line number at left margin indicating file and line number
(eg: 3.41 refers to file 3, line 41), and at the very end of listing, there
is a cross-reference of all tokens, giving file.line references.  Part of
this set of programs was taken directly off the net and modified for our
own use.

Well, that's all that I can think of for now.  BUT what I really mailed
to you was for something that I want.  At the last DECUS, one of the speakers
demonstrated a little program that he wrote that allowed him to keep a
running log of what he did every day.  The program started up when he logged
on, and ran in the background.  Every 15 minutes, it would beep at him,
asking him to input a line telling what he was currently doing.  If ignored,
it would beep at him every minute until he input something to it.  I don't
know who the guy was, and I lost his business card, but I'd sure like to
get that program if you have it.  Thanks much.

                        Diana L. Syriac
                        GenRad, Concord, Ma.
                        decvax!genrad!teddy!dls


::::::::::::::
logins/1
::::::::::::::
From: sun!dagobah!mike
Date: Mon, 17 Sep 84 23:26:53 pdt
To: sun!resonex!nancy
Subject: .login

#tset -m dialup:aaa-60 -Q
tset -m dialup:c100-4p -Q
setenv TERM $term
switch ($TERM)
        case dialup:
                set term = aaa-60; setenv TERM $term
                ~/bin/aaapf
                breaksw
        case c100-4:
        case c108-4p:
                sysline
        case c100-4p:
                setkeys
endsw
stty new erase "^?"

biff y
setenv notify true
setenv CWD $cwd
setenv SHELL /bin/csh
setenv MAIL ~/Mail
setenv MANPATH /u0/pn/man:/u0/mike/Man:/usr/lfl/man:/usr/man
setenv INCPATH /usr/lfl/include:/usr/include:/u0/mike/Include
setenv LIBPATH /usr/lfl/lib:/lib:/usr/lib:/u0/mike/Lib
setenv LOADPATH /usr/src/lfl/bin/emacs.unipress/emacs4.2/maclib
setenv EDITOR /usr/ucb/vi
uupoll ucbvax
msgs


::::::::::::::
logins/2
::::::::::::::
Date: Fri, 14 Sep 84 10:42:43 edt
From: Jay Weber  <amd!mordor!ut-sally!seismo!rochester!jay>
To: ut-sally!mordor!dual!amd!resonex!nancy
Subject: Re: Tricks, shell and awk scripts, csh aliases and the like

I use the hold option in my .mailrc, which keeps messages around
until you explicitly delete them.  That's a popular option since
it makes it easy to keep around descriptions of things to do, but
it gets hard to tell when you have new mail and how much.  So, I
have this in my .login:

@ newmail= `from $mail[$#mail] |awk 'END{print NR}'` - `cat .mailsize`
if ($newmail == 1) then
  echo "(There is one new mail message.)"
else
  if ($newmail > 1) echo "(There are $newmail new mail messages.)"
endif
------------
and this in my .logout:

if (-r $mail[$#mail]) then
  from $mail[$#mail] | awk 'END{print NR}' >~/.mailsize
endif
------------

Jay Weber
..!seismo!rochester!jay
jay@rochester.arpa


::::::::::::::
logins/3
::::::::::::::
Date: Fri, 14 Sep 84 15:16:00 cdt
To: ctvax!convex!allegra!resonex!nancy
From: allegra!convex!trsvax!gm  (George Moore)
Subject: neat .login's

Nancy,
   Here is some of the aliases I use, as well as part of my .login
file: (We are running 4.1BSD on a 11/780)

  alias back 'set back=$old; set old=$cwd; cd $back; unset back'
  alias cd 'set old=$cwd; chdir \!*; sp'
  alias sp 'set prompt="$cwd> "'
Those aliases allow my prompt to always be my current directory.
You never have to run "pwd" again. Looks kindof strange when you
are in a low directory like /g/usr/src/local/csh, but you get used
to it. It also allows you to cd to some low dir, and then type
"back" and you are back in the directory you started in.

I have this line in my .login:
  sh -c "$HOME/bin/firstlog &"
This line allows you to spin off a background job without the
"[1] 22934"  message messing up your screen. Firstlog is done
below. I have a security program which goes out and checks a few
key files and directories (/etc/passwd, /etc/group, /usr/lib/crontab,
/etc). If anything has changed, it sends me mail informing me of the
fact. But I only wish it run once a day, at the time I first login for
the day. (I don't want it run from crontab, that makes things too
predictable for the users)

---------------------------------------------------------------------
#! /bin/csh
#  Firstlog -- finds out if this is the first time I have logged in
#              today and start-up all sorts of neat stuff if it is.

set date=`/bin/date`
set now=`/usr/ucb/last $user`
if ($date[2] != $now[13] || $date[3] != $now[14]) then
        sh -c "$HOME/personal/security/secure &"
endif
---------------------------------------------------------------------

I hope this helps.                              George Moore
                                                gm@trsvax.UUCP


From: Nancy Blachman <decvax!decwrl!sun!idi!resonex!nancy@Ucb-Vax.ARPA>
To: net.unix,net.unix-wizards,net.sources
Subject: Actual Tricks, shells, csh aliases and the like, 2 of 3
Date: 16 Oct 84 21:22:55 GMT
Organization: Resonex Inc., Sunnyvale, CA

> [Know anybody with a GREAT .login or .cshrc?]

> I'm interested in collecting the little tricks, shell scripts, awk
> hacks, csh aliases, and such that people have built to make their daily
> life a little easier or more automatic.  Being a fairly new system
> administrator I don't have the big toolbox that years of messing around
> will leave you with.  If you have any hacks you're proud of (or that
> you aren't proud of, but which work anyway), and you're willing to make
> them public, mail them to me.  I'll collect, collate, shuffle, sort,
> munge, judge, select and discard them and then "summarize to the net".

This article focuses shell scripts I received in response to my solicitation.
The first article of this series concentrates on  aliases, and .cshrc and
.login files. The third article centers on C programs and awk scripts.

/\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\/
> Nancy Blachman {allegra,hplabs,ihnp4,sun}!resonex!nancy  (408)720 8600 x37 <
/\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\/

::::::::::::::
shells/1
::::::::::::::
Date: Thu, 13 Sep 84 12:49:57 edt
From: allegra!vax135!cornell!tesla!mac (Michael Mc Namara)
To: cornell!vax135!houxm!mhuxl!ulysses!allegra!resonex!nancy
Subject: Cute cshell - sh scripts

    If your are like most UNIX systems, you have a plethora of different
terminals that  your system  is supposed to support.  Sure, with termcap
and terminfo, and programs written to use them, the interface gets easier.
If you only ever login to one particular terminal, you can

set term = "vt131"

or

TERM=vt131
export TERM

in your .login or .profile.

But what if you,  or some of your users,  drift  around using different
terminal types-- You have a terminal room with many different terminals.

Here is a set of shell scripts & C programs that use the "echo terminal
type" command that many terminals support, to do automatic terminal type
identification and setting:  (of course I've only made it work for  the
terminals we have here at Cornell, and some day I should write more of it
in C...)

    This one is written for cshell:

##########################################
#    Identify and set terminal type (csh)#
##########################################
set noglob
echo Please wait...
stty cbreak -echo
# this sequence will cause all terminals we have to echo something
# except for adm's; those users are told to hit 'a' when they see
# please wait
echo ' CZ[c'
sleep 1
# this calls a c program to grab the id string from the terminal
# program is included later...
set type = `/usr/new/rin.login`
stty -cbreak echo new crt
#########################
# the or in the vt100 terminal type is because vt100's respond
# to both ^[Z and ^[[c, but DEC threatens to eliminate one of
# the responces (I forget which).. The extra stty back you see
# with DG terminals (Data General) is because their backspace is
# ^Y instead of ^H ( Home on DG terminals) This involves a modification
# of stty, which you would care about only if you have them--Write to me.
##################
if ( $type == "[?1;0c" || $type == "[?1;0c[?1;0c" ) then
     set term = vt100
     echo "VT101"
else if ( $type == "[?1;2c" || $type == "[?1;2c[?1;2c" ) then
     set term = vt100
     echo "VT100"
else if ( $type == "[?1;11c[?1;11c") then
     set term = ct500
     echo "[7mCIT - 500[m"
else if ( $type == "[?12;5;0;102c" ) then
     set term = vt100
     echo "VT125"
else if ($type == "[?1;2c[?1;2c") then
     set term = vt100
     echo "VT100, with Selenar Graphics"
else if ( $type == "o#\!R" ) then
     set term = dg200
     stty stop undef start undef back
     echo "DDG200E"
else if ( $type == "o#'C3" ) then
     set term = dg450
     stty back
     echo "FS11BFS00 DATA GENERAL DASHER D450"
else if ( $type == "o#'K3" ) then
     set term = dg450
     stty back
     echo "FS11BFS00 DATA GENERAL DASHER D450"
else if ( $type == "/K" ) then
     set term = vt52
     echo "Visual 50"
else if ( $type =~ "\\4*" ) then
     set term = hp2621
     echo HP2621
else if ( $type =~ "a" ) then
     set term = adm3a
     echo "adm3a"
else if ($type == "50" ) then
     set term = w50
     echo "WYSE50"
else
# Ask user for terminal type -- for some reason the above didn't work
set no_name_yet=1
set no_name_yet = 1;
while( $no_name_yet )
   echo -n "Please enter terminal type (hit return for menu) "
   set ttyname = ($< );
   switch( $ttyname )
   case d450:
   case dg450:
      set term=dg450;
      stty back
      set no_name_yet = 0;
      breaksw;
   case vt100:
      set term=vt100;
      set no_name_yet = 0;
      breaksw;
   case v50:
   case vt52:
      set term=vt52;
      set no_name_yet = 0;
      breaksw;
   case hp2621:
   case hp:
      set term=hp2621;
      set no_name_yet = 0;
      breaksw;
   case wyse50:
      set term=w100;
      set no_name_yet = 0;
      breaksw;
   case adm5:
      set term=adm5;
      set no_name_yet = 0;
      breaksw;
   case adm3+:
   case adm3:
   case adm3a:
      set term=adm3+;
      set no_name_yet = 0;
   case d200:
   case dg200:
      set term=dg200;
      stty stop undef start undef back ;
      set no_name_yet = 0;
      breaksw;
   case other:
      echo -n "Enter terminal name: "
      set term=($< );
      set no_name_yet = 0;
      breaksw;
   case '':
      echo Terminal abbreviations are:
      echo "Dasher 450 : dg450"
      echo "Dasher 200 : dg200"
      echo "Visual 50  : v50"
      echo "VT100      : vt100"
      echo "HP 2621    : hp2621"
      echo "ADM5       : adm5"
      echo "ADM3+      : adm3+"
      echo "Use 'other' to specify terminals not on this menu"
      breaksw;
   default:
      echo "I didn't understand that. Hit return for a menu."
   endsw
end
unset no_name_yet
unset ttyname
endif
stty -cbreak
stty echo
unset noglob

Ok, This one is used for Bourne shell lovers:  (I used /bin/test because
one user had an executable file called test somewhere in his path ahead
of where this program lived...That one took days to track down...)


echo "Please Wait..."
stty start  stop   crt new back  -echo cbreak
echo ' CZ[c'
sleep 1
TYPE=`/usr/new/rin.login`
stty echo -cbreak
if ( /bin/test \( $TYPE = "[?1;0c" \) -o \( $TYPE = "[?1;0c[?1;0c" \) ) then
     TERM=vt100
     echo "[7mVT101[m"
elif ( /bin/test \( $TYPE = "[?1;2c" \) -o \( $TYPE = "[?1;2c[?1;2c" \)  ) then
     TERM=vt100
     echo "#3[7mVT100[m"
     echo "#4?[7mVT100[m"
elif ( /bin/test  $TYPE = "[?1;11c[?1;11c") then
     TERM=ct500
     echo "CT 500"
elif ( /bin/test  $TYPE = "o#!R" ) then
     TERM=dg200
     stty stop undef
     stty start undef
     stty crt
     stty back
     echo "D DATA GENERAL DASHER D200E"
elif ( /bin/test $TYPE = "o#'C3" )  then
     TERM=dg450
     stty crt
     stty back
     echo "FS11BFS00 DATA GENERAL DASHER D450"
elif ( /bin/test $TYPE = "/K" ) then
     TERM=vt52
     echo "UVisual 50T"
elif ( /bin/test $TYPE = "50" ) then
     TERM=w50
     clear
     echo "WYSE 50"
elif ( /bin/test $TYPE = "\4088000" ) then
     TERM=hp2621
     echo HP2621
elif ( /bin/test $TYPE = "a" ) then
     TERM=adm3a
     echo ADM3a
else
     stty start
     stty stop
     stty new crt
     set no_name_yet=1
echo
while ($no_name_yet) do {
  echo
  echo Which terminal do you have?
  echo       Hit return for a menu.
  read INP
  case $INP
    in
100 | v | vt100) {
                  TERM=vt100
                  break
             } ;;
adm5)            {
                 TERM=adm5
                 break
             } ;;
adm3+)           {
                 TERM=adm3+
                 break
             } ;;
450 | dg450 | d450)  {
                  TERM=dg450
                  stty back
                  break
             } ;;
200 | dg200 | d200)  {
                  TERM=dg200
                  stty stop undef
                  stty start undef
                  stty back
                  break
             }  ;;
 50 | vt52 | v50)   {
                  TERM=vt52
                  break
             } ;;
 2621 | hp2621 | hp) {
                  TERM=hp2621
                  break
             } ;;
      other) {
                  echo -n Enter terminal name:
                  read tname
                  TERM=$tname
                  break
             } ;;
 ''|?|help)  {    echo Terminal abbreviations are:
                  echo
                  echo Dasher 450:  dg450
                  echo Dasher 200:  dg200
                  echo Visual  50:  vt52
                  echo VT100     :  vt100
                  echo HP 2621   :  hp2621
                  echo ADM3+     :  adm3+
                  echo ADM5      :  adm5
                  echo "Use 'other' to specify other terminals."
                  echo
             } ;;
        * )  {   echo "I did not understand that."
             } ;;
  esac
  }
done
fi
export TERM

*********
And here is the c program that read's in the terminal ID string:


/* rin -- read in a char string which may not be terminated */
char buf[256];
int n;
main ()
{
n = read(0,buf,256);
write(1,buf,n);
printf("\n");
}

***************


        Use them, abuse them.  Of course you have to paw through
your terminal manuanls to discover what (if any) string they respond to,
and test for the response accordingly...

                                        ---MAC



::::::::::::::
shells/2
::::::::::::::
From: hplabs!azure!billp
To: tektronix!hplabs!resonex!nancy
Date: Thursday, 13 Sep 84 09:23:49 PDT
Subject: Re: Tricks, shell and awk scripts, csh aliases and the like

Here are some that I like and use a lot.  'del' and 'undelete' are just two
links to the same file.  This way if somebody copies one, they get the
other too
-------------------------------------------------------------------------------
::::::::::::::
: mv
::::::::::::::
: 'prompts if the destination file already exists'
/bin/mv -i $*
-------------------------------------------------------------------------------
::::::::::::::
: cp
::::::::::::::
: 'prompts if the destination file already exists'
/bin/cp -i $*
-------------------------------------------------------------------------------
::::::::::::::
: del, undelete
::::::::::::::
: '"del" throws files into the waste basket'
: 'files preceded by "," are automagically removed after 7 days'
: '"undelete" pulls files out of the waste basket'
: 'if invoked without an argument, both commands list the contents of the'
: 'waste basket.'

case $0 in
*del)
    if test -z "$1"
    then
        ls -lus $HOME/.waste_basket
    else
        for i
        do
            echo -n "deleting "
            tmp=`basename $i`
            /bin/mv -i $i $HOME/.waste_basket/,$tmp
            echo $i
        done
    fi;;

*undelete)
    if test -z "$1"
    then
        ls -lus $HOME/.waste_basket
    else
        for i
        do
            echo -n "recovering "
            tmp=`basename $i`
            /bin/mv -i $HOME/.waste_basket/,$tmp $i
            echo $i
        done
    fi;;
esac
-------------------------------------------------------------------------------
::::::::::::::
: vi
::::::::::::::
: 'backs up file(s) before editing them'
: 'files preceded by "," are automagically removed after 7 days'
for i
do
    if test -f $i
    then
        echo -n "backing up "
        tmp=`basename $i`
        /bin/cp -i $i $HOME/.vi_backup/,$tmp
        echo $i
    fi
done
/usr/ucb/vi $*
-------------------------------------------------------------------------------

        Bill Pfeifer
{ucbvax,decvax,ihnp4,allegra,uw-beaver,hplabs} !tektronix!tekmdp!billp

::::::::::::::
shells/3
::::::::::::::
Date: Thu, 13 Sep 84 13:58:09 pdt
From: turtlevax!ken (Ken Turkowski)
To: resonex!nancy
Subject: Re: Tricks, shell and awk scripts, csh aliases and the like

You asked for it, you've got it!  Here's ALL of my personal nifties:
                        Ken
**************************************************

echo x - bin
mkdir bin
echo x - bin/CC
cat >bin/CC <<'!Funky!Stuff!'
#
set outname=a.out
foreach file ($argv)
    if ("$file" =~ *.[cso]) then
        set outname=$file:r
        break
    endif
end
echo cc -o $outname $*
exec cc -o $outname $*
!Funky!Stuff!
echo x - bin/appt
cat >bin/appt <<'!Funky!Stuff!'
#
set notetype=$0
set notetype=$notetype:t
set notefile=~/.$notetype
# if ($notetype == appt) then
#     set notetype=appointment
#     set notefile=~/calendar
# endif

if ($#argv == 0) then
    test -t 0 && echo Please enter your $notetype entry '(^D to end):'
    echo ' ' >> $notefile
    exec cat >> $notefile
endif

switch ($1)
    case -:
        exec vi $notefile
    case -rm:
        cat /dev/null > $notefile
        exec echo The ${notetype}s are removed.
    case -what:
        exec cat $notefile
    default:
        echo '' >> $notefile
        echo "$*" >> $notefile
endsw
!Funky!Stuff!
echo x - bin/asfix
cat >bin/asfix <<'!Funky!Stuff!'
case $# in
    0)
        file=/tmp/afix$$
        trap "cat $file; rm $file; exit" 0
        trap "rm $file; exit" 3 9
        cat > $file ;;
    1)
        file=$1 ;;
    *)
        echo Usage `basename $0` ' [ <file> ]' ;;
esac
ed - $file << EOF
v/[:\.]/s/^/    /
g/:./s/:/:      /
wq
EOF
!Funky!Stuff!
echo x - bin/atcat
cat >bin/atcat <<'!Funky!Stuff!'
#
if ($#argv < 2) then
    set cmd=$0
    echo Usage: "$cmd:t <time> <word> [ <word> ... ]"
    exit
endif
set atcmd="echo $argv[2-] > `tty`"
at $1 << EOF
$atcmd
EOF
!Funky!Stuff!
echo x - bin/atecho
cat >bin/atecho <<'!Funky!Stuff!'
#
if ($#argv < 2) then
    set cmd=$0
    echo Usage: "$cmd:t <time> <word> [ <word> ... ]"
    exit
endif
set atcmd="echo $argv[2-] > `tty`"
at $1 << EOF
$atcmd
EOF
!Funky!Stuff!
echo x - bin/beautify
cat >bin/beautify <<'!Funky!Stuff!'
#
set TMP=/tmp/cb$$
foreach file (argv)
    echo Beautifying $file:
    cb < $file > $TMP
    cat $TMP > $file
end
rm $TMP
!Funky!Stuff!
echo x - bin/blankclean
cat >bin/blankclean <<'!Funky!Stuff!'
sed -e 's/^     $//' -e 's/ *$//' $*
!Funky!Stuff!
echo x - bin/bphone
cat >bin/bphone <<'!Funky!Stuff!'
phonefile=$HOME/.`basename $0`s

echo ' '

case $# in
    0)
        ed - $phonefile << EOF
g/./s/$/\\
/
g/      /s//\\
/g
g/;/s// /g
1,\$p
q
EOF
    exit ;;
esac

case $1 in
    -)
        chmod 644 $phonefile
        vi $phonefile
        chmod 444 $phonefile
        exit ;;
esac

trap "rm /tmp/data$$; exit" 0 2
for name
do
    grep -y "$name" $phonefile >> /tmp/data$$
done
ed - /tmp/data$$ << EOF
g/./s/$/\\
/
g/      /s//\\
/g
g/;/s// /g
1,\$p
q
EOF
!Funky!Stuff!
echo x - bin/catalog
cat >bin/catalog <<'!Funky!Stuff!'
# catalog - produce complete file structure list from directory
#
# Parameters:   1: directory name (optional)
#               2: indentation string (empty on first call)
#
# Produces on standard output the file structure emanating from
#   the current directory.  Each descent into a subdirectory
#    is indicated by further indentation.  Directories are indicated
#    by surrounding [], and executable files are prefaced with a *.
#
if ( $#argv == 0) then
   echo "file structure from directory `pwd`"
   date
   echo ''
else
   cd $1
endif
foreach i ( * )
   if ( -d $i ) then
         echo "${2}[ $i ]"
         $0 $i "$2  . "
   endif
         if ( "$i" != '*' ) then
            if ( -x $i ) then
               echo "${2} *$i "
            else
               echo "${2}  $i "
            endif
         endif
   endif
end
!Funky!Stuff!
echo x - bin/circum
cat >bin/circum <<'!Funky!Stuff!'
there=$1
shift
otherstuff="$*"
back=`whoami`
last=`hostname`
IFS='    !
'
for link in $there
do
    back="$last!$back"
    last=$link
done
IFS='
'
echo mail $there!$back
(date; echo "$otherstuff") | mail -s "Circumlocution to $last" $there!$back
!Funky!Stuff!
echo x - bin/comfmt
cat >bin/comfmt <<'!Funky!Stuff!'
exec fmt | \
sed -e '1s/^\([  ]*\)/\1\/\* /' -e '2,$s/^\([    ]*\)/\1 \* /' -e '${P
s/\*.*/*\//
}'
!Funky!Stuff!
echo x - bin/comstrip
cat >bin/comstrip <<'!Funky!Stuff!'
exec sed -e 's/\/\*//' -e 's/\*\///' -e 's/^[   ]*\** *//'
!Funky!Stuff!
echo x - bin/decvert
cat >bin/decvert <<'!Funky!Stuff!'
#
if ($#argv == 0) then
    set args=`cat`
    if ($#args != 0) $0 $args
    exit
endif

foreach hexnum ($argv)
dc << EOF
16i
${hexnum}p
EOF
end
!Funky!Stuff!
echo x - bin/f77
cat >bin/f77 <<'!Funky!Stuff!'
PATH=/usr/bin
SPECLIB=/usr/ken/cmd/lib/libc.a
exec f77 "$@" $SPECLIB
!Funky!Stuff!
echo x - bin/famove
cat >bin/famove <<'!Funky!Stuff!'
#
if ($#argv != 2) then
    echo Usage: $0 '<source family root> <destination family root>'
    exit
endif
foreach file ($1.*)
    set suffix=`expr $file : "$1\.\(.*\)"`
    echo mv $file $2.$suffix
    mv $file $2.$suffix
end
if (-e $1) then
    echo mv $1 $2
    mv $1 $2
endif
!Funky!Stuff!
echo x - bin/gredit
cat >bin/gredit <<'!Funky!Stuff!'
#
set CAESAR=/mnt/cad/bin/caesar
set SEARCHPATH=(-p ::/usr/ken/caesar/symlib)
set COLORMAP=(-c mumap.cmap)
set GRTERM=ttyh7
set caesarfile=()
foreach parm ($argv)
    if ($?flag) then
        switch ($flag)
            case g:
                set GRTERM=$parm
                breaksw
            case p:
                set SEARCHPATH=(-p "$parm")
                breaksw
            case R:
                set SEARCHPATH=($SEARCHPATH:$parm)
                breaksw
            case c:
                set COLORMAP=(-c $parm)
                breaksw
        endsw
        unset flag
        continue
    endif
    if ($parm =~ -*) then
        switch ($parm)
            case -g:
                set flag=g
                continue
            case -p:
                set flag=p
                continue
            case -P:
                set SEARCHPATH=()
                continue
            case -R:
                set flag=R
                continue
            case -C:
                set COLORMAP=()
                continue
            case -c:
                set flag=c
                continue
        endsw
    else
        set caesarfile=($caesarfile $parm)
    endif
end
onintr -
$CAESAR -g $GRTERM $SEARCHPATH $COLORMAP $caesarfile
!Funky!Stuff!
echo x - bin/grindall
cat >bin/grindall <<'!Funky!Stuff!'
#
set flags=
set fileargs=
onintr cleanup
foreach file ($argv)
    if ($file =~ -*) then
        if ($file == -t) then
            set stdout
        else
            set flags=($flags $file)
        endif
    else
        set fileargs=($fileargs $file)
    endif
end

if ($?stdout) then
    foreach file ($fileargs)
        vgrind -t $flags $file
    end
else
    foreach file ($fileargs)
        vgrind -t $flags $file >> /usr/tmp/grind$$
    end
    vpr -T $fileargs[1] -t /usr/tmp/grind$$
endif

cleanup:
rm /usr/tmp/grind$$
!Funky!Stuff!
echo x - bin/hardasm
cat >bin/hardasm <<'!Funky!Stuff!'
#
grasm -1 -l -x $* |& pr -f -h "grasm -l -x $*" | vpr -l
!Funky!Stuff!
echo x - bin/hexvert
cat >bin/hexvert <<'!Funky!Stuff!'
#
if ($#argv == 0) then
    set args=`cat`
    if ($#args != 0) $0 $args
    exit
endif

foreach decnum ($argv)
dc << EOF
16o
${decnum}p
EOF
end
!Funky!Stuff!
echo x - bin/job
cat >bin/job <<'!Funky!Stuff!'
PATH=/usr/ken/cmd/bin:/usr/ucb:/bin:/usr/bin
case $# in
    0)
        exec echo Usage: `basename $0` '-;' or $0 '<job description>' ;;
esac
case $1 in
    -)
        exec ex $HOME/.joblog ;;
    -h | -hr | -hrs)
        shift
        hrs=$1
        shift
        exec echo '   job:' $hrs hours # $* >> $HOME/.joblog ;;
    -tail)
        exec tail -22 $HOME/.joblog ;;
    -today)
        {
            while read line
            do
                case $line in
                    *login*)
                        login="$line" ;;
                esac
            done
            echo -n "$login" "for "
            diffdate "$login" "`date`"
        } < $HOME/.joblog ;;
    -login)
        echo ' login:' "`date`" >> $HOME/.joblog ;;
    -summary)
        cat $HOME/.joblog |
            while read line
            do
                case $line in
                    *login*)
                        login="$line" ;;
                    *logout*)
                        logout="$line"
                        echo -n "$login" "for "
                        diffdate "$login" "$logout"
                esac
            done ;;
    *)
        exec echo '   job:' "`date`" # $* >> $HOME/.joblog ;;
esac
!Funky!Stuff!
echo x - bin/ledger
cat >bin/ledger <<'!Funky!Stuff!'
#
set notetype=$0
set notetype=$notetype:t
set notefile=~/.$notetype
# if ($notetype == appt) then
#     set notetype=appointment
#     set notefile=~/calendar
# endif

if ($#argv == 0) then
    test -t 0 && echo Please enter your $notetype entry '(^D to end):'
    echo ' ' >> $notefile
    exec cat >> $notefile
endif

switch ($1)
    case -:
        exec vi $notefile
    case -rm:
        cat /dev/null > $notefile
        exec echo The ${notetype}s are removed.
    case -what:
        exec cat $notefile
    default:
        echo '' >> $notefile
        echo "$*" >> $notefile
endsw
!Funky!Stuff!
echo x - bin/lstree
cat >bin/lstree <<'!Funky!Stuff!'
#
if ($#argv == 0) then
    set root=.
else
    set root=($*)
endif
exec find $root -print | sort | sed -e 's/[^ \/]*\//    /g'
!Funky!Stuff!
echo x - bin/match
cat >bin/match <<'!Funky!Stuff!'
cat $2 |
while read x
do
    for word in $x
    do
        case $word in
            $1)
                echo $word ;;
        esac
    done
done
!Funky!Stuff!
echo x - bin/narrow
cat >bin/narrow <<'!Funky!Stuff!'
echo \!
!Funky!Stuff!
echo x - bin/outmesg
cat >bin/outmesg <<'!Funky!Stuff!'
#
set notetype=$0
set notetype=$notetype:t
set notefile=~/.$notetype
# if ($notetype == appt) then
#     set notetype=appointment
#     set notefile=~/calendar
# endif

if ($#argv == 0) then
    test -t 0 && echo Please enter your $notetype entry '(^D to end):'
    echo ' ' >> $notefile
    exec cat >> $notefile
endif

switch ($1)
    case -:
        exec vi $notefile
    case -rm:
        cat /dev/null > $notefile
        exec echo The ${notetype}s are removed.
    case -what:
        exec cat $notefile
    default:
        echo '' >> $notefile
        echo "$*" >> $notefile
endsw
!Funky!Stuff!
echo x - bin/path
cat >bin/path <<'!Funky!Stuff!'
IFS="${IFS}:"
for cmddir in $PATH
do
    test -s $cmddir/$1 && echo "        $cmddir/$1"
done
!Funky!Stuff!
echo x - bin/pphone
cat >bin/pphone <<'!Funky!Stuff!'
phonefile=$HOME/.`basename $0`s

echo ' '

case $# in
    0)
        ed - $phonefile << EOF
g/./s/$/\\
/
g/      /s//\\
/g
g/;/s// /g
1,\$p
q
EOF
    exit ;;
esac

case $1 in
    -)
        chmod 644 $phonefile
        vi $phonefile
        chmod 444 $phonefile
        exit ;;
esac

trap "rm /tmp/data$$; exit" 0 2
for name
do
    grep -y "$name" $phonefile >> /tmp/data$$
done
ed - /tmp/data$$ << EOF
g/./s/$/\\
/
g/      /s//\\
/g
g/;/s// /g
1,\$p
q
EOF
!Funky!Stuff!
echo x - bin/progression
cat >bin/progression <<'!Funky!Stuff!'
last=
for backup in $1_??
do
    case $last in
        "")
            last=$backup
            continue;
    esac
    echo ''
    echo From $last to $backup:
    diff $last $backup
    last=$backup
done
echo ''
echo From $last to $1:
diff $last $1
!Funky!Stuff!
echo x - bin/query
cat >bin/query <<'!Funky!Stuff!'
#
set notetype=$0
set notetype=$notetype:t
set notefile=~/.$notetype
# if ($notetype == appt) then
#     set notetype=appointment
#     set notefile=~/calendar
# endif

if ($#argv == 0) then
    test -t 0 && echo Please enter your $notetype entry '(^D to end):'
    echo ' ' >> $notefile
    exec cat >> $notefile
endif

switch ($1)
    case -:
        exec vi $notefile
    case -rm:
        cat /dev/null > $notefile
        exec echo The ${notetype}s are removed.
    case -what:
        exec cat $notefile
    default:
        echo '' >> $notefile
        echo "$*" >> $notefile
endsw
!Funky!Stuff!
echo x - bin/releave
cat >bin/releave <<'!Funky!Stuff!'
#
set tty=`tty`
set tty=`expr $tty : '.*tty\(.*\)'`
set leaveproc=`ps gt$tty | grep -w leave`
kill -9 $leaveproc[1]
date
leave $*
!Funky!Stuff!
echo x - bin/reminder
cat >bin/reminder <<'!Funky!Stuff!'
#
set notetype=$0
set notetype=$notetype:t
set notefile=~/.$notetype
# if ($notetype == appt) then
#     set notetype=appointment
#     set notefile=~/calendar
# endif

if ($#argv == 0) then
    test -t 0 && echo Please enter your $notetype entry '(^D to end):'
    echo ' ' >> $notefile
    exec cat >> $notefile
endif

switch ($1)
    case -:
        exec vi $notefile
    case -rm:
        cat /dev/null > $notefile
        exec echo The ${notetype}s are removed.
    case -what:
        exec cat $notefile
    default:
        echo '' >> $notefile
        echo "$*" >> $notefile
endsw
!Funky!Stuff!
echo x - bin/reremind
cat >bin/reremind <<'!Funky!Stuff!'
#
set tty=`tty`
set tty=`expr $tty : '.*tty\(.*\)'`
set leaveproc=`ps gt$tty | awk '$5 ~ /^remind$/ { print $1 }'`
if ($#leaveproc > 1) echo $#leaveproc reminds were running
kill -9 $leaveproc
date
if ($#argv <= 1) then
    remind $*
else
    set time=$1
    shift
    remind $time "$*"
endif
!Funky!Stuff!
echo x - bin/restore
cat >bin/restore <<'!Funky!Stuff!'
# Truncate filename if necessary
set file=$1
if (`expr $file:t : '.*'` >= 11) then
    set savename=`expr $file : '\(.*\)'$file:t`
    set savename=$savename`expr $file:t : '\(...........\)'`
else
    set savename=$file
endif

switch ($#argv)
    case 1:
        set nonomatch
        set backup=(${savename}_[0-9][0-9])
        if ("$backup" == "${savename}_[0-9][0-9]") then
            echo Error: No backups found for $file
            exit
        endif
        set backup=$backup[$#backup]
        echo No backup number specified. Using latest: $backup
        breaksw
    case 2:
        set backup=${savename}_$2
        breaksw
    default:
        exec echo Usage: `basename $0` '<file>' '[<backup number>]'
endsw

if ( { cp $backup $file } ) then
    echo $file restored from $backup.
    echo -n Do you wish to keep "$backup? "
    set response=$<
    if ($response !~ y*) then
        rm $backup
    endif
endif
!Funky!Stuff!
echo x - bin/rot13
cat >bin/rot13 <<'!Funky!Stuff!'
tr "A-Za-z" "N-ZA-Mn-za-m"
!Funky!Stuff!
echo x - bin/shufcol
cat >bin/shufcol <<'!Funky!Stuff!'
trap 'rm /tmp/$$.*; exit' 0 2
cat > /tmp/$$.0
i=1
for cols
do
    cut -f$cols < /tmp/$$.0 > /tmp/$$.$i
    filelist="$filelist /tmp/$$.$i"
    i=`expr $i + 1`
done
paste $filelist
!Funky!Stuff!
echo x - bin/signature
cat >bin/signature <<'!Funky!Stuff!'
PATH=/bin:/usr/bin
cat
echo --
cat $HOME/.signature
!Funky!Stuff!
echo x - bin/swab
cat >bin/swab <<'!Funky!Stuff!'
#
if ($#argv == 0) then
    dd conv=swab
else
    onintr cleanup
    foreach file ($argv)
        cp $file /tmp/swab$$
        dd if=/tmp/swab$$ of=$file conv=swab
    end
    cleanup:
    rm /tmp/swab$$
endif
!Funky!Stuff!
echo x - bin/what
cat >bin/what <<'!Funky!Stuff!'
cat $HOME/.query
echo -n 'save? (n or d to delete, e to edit) '
read response
case $response in
    n | no | d | delete)
        rm $HOME/.query && echo The query is removed. ;;
    "" | y | yes | s | save)
        exit ;;
    e | edit)
        exec vi $HOME/.query < /dev/tty
        exit ;;
    *)
        echo Bad response: "$response"
        exec $0 ;;
esac
!Funky!Stuff!
echo x - bin/whereis
cat >bin/whereis <<'!Funky!Stuff!'
N=$#
command=echo
case "$1" in
    -*)
        command=`expr "$1" : '-\(.*\)'`
        shift
        N=`expr $N - 1` ;;
esac
case $N in
    0)
        exec echo Usage: `basename $0` [ -command ] pattern file ...  ;;
    1)
        files=`fgrep -l "$1" *` ;;
    *)
        files=`fgrep -l "$@"` ;;
esac
case $files in
        "")
            echo $1 not found in any files.
            exit ;;
esac
exec $command $files
!Funky!Stuff!
echo x - bin/wide
cat >bin/wide <<'!Funky!Stuff!'
echo \"
!Funky!Stuff!
echo x - bin/xprint
cat >bin/xprint <<'!Funky!Stuff!'
case $# in
    1)
        eval $1 | eval pr -f -h \"$1\" | vpr -l ;;
    *)
        command='cat $file'
        for file
        do
            case $file in
                -*)
                    command=`expr "$file" : '-\(.*\)'`
                    case $command in
                        *\$file*)
                            ;;
                        *)
                            command="$command \$file" ;;
                    esac ;;
                *)
                    eval $command | eval pr -f -h \"$command\" | vpr -l ;;
            esac
        done
esac
!Funky!Stuff!
echo x - bin/archives
mkdir bin/archives
echo x - bin/archives/newsweed
cat >bin/archives/newsweed <<'!Funky!Stuff!'
#
cd
if ($#argv == 0) then
    if (-e .newsweed) then
        set WEEDGROUPS=`cat .newsweed`
    else
        set WEEDGROUPS=
    endif
else
    set WEEDGROUPS=$*
endif
if ($#WEEDGROUPS == 0) then
    onintr
    echo Searching for articles in all newsgroups
    readnews -l | \
    grep Subject | \
    sed -e 's/Subject: *//' -e 's/^[rR][eE]:*  *//' | \
    sort -u > /tmp/weed$$a
    if (-z /tmp/weed$$a) then
        echo No news.
    else
        cp /tmp/weed$$a /tmp/weed$$b
        echo Please remove article titles which you do not wish to read
        sleep 1
        onintr -
        vi /tmp/weed$$b
        onintr cleanup
        comm -23 /tmp/weed$$a /tmp/weed$$b > /tmp/weed$$c
        echo Removing unwanted articles
        newsec -f /tmp/weed$$c
    endif
else
    foreach group ($WEEDGROUPS)
        echo Searching for articles in group\(s\):
        echo $group
        readnews -l -n $group | \
        grep Subject | \
        sed -e 's/Subject: *//' -e 's/^[rR]e:*  *//' | \
        sort -u > /tmp/weed$$a
        if (-z /tmp/weed$$a) then
            echo in newsgroups $group.
        else
            cp /tmp/weed$$a /tmp/weed$$b
            echo Please remove article titles which you do not wish to read
            sleep 1
            onintr -
            vi /tmp/weed$$b
            onintr cleanup
            comm -23 /tmp/weed$$a /tmp/weed$$b > /tmp/weed$$c
            echo Removing unwanted articles
            newsec -f /tmp/weed$$c
        endif
    end
endif

cleanup:
rm /tmp/weed$$?
!Funky!Stuff!
echo x - bin/archives/pk_01
cat >bin/archives/pk_01 <<'!Funky!Stuff!'
: Roff, nroff, or eqn input text
for file in `file $* | sed -n '/eqn input text$/s/:[^:]*$//p'`
do
    echo "echo x - $file"
    echo "sed 's/^x//' >$file <<'!Funky!Stuff!'"
    sed 's/^/x/' $file; echo "!Funky!Stuff!"
done
: Text files
for file in `file $* | sed -n -e '/commands text$/s/:[^:]*$//p' -e '/ascii text$/s/:[^:]*$//p'`
do
    echo "echo x - $file"
    echo "cat >$file <<'!Funky!Stuff!'"
    cat $file; echo "!Funky!Stuff!"
done
: Directories, recursively
for dir in `file $* | sed -n '/directory$/s/:.*//p'`
do
    echo "echo x - $dir"
    echo "mkdir $dir"
    file=`echo $dir/*`
    test "$file" != "$dir/*" && $0 $file
done
!Funky!Stuff!
echo x - bin/archives/pkf
cat >bin/archives/pkf <<'!Funky!Stuff!'

for dir
do
        echo "echo x - $dir"
        echo "mkdir $dir";
        for file in `file $dir/* | sed -n '/text$/s/:[^:]*$//p'`
        do
                echo "echo x - $file"
                echo "cat >$file <<'!Funky!Stuff!'"
                cat $file; echo "!Funky!Stuff!"
        done
        $0 `file $dir/* | sed -n '/directory$/s/:.*//p'`
done
!Funky!Stuff!
echo x - bin/archives/pkg
cat >bin/archives/pkg <<'!Funky!Stuff!'
for file
do
    echo "echo x - $file"
    echo "cat >$file <<'!Funky!Stuff!'"
    cat $file; echo "!Funky!Stuff!"
done
!Funky!Stuff!
echo x - bin/archives/pkn
cat >bin/archives/pkn <<'!Funky!Stuff!'

for dir
do
        echo "echo x - $dir"
        echo "mkdir $dir";
        for file in `file $dir/* | sed -n '/text$/s/:[^:]*$//p'`
        do
                echo "echo x - $file"
                echo "sed 's/^x//' >$file <<'!Funky!Stuff!'"
                sed 's/^/x/' $file; echo "!Funky!Stuff!"
        done
        $0 `file $dir/* | sed -n '/directory$/s/:.*//p'`
done
!Funky!Stuff!
echo x - bin/archives/prod
cat >bin/archives/prod <<'!Funky!Stuff!'
#
set flags=()
set syslist=()
foreach arg ($argv)
    switch ($arg)
        case -s*:
            if (`expr $arg : '.*'` > 9) then
                rm -f /usr/spool/uucp/STST.`expr $arg : '-s\(.......\)'`
            else
                rm -f /usr/spool/uucp/STST.`expr $arg : '-s\(.*\)'`
            endif
            set syslist=($syslist $arg)
            breaksw
        case -*:
            set flags=($flags $arg)
            breaksw
        default:
            if (`expr $arg : '.*'` > 7) then
                rm -f /usr/spool/uucp/STST.`expr $arg : '\(.......\)'`
            else
                rm -f /usr/spool/uucp/STST.$arg
            endif
            set syslist=($syslist -s$arg)
            breaksw
    endsw
end
foreach sys ($syslist)
    /usr/lib/uucp/uucico -r1 $flags $sys
end
!Funky!Stuff!
echo x - bin/bourne_scripts
mkdir bin/bourne_scripts
echo x - bin/bourne_scripts/lookdoc
sed 's/^x//' >bin/bourne_scripts/lookdoc <<'!Funky!Stuff!'
xtrap exit 2
xcase $# in
x    0)
x       ul | more
x       exit ;;
xesac
xfor names
xdo
x    case $names in
x       -n)
x           default=n ;;
x       -t)
x           default=t ;;
x       -m*)
x           macros="$macros $names" ;;
x       *.n | *.nr)
x           nroff $macros $names | ul | more ;;
x       *.t | *.tbl)
x           soelim $names | tbl | nroff $macros - | ul | more ;;
x       *)
x           case $default in
x               n)
x                   nroff $macros $names | ul | more ;;
x               t)
x                   soelim $names | tbl | nroff $macros - | ul | more ;;
x               "")
x                   ul $names | more ;;
x           esac
x    esac
xdone
!Funky!Stuff!
echo x - bin/bourne_scripts/CC
cat >bin/bourne_scripts/CC <<'!Funky!Stuff!'
outname=a.out
for argv
do
    case $argv in
        *.[cos])
            outname=`expr $argv : '\(.*\)\.'`
            break ;;
    esac
done
cc -o $outname $*
!Funky!Stuff!
echo x - bin/bourne_scripts/appt
cat >bin/bourne_scripts/appt <<'!Funky!Stuff!'
case $0 in
    appt)
        notetype=appointment
        notefile=$HOME/calendar ;;
    *)
        notetype=$0
        notefile=$HOME/.$0 ;;
esac

case $# in
    0)
        test -t 0 && echo Please enter your $notetype '(^D to end):'
        echo '' >> $notefile
        exec cat >> $notefile ;;
esac
case $1 in
    -)
        exec vi $notefile ;;
    -rm)
        cat /dev/null > $notefile
        exec echo The ${notetype}s are removed. ;;
    -what)
        exec cat $notefile ;;
    *)
        echo '' >> $notefile
        exec echo "$*" >> $notefile ;;
esac
!Funky!Stuff!
echo x - bin/bourne_scripts/beautify
cat >bin/bourne_scripts/beautify <<'!Funky!Stuff!'
for files
do
    echo $files:
    cb < $files > /tmp/cb$$
    cat /tmp/cb$$ > $files
done
rm /tmp/cb$$
!Funky!Stuff!
echo x - bin/bourne_scripts/format
cat >bin/bourne_scripts/format <<'!Funky!Stuff!'
case $# in
    0)
        echo "Usage: `basename $0` [-flags] <filename> [ <filename> ... ]"
        exit 1 ;;
esac
for names
do
    case $names in
        -*)
                flags="$flags $names" ;;
        *.t)
                outfile=`expr $names : '\(.*\)\.'`.d
                soelim $names | tbl | nroff $flags - > $outfile ;;
        *.tbl)
                outfile=`expr $names : '\(.*\)\.'`.doc
                soelim $names | tbl | nroff $flags - > $outfile ;;
        *.n)
                outfile=`expr $names : '\(.*\)\.'`.d
                nroff $flags $names > $outfile ;;
        *.nr)
                outfile=`expr $names : '\(.*\)\.'`.doc
                nroff $flags $names > $outfile ;;
        *)
                echo Don\'t know what to do with $names ;;
    esac
done
!Funky!Stuff!
echo x - bin/bourne_scripts/print
cat >bin/bourne_scripts/print <<'!Funky!Stuff!'
PATH=/avsd/ava/turk/bin:/usr/local/bin:/usr/bin
indent=0
for names
do
    case $names in
        -i)
            indent=1 ;;
        *)
            args="$args $names" ;;
    esac
done
case $indent in
    0)
        pr $args | lpr ;;
    *)
        pr $args | indent | lpr ;;
esac
!Funky!Stuff!
echo x - bin/bourne_scripts/repeat
cat >bin/bourne_scripts/repeat <<'!Funky!Stuff!'
case $1 in
    -[0-9]*)
        number=`expr $1 : '-\(.*\)'`
        shift
        while test $number -gt 0
        do
            eval $*
            number=`expr $number - 1`
        done
        exit ;;
    *)
        echo Executing forever: $* 1>&2
        number=0
        trap 'echo Executed $number times.; exit' 2
        while true
        do
            eval $*
            number=`expr $number + 1`
        done ;;
esac
!Funky!Stuff!
echo x - bin/bourne_scripts/restore
cat >bin/bourne_scripts/restore <<'!Funky!Stuff!'
case $# in
    2) ;;
    *)
        exec echo Usage: `basename $0` '<file>' '<version>' ;;
esac
: Truncate filename if necessary
if test `expr $1 : '.*'` -gt 11
then
    savename=`expr $1 : '\(...........\)'`
else
    savename=$1
fi
savename=${savename}_$2
cp $savename $1 && rm $savename && echo $1 restored from $savename
!Funky!Stuff!
echo x - bin/bourne_scripts/save
cat >bin/bourne_scripts/save <<'!Funky!Stuff!'
for file
do
    if test `expr $file : '.*'` -gt 11
    then
        savename=`expr $file : '\(...........\)'`
    else
        savename=$file
    fi
    for copy in ${savename}_??
    do
        latest=$copy
    done
    if test $latest = "${savename}_??"
    then
        latest=${savename}_01
    else
        latest=`expr $latest : '.*_\([0123456789]*\)$' + 1`
        case $latest in
            ?)
                latest=0$latest
                ;;
        esac
        latest=${savename}_$latest
    fi
    cp $file $latest && echo $file saved as $latest
done
!Funky!Stuff!
echo x - bin/csh_scripts
mkdir bin/csh_scripts
echo x - bin/csh_scripts/newsweed
cat >bin/csh_scripts/newsweed <<'!Funky!Stuff!'
#
set TEMP=/tmp/weed$$
set NEWSRC=~/.newsrc
set AWKFILE=/usr/ken/cmd/lib/newsweed.awk
onintr
echo Searching for articles in all newsgroups
readnews -l $* | sort -o ${TEMP}a
if (-z ${TEMP}a) then
    echo No news.
else
    cp ${TEMP}a ${TEMP}b
    echo Please remove article titles which you do not wish to read
    sleep 1
    onintr -
    vi ${TEMP}b
    onintr cleanup
    if ( { cmp -s ${TEMP}a ${TEMP}b } ) then
        echo No articles deleted.
    else
        comm -23 ${TEMP}a ${TEMP}b | sed 's/ .*//' > ${TEMP}c
        echo Removing unwanted articles
        cp $NEWSRC $NEWSRC.old
        awk -f $AWKFILE $NEWSRC.old ${TEMP}c > ${TEMP}d
        cp ${TEMP}d $NEWSRC
    endif
endif
cleanup:
rm ${TEMP}?
!Funky!Stuff!
echo x - bin/csh_scripts/pathname
cat >bin/csh_scripts/pathname <<'!Funky!Stuff!'
#
foreach cmddir ($path)
    if ( -e $cmddir/$1 ) echo " $cmddir/$1"
end
!Funky!Stuff!
echo x - bin/local
mkdir bin/local
echo x - bin/local/format
cat >bin/local/format <<'!Funky!Stuff!'
#
if ($#argv == 0) then
    set progname=$0
    set progname=$progname:t
    echo 'Usage:' $progname '[-v] [-n] [-print] [-troffflags] <filename> [ <filename> ... ]'
    exit (1)
endif
set flags
set formatter="vtroff -t"
set eqnsetter=eqn
set docsuf=v
set longdocsuf=vpr
set more=0
foreach name ($argv)
    if ($more > 0) then
        set flags="$flags $name"
        @ more--
        continue
    endif
    switch ($name)
        case -*:
            switch ($name)
                case -print:
                    set print
                    continue
                case -v:
                    set formatter="vtroff -t"
                    set eqnsetter=eqn
                    set docsuf=v
                    set longdocsuf=vpr
                    continue
                case -n:
                    set formatter=nroff
                    set eqnsetter=neqn
                    set docsuf=d
                    set longdocsuf=doc
                    continue
                case -[F123]:
                    set more=1
                default:
                    set flags="$flags $name"
            endsw
            continue
        case *.et:
            set outfile=$name:r.$docsuf
            eval soelim $name | tbl | $eqnsetter | $formatter $flags > $outfile
            breaksw
        case *.t:
            set outfile=$name:r.$docsuf
            eval soelim $name | tbl | $formatter $flags > $outfile
            breaksw
        case *.tbl:
            set outfile=$name:r.$longdocsuf
            eval soelim $name | tbl | $formatter $flags > $outfile
            breaksw
        case *.e:
            set outfile=$name:r.$docsuf
            eval $eqnsetter $name | $formatter $flags > $outfile
            breaksw
        case *.eqn:
            set outfile=$name:r.$longdocsuf
            eval $eqnsetter $name | $formatter $flags > $outfile
            breaksw
        case *.n:
            set outfile=$name:r.$docsuf
            eval $formatter $flags $name > $outfile
            breaksw
        case *.nr:
            set outfile=$name:r.$longdocsuf
            eval $formatter $flags $name > $outfile
            breaksw
        default:
            echo Don\'t know what to do with $name
            continue
    endsw
    if ($?print) then
        if ("$formatter" == nroff) then
            vpr $outfile
        else
            vpr -t $outfile
        endif
    endif
end
!Funky!Stuff!
echo x - bin/local/lntree
cat >bin/local/lntree <<'!Funky!Stuff!'
PATH=/usr/local/bin:/usr/ucb:/bin:/usr/bin
if test $1 = -v
then
    verbose=1
    shift
else
    verbose=0
fi
case $2 in
    /*)
        target=$2 ;;
    *)
        target=`pwd`/$2 ;;
esac
if test -f $2
then
    echo Error: $2 is not a directory
    exit 1
fi
cd $1
source=`pwd`
if test `expr $target : $source/` != 0
then
    echo Error: $2 may be a subdirectory of $1
    echo Try using the full path name of $2 \(no ..\'s\)
    exit 1
fi
if test $verbose = 1
then
    set -x
fi
files=`type -f`
case $files in
    "") ;;
    *)
        ln $files $target ;;
esac
for directory in `find '' -type d -a -print`
do
    mkdir $target$directory
    cd $source$directory
    files=`type -f`
    case $files in
        "") ;;
        *)
            ln $files $target$directory ;;
    esac
done
!Funky!Stuff!
echo x - bin/local/lookdoc
cat >bin/local/lookdoc <<'!Funky!Stuff!'
#
if ($#argv == 0) then
        more
        exit
endif
set macros pipespec args
foreach name ($argv)
    switch ($name)
        case -n:
            set pipespec=n
            breaksw
        case -t:
            set pipespec=t
            breaksw
        case -m*:
            set macros="$macros $name"
            breaksw
        case *.n:
        case *.nr:
            if ($pipespec != t) set pipespec=n
            set args="$args $name"
            breaksw
        case *.t:
        case *.tbl:
            set pipespec=t
            set args="$args $name"
            breaksw
        default:
            set args="$args $name"
    endsw
end

switch ($pipespec)
    case n:
        nroff $macros $args | more
        breaksw
    case t:
        soelim $args | tbl | nroff $macros - | col | more
        breaksw
    default:
        more $name
        breaksw
endsw
!Funky!Stuff!
echo x - bin/local/newsweed
cat >bin/local/newsweed <<'!Funky!Stuff!'
TEMP=/tmp/weed$$
NEWSRC=$HOME/.newsrc
AWKFILE=/usr/local/lib/newsweed.awk
trap 'rm ${TEMP}?; exit' 0 2
echo Making list of article titles
readnews -l $* | sort -o ${TEMP}a
if test -s ${TEMP}a
then
    cp ${TEMP}a ${TEMP}b
    echo Please remove article titles which you do not wish to read
    sleep 1
    reset       # So that vi's CRLF doesn't get trashed by another vi
    ${EDITOR-vi} ${TEMP}b
    if cmp -s ${TEMP}a ${TEMP}b
    then
        echo No articles deleted.
    else
        comm -23 ${TEMP}a ${TEMP}b | sed 's/ .*//' > ${TEMP}c
        echo Removing unwanted articles
        cp $NEWSRC $NEWSRC.old
        awk -f $AWKFILE $NEWSRC.old ${TEMP}c > ${TEMP}d
        cp ${TEMP}d $NEWSRC
    fi
else
    echo No news.
fi
!Funky!Stuff!
echo x - bin/local/nmail
cat >bin/local/nmail <<'!Funky!Stuff!'
#/bin/csh
set found = 0
set arg = 1
while($arg <= $#argv)
        if(`echo $argv[$arg] | grep \!` != "") then
                set tuple = `echo $argv[$arg] | sed s/\\!/\ /`
                set upath = `uupath $tuple[1]`
                set found = $status
                set argv[$arg] = "$upath\!$tuple[2]"
        else
                set found = 0
        endif
        if($found != 0) then
                set argv[$arg]
        endif
        @ arg = $arg + 1
end
echo "mail $argv"
mail $argv

!Funky!Stuff!
echo x - bin/local/peopledata
cat >bin/local/peopledata <<'!Funky!Stuff!'
peoplefile=$HOME/.peopledata

echo ' '

case $# in
    0)
        ed - $peoplefile << EOF
g/./s/$/\\
/
g/      /s//\\
/g
1,\$p
q
EOF
    exit ;;
esac

case $1 in
    -)
        chmod 600 $peoplefile
        vi $peoplefile
        chmod 400 $peoplefile
        exit ;;
esac
trap "rm /tmp/data$$; exit" 0 2
for name
do
    grep -y "$name" $peoplefile >> /tmp/data$$
done
ed - /tmp/data$$ << EOF
g/./s/$/\\
/
g/      /s//\\
/g
1,\$p
q
EOF
!Funky!Stuff!
echo x - bin/local/phone
cat >bin/local/phone <<'!Funky!Stuff!'
peoplefile=$HOME/.peopledata

case $# in
    0)
        ed - $peoplefile << EOF
        v/-/d
        g/./s/\([^      ]*\)[^-]*       \(.*-.*\)/\1    \2/
        1,\$p
EOF
        exit ;;
esac

case $1 in
    -)
        chmod 600 $peoplefile
        vi $peoplefile
        chmod 400 $peoplefile
        exit ;;
esac

trap "rm /tmp/data$$; exit" 0 2
for name
do
    grep -y "$name" $peoplefile >> /tmp/data$$
done
ed - /tmp/data$$ << EOF
g/./s/\([^      ]*\)[^-]*       \(.*-.*\)/\1    \2/
1,\$p
q
EOF
!Funky!Stuff!
echo x - bin/local/pk
cat >bin/local/pk <<'!Funky!Stuff!'
for dir
do echo "mkdir $dir";
        for file in `file $dir/* | sed -n '/text$/s/:[^:]*$//p'`
        do      echo "echo x - $file"
                echo "cat >$file <<'#EOF#'"
                cat $file; echo "#EOF#"
        done
        pk `file $dir/* | sed -n '/directory$/s/:.*//p'`
done
!Funky!Stuff!
echo x - bin/local/save
cat >bin/local/save <<'!Funky!Stuff!'
#
if ("$1" =~ -*) then
    set suffix=`expr $1 : '-\(.*\)'`
    shift
    foreach file ($argv)
        if (`expr $file:t : '.*'` >= 11) then
            set savename=`expr $file : '\(.*\)'$file:t`
            set savename=$savename`expr $file:t : '\(...........\)'`
        else
            set savename=$file
        endif
        cp $file ${savename}_$suffix && \
                echo $file saved as ${savename}_$suffix
    end
    exit
endif
foreach file ($argv)
    if (`expr $file:t : '.*'` >= 11) then
        set savename=`expr $file : '\(.*\)'$file:t`
        set savename=$savename`expr $file:t : '\(...........\)'`
    else
        set savename=$file
    endif

    set nonomatch
    set latest=(${savename}_[0-9][0-9])
    if ("$latest" == "${savename}_[0-9][0-9]") then
        set latest=${savename}_01
    else
        set latest=$latest[$#latest]
        set latest=`expr $latest : '.*_\([0123456789]*\)$' + 1`
        if ($latest < 10) set latest=0$latest
        set latest=${savename}_$latest
    endif
    cp $file $latest && echo $file saved as $latest
end
!Funky!Stuff!
echo x - bin/local/shar
cat >bin/local/shar <<'!Funky!Stuff!'
: Roff, nroff, or eqn input text
for file in `file $* | sed -n '/eqn input text$/s/:[^:]*$//p'`
do
    echo "echo x - $file"
    echo "sed 's/^x//' >$file <<'!Funky!Stuff!'"
    sed 's/^/x/' $file; echo "!Funky!Stuff!"
done
: Text files
for file in `file $* | sed -n -e '/eqn input text$/d' -e '/text$/s/:[^:]*$//p'`
do
    echo "echo x - $file"
    echo "cat >$file <<'!Funky!Stuff!'"
    cat $file; echo "!Funky!Stuff!"
done
: Directories, recursively
for dir in `file $* | sed -n '/directory$/s/:.*//p'`
do
    echo "echo x - $dir"
    echo "mkdir $dir"
    file=`echo $dir/*`
    test "$file" != "$dir/*" && $0 $file
done
!Funky!Stuff!
echo x - bin/local/uuhosts
cat >bin/local/uuhosts <<'!Funky!Stuff!'
#!/bin/sh
# '@(#) uuhosts.sh 1.22 84/08/07'

# PATH will have to be adjusted for non-BSD systems.
PATH=/usr/local/bin:/usr/ucb:/bin:/usr/bin
LIB=/usr/lib

# Routing information produced by pathalias.
paths=$LIB/nmail.paths

# The directory $NEWSMAP should contain the USENET news map information
# from newsgroup net.news.map that is posted about once a month from
# cbosgd!map, extracted by a line like this in $LIB/news/sys:
#
#       newsmap:net.news.map:B:/usr/local/uuhosts -x
#
# Locally-known information should go in $LIB/news/net.news.map/Local.
# The directory $MAILMAP is extracted by the same command from the
# UUCP mail information posted to the same newsgroup.
NEWSMAP=$LIB/news/net.news.map
MAILMAP=$LIB/news/net.mail.map
cd $NEWSMAP

case $1 in
        -x)
                # extract a new map piece into the map directory
                temphead=/tmp/maphead.$$
                temptext=/tmp/maptext.$$
                awk '
BEGIN   {
        temphead = "'$temphead'";
        isnewsmap = 0; ismailmap = 0;
        shead = 0; stext = 1; snews = 2; smail = 3; scat = 4; scatting = 5;
        state = shead;
        print "Reply-To: news" >> temphead;
}
state == shead && /^From: /     {
        print "Original-" $0 >> temphead;
}
state == shead && /^Subject: /  {
        if ($2 != "Re:")
        for (x = 2; x <= NF; x++) {
                if ($x == "UUCPmap" || $x == "uucpmap" || $x == "UUCPMAP") {
                        ismailmap = 1;
                        break;
                }
                if ($x == "map" || $x == "Map" || $x == "MAP") {
                        if (x <= 2)
                                continue;
                        x--;
                        if ($x == "USENET") {
                                isnewsmap = 1;
                                break;
                        }
                        if ($x == "UUCP") {
                                ismailmap = 1;
                                break;
                        }
                        x++;
                }
        }
        if (!isnewsmap && !ismailmap) {
                print "Subject:  not a map update" >> temphead;
                print "Original-" $0 >> temphead;
        } else
                print $0 >> temphead;
}
state == shead && /^$/  {
        if (isnewsmap != 0)
                state = snews;
        else if (ismailmap != 0) {
                state = scat;
        } else
                state = stext;
        next;
}
state == scat   {
        if ($1 != "cat")
                state = scatting;
        else
                state = smail;
}
state == scatting {
        if ($1 == ":")
                state = smail;
        else
                print;
}
state == smail  {
        print | "uuhosts -u";
}
state == snews  {
        print | "/bin/sh";
}
state == stext  {
        print;
}
' > $temptext 2>&1
                cat $temphead $temptext | /bin/mail news
                rm -f $temphead $temptext
                exit 0
        ;;

        -u)
                # extract a UUCP map piece
                cd $MAILMAP
                /bin/sh
                for f in *map*.a *map*.ar
                do
                        ar xv $f
                        rm $f
                done
        ;;

        -g)
                # by geographical region
                shift
                if test $# -eq 0
                then
                        exec ls
                        exit 1
                fi
                exec cat $*
                exit 1
        ;;

        -k)
                # by keyword
                shift
                exec awk '
BEGIN           { inside = 1; outside = 0; state = outside; }
/^Name:/        { state = inside; count = 0; useit = 0; }
state == inside { block[count++] = $0; }
/'"$*"'/        { useit = 1; }
/^$/ && state == inside {
        if (useit == 1) {
                for (i = 0; i < count; i++) {
                        print block[i];
                }
        }
        state = outside;
}
' *
                exit 1
        ;;

        -*)
                # unknown option
        ;;

        "")
                # no arguments
        ;;

        *)
                # by site name
                for arg in $*
                do
                        echo 'UUCP mail path:'
                        grep '^'${arg} $paths
                        echo '
UUCP mail host information:'
                        cat $MAILMAP/${arg}* | tr % '\012'
                        echo '
USENET news host information:'
                        sed -n -e "/^Name:[     ]*${arg}/,/^$/p" *
                done
                exit 0
        ;;
esac

echo 'Usage:    'uuhosts' hostname ...
for information about a particular UUCP or USENET host or hosts, or

        'uuhosts' -g geographical-region
for information about USENET news sites in a geographical region, or

        'uuhosts' -g
for a list of known USENET geographical-regions.
'
exit 1
!Funky!Stuff!

::::::::::::::
shells/4
::::::::::::::
Date: Fri, 14 Sep 84 15:06:07 pdt
From: hplabs!sdcrdcf!sdcsvax!celerity!barto (David Barto)
To: sdcsvax!sdcrdcf!hplabs!resonex!nancy
Subject: Re: Tricks, shell and awk scripts, csh aliases and the like

Hi Nancy,
        I too am a 'new' system admin, and belive me, it won't take
        you too long to get quite a bag of tricks put together.

        Most of mine relate to source programs put together in
        shell scripts to keep track of things.

        I have 1 for news (at the end of the article) which keeps
        the active list up to date.

        Another nice program is one I call '#'.  It is owned by root
        and setuid/setgid to root/daemon.  I use it to 'become' root
        while doing 1 command
                        # mv file1 file2
        which requires root permission.  It checks to see the normal
        userid is 'me' and then allows the command.  I will send it
        along if you want it.

        I have shell scripts for doing things such as 'rootedit'
        a file.  This is an alias for "alias re  '# vi -v \!*'"

        I too would love to see the things you get back from the
        net.  As well I have a sendmail config setup for making
        your configuration a breeze.  If you want it I can send
        it under seperate cover.


        barto (david barto)     Tele : (619) 271 9940
        uucp : {decvax || ucbvax || ihnp4}!sdcsvax!celerity!barto
        uucp : akgua!celerity!barto
        arpa : sdcsvax!celerity!barto@NOSC


: This is a shar archive.  Extract with sh, not csh.
echo x - Mkactive
cat > Mkactive << '!Funky!Stuff!'
#!/bin/sh
# see Update.active for this usage
#
sed -e '1,/---/d'\
        -e '1,/---/d'\
        -e 's/^[        ]//'\
        -e 's/  \(.*\)//'\
        active.current | sort | sed -e '1,/Newsgroup/d' > current
sed -e 's/ \(.*\)//' /usr/new/lib/news/active | sort > active
diff active current > /tmp/active.diff
echo "# active newsgroups not in local active file:"
fgrep ">" /tmp/active.diff
echo "# defunct newsgroups still in active file (also local groups):"
fgrep "<" /tmp/active.diff
/bin/rm current active /tmp/active.diff
!Funky!Stuff!
echo x - Mkdead
cat > Mkdead << '!Funky!Stuff!'
#!/bin/sh
# see Update.active for usage
# change all groups that we have (but shouldn't) to be removed,
# and change all groups that we dont have (but sould) to be a comment
sed     -e '/general/d'\
        -e '/control/d' \
        -e '/junk/d' \
        -e 's/</rmgroup/' \
        -e 's/>/#/'
!Funky!Stuff!
echo x - rmgroup
cat > rmgroup << '!Funky!Stuff!'
#! /bin/sh
# from : sdcsvax!sdcrdcf!hplabs!hao!seismo!rlgvax!cvl!umcp-cs!eneevax!chris
#
# @(#)rmgroup.sh        (U of Maryland) FLB 28-Jun-1983
#                       Bug fixes 5 June 1984 Chris Torek
#
# Delete a newsgroup

lib=/usr/new/lib/news
spool=/usr/spool/news

group=$*

for group
do
        qgrp="`echo $group | sed 's/\./\\\./g'`"
        if
                grep -s "^$qgrp [0-9][0-9][0-9][0-9][0-9]$" $lib/active
        then
                ed - $lib/active << xxxFOOxxx
/^$qgrp [0-9][0-9][0-9][0-9][0-9]$/d
w
q
xxxFOOxxx
        else
                echo "$0: $group: no such active line" 2>&1
        fi

        dir=$spool/"`echo $group | sed 's/\./\//g'`"
        if
                [ -d "$dir" ]
        then
                /bin/rm -fr "$dir"
        else
                echo "$0: $dir: no spool directory" 2>&1
        fi
done
exit 0
!Funky!Stuff!

::::::::::::::
shells/5
::::::::::::::
Date: Thu, 20 Sep 84 01:20:29 pdt
From: turtlevax!ken (Ken Turkowski)
To: resonex!nancy
Subject: Handy new uucp utility: uuque

cat << EOF
I just completed a new useful uucp utility which lets you know what kind
of uucp work is in progress.  While uusnap just tells you the number of
files to be processed, uuque tells you exactly what kind of work is to
be performed.  I've only tried it on three kinds of work, namely mail,
news, and standard uucp transfers.  Give it a try, and see if it breaks
on any new types of uucp work.
                                Ken
P.S. This really should be a C program.
EOF
echo x - uuque
cat >uuque <<'!Funky!Stuff!'
#! /bin/sh
# uusnap
cd /usr/spool/uucp
LUUNAME=`uuname -l`

# Check for outgoing work
for cmdfile in C./*
do
    test -f $cmdfile || continue
    othersys=`expr $cmdfile : 'C./C.\(.*\).....'`
    cmd=
    dfile=
    xfile=
    ufile=
    cat $cmdfile | {
        while read cmd arg1 arg2 arg3 extra
        do
            case $cmd in
                S) ;;
                *)  echo Bad cmd in $cmdfile: $cmd $arg1 $arg2 $arg3 $extra
                    exit ;;
            esac
            case $arg1 in
                D.${LUUNAME}X????)      # Remote execute file
                    xfile=$arg1
                    ;;
                D.${LUUNAME}?????)      # Data file ref'd by the execute file
                    dfile=$arg1
                    ;;
                *)                      # Just a uucp
                    dfile=$arg1
                    ufile=$arg2
                    from=$arg3
                    ;;
            esac
        done
        case $xfile in
            "")                 # uucp transfer
                echo `wc -c < $dfile`\   uucp $dfile $othersys!$ufile \($from\)
                ;;
            *)                  # complex transfer
                cat D.${LUUNAME}X/$xfile | {
                    while read xcmd arg1 arg2 extra
                    do
                        case $xcmd in
                            U)
                                from=$arg2!$arg1
                                ;;
                            F)
                                ;;
                            I)
                                ;;
                            C)
                                echo `wc -c < D.${LUUNAME}/$dfile`\      $arg1 $othersys!$arg2 \($from\)
                                ;;
                            *)
                                echo Unknown xcmd in $xfile: $xcmd $arg1 $arg2
                                exit
                                ;;
                        esac
                    done
                }
                ;;
        esac
    }
done

# Check for incoming work
for cmdfile in X./*
do
    test -f $cmdfile || continue
    othersys=`expr $cmdfile : 'X./X.\(.*\).....'`
    cat $cmdfile | {
        while read cmd arg1 arg2 extra
        do
            case $cmd in
                U)
                    from=$arg2!$arg1
                    ;;
                Z)
                    ;;
                F)
                    if test -f D./$arg1
                    then
                        dfile=D./$arg1
                    elif test -f D./$arg2
                    then
                        dfile=D./$arg2
                    else
                        continue 2
                    fi
                    ;;
                C)
                    xcmd=$arg1
                    ;;
                *)  echo Bad cmd in $cmdfile: $cmd $arg1 $arg2 $extra
                    exit ;;
            esac
        done
        echo `wc -c < $dfile`\   $xcmd $dfile \($from\)
    }
done
!Funky!Stuff!

::::::::::::::
shells/6
::::::::::::::
Date: Sat, 22 Sep 84 01:22:39 pdt
From: turtlevax!ken (Ken Turkowski)
To: resonex!nancy
Subject: Re:  uuque

I've updated uuque to the point where it should probably instead be called
uusnoop.  Of course, it's not that interesting unless there are others on
your system that use uucp and net mail.

                        Ken

echo x - uuque
cat >uuque <<'!Funky!Stuff!'
#! /bin/sh
# The user must have access to the /usr/spool/uucp/* directories and files.
# This can be easily done by making certain users members of the daemon
# and/or uucp groups, or by becoming super-user.
# uusnap
cd /usr/spool/uucp
LUUNAME=`uuname -l`

# Check for outgoing work
for cmdfile in C./*
do
    test -f $cmdfile || continue
    othersys=`expr $cmdfile : 'C./C.\(.*\).....'`
    cmd=
    dfile=
    xfile=
    ufile=
    cat $cmdfile | {
        while read cmd arg1 arg2 arg3 extra
        do
            case $cmd in
                S)                              # uucp send
                    case $arg1 in
                        D.${LUUNAME}X????)      # Remote execute file
                            xfile=$arg1
                            ;;
                        D.${LUUNAME}?????)      # Data file ref'd by xfile
                            dfile=D.${LUUNAME}/$arg1
                            ;;
                        *)              # Just a uucp -- no intertpretation
                            echo `wc -c < $arg1`\        uucp $arg1 $othersys!$arg2 \($arg3\)
                            ;;
                    esac
                    ;;
                R)              # uucp receive
                    echo '      ' uucp $othersys!$arg1 $arg2 \($arg3\)
                    ;;
                *)  echo Bad cmd in $cmdfile: $cmd $arg1 $arg2 $arg3 $extra
                    continue ;;
            esac
        done
        case $xfile in
            "")                 # uucp transfer
                continue
                ;;
        esac
        cat D.${LUUNAME}X/$xfile | {    # complex transfer -- interpret xfile
            while read xcmd arg1 arg2 extra
            do
                case $xcmd in
                    U)
                        from=$arg2!$arg1
                        ;;
                    F)
                        ;;
                    I)
                        ;;
                    Z)
                        ;;
                    C)
                        case $arg1 in
                            rmail)
                                from=`head -1 $dfile | ( read arg1 arg2 extra; echo $arg2 )`
                                echo `wc -c < $dfile`\   $arg1 $othersys!$arg2 \($from\)
                                echo -n '        '
                                grep '^Subject:' $dfile || echo ''
                                ;;
                            rnews)
                                echo `wc -c < $dfile`\   $arg1 $othersys  \($from\)
                                echo -n '        '
                                grep '^Newsgroups:' $dfile
                                echo -n '        '
                                grep '^Subject:' $dfile
                                ;;
                            *)
                                echo `wc -c < $dfile`\   $arg1 $arg2 $extra [$othersys $dfile] \($from\)
                                ;;
                        esac
                        ;;
                    *)
                        echo Unknown xcmd in $xfile: $xcmd $arg1 $arg2
                        exit
                        ;;
                esac
            done
        }
    }
done

# Check for incoming work
for cmdfile in X./*
do
    test -f $cmdfile || continue
    othersys=`expr $cmdfile : 'X./X.\(.*\).....'`
    comment=
    cat $cmdfile | {
        while read cmd arg1 arg2 extra
        do
            case $cmd in
                U)
                    from=$arg2!$arg1
                    ;;
                Z)
                    ;;
                I)
                    ;;
                F)
                    if test -f D./$arg1
                    then
                        dfile=D./$arg1
                    elif test -f XTMP/$arg2
                    then
                        dfile=XTMP/$arg2
                        comment="(EXECUTING)"
                    else
                        continue 2
                    fi
                    ;;
                C)
                    xcmd=$arg1
                    xargs="$arg2 $extra"
                    case $arg1 in
                        rmail)
                            from=$othersys!`head -1 $dfile | ( read arg1 arg2 extra; echo $arg2 )`
                            echo -n '    '
                            grep '^Subject:' $dfile || echo ''
                            ;;
                    esac
                    ;;
                *)  echo Bad cmd in $cmdfile: $cmd $arg1 $arg2 $extra
                    continue ;;
            esac
        done
        echo `wc -c < $dfile`\   $xcmd $xargs $comment \($from\)
    }
done
!Funky!Stuff!



From: Nancy Blachman <decvax!decwrl!sun!idi!resonex!nancy@Ucb-Vax.ARPA>
To: net.unix, net.unix-wizards, net.sources
Subject: Actual tricks, shells, csh aliases and the like, 3 of 3
Date: 16 Oct 84 21:24:32 GMT
Organization: Resonex Inc., Sunnyvale, CA

> [Know anybody with a GREAT .login or .cshrc?]

> I'm interested in collecting the little tricks, shell scripts, awk
> hacks, csh aliases, and such that people have built to make their daily
> life a little easier or more automatic.  Being a fairly new system
> administrator I don't have the big toolbox that years of messing around
> will leave you with.  If you have any hacks you're proud of (or that
> you aren't proud of, but which work anyway), and you're willing to make
> them public, mail them to me.  I'll collect, collate, shuffle, sort,
> munge, judge, select and discard them and then "summarize to the net".

This article centers on C programs and awk scripts I received in response to
my solicitation.  The first article concentrates on  aliases, and .cshrc and
.login files.  The second article in this series focuses shell scripts.

/\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\/
> Nancy Blachman {allegra,hplabs,ihnp4,sun}!resonex!nancy  (408)720 8600 x37 <
/\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\/

::::::::::::::
programs/1
::::::::::::::
Date: Sat, 15 Sep 84 02:45:08 pdt
From: <hplabs!intelca!t4test!chip>
To: intelca!hplabs!resonex!nancy
Subject: Re: Tricks, shell and awk scripts, csh aliases and the like

One thing I've put together is a bunch of scripts which give you a
status line on a DEC type terminal.  The thing is hardwired into VTxxx
type stuff rather than termcap for two reasons.  First, the cursor
save/restore function isn't part of termcap.  Secondly, the set
scrolling region is part of termcap, but it is for VT100 type
terminals.  Since we only have DEC terminals, it doesn't hurt us too
much.

Some history:  I used to like to display my current working directory
on my prompt line.  Later I wanted my terminal line there too.  (That
was in case a terminal I was on locked up, I could quickly tell what
terminal to kill.)  Later, when I had four accounts on the machine I
thought it would be nice to display my login name in my prompt.  The
straw which broke the camel's back was that we bought another VAX, and
I wanted to be able to see which machine I was logged on.  As you might
imagine, my prompt now extended about 60 columns across the screen.  My
answer was to take everything out of my prompt except the history
number and stick it at a status line at the bottom of my screen.

Below is a shar archive of the status line files.  You do a `source
stat.init' to get stuff initialized.  Then `son' and `soff' (which are
aliased to source the two other scripts) turn the status line on and
off.  These also define a bunch of aliases which help you work with
programs which don't like the status line.  So, I put a `source
/usr/public/stat.init' followed by a `son' in my `.login'.  (I don't
turn it on with my `.cshrc', my shell escapes would then get awfully
sloooooow.)

Also, you would need to add `vt100s' and `vt131s' to /etc/termcap.
This is to keep screen stuff (e.g. more, vi, etc.) happy if you run
them with the status line on.  This is what I use:

    ################      VT131 with 24th line reserved
    ################ d13s|vt131s|VT131S|vt-131s|pt131s|pt-131s|dec
    vt131s:\
            :li#23:tc=vt131

You will definately want to change the terminal identification stuff in
`stat.init'.  We run Eunice, so I use the `grep' to convert the Unix
style terminal line identification to a VMS terminal port.

You can redefine `statin' in the `stat.init' script to put whatever you
want on the status line.

Well...after all this, I hope you use VT1xx/VT2xx terminals.
Otherwise, this won't be real exciting.  (Unless you want to rewrite
`statterm.c')

---

Chip Rosenthal, Intel/Santa Clara
{ idi|intelca|icalqa|kremvax|qubix|ucscc } ! t4test ! { chip|news }

-----  cut here  -----------------------------------------------------------

: This is a shar archive.  Extract with sh, not csh.
: This archive contains the following files
:  Makefile stat.init stat.on stat.off statterm.c
: Total number of files: 5
echo x - Makefile [file 1 of 5]
sed 's/^|//' > Makefile << '!-FUNKY-STUFF-!'
|BIN=   /usr/public
|OBJS=  statterm
|
|IOBJS= $(BIN)/statterm \
|       $(BIN)/stat.init \
|       $(BIN)/stat.on \
|       $(BIN)/stat.off
|
|SOURCES=Makefile \
|       stat.init \
|       stat.on \
|       stat.off \
|       statterm.c
|
|all:           $(OBJS)
|install:       $(IOBJS)
|shar:          stat.shar
|
|statterm:              statterm.c
|                       cc -O statterm.c -o statterm
|
|$(BIN)/statterm:       statterm
|                       cp $? $@
|                       chmod 755 $@
|
|$(BIN)/stat.init:      stat.init
|                       cp $? $@
|                       chmod 755 $@
|
|$(BIN)/stat.on:                stat.on
|                       cp $? $@
|                       chmod 755 $@
|
|$(BIN)/stat.off:       stat.off
|                       cp $? $@
|                       chmod 755 $@
|
|stat.shar:             $(SOURCES)
|                       shar $(SOURCES) > $@
|
|
!-FUNKY-STUFF-!
echo x - stat.init [file 2 of 5]
sed 's/^|//' > stat.init << '!-FUNKY-STUFF-!'
|alias a 'alias'
|
|# run statterm to verify terminal can do status line
|statterm
|if $status then
|    # status line not available on this terminal -- see if a
|    # baseterm is defined.  if so, then maybe $TERM is just
|    # messed up from earlier invocation of stat.init.
|    if $?baseterm then
|       # baseterm has been defined -- see if it will work
|       set temp=$TERM
|       setenv TERM $baseterm
|       statterm
|       if $status then
|           # nope -- baseterm will not work either
|           setenv TERM $temp
|           unset temp
|           goto failed
|       else
|           # yes -- baseterm will work
|           echo "changing terminal type from $temp to $TERM"
|           unset temp
|       endif
|    else
|       # no baseterm defined
|       goto failed
|    endif
|endif
|
|# status line will work with this terminal
|set baseterm=$TERM
|set ignoreeof
|
|# find user's system (ick)
|set system=`tr '[A-Z]' '[a-z]' < /usr/include/whoami`
|
|# find user's tty (ick ick ick)
|set temp=`tty`'$'
|set tty=`grep "$temp" /etc/dev.com | sed -e 's/^.*_\(.*\):.*/\1/'`
|unset temp
|
|# setup terminal strings
|set statin="`statterm in '${system}\\!${user}' '(${tty})'`"
|set statout="`statterm out`"
|set statoff="`statterm off`"
|echo -n "$statoff"
|
|# setup status commands
|#   son - turn on status mode
|#   soff - turn off status mode
|#   stat - draw status line
|#   nostat - erase status line
|#   termstat - setenv the terminal with status line protected
|#   termnorm - setenv the terminal without a status line
|#   ns - execute a command without a status line
|a son          'source /usr/public/stat.on'
|a soff         'source /usr/public/stat.off'
|a stat         ';'
|a nostat       ';'
|a termstat     ';'
|a termnorm     ';'
|a ns           'nostat ; termnorm ; \!* ; termstat ; stat ; echo ""'
|
|# alias the commands which maintain the status line
|a cd           'chdir \!* ; stat'
|a popd         'popd ; stat'
|a pushd                'pushd \!* ; stat'
|
|# alias the commands which (might) munch the status line
|a clear                'clear \!* ; stat'
|a mail         'mail \!* ; stat'
|a more         'more \!* ; stat'
|
|# alias the commands which should be done with the status line off
|a lo           'ns logout \!*'
|a LO           'ns logout \!*'
|a rn           'ns /local/bin/rn \!*'
|a pn           'ns /local/bin/pn \!*'
|a reply                'ns /local/bin/reply \!*'
|a sus          'ns suspend \!*'
|a vi           'ns /usr/ucb/vi \!*'
|a view         'ns /usr/ucb/view \!*'
|
|# that is all folks.  the status stuff is initialized
|# now all you need is a 'son' to turn it on
|exit 0
|
|failed:
|set baseterm=$TERM
|set temp="status line is not available for terminal type $TERM"
|echo $temp
|set statin=";"
|set statout=";"
|if     $?statoff == 0 then
|    set statoff=";"
|endif
|alias son echo "$temp"
|alias off 'source /usr/public/stat.off'
|unset temp
|soff
|exit 1
|
!-FUNKY-STUFF-!
echo x - stat.on [file 3 of 5]
sed 's/^|//' > stat.on << '!-FUNKY-STUFF-!'
|a stat         'echo -n "${statin}${cwd}${statout}"'
|a nostat       'echo -n "$statoff"'
|a termstat     'setenv TERM ${baseterm}s'
|a termnorm     'setenv TERM $baseterm'
|termstat
|stat
|echo ""
|set statmode
!-FUNKY-STUFF-!
echo x - stat.off [file 4 of 5]
sed 's/^|//' > stat.off << '!-FUNKY-STUFF-!'
|setenv TERM $baseterm
|echo -n "$statoff"
|unset statmode
|a termstat     ';'
|a termnorm     ';'
|a stat ';'
|a nostat ';'
!-FUNKY-STUFF-!
echo x - statterm.c [file 5 of 5]
sed 's/^|//' > statterm.c << '!-FUNKY-STUFF-!'
|/*
| * FILE:       statterm
| * VERSION:    V0.01 [preliminary]
| * DATE:       Mon Aug 27 16:43:13 PDT 1984
| * AUTHOR:      Chip Rosenthal/Intel Corporation
| * ADDRESS:    t4test!chip
| * PACKAGE:     'stat' terminal status line package
| * DESCRIPTION:        produces terminal escape sequences to implement status line
| * COMPILATION: cc -C statterm.c -o statterm
| *
| * REVISION NOTES:
| *
| * V1.00  Original program.
| *
| *
| * USAGE:
| *
| *    statterm
| *        Verifies that the status line will work with current terminal.
| *        Returns a zero exit status if it will, nonzero if it won't.
| *
| *    statterm in [arg ...]
| *        Creates a string which opens up the status line.  Any
| *        arguments are placed at the beginning of the status
| *        line, and the cursor is left there.
| *
| *    statterm out
| *        Create string which closes the status line and returns
| *        cursor to position it was in prior to the last execution
| *        of a 'statterm in' string.
| *
| *    statterm off
| *        Creates a string which removes the status line.
| *
| *
| *    EXAMPLE:
| *        # this is a cshell script
| *        statterm
| *        if $status then
| *            echo "status line will not work on this terminal"
| *            exit
| *        endif
| *        echo -n `statterm in $user`
| *        echo -n `pwd`
| *        echo `statterm out`
| *
| *
| * BUGS:
| *
| *    This program is hardwired into the DEC VT100 terminal escape sequences.
| *    This is done because (unfortunately) 'termcap' doesn't offer a cursor
| *    position save/restore feature.
| *
| */
|
|#include <stdio.h>
|#define strmatch(A,B) (strcmp((A),(B))==0)
|
|/*
| * VT100 Terminal Escape Definitions -- all parameters are strings
| */
|#define ESC          putchar(27);              /* escape character          */
|#define CSI          ESC;putchar('[');         /* command string            */
|#define DECSC        ESC;putchar('7');         /* save cursor position      */
|#define DECRC        ESC;putchar('8');         /* restore cursor position   */
|#define CUP(L,C)      CSI;printf("%s;%sH",L,C); /* set cursor to line/col    */
|#define CUU1         CSI;printf("1A");        /* cursor up one line        */
|#define CUD1         CSI;printf("1B");        /* cursor down one line      */
|#define EL(MODE)      CSI;printf("%sK",MODE);   /* erase line                */
|#define ED(MODE)      CSI;printf("%sJ",MODE);   /* erase display             */
|#define DECSETBM(T,B) CSI;printf("%s;%sr",T,B); /* top/bot of scroll area    */
|/*
| * erasing modes:
| *   mode "0" - from cursor to end
| *   mode "1" - from beginning to cursor
| *   mode "2" - entire
| */
|
|
|main(argc,argv)
|int argc;
|char *argv[];
|{
|    char *term, *getenv();
|    int i;
|
|    if ( argc == 1 ) {
|       term=getenv("TERM");
|       if ( term == NULL )
|           exit(1);
|       if ( strmatch(term,"vt100") || strmatch(term,"vt131") )
|           exit(0);
|       else
|           exit(1);
|    }
|
|    if ( strmatch(argv[1],"in") ) {
|       /*
|        * Save cursor position, go to line 24, print out the arguments, and
|        * erase the rest of the status line.  Cursor remains in status line.
|        */
|       DECSC;
|       CUP("24","1");
|       for ( i=2 ; i<argc ; ++i )
|           printf("%s  ",argv[i]);
|       EL("0");
|    } else if ( strmatch(argv[1],"out") ) {
|       /*
|        * Protect status line from scrolling and restore cursor to location
|        * prior to the last 'in' call.  Move the cursor up and down one line.
|        * This will keep it out of the status line area if it was there when
|        * 'in' was called.
|        */
|       DECSETBM("1","23");
|       DECRC;
|       CUU1;
|       CUD1;
|    } else if ( strmatch(argv[1],"off") ) {
|       /*
|        * Save the current cursor position, unprotect the status line, erase
|        * the status line, and restore the cursor position.
|        */
|       DECSC;
|       DECSETBM("1","24");
|       CUP("24","1");
|       EL("2");
|       DECRC;
|    } else
|       exit(1);
|
|}
!-FUNKY-STUFF-!
exit



::::::::::::::
programs/2
::::::::::::::
From: ihnp4!mcnc!malloy@ittral
Date: Thu, 13 Sep 84 21:35:18 edt
To: ihnp4!resonex!nancy@mcnc
Subject: Tricks

Well it depends upon what you mean. The big problem with having lots of aliases
and such is they start taking up large amounts of memory.  Take it from someone
who knows.  But here's a few things.  Some you no doubt already have, and most
are trivial, but it's better to be complete then to leave anything out.  You
can always just delete this.    == William P. Malloy (ittral!malloy}
---------------------------------------------------------------------
In a .cshrc, a warning and a work around.  Apparently not known by most people
but obvious to people have who been around.  Our users keep bumping into it
about once a year like clock work.
# reason for setting variables only if a prompt already exists
# If it sets prompt in a non-interactive shell, for instance vi(1)
# firing up a sub-shell to expand shell meta-characters, the set prompt
# will stomp on alot of shell variables used for the expansion (like ~)
#
if ( $?prompt ) then
   set mail=/usr/spool/mail/malloy
   set prompt=\`
   set histchars=",;"
endif
Note the setting of histchars.  A little known, but for me much loved feature
of csh is the ability to change the history characters "!^" from their default
values.  The pair `,;' are easier to reach, don't require shifting, and don't
appear in mail paths.  Typing `mail mcnc\!ihnp4\!resonex\!nancy' gets to be
a pain every time you want to mail someone.

alias , 'redo \,* ~/.cmd ~/.cmd1 ; source ~/.cmd1 '

This little alias allows you to have command editing in the csh.  It's quite
useful, particularly when you've got a LONG painful command line.  The , is
just the history character and is ! for most people.  The command redo is a
simple C program.
--------------- redo.c  -------------------
#include <stdio.h>

/* redo -- outputs a command file (last arg )used to edit and
   re-ex a command.  Next to last arg is dest file of the command.

   NOTE: if you use a non-standard history character, i.e. not !
   then you must `setenv HISTCHARS $histchars' in your .login
   If you do not `set histchars=",;"' for instance then it will
   automagically default to !    -- 12/2/83 wpm

   First arg is the history ref . To use:
    alias , 'redo \,* ~/cmd ~/cmd1 ; source ~/cmd1 '
    , 25    to edit & re-execute ,25
    , , or ,  to edit & re-execute ,,
    , v     to edit & re-execute ,v ,etc.

*/

main(argc, argv)
   int argc;
   char *argv[];
{
   FILE *fp;
   char *t, *getenv();

   fp = fopen(argv[argc-1], "w");
   if ((t = getenv("HISTCHARS")) != NULL)
      t[1] = '\0';
   else
      t = "!";
   fprintf(fp, "echo \"%s", t);
   if ( (argc < 4) || (strcmp(argv[1], t) == 0) )
      fputs("-2", fp);
   else
      fputs(argv[1], fp);
   fputs(":q\" >! ", fp);
   fputs(argv[argc-2], fp);
   putc('\n', fp);
   fputs("ex +open ", fp);
   fputs(argv[argc-2], fp);
   putc('\n', fp);
   fputs("/usr/local/typein2 < ", fp);
   fputs(argv[argc-2], fp);
   putc('\n', fp);
   fclose(fp);
   exit(0);
}
------------------ (end of redo.c, begining of typein2.c) --------------------
#include <stdio.h>
#include <sgtty.h>

main(argc, argv)
        int argc;
        char **argv;
{
        register char *cp;
        struct sgttyb stb, stb2;
        int pendin = LPENDIN;
        int c,i,j;
        char buff[2];
        char buff2[256];

        i=0;
        while ((c=getchar()) != EOF) {
                        buff2[i++]=c;
        }
        ioctl(2, TIOCGETP, &stb);
        stb2 = stb;
        stb.sg_flags &= ~ECHO;
        ioctl(2, TIOCSETN, &stb);
        for (j=0; j<i; j++) {
                        ioctl(2, TIOCSTI, &buff2[j]);
                        putchar(buff2[j]);
        }
        ioctl(2, TIOCSETN, &stb2);
        ioctl(2, TIOCLBIS, &pendin);
        exit(0);
}
---------------------------- (end of typein2.c) ------------------------
A couple of oldies but still the simplest.  cd and back aliases.
alias back 'set back=$old; set old=$cwd; cd $back; unset back; dirs'
alias cd 'set old=$cwd; chdir \,*; set prompt = "< $cwd:t > "'

# this is a useful feature for vi
setenv EXINIT 'map #1 Gi/\<A\>"add@a|map #2 1G\!Gvispell|set ai sw=3'

You f2 key will run a file through the spell program, and put the words it
doesn't find in the dictionary at the bottom of the file.  Then typing f1 will
cause it to delete the last line in the file, and search for the string in
the rest of the file.
------------------------------ (source for vispell) -------------
#! /bin/sh
#
tee /tmp/vis$$
echo SpellingList
spell /tmp/vis$$
rm /tmp/vis$$
------------------------------- (end of vispell) ------------------
Stuff from our /.cshrc file.  psa lets you see what's going on in the system
and what people are doing.  Useful to see if people are hanging themselves.
alias psa 'ps axu | sed "/getty/d" | sort -f | more'

A simple alias to compile C programs (C adm.c expands to cc adm.c -o adm).
alias C 'cc \,:* -o \,^:r'

Useful to see what's going on in the system without those !@#$% bells.
alias moremsgs "tr -d '\07' </usr/adm/messages | more"

Like fg.
alias pj '%-'

A feature we use in our root .cshrc allowing indivual superusers to get their
own enviornment.  Useful if people want their own enviornment anywhere people
share an account.
if ( $user == "malloy" ) then
   source /t/malloy/.root
endif

--------------- (here's some things I picked up off the net) --------------
From: ittvax!decvax!harpo!utah-cs!seismo!hao!denelcor!udenva!koala!aburt
Date: Fri Aug 10 09:19:37 1984
Subject: Perversions of source -h and other csh aliases
Newsgroups: net.unix,net.unix-wizards,net.sources

For your enjoyment, here are some interesting lunch hour csh aliases that
I've created.
{this is to slow, my version is a little faster}
My personal favorite is the "history editor" -- allows you to edit
you csh history.  The alias:

        alias hed history -h !* > $hed; vi + $hed; source -h $hed

will allow you to invoke 'vi' on your current history.  (If, for
instance, you typed in a long, tedious line and put in an extra space,
among other things.  The ^...^...  mechanism to remove it can be quite
tedious; 'hed's is easy.)  Before anyone starts flaming that vi is too
slow, history can do it (even if it's tough to type and you're prone to
more typos doing the history), etc. -- if you don't like it, don't use it.

Hed works particularly well if you move the command in question to the
end of the file; then '!!' will execute it after you ZZ from vi.  The
only drawback to this is that it trashes your current event numbers
(they get incremented during the source -h).  By using 'hed 10' you
only edit the last 10 entries in your history.  A temp file, which I
keep in $hed (set to /tmp/hed.$$ from my .login), is used each time for
the history.  Obvious changes to this are to use /tmp/hed.$$ straight
out and add "rm /tmp/hed.$$" to the end of the list.  If you don't like
waiting for the rm, and your /tmp doesn't get cleared out periodically,
put a # in front of the name to make it a disposable file.

This may be slower than the vi/emacs mode in the ksh I keep hearing about, but
it does give the functionality.

A slight modification to 'hed'...

        alias hedf history -h !-0:1 > !-0:2; vi + !-0:2; source -h !-0:2

allows you to specify a file to place the history into instead of a temp
file.

Another modification yields:

        alias heh echo \!* > $hed; vi + $hed; source -h $hed

Which lets you edit then add to your history a specific history sequence.
'Heh' for History edit history.

By inserting a 'source \!-0:2' before the source -h in any of the
above has the effect of executing the commands AND placing them on the
history list (from which we may conclude that 'alias so source \!* ;
source -h \!*' is a useful item: it sources a file then places each line
into your history).

On rare occasions you'll have to put extra quotes/escapes around things
when editing the temp file so it gets sourced right.  Particularly around
aliases with raw history substitutions in them (the \!* type of thing).
The easiest is to try it first; if it fails, edit it again.  After all,
two 'hed's are better than one...

Regarding the use of !-0:1 instead of !:1 for the first argument to the
current command -- At least one csh is known to accept the former but not
the latter.  (The same csh dumps core (therefore logging you out) on receipt
of the !# history selector.  This is version 1.0 of 4.2BSD csh on a Sun-2.
The 1.1 csh exhibits this behavior:

        echo a !#
        a echo a echo

adding an extra arg 0 to the end.  Is this common to other cshs out there?)

So, for those whose csh's allow !:1, use that where I have !-0:1, etc.

Another interesting perversion is an alias'd whereis:

        alias wheres ls -l \{'`echo $path | sed "s/ /,/g"`'\}/'`echo \!-0:1 | sed "s/^./[&]/"`'

It does an ls -l on every file (passed as arg 1) in any directory on
your current path.  (No aliases, though adding an if at the front
should do the trick.)  The idea is to turn your $path list into a comma
separates list, stick that between {}, and append / and arg 1 to that.
Alas, if the file doesn't exist in one of the directories, you get
errors from ls saying it doesn't exist in a given directory.  So, arg 1
is turned into a pattern, which is allowed to fail; the pattern is,
e.g., foo --> [f]oo.  So the second arg to ls only expands to the
existing files.
---------------------------- (end of net article) ------------------------
--
Address: William P. Malloy, ITT Telecom, B & CC Engineering Group, Raleigh NC
         {ihnp4!mcnc, burl, ncsu, decvax!ittvax}!ittral!malloy


::::::::::::::
awk/1
::::::::::::::
Date:       Wed, 19 Sep 84 11:44:38 CST
From: David Chase <hplabs!ucbvax!rbbb@rice.ARPA>
Subject:    Re: Tricks, shell and awk scripts, csh aliases and the like
To: resonex!nancy@BERKELEY

Here is my favorite awk script.  It turns a list of csrc's from memory
errors on an 11/780 (with MS780C controller) into board and chip position
for certain Mostek memory boards.  This script saved me many headaches,
because the tables in the appendix of the technical manual were hard to read
and contained errors (errors that were noticed as deviations from a pattern
when entering this script).

#
# Incredible sleazy awk file to attack memory errors
# Included here is the local configuration, because some decoding
# is board specific
#
BEGIN   {
# Boards understood by this program

#       mk4118 = mostek mk8016 fully populated with mk4116 chips (512k)
        known["mk4118"] = 1

#       mk4116 = mostek mk8016 half populated with mk4116 chips (256k)
        known["mk4116"] = 1

#       mk8016 = mostek mk8016 fully populated with mk4108 chips (256k)
        known["mk4108"] = 1

#       m8210 = DEC 256k board; don't know how to decode this guy (256k)
        known["m8210"] = 0

# To add different boards, (i.e., not conforming to this system)
# append to the "pos" map, and make "keys[<array><bank><new board>]"
# reference the appended chip addresses.

# Local configuration
# boards is indexed by slot number
        boards["0"] = "m8210"
        boards["1"] = "m8210"
        boards["2"] = "m8210"
        boards["3"] = "m8210"
        boards["4"] = "m8210"
        boards["5"] = "m8210"
        boards["6"] = "mk4116"
        boards["7"] = "mk4116"
        boards["8"] = "mk4116"
        boards["9"] = "mk4116"
        boards["a"] = "mk4116"
        boards["b"] = "mk4116"
        boards["c"] = "mk4118"
        boards["d"] = "mk4118"
        boards["e"] = "mk4118"
        boards["f"] = "mk4118"

#       bit in error for a given CRC calculation
#       bits are identified by "u" (upper), "l" (lower), and "c" (check)
#       folowed by the bit number.

        bit["01"] = "c0"
        bit["02"] = "c1"
        bit["04"] = "c2"
        bit["08"] = "c3"
        bit["10"] = "c4"
        bit["19"] = "l01"
        bit["1a"] = "l02"
        bit["1c"] = "l04"
        bit["1f"] = "l07"
        bit["20"] = "c5"
        bit["38"] = "l00"
        bit["3b"] = "l03"
        bit["3d"] = "l05"
        bit["3e"] = "l06"
        bit["40"] = "c6"
        bit["49"] = "l09"
        bit["4a"] = "l10"
        bit["4c"] = "l12"
        bit["4f"] = "l15"
        bit["51"] = "l17"
        bit["52"] = "l18"
        bit["54"] = "l20"
        bit["57"] = "l23"
        bit["58"] = "l24"
        bit["5b"] = "l27"
        bit["5d"] = "l29"
        bit["5e"] = "l30"
        bit["68"] = "l08"
        bit["6b"] = "l11"
        bit["6d"] = "l13"
        bit["6e"] = "l14"
        bit["70"] = "l16"
        bit["73"] = "l19"
        bit["75"] = "l21"
        bit["76"] = "l22"
        bit["79"] = "l25"
        bit["7a"] = "l26"
        bit["7c"] = "l28"
        bit["7e"] = "l31"
        bit["80"] = "c7"
        bit["89"] = "u01"
        bit["8a"] = "u02"
        bit["8c"] = "u04"
        bit["8f"] = "u07"
        bit["91"] = "u09"
        bit["92"] = "u10"
        bit["94"] = "u12"
        bit["97"] = "u15"
        bit["98"] = "u16"
        bit["9b"] = "u19"
        bit["9d"] = "u21"
        bit["9e"] = "u22"
        bit["a8"] = "u00"
        bit["ab"] = "u03"
        bit["ad"] = "u05"
        bit["ae"] = "u06"
        bit["b0"] = "u08"
        bit["b3"] = "u11"
        bit["b5"] = "u13"
        bit["b6"] = "u14"
        bit["b9"] = "u17"
        bit["ba"] = "u18"
        bit["bc"] = "u20"
        bit["bf"] = "u23"
        bit["c1"] = "u25"
        bit["c2"] = "u26"
        bit["c4"] = "u28"
        bit["c7"] = "u31"
        bit["e0"] = "u24"
        bit["e3"] = "u27"
        bit["e5"] = "u29"
        bit["e6"] = "u30"

#       binary decoding of hex digits

        hex["0"]  = "0000"
        hex["1"]  = "0001"
        hex["2"]  = "0010"
        hex["3"]  = "0011"
        hex["4"]  = "0100"
        hex["5"]  = "0101"
        hex["6"]  = "0110"
        hex["7"]  = "0111"
        hex["8"]  = "1000"
        hex["9"]  = "1001"
        hex["a"]  = "1010"
        hex["b"]  = "1011"
        hex["c"]  = "1100"
        hex["d"]  = "1101"
        hex["e"]  = "1110"
        hex["f"]  = "1111"

#       chip positions for a given bit, collected across all possible
#       boards.  Each group of 3 letters represents a position.
#       See keys for a better description.

        pos["u31"] =  "i01h01g01f01"
        pos["u30"] =  "e01d01c01b01"
        pos["u29"] =  "i02h02g02f02"
        pos["u28"] =  "e02d02c02b02"
        pos["u27"] =  "i03h03g03f03"
        pos["u26"] =  "e03d03c03b03"
        pos["u25"] =  "i04h04g04f04"
        pos["u24"] =  "e04d04c04b04"
        pos["u23"] =  "a01a02a03a04"
        pos["u22"] =  "i05h05g05f05"
        pos["u21"] =  "e05d05c05b05"
        pos["u20"] =  "i06h06g06f06"
        pos["u19"] =  "e06d06c06b06"
        pos["u18"] =  "i07h07g07f07"
        pos["u17"] =  "e07d07c07b07"
        pos["u16"] =  "i08h08g08f08"
        pos["u15"] =  "e08d08c08b08"
        pos["u14"] =  "a05a06a07a08"
        pos["u13"] =  "i09h09g09f09"
        pos["u12"] =  "e09d09c09b09"
        pos["u11"] =  "i10h10g10f10"
        pos["u10"] =  "e10d10c10b10"
        pos["u09"] =  "i11h11g11f11"
        pos["u08"] =  "e11d11c11b11"
        pos["u07"] =  "i12h12g12f12"
        pos["u06"] =  "e12d12c12b12"
        pos["u05"] =  "a09a10a11a12"
        pos["u04"] =  "i13h13g13f13"
        pos["u03"] =  "e13d13c13b13"
        pos["u02"] =  "i14h14g14f14"
        pos["u01"] =  "e14d14c14b14"
        pos["u00"] =  "i15h15g15f15"
        pos["c7"] =   "e15d15c15b15"
        pos["c6"] =   "i16h16g16f16"
        pos["c5"] =   "e16d16c16b16"
        pos["c4"] =   "a13a14a15a16"
        pos["l31"] =  "i17h17g17f17"
        pos["l30"] =  "e17d17c17b17"
        pos["l29"] =  "i18h18g18f18"
        pos["l28"] =  "e18d18c18b18"
        pos["l27"] =  "i19h19g19f19"
        pos["l26"] =  "e19d19c19b19"
        pos["l25"] =  "i20h20g20f20"
        pos["l24"] =  "e20d20c20b20"
        pos["l23"] =  "a17a18a19a20"
        pos["l22"] =  "i21h21g21f21"
        pos["l21"] =  "e21d21c21b21"
        pos["l20"] =  "i22h22g22f22"
        pos["l19"] =  "e22d22c22b22"
        pos["l18"] =  "i23h23g23f23"
        pos["l17"] =  "e23d23c23b23"
        pos["l16"] =  "i24h24g24f24"
        pos["l15"] =  "e24d24c24b24"
        pos["l14"] =  "a21a22a23a24"
        pos["l13"] =  "i25h25g25f25"
        pos["l12"] =  "e25d25c25b25"
        pos["l11"] =  "i26h26g26f26"
        pos["l10"] =  "e26d26c26b26"
        pos["l09"] =  "i27h27g27f27"
        pos["l08"] =  "e27d27c27b27"
        pos["l07"] =  "i28h28g28f28"
        pos["l06"] =  "e28d28c28b28"
        pos["l05"] =  "a25a26a27a28"
        pos["l04"] =  "i29h29g29f29"
        pos["l03"] =  "e29d29c29b29"
        pos["l02"] =  "i30h30g30f30"
        pos["l01"] =  "e30d30c30b30"
        pos["l00"] =  "i31h31g31f31"
        pos["c3"] =   "e31d31c31b31"
        pos["c2"] =   "i32h32g32f32"
        pos["c1"] =   "e32d32c32b32"
        pos["c0"] =   "a29a30a31a32"

#       keys is indexed by <board #> <bank> <board type>
#       and yields an index into  a particular pos string
#       for example, board 0, bit 0 on an mk4118 board
#       gives a key of 4.  If the bit in error was c0, then
#       the chip in error is a32 (from the 4th group of 3
#       in pos["c0"].  To change this map, create new keys
#       and (if necessary) append to the pos entries.
#       If it could be more than one chip, then use a multiple
#       digit key (e.g, see the keys for the mk4108 board).

        keys["00mk4118"] = "4"
        keys["20mk4118"] = "4"
        keys["40mk4118"] = "4"
        keys["60mk4118"] = "4"
        keys["80mk4118"] = "4"
        keys["a0mk4118"] = "4"
        keys["c0mk4118"] = "4"
        keys["e0mk4118"] = "4"
        keys["01mk4118"] = "2"
        keys["21mk4118"] = "2"
        keys["41mk4118"] = "2"
        keys["61mk4118"] = "2"
        keys["81mk4118"] = "2"
        keys["a1mk4118"] = "2"
        keys["c1mk4118"] = "2"
        keys["e1mk4118"] = "2"
        keys["10mk4118"] = "3"
        keys["30mk4118"] = "3"
        keys["50mk4118"] = "3"
        keys["70mk4118"] = "3"
        keys["90mk4118"] = "3"
        keys["b0mk4118"] = "3"
        keys["d0mk4118"] = "3"
        keys["f0mk4118"] = "3"
        keys["11mk4118"] = "1"
        keys["31mk4118"] = "1"
        keys["51mk4118"] = "1"
        keys["71mk4118"] = "1"
        keys["91mk4118"] = "1"
        keys["b1mk4118"] = "1"
        keys["d1mk4118"] = "1"
        keys["f1mk4118"] = "1"

        keys["00mk4116"] = "4"
        keys["20mk4116"] = "4"
        keys["40mk4116"] = "4"
        keys["60mk4116"] = "4"
        keys["80mk4116"] = "4"
        keys["a0mk4116"] = "4"
        keys["c0mk4116"] = "4"
        keys["e0mk4116"] = "4"
        keys["01mk4116"] = "2"
        keys["21mk4116"] = "2"
        keys["41mk4116"] = "2"
        keys["61mk4116"] = "2"
        keys["81mk4116"] = "2"
        keys["a1mk4116"] = "2"
        keys["c1mk4116"] = "2"
        keys["e1mk4116"] = "2"
        keys["10mk4116"] = "4"
        keys["30mk4116"] = "4"
        keys["50mk4116"] = "4"
        keys["70mk4116"] = "4"
        keys["90mk4116"] = "4"
        keys["b0mk4116"] = "4"
        keys["d0mk4116"] = "4"
        keys["f0mk4116"] = "4"
        keys["11mk4116"] = "2"
        keys["31mk4116"] = "2"
        keys["51mk4116"] = "2"
        keys["71mk4116"] = "2"
        keys["91mk4116"] = "2"
        keys["b1mk4116"] = "2"
        keys["d1mk4116"] = "2"
        keys["f1mk4116"] = "2"

        keys["00mk4108"] = "34"
        keys["20mk4108"] = "34"
        keys["40mk4108"] = "34"
        keys["60mk4108"] = "34"
        keys["80mk4108"] = "34"
        keys["a0mk4108"] = "34"
        keys["c0mk4108"] = "34"
        keys["e0mk4108"] = "34"
        keys["01mk4108"] = "12"
        keys["21mk4108"] = "12"
        keys["41mk4108"] = "12"
        keys["61mk4108"] = "12"
        keys["81mk4108"] = "12"
        keys["a1mk4108"] = "12"
        keys["c1mk4108"] = "12"
        keys["e1mk4108"] = "12"
        keys["10mk4108"] = "34"
        keys["30mk4108"] = "34"
        keys["50mk4108"] = "34"
        keys["70mk4108"] = "34"
        keys["90mk4108"] = "34"
        keys["b0mk4108"] = "34"
        keys["d0mk4108"] = "34"
        keys["f0mk4108"] = "34"
        keys["11mk4108"] = "12"
        keys["31mk4108"] = "12"
        keys["51mk4108"] = "12"
        keys["71mk4108"] = "12"
        keys["91mk4108"] = "12"
        keys["b1mk4108"] = "12"
        keys["d1mk4108"] = "12"
        keys["f1mk4108"] = "12"
        }

        {csrc     = $1
        syndrome = substr (csrc,7,2)
        board    = substr (csrc,2,1)
        boardtype = boards[board]
        bank     = substr (hex [substr (csrc,3,1)],1,1)
        chips    = bit[syndrome]
        if (known[boardtype])
        {  where         = pos[chips]
           key   = keys[board bank boardtype]
           sbegin   = 3 * (substr(key,1,1) - 1) + 1
           thechip  = substr(where,sbegin,3)
           if (length(key) > 1)
           {   sbegin   = 3 * (substr(key,2,1) - 1) + 1
               thechip  = thechip " and/or " substr(where,sbegin,3)
           }
#          printf "\n"
#          print "csrc =      " csrc
#          print "syndrome =  " syndrome
#          print "board =     " board
#          print "bank =      " bank
#          print "chips =     " chips
#          print "locations = " where
#          print "boardtype = " boardtype
#          print "key =       " key
#          print "the chip is " thechip
           errors[board "-" thechip]++;
        }
        else
        {
#          printf "\n"
#          print "Board type " boardtype " is unknown"
           errors["unknown-unknown"]++;
        }
}

END { for (i in errors) {
        n = split(i,list,"-");
        printf "%d errors for board %s, chip %s\n",errors[i],list[1],list[2];
        }
}

