[mod.sources] v09i001: ELM Mail System, Part01/19

sources-request@mirror.UUCP (03/09/87)

Submitted by: Dave Taylor <hplabs!taylor>
Mod.sources: Volume 9, Issue 1
Archive-name: elm2/Part01

[  Dave tells me this is probably the final release of ELM; I hope
   not -- what will I use to start off Volume 10? :-)  --r$  ]

#! /bin/sh
# This is a shell archive.  Remove anything before this line,
# then unpack it by saving it in a file and typing "sh file".
# If this archive is complete, you will see the message:
#		"End of archive 1 (of 19)."
# Contents:  bin doc doc/Elm.coversheet doc/answer.1 doc/autoreply.1
#   doc/checkalias.1 doc/elm-help.0 doc/elm-help.1 doc/elm-help.2
#   doc/elmrc.sample doc/filter.1 doc/from.1 doc/listalias.1
#   doc/messages.1 doc/newalias.1 doc/newmail.1 doc/printmail.1
#   doc/trim-headers.1 doc/wnewmail.1 filter filter/Makefile
#   filter/Makefile.mstr hdrs hdrs/curses.h hdrs/save_opts.h src
#   src/delete.c src/getopt.c src/output_utils.c src/pmalloc.c
#   src/quit.c src/remail.c src/signals.c src/string2.c
#   src/validname.c test test/test.empty utils utils/listalias.c
#   utils/mailrc.awk utils/trim-headers
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test ! -d bin ; then
    echo shar: Creating directory \"bin\"
    mkdir bin
fi
if test ! -d doc ; then
    echo shar: Creating directory \"doc\"
    mkdir doc
fi
echo shar: Extracting \"doc/Elm.coversheet\" \(526 characters\)
if test -f doc/Elm.coversheet ; then 
  echo shar: Will not over-write existing file \"doc/Elm.coversheet\"
else
sed "s/^X//" >doc/Elm.coversheet <<'END_OF_doc/Elm.coversheet'
X.PH ""
X\"
X\"  Cover sheet for the ELM mail system...
X\"  format with 'troff -mm Elm.coversheet > Coversheet.fmtd'
X\"  or something similar.
X\"  (C) Copyright 1986 Dave Taylor
X\"
X.PF ""
X.ds HF 3  3 
X.ds HP 12 12
X.SA 1
X.nr Hy 1
X.nr Pt 1
X.nr Pi 8
X.lg 1
X.HM 1 1
X.rs
X.sp 11
X.ce 99
X.ps 25
X\fBThe \s26Elm\s25 Mail System\fR
X.sp 2
X.ps 14
X\fIA Replacement Mailer for All Unix Systems\fR
X.sp 8
XDave Taylor
X.sp 2
XHewlett-Packard Laboratories
X1501 Page Mill Road
XPalo Alto CA
X94304
X.sp 2
Xemail: taylor\s12@\s14hplabs \ or \ hplabs!taylor
END_OF_doc/Elm.coversheet
if test 526 -ne `wc -c <doc/Elm.coversheet`; then
    echo shar: \"doc/Elm.coversheet\" unpacked with wrong size!?
fi
# end of overwriting check
fi
echo shar: Extracting \"doc/answer.1\" \(1814 characters\)
if test -f doc/answer.1 ; then 
  echo shar: Will not over-write existing file \"doc/answer.1\"
else
sed "s/^X//" >doc/answer.1 <<'END_OF_doc/answer.1'
X.TH ANSWER 1L 
X.ad b
X.SH NAME
Xanswer - phone message transcription system
X.SH SYNOPSIS
X.B answer
X.PP
X.SH HP-UX COMPATIBILITY
X.TP 10
XLevel:
XHP-UX/CONTRIBUTED
X.TP
XOrigin:
XHewlett-Packard
X.SH DESCRIPTION
X.I Answer\^
Xis a part of the 
X.B Elm
Xmail system and is designed for secretaries and the like
Xto allow them to answer phones and|or listen to phone message
Xmachines and quickly and easily transcribe the messages into
Xelectronic mail.
X.P
XThe program uses it's own alias set (usually a subset of the
Xsystem aliases, with more fields per user (ie unique first
Xnames, unique last names, first-initial lastname, and so on)).
XNote this means that you must create and then install, using
X.I newalias,
Xa separate alias table for the account this program is to 
Xbe run from.
X.P
XInterface-wise, the program is a breeze to use - type 'answer'
Xto start it up and then merely type a user name at the
X.nf
X	
X	Message to:
X
X.fi
Xprompt, and then enter the message, ending with a blank line.
XNames can be entered as 'Firstname Lastname' and the system
Xwill try to find a mail alias based on the first letter of the
Xfirst name plus the last name.  For example, 'Dave Taylor'
Xwill cause the program to search for an alias 'd_taylor' in
Xthe file (note the transliteration into lower case).   The 
Xprogram will loop until killed or quit.
X.P
X.I Answer
Xcan be easily exited by typing any of 'quit', 'exit' 'done', 
Xor 'bye' at the 'Message to:' prompt.
X.SH AUTHOR
XDave Taylor, Hewlett-Packard Laboratories
X.SH SEE ALSO
X.I "Elm Alias Users Guide", 
Xby Dave Taylor
X.sp
X.br
Xnewalias(1L), checkalias(1L), mail(1), mailx(1), from(1L), printmail(1L)
X.SH FILES
X$home/.alias_hash             individual alias hash table
X.br
X$home/.alias_data             individual alias data table
X.br
X/tmp/snd*                     edit buffer for outgoing mail
END_OF_doc/answer.1
if test 1814 -ne `wc -c <doc/answer.1`; then
    echo shar: \"doc/answer.1\" unpacked with wrong size!?
fi
# end of overwriting check
fi
echo shar: Extracting \"doc/autoreply.1\" \(1836 characters\)
if test -f doc/autoreply.1 ; then 
  echo shar: Will not over-write existing file \"doc/autoreply.1\"
else
sed "s/^X//" >doc/autoreply.1 <<'END_OF_doc/autoreply.1'
X.TH AUTOREPLY 1L 
X.ad b
X.SH NAME
Xautoreply - Automatic mail reply system
X.SH SYNOPSIS
X.B autoreply
X.br
X.B "autoreply off"
X.br
X.B autoreply
X<
X.B filename
X>
X.PP
X.SH HP-UX COMPATIBILITY
X.TP 10
XSystems:
XAT&T System V and Berkeley BSD
X.TP
XOrigin:
XHewlett-Packard
X.SH DESCRIPTION
X.I Autoreply\^
Xis a part of the 
X.B Elm
Xmail system and is designed to enable users to easily set up
Xan automatic response to all mail they receive.  This is
Xtypically during a vacation or some other period of time that
Xthe user is not available to reply to mail (although some
Xpeople get enough mail that they have it permanently running
Xto simply send an "ack" to each message)
X.PP
XThe system is quite easy to use...
XYou can type "autoreply" and be informed of your current
Xstatus in the system (on or off), or "autoreply off" will
Xturn your autoreplying off.
X.PP
XTo add yourself to the system, you need merely to compose a
Xform response in a file somewhere, then type "autoreply <file>"
Xwhere <file> is the name of the file.
X.SH "SPECIAL NOTE"
XFor this to function correctly, the program "arepdaemon" must
Xbe running as a daemon in background.  This program automatically
Xchecks all the currently enrolled users for new mail in their
Xmailboxes...
X.SH AUTHOR
XDave Taylor, Hewlett-Packard Laboratories.
X.SH SEE ALSO
X.I "Elm Users Guide", 
Xby Dave Taylor
X.sp
X.br
Xmail(1), mailx(1), elm(1L)
X.SH "BUGS"
XUnfortunately, this program isn't too brilliant about identifying
Xmail that shouldn't be responded to (like mail from other
Xdaemons, or your mother) but that's a more general problem anyway.
X.sp
XAlso, occasionally a user will remove themselves from the
Xautoreply system and the system won't turn their autoreply
Xoff.  This is a problem that hasn't been solved yet (obviously
Xsince it's in the "bugs" section!!) and any further information
Xwould be appreciated!
END_OF_doc/autoreply.1
if test 1836 -ne `wc -c <doc/autoreply.1`; then
    echo shar: \"doc/autoreply.1\" unpacked with wrong size!?
fi
# end of overwriting check
fi
echo shar: Extracting \"doc/checkalias.1\" \(941 characters\)
if test -f doc/checkalias.1 ; then 
  echo shar: Will not over-write existing file \"doc/checkalias.1\"
else
sed "s/^X//" >doc/checkalias.1 <<'END_OF_doc/checkalias.1'
X.TH CHECKALIAS 1L
X.ad b
X.SH NAME
Xcheckalias - check to see if an alias is defined.
X.SH SYNOPSIS
X.B checkalias
Xalias, alias, ...
X.SH HP-UX COMPATIBILITY
X.TP 10
XLevel:
XHP-UX/CONTRIBUTED
X.TP
XOrigin:
XHewlett-Packard
X.SH DESCRIPTION
X.I Checkalias
Xchecks the user file first, and then the system alias file
Xto try to find the specified alias or aliases.  If found, 
Xthe value of the alias is printed out, otherwise an error
Xis generated.
X.P
XNote: this is in fact a one-line shell script;
X.nf
X
X	elm -c $*
X
X.fi
X.SH AUTHOR
XDave Taylor, Hewlett-Packard Laboratories
X.SH SEE\ ALSO
Xnewalias(1L), elm(1L), mail(1), mailx(1)
X.SH BUGS
XNote that the precedence of aliases is user file then system
Xfile.  This means that a user can 'overload' an alias by having
Xone defined in the system file also defined in theirs.  This
Xshouldn't turn out to be a problem, but is something for
Xthe system administrator to keep in mind when creating the
Xsystem alias file.
END_OF_doc/checkalias.1
if test 941 -ne `wc -c <doc/checkalias.1`; then
    echo shar: \"doc/checkalias.1\" unpacked with wrong size!?
fi
# end of overwriting check
fi
echo shar: Extracting \"doc/elm-help.0\" \(1802 characters\)
if test -f doc/elm-help.0 ; then 
  echo shar: Will not over-write existing file \"doc/elm-help.0\"
else
sed "s/^X//" >doc/elm-help.0 <<'END_OF_doc/elm-help.0'
X
X        Command                 	Action
X
X	   | 		Pipe current message to ...
X	   !		Shell escape
X	   $		Resynchronize mailbox (force it)
X           ?            This screen of information
X           +, <SPACE>   Next page of headers
X           -            Previous page of headers
X           =            Set current message to 1
X	   *		Set current message to last message
X           <n>          Set current message to n
X	   /		Search from/subjects for pattern
X	   //		Search entire message bodies for pattern
X	   >		Save current message or tagged to file
X	   <		Scan current message for calendar entries
X
X           a            Alias, change to 'alias' mode 
X	   b		Bounce (remail) current message
X           c            Change current mail file
X           d            Delete current message
X	  ^D		Delete messages with specified patter
X	   e		Edit the current mailbox
X           f            Forward message to specified user
X	   g            Group (all recipients) reply to message
X	   h		Headers displayed with message
X           j		Increment current message by one
X	   k		Decrement current message by one
X           m            Mail to arbitrary user(s)
X           n            Next message (Read current, then increment)
X	   o		Change Elm options
X	   p            print current message
X           q            Quit - mail deleted, saved in mbox or left.
X           r            Reply to current message
X           s            Save message to specified file
X	   t		Tag a message for further operations
X	  ^T		Tag messages with specified pattern
X           u            Undelete current message
X           x            Exit - don't record as read, don't save...
X
X          ^L            Rewrite screen.
X	  <RETURN>	Read current message
X	  ^Q, DEL	Exit - don't record as read, don't save...
END_OF_doc/elm-help.0
if test 1802 -ne `wc -c <doc/elm-help.0`; then
    echo shar: \"doc/elm-help.0\" unpacked with wrong size!?
fi
# end of overwriting check
fi
echo shar: Extracting \"doc/elm-help.1\" \(847 characters\)
if test -f doc/elm-help.1 ; then 
  echo shar: Will not over-write existing file \"doc/elm-help.1\"
else
sed "s/^X//" >doc/elm-help.1 <<'END_OF_doc/elm-help.1'
X
X                Commands available from the Options Menu
X
XChar    Meaning
X----    -------
X  c     Change `calendar' file to the file specified.  See '<' at top level 
X        menu for more information on this.
X
X  d     Display pager.  `builtin' will use the built-in pager, or you
X        can put anything else you'd like, including "/bin/more"
X
X  e     Editor to use when composing messages
X
X  f     Folder directory.  This is what '=', '+', or '%' expands to.
X
X  s     Sorting criteria.  Step through with space, <return> selects.
X
X  o     Outbound mail file.  Where to save copies of outbound mail.
X
X  p     How to print messages.  '%s' can be used as a filename holder
X
X  y     Your fullname for outbound mail.
X
X  a     arrow cursor.  Changes from "->" to inverse bar and back
X
X  m     display mini-menus or not.  Expert users usually don't.
END_OF_doc/elm-help.1
if test 847 -ne `wc -c <doc/elm-help.1`; then
    echo shar: \"doc/elm-help.1\" unpacked with wrong size!?
fi
# end of overwriting check
fi
echo shar: Extracting \"doc/elm-help.2\" \(462 characters\)
if test -f doc/elm-help.2 ; then 
  echo shar: Will not over-write existing file \"doc/elm-help.2\"
else
sed "s/^X//" >doc/elm-help.2 <<'END_OF_doc/elm-help.2'
X
X                Commands available from the Alias Menu
X
XChar    Meaning
X----    -------
X
X  ?     help on a specific key, or this summary of commands.
X
X  a     Add return address of current message to alias database
X
X  m     Make new user alias, adding to alias database when done
X
X  r,x   return from the alias menu
X                      
X  p     check for a person in the alias database
X        
X  s     check for a system in the host routing/domain database
X
END_OF_doc/elm-help.2
if test 462 -ne `wc -c <doc/elm-help.2`; then
    echo shar: \"doc/elm-help.2\" unpacked with wrong size!?
fi
# end of overwriting check
fi
echo shar: Extracting \"doc/elmrc.sample\" \(1520 characters\)
if test -f doc/elmrc.sample ; then 
  echo shar: Will not over-write existing file \"doc/elmrc.sample\"
else
sed "s/^X//" >doc/elmrc.sample <<'END_OF_doc/elmrc.sample'
X#
X# .msgrc - automatic variable defines for the 'msg' mailer.
X#
X# Personalized for ??
X# 
X
X# where to save my mail to, default directory
Xmaildir  = ~/Mail
X
X# where to save messages to, default file
Xmailbox  = ~/Mail/mailbox
X
X# what editor to use
Xeditor   = $EDITOR
X
X# where to save mail if not specified somewhere else
Xsavemail = ~/Mail/mail.sent
X
X# how to print a message ('%s' is the filename)
Xprint    = /usr/local/bin/print -p lpn -f %s
X
X# prefix sequence for including message text in other messages...
Xprefix = > 
X
X# what headers I DON'T want to see, ever.
X
Xweedout  = "Via:"  "Sent:"  "Date:"  "Status:"  "Original"
X	   "From"  "Phase"  "Subject:"  "Fruit"  "Sun"
X	   "Lat"  "Buzzword"  "Return"  "Posted" "Telephone"
X	   "Postal-Address" "Origin" "X-Sent-By-Nmail-V"
X	   "Resent" "X-Location"  "Source" "Mood"  "Neuron"
X	   "Libido" "To:" "X-Mailer:"  "Full-Name:" "X-HPMAIL"
X	   "Cc:" "cc:" "Mmdf" "Network-"
X
X# automatically copy message being replied to into buffer? 
Xautocopy = OFF
X
X# save a copy of all outbound messages? 
Xcopy     = ON
X
X# emulate the mailx message increment mode (only increment after something
X# has been 'done' to a message, either saved or deleted)
Xresolve  = ON
X
X# enable the weedout list to be read...
Xweed     = ON
X
X# when messages are copied into the outbound buffer, don't include headers
Xnoheader = ON
X
X# display message title when displaying pages of message
Xtitles	 = ON
X
X# alternative addresses that I could receive mail from (usually a
X# forwarding mailbox)
X
X# alternatives = 
END_OF_doc/elmrc.sample
if test 1520 -ne `wc -c <doc/elmrc.sample`; then
    echo shar: \"doc/elmrc.sample\" unpacked with wrong size!?
fi
# end of overwriting check
fi
echo shar: Extracting \"doc/filter.1\" \(2330 characters\)
if test -f doc/filter.1 ; then 
  echo shar: Will not over-write existing file \"doc/filter.1\"
else
sed "s/^X//" >doc/filter.1 <<'END_OF_doc/filter.1'
X.TH FILTER 1L
X.ad b
X.SH NAME
Xfilter - filter incoming messages before adding to mailbox
X.SH SYNOPSIS
X.B filter
X[-a]
X[-v]
X.br
X.B filter
X[-n]
X.br
X.B filter
X[-r]
X.br
X.B filter
X[-c] [-s]
X.br
X.B filter
X[-c] [-S]
X.SH HP-UX COMPATIBILITY
X.TP 10
XLevel:
XHP-UX/CONTRIBUTED
X.TP
XOrigin:
XHewlett-Packard Laboratories
X.SH DESCRIPTION
X.I Filter
Xis a sophisticated program that allows incoming mail to be
Xfiltered against a wide set of criteria.  The format for the
Xrules, located in $HOME/.filter_rules, is;
X.nf
X	
X	if (\fIcondition\fR) then \fIaction\fR
X
X.fi
Xwhere \fIcondition\fR can be any number of occurances of 
X``\fIfield\fR \fIrelationship\fR "\fIvalue\fR"'' joined by
X\fBand\fR statements and optionally prepended with a \fBnot\fR
Xstatement.  Note that the \fBor\fR statement is not currently
Xsupported as a logical conjunction.
X.sp
X\fIField\fR can be ``from'', ``subject'', ``to'',
X``lines'' or ``contains'', \fIrelationship\fR can be either `='
Xor, for ``lines'', `<', `>', `<=', `>=', or '!=' too.
X.nf
X
X	delete
X	save	 \fIfoldername\fR
X	savecopy \fIfoldername\fR
X	execute  \fIcommand\fR
X	forward  \fIaddress\fR
X	leave
X
X.fi
XThe flags are;
X.TP 1.0i
X.B "-a"
XAudible.  Output a beep with each filter action message (use with \fB-v\fR).
X.TP
X.B "-c"
XClear Logs.  If this flag is used, the log files will be removed after
Xbeing summarized by either "-s" or "-S" (see below).
X.TP
X.B "-n"
XNot-Really.  Output what would happen if given message from standard
Xinput, but don't actually do anything with it.
X.TP
X.B "-r"
XRules.  List the rules currently being used.
X.TP
X.B "-s"
XSummarize.  List a summary of the messages filtered since the last summary
Xand zero the log file.
X.TP
X.B "-S"
XSummarize in a more verbose format.
X.TP
X.B "-v"
XVerbose.  Give output on standard out for each message filtered.  Useful
Xto have redirected to ``/dev/console'' and such.  (see \fB-a\fR too).
X.SH AUTHOR
XDave Taylor, Hewlett-Packard Laboratories.
X.SH FILES
X$HOME/.filter-rules     The ruleset for the users filter
X.br
X$HOME/.filterlog        A log of what has been done
X.br
X$HOME/.filtersum        A summary of what has been done
X.br
X/etc/passwd             Used to get users home directory
X.SH SEE\ ALSO
X\fIThe Elm Filter Guide\fR, by Dave Taylor.
X.br
Xreadmsg(1L), elm(1L), mail(1), mailx(1), sendmail(1,8)
X.SH COMMENTS
XNot real smart about pattern matching.  
END_OF_doc/filter.1
if test 2330 -ne `wc -c <doc/filter.1`; then
    echo shar: \"doc/filter.1\" unpacked with wrong size!?
fi
# end of overwriting check
fi
echo shar: Extracting \"doc/from.1\" \(1055 characters\)
if test -f doc/from.1 ; then 
  echo shar: Will not over-write existing file \"doc/from.1\"
else
sed "s/^X//" >doc/from.1 <<'END_OF_doc/from.1'
X.TH FROM 1L
X.ad b
X.SH NAME
Xfrom - list from and subject of all messages in mailbox or file
X.SH SYNOPSIS
X.B from
X[-n]
X[ filename ]
X.br
X.B from
X[-n]
X[ username ]
X.SH HP-UX COMPATIBILITY
X.TP 10
XLevel:
XHP-UX/CONTRIBUTED
X.TP
XOrigin:
XHewlett-Packard
X.SH DESCRIPTION
X.I From
Xoutputs a line per message in the current users mailbox 
Xof the form;
X.PP
X<from> [subject]
X.PP
XIf a filename is specified, the program reads that file
Xrather than the default file.  If the argument is a
X\fIusername\fR then look for that users mailbox.
X.PP
XFurthermore, if the \fI-n\fR flag is specified, the headers
Xwill be numbered using the same numbering scheme that, for
Xexample, \fIreadmsg\fR will understand.
X.PP
XFilename can be specified with the same notation as
Xwhen invoking the \fBElm\fR mailer.
X.SH AUTHOR
XDave Taylor, Hewlett-Packard Laboratories.
X.SH SEE\ ALSO
Xreadmsg(1L), elm(1L), mail(1), mailx(1)
X.SH BUGS
XOccasionally it gets confused about whether a message has
Xa subject or not.  This, unfortunately, is due to the
Xvast number of possible headers in the messages...
END_OF_doc/from.1
if test 1055 -ne `wc -c <doc/from.1`; then
    echo shar: \"doc/from.1\" unpacked with wrong size!?
fi
# end of overwriting check
fi
echo shar: Extracting \"doc/listalias.1\" \(806 characters\)
if test -f doc/listalias.1 ; then 
  echo shar: Will not over-write existing file \"doc/listalias.1\"
else
sed "s/^X//" >doc/listalias.1 <<'END_OF_doc/listalias.1'
X.TH LISTALIAS 1L
X.ad b
X.SH NAME
Xlistalias - list user and system aliases
X.SH SYNOPSIS
X.B listalias
X[ regular-expression ]
X.SH HP-UX COMPATIBILITY
X.TP 10
XLevel:
XHP-UX/CONTRIBUTED
X.TP
XOrigin:
XHewlett-Packard Laboratories
X.SH DESCRIPTION
X.I Listalias
Xoutputs a line per alias in both the user and the system 
Xaliases.  Each line is of the form;
X.nf
X   
X   <alias>     <address>  (<comment>)
X
X.fi
XIf an optional regular expression is used, just the aliases
Xthat match the specified expression are listed.  If not, 
Xthey are all listed.
X.sp
XEither way, the output is sorted.
X.SH AUTHOR
XDave Taylor, Hewlett-Packard Laboratories.
X.SH SEE\ ALSO
Xnewalias(1L), elm(1L), checkalias(1L)
X.SH BUGS
XSince the program uses a pipe to egrep, how expressions are evaluated is
Xa function of \fIthat\fR program, not this one!
END_OF_doc/listalias.1
if test 806 -ne `wc -c <doc/listalias.1`; then
    echo shar: \"doc/listalias.1\" unpacked with wrong size!?
fi
# end of overwriting check
fi
echo shar: Extracting \"doc/messages.1\" \(518 characters\)
if test -f doc/messages.1 ; then 
  echo shar: Will not over-write existing file \"doc/messages.1\"
else
sed "s/^X//" >doc/messages.1 <<'END_OF_doc/messages.1'
X.TH MESSAGES 1L
X.ad b
X.SH NAME
Xmessages - quick count of messages in mailbox or folder
X.SH SYNOPSIS
X.B messages
X.br
X.B messages
Xfolder-name
X.SH HP-UX COMPATIBILITY
X.TP 10
XLevel:
XHP-UX/CONTRIBUTED
X.TP
XOrigin:
XHewlett-Packard
X.SH DESCRIPTION
X.I Messages
Xcounts the occurances of "^From\ " in either the current incoming 
Xmailbox or the specified folder.
X.P
XThis is, in fact, a simple little shell script!!
X.SH AUTHOR
XDave Taylor, Hewlett-Packard Laboratories
X.SH SEE\ ALSO
Xfrom(1L), elm(1L)
X.SH BUGS
XDon't be foolish...
END_OF_doc/messages.1
if test 518 -ne `wc -c <doc/messages.1`; then
    echo shar: \"doc/messages.1\" unpacked with wrong size!?
fi
# end of overwriting check
fi
echo shar: Extracting \"doc/newalias.1\" \(2407 characters\)
if test -f doc/newalias.1 ; then 
  echo shar: Will not over-write existing file \"doc/newalias.1\"
else
sed "s/^X//" >doc/newalias.1 <<'END_OF_doc/newalias.1'
X.TH NEWALIAS 1L
X.ad b
X.SH NAME
Xnewalias - install new elm aliases for user and/or system
X.SH SYNOPSIS
X.B newalias
X[-q]
X.SH HP-UX COMPATIBILITY
X.TP 10
XLevel:
XHP-UX/CONTRIBUTED
X.TP
XOrigin:
XHewlett-Packard
X.SH DESCRIPTION
X.I Newalias
Xcreates new hash and data files from a text file.  If the
Xprogram is invoked by any account other than the superuser
Xaccount, the program looks for a file 
Xcalled $home/.alias_text
Xand, upon finding it, creates files $home/.alias_hash and
X$home/.alias_data for the 
X.I Elm
Xprogram.
X.PP
XIf the superuser invokes the program, they are given the
Xoption of either updating their personal alias files or
Xthe system alias files.
XThe question can be supressed, with the default being
Xthe user files for the superuser, if the ``-q'' flag is
Xpresent upon invokation.
X.PP
XThe format that the program expects is;
X.sp
X.nf
X	alias, alias, .. : comment : address
Xor
X	alias, alias, .. : comment : alias, alias, ...
X   
XThe first form is for an individual user such as;
X
X	dave, taylor : Dave Taylor : veeger!hpcnou!dat
X
Xand the second is for defining a group alias such as;
X
X	gurus : Unix Gurus : alan, john, dave, mike, richard,
X		             larry, t_richardson
X
X.fi
X.sp
XNote that lines can be continued at will, blank lines are accepted
Xwithout error, and that any line starting with '#' is considered a
Xcomment and is not processed.
X.PP
XThe comment field is thrown away by this program, but it is 
Xrecommended that it contain the name of the user who the alias
Xis for.
X.PP
XFinally, aliases can contain other aliases, and/or groups;
X.sp
X.nf
X	unix : Unix people : gurus, taylor, jonboy
X.fi
X' onto the next page, if you please
X.sp 3
X.SH FILES
X$home/.alias_text               alias source for user 
X.br
X$home/.alias_hash               alias hash table for user
X.br
X$home/.alias_data               alias data file for user
X.br
X/usr/mail/.alias_text           alias source for system
X.br
X/usr/mail/.alias_hash           alias hash table for system
X.br
X/usr/mail/.alias_data           alias data file for system
X.SH AUTHOR
XDave Taylor, Hewlett-Packard Laboratories.
X.SH SEE\ ALSO
Xelm(1L), checkalias(1L), mail(1), mailx(1)
X.SH DIAGNOSTICS
XNewalias has a couple of descriptive error messages which
Xdon't need to be detailed here.  It is, however, worth
Xnoting that the
X.I checkalias
Xprogram can be used to ensure that the aliases are in the
Xproper order and are available for the 
X.I Elm
Xsystem.
END_OF_doc/newalias.1
if test 2407 -ne `wc -c <doc/newalias.1`; then
    echo shar: \"doc/newalias.1\" unpacked with wrong size!?
fi
# end of overwriting check
fi
echo shar: Extracting \"doc/newmail.1\" \(1377 characters\)
if test -f doc/newmail.1 ; then 
  echo shar: Will not over-write existing file \"doc/newmail.1\"
else
sed "s/^X//" >doc/newmail.1 <<'END_OF_doc/newmail.1'
X.TH NEWMAIL 1L 
X.ad b
X.SH NAME
Xnewmail - daemon to asynchronously notify of new mail
X.SH SYNOPSIS
X.B newmail
X.br
X.B newmail
Xfilename
X.PP
X.SH HP-UX COMPATIBILITY
X.TP 10
XLevel:
XHP-UX/CONTRIBUTED
X.TP
XOrigin:
XHewlett-Packard
X.SH DESCRIPTION
X.I Newmail\^
Xis a daemon designed to run in background and every 60 seconds
Xcheck to see if there is any new mail for the user that
Xstarted it up.
X.P
XIf there is new mail, the program will asynchronously write to
Xthe terminal that it was started on a message of the form
X.nf
X
X   New mail from <name> - <subject>
X
X.fi
Xwhere <name> is either the name of the person sending it,
Xif available (the ARPA 'From:' line) or machine!login where
Xmachine is the machine the mail was sent from.  If there
Xis no subject, the message "<no subject>" will appear on
Xthe screen.
X.P
XIf the message is a \fIpriority\fR message (that is, it has a field
Xin the header "Priority:"), then the line will be "PRIORITY mail"
Xinstead of "New mail".
X.P
XThis program will run forever, and can internally reset 
Xitself if mail is deleted from the incoming mailbox while
Xtrying to monitor it.
X.P
XIf \fBnewmail\fR is started up with a filename, it will
Xperform exactly the same, but with the specified file as
Xthe one to check rather than the default users mailbox.
X.SH AUTHOR
XDave Taylor, Hewlett-Packard Laboratories.
X.SH SEE ALSO
Xnotify in sh(1) or csh(1), announce(1L)
END_OF_doc/newmail.1
if test 1377 -ne `wc -c <doc/newmail.1`; then
    echo shar: \"doc/newmail.1\" unpacked with wrong size!?
fi
# end of overwriting check
fi
echo shar: Extracting \"doc/printmail.1\" \(809 characters\)
if test -f doc/printmail.1 ; then 
  echo shar: Will not over-write existing file \"doc/printmail.1\"
else
sed "s/^X//" >doc/printmail.1 <<'END_OF_doc/printmail.1'
X.TH PRINTMAIL 1L
X.ad b
X.SH NAME
Xprintmail - format mail in a readable fashion for printing
X.SH SYNOPSIS
X.B printmail
X{-d}
X{filename}
X.SH HP-UX COMPATIBILITY
X.TP 10
XLevel:
XHP-UX/CONTRIBUTED
X.TP
XOrigin:
XHewlett-Packard
X.SH DESCRIPTION
X.I Printmail
Xcopies all messages from either the file specified or the
Xdefault user mailbox separated by form feeds to standard output.  
XWith the
X.B \-d
Xoption, the messages are separated by a dashed line
Xrather than the formfeed (for lots of little mail).
X.sp
X.P
XIf the program is given a file as standard input, it will
Xuse that instead of the default mailbox for the operation
Xspecified.
X.SH EXAMPLE
XA typical usage of this command is;
X.nf
X	printmail -d | print 
X.fi
X.SH AUTHOR
XDave Taylor, Hewlett-Packard Laboratories.
X.SH SEE\ ALSO
Xelm(1L), mail(1), mailx(1), from(1L)
END_OF_doc/printmail.1
if test 809 -ne `wc -c <doc/printmail.1`; then
    echo shar: \"doc/printmail.1\" unpacked with wrong size!?
fi
# end of overwriting check
fi
echo shar: Extracting \"doc/trim-headers.1\" \(958 characters\)
if test -f doc/trim-headers.1 ; then 
  echo shar: Will not over-write existing file \"doc/trim-headers.1\"
else
sed "s/^X//" >doc/trim-headers.1 <<'END_OF_doc/trim-headers.1'
X.TH TRIM-HEADERS 1L
X.ad b
X.SH NAME
Xtrim-headers - help keep mailbox files clean of trash headers
X.SH SYNOPSIS
Xcat \fIfilename\fR |
X.B trim-headers
X> \fIfilename2\fR
X.br
X.B trim-headers
Xfilename-list
X.SH HP-UX COMPATIBILITY
X.TP 10
XLevel:
XHP-UX/CONTRIBUTED
X.TP
XOrigin:
XHewlett-Packard Laboratories
X.SH DESCRIPTION
X.I Trim-headers
Xis a simple awk script that removes all headers from the specified
Xfolder, either standard input or one of a list of filenames, according
Xto how it's invoked.  The program knows about the following headers;
X.sp
X.nf
X	From 
X	From:
X	Subject:
X	To:
X	Cc:
X	Date:
X
X.fi
XAll other headers are considered extraneous and are removed.
X.SH AUTHOR
XDave Taylor, Hewlett-Packard Laboratories
X.SH SEE\ ALSO
Xawk(1), printmail(1L), readmsg(1L)
X.SH BUGS
XThe current incancation of the \fIawk\fR script doesn't understand
Xthe idea of multiple line header fields, so a message that has, say,
Xa three line To: list will only have the first line saved...
END_OF_doc/trim-headers.1
if test 958 -ne `wc -c <doc/trim-headers.1`; then
    echo shar: \"doc/trim-headers.1\" unpacked with wrong size!?
fi
# end of overwriting check
fi
echo shar: Extracting \"doc/wnewmail.1\" \(1502 characters\)
if test -f doc/wnewmail.1 ; then 
  echo shar: Will not over-write existing file \"doc/wnewmail.1\"
else
sed "s/^X//" >doc/wnewmail.1 <<'END_OF_doc/wnewmail.1'
X.TH WNEWMAIL 1L 
X.ad b
X.SH NAME
Xwnewmail - daemon to asynchronously notify of new mail
X.SH SYNOPSIS
X.B wnewmail
X.br
X.B wnewmail
Xfilename
X.PP
X.SH HP-UX COMPATIBILITY
X.TP 10
XLevel:
XHP-UX/CONTRIBUTED
X.TP
XOrigin:
XHewlett-Packard
X.SH DESCRIPTION
X.I Wnewmail\^
Xis a daemon designed to run in \fBa window\fR on a windowing
Xsystem (such as an HP or Sun system) and check every 10 seconds
Xto see if there is any new mail for the user that
Xstarted it up.
X.P
XIf there is new mail, the program will "beep", and write to
Xthe window for each of the new messages;
X.nf
X
X   Mail from <name> -- <subject>
X
X.fi
Xwhere <name> is either the name of the person sending it,
Xif available (the ARPA 'From:' line) or machine!login where
Xmachine is the machine the mail was sent from.  If there
Xis no subject, the message "<no subject>" will appear on
Xthe screen.
X.P
XIf the message is a \fIpriority\fR message (that is, the
Xheader contains a line "Priority:"), then the line output
Xwill be "PRIORITY mail from ..." rather than just "Mail from".
X.P
XThis program will run forever, and can internally reset 
Xitself if mail is deleted from the incoming mailbox while
Xtrying to monitor it.
X.P
XIf \fBwnewmail\fR is started up with a filename, it will
Xperform exactly the same, but with the specified file as
Xthe one to check rather than the default users mailbox.
X.SH AUTHOR
XDave Taylor, Hewlett-Packard Laboratories.
X.SH SEE ALSO
Xnotify in sh(1) or csh(1), newmail(1L)
X.SH NOTE
XThis is almost identical to the program \fBnewmail\fR...
END_OF_doc/wnewmail.1
if test 1502 -ne `wc -c <doc/wnewmail.1`; then
    echo shar: \"doc/wnewmail.1\" unpacked with wrong size!?
fi
# end of overwriting check
fi
if test ! -d filter ; then
    echo shar: Creating directory \"filter\"
    mkdir filter
fi
echo shar: Extracting \"filter/Makefile\" \(1172 characters\)
if test -f filter/Makefile ; then 
  echo shar: Will not over-write existing file \"filter/Makefile\"
else
sed "s/^X//" >filter/Makefile <<'END_OF_filter/Makefile'
X#
X#  Makefile for the Elm system filter program
X#
X#         (C) Copyright 1986, Dave Taylor
X#
X#  Last modification: Oct 7th, 1986
X
XSHELL=/bin/sh
X
XDEFINE= -DBSD
XLIB2  = -lcurses
X
XCFLAGS= -O -I../hdrs
XCC=	/bin/cc
XRM= 	/bin/rm -f
XECHO=  /bin/echo
X
XOBJ     =   ../bin/filter
XHDRS    =   ../hdrs/defs.h ../hdrs/sysdefs.h ../hdrs/filter.h
XBINARIES=   actions.o filter.o parse.o rules.o summarize.o utils.o utils2.o
XSRC     =   actions.c filter.c parse.c rules.c summarize.c utils.c utils2.c
X
Xall: ${OBJ}
X
X../bin/filter  : ${HDRS} ${BINARIES}
X	${CC} ${CFLAGS} ${DEFINE} ${BINARIES} -o ${OBJ}
X
Xactions.o : ${HDRS} actions.c
X	${CC} -c ${CFLAGS} ${DEFINE} actions.c
X
Xfilter.o : ${HDRS} filter.c
X	${CC} -c ${CFLAGS} ${DEFINE} filter.c
X
Xparse.o : ${HDRS} parse.c
X	${CC} -c ${CFLAGS} ${DEFINE} parse.c
X
Xutils.o : ${HDRS} utils.c
X	${CC} -c ${CFLAGS} ${DEFINE} utils.c
X
Xutils2.o : ${HDRS} utils2.c
X	${CC} -c ${CFLAGS} ${DEFINE} utils2.c
X
Xrules.o : ${HDRS} rules.c
X	${CC} -c ${CFLAGS} ${DEFINE} rules.c
X
Xsummarize.o : ${HDRS} summarize.c
X	${CC} -c ${CFLAGS} ${DEFINE} summarize.c
X
Xlint    : 
X	lint -I../hdrs ${SRC} > LINT.OUT
X
Xclean	:
X	${RM} ${BINARIES}
X
Xindex   :
X	index ${SRC} > INDEX
X
END_OF_filter/Makefile
if test 1172 -ne `wc -c <filter/Makefile`; then
    echo shar: \"filter/Makefile\" unpacked with wrong size!?
fi
# end of overwriting check
fi
echo shar: Extracting \"filter/Makefile.mstr\" \(1167 characters\)
if test -f filter/Makefile.mstr ; then 
  echo shar: Will not over-write existing file \"filter/Makefile.mstr\"
else
sed "s/^X//" >filter/Makefile.mstr <<'END_OF_filter/Makefile.mstr'
X#
X#  Makefile for the Elm system filter program
X#
X#         (C) Copyright 1986, Dave Taylor
X#
X#  Last modification: Oct 7th, 1986
X
XSHELL=/bin/sh
X
XDEFINE= >os-define<
XLIB2  = >lib2<
X
XCFLAGS= -O -I../hdrs
XCC=	>cc<
XRM= 	>rm<
XECHO=  /bin/echo
X
XOBJ     =   ../bin/filter
XHDRS    =   ../hdrs/defs.h ../hdrs/sysdefs.h ../hdrs/filter.h
XBINARIES=   actions.o filter.o parse.o rules.o summarize.o utils.o utils2.o
XSRC     =   actions.c filter.c parse.c rules.c summarize.c utils.c utils2.c
X
Xall: ${OBJ}
X
X../bin/filter  : ${HDRS} ${BINARIES}
X	${CC} ${CFLAGS} ${DEFINE} ${BINARIES} -o ${OBJ}
X
Xactions.o : ${HDRS} actions.c
X	${CC} -c ${CFLAGS} ${DEFINE} actions.c
X
Xfilter.o : ${HDRS} filter.c
X	${CC} -c ${CFLAGS} ${DEFINE} filter.c
X
Xparse.o : ${HDRS} parse.c
X	${CC} -c ${CFLAGS} ${DEFINE} parse.c
X
Xutils.o : ${HDRS} utils.c
X	${CC} -c ${CFLAGS} ${DEFINE} utils.c
X
Xutils2.o : ${HDRS} utils2.c
X	${CC} -c ${CFLAGS} ${DEFINE} utils2.c
X
Xrules.o : ${HDRS} rules.c
X	${CC} -c ${CFLAGS} ${DEFINE} rules.c
X
Xsummarize.o : ${HDRS} summarize.c
X	${CC} -c ${CFLAGS} ${DEFINE} summarize.c
X
Xlint    : 
X	lint -I../hdrs ${SRC} > LINT.OUT
X
Xclean	:
X	${RM} ${BINARIES}
X
Xindex   :
X	index ${SRC} > INDEX
X
END_OF_filter/Makefile.mstr
if test 1167 -ne `wc -c <filter/Makefile.mstr`; then
    echo shar: \"filter/Makefile.mstr\" unpacked with wrong size!?
fi
# end of overwriting check
fi
if test ! -d hdrs ; then
    echo shar: Creating directory \"hdrs\"
    mkdir hdrs
fi
echo shar: Extracting \"hdrs/curses.h\" \(620 characters\)
if test -f hdrs/curses.h ; then 
  echo shar: Will not over-write existing file \"hdrs/curses.h\"
else
sed "s/^X//" >hdrs/curses.h <<'END_OF_hdrs/curses.h'
X/*** 			curses.h			***/
X
X/*** (C) Copyright 1986 Dave Taylor			***/
X
X     /*** Include file for seperate compilation.  ***/
X
X#define OFF		0
X#define ON 		1
X
Xint  InitScreen(),      /* This must be called before anything else!! */
X
X     ClearScreen(), 	 CleartoEOLN(),
X
X     MoveCursor(),
X     CursorUp(),         CursorDown(), 
X     CursorLeft(),       CursorRight(), 
X
X     StartBold(),        EndBold(), 
X     StartUnderline(),   EndUnderline(), 
X     StartHalfbright(),  EndHalfbright(),
X     StartInverse(),     EndInverse(),
X	
X     transmit_functions(),
X
X     Raw(),              ReadCh();
X
Xchar *return_value_of();
END_OF_hdrs/curses.h
if test 620 -ne `wc -c <hdrs/curses.h`; then
    echo shar: \"hdrs/curses.h\" unpacked with wrong size!?
fi
# end of overwriting check
fi
echo shar: Extracting \"hdrs/save_opts.h\" \(2043 characters\)
if test -f hdrs/save_opts.h ; then 
  echo shar: Will not over-write existing file \"hdrs/save_opts.h\"
else
sed "s/^X//" >hdrs/save_opts.h <<'END_OF_hdrs/save_opts.h'
X/**			 save_opts.h 			**/
X
X/** Some crazy includes for the save-opts part of the Elm program!
X
X    (C) Copyright 1986, Dave Taylor
X**/
X
X#define ALTERNATIVES		0
X#define ALWAYSDELETE		1
X#define ALWAYSLEAVE		2
X#define ARROW			3
X#define AUTOCOPY		4
X#define BOUNCEBACK		5
X#define CALENDAR		6
X#define COPY			7
X#define EDITOR			8
X#define EDITOUT			9
X#define FORMS			10
X#define FULLNAME		11
X#define KEYPAD			12
X#define LOCALSIGNATURE		13
X#define MAILBOX			14
X#define MAILDIR			15
X#define MENU			16
X#define MOVEPAGE		17
X#define NAMES			18
X#define NOHEADER		19
X#define PAGER			20
X#define POINTNEW		21
X#define PREFIX			22
X#define PRINT			23
X#define REMOTESIGNATURE		24
X#define RESOLVE			25
X#define SAVEMAIL		26
X#define SAVENAME		27
X#define SHELL			28
X#define SIGNATURE		29
X#define SOFTKEYS		30
X#define SORTBY			31
X#define TIMEOUT			32
X#define TITLES			33
X#define USERLEVEL		34
X#define WARNINGS		35
X#define WEED			36
X#define WEEDOUT			37
X
X#define NUMBER_OF_SAVEABLE_OPTIONS	WEEDOUT+1
X
Xstruct save_info_recs { 
X	char 	name[NLEN]; 	/* name of instruction */
X	long 	offset;		/* offset into elmrc-info file */
X	} save_info[NUMBER_OF_SAVEABLE_OPTIONS] = 
X{
X { "alternatives", -1L }, { "alwaysdelete", -1L }, 	{ "alwaysleave", -1L },
X { "arrow", -1L},         { "autocopy", -1L },      	{ "bounceback", -1L },
X { "calendar", -1L }, 	  { "copy", -1L },          	{ "editor", -1L },
X { "editout", -1L }, 	  { "forms", -1L },         	{ "fullname", -1L },
X { "keypad", -1L }, 	  { "localsignature", -1L },	{ "mailbox", -1L }, 
X { "maildir", -1L }, 	  { "menu", -1L }, 		{ "movepage", -1L }, 
X { "names", -1L },        { "noheader", -1L }, 		{ "pager", -1L }, 
X { "pointnew", -1L},      { "prefix", -1L },       	{ "print", -1L }, 
X { "remotesignature",-1L},{ "resolve", -1L },       	{ "savemail", -1L }, 
X { "savename", -1L },     { "shell", -1L },         	{ "signature", -1L },
X { "softkeys", -1L },	  { "sortby", -1L }, 		{ "timeout", -1L },
X { "titles", -1L },       { "userlevel", -1L }, 	{ "warnings", -1L },
X { "weed", -1L },         { "weedout", -1L }
X};
END_OF_hdrs/save_opts.h
if test 2043 -ne `wc -c <hdrs/save_opts.h`; then
    echo shar: \"hdrs/save_opts.h\" unpacked with wrong size!?
fi
# end of overwriting check
fi
if test ! -d src ; then
    echo shar: Creating directory \"src\"
    mkdir src
fi
echo shar: Extracting \"src/delete.c\" \(2451 characters\)
if test -f src/delete.c ; then 
  echo shar: Will not over-write existing file \"src/delete.c\"
else
sed "s/^X//" >src/delete.c <<'END_OF_src/delete.c'
X/**		delete.c		**/
X
X/**  Delete or undelete files: just set flag in header record! 
X     Also tags specified message(s)...
X
X     (C) Copyright 1985  Dave Taylor
X**/
X
X#include "headers.h"
X
Xdelete_msg(real_del)
Xint real_del;
X{
X	/** Delete current message.  If real-del is false, then we're
X	    actually requested to toggle the state of the current
X	    message... **/
X
X	if (real_del)
X	  header_table[current-1].status |= DELETED;
X	else if (ison(header_table[current-1].status, DELETED))
X	  clearit(header_table[current-1].status, DELETED);
X	else
X	  setit(header_table[current-1].status, DELETED);
X
X	show_msg_status(current-1);
X}
X
Xundelete_msg()
X{
X	/** clear the deleted message flag **/
X
X	clearit(header_table[current-1].status, DELETED);
X
X	show_msg_status(current-1);
X}
X
Xshow_msg_status(msg)
Xint msg;
X{
X	/** show the status of the current message only.  **/
X
X	if (on_page(msg)) {
X	  MoveCursor((msg % headers_per_page) + 4, 3);
X	  if (msg == current && !arrow_cursor) {
X	    StartBold();
X	    Writechar( ison(header_table[msg].status, DELETED)? 'D' : ' ');
X	    EndBold();
X	  }
X	  else
X	    Writechar( ison(header_table[msg].status, DELETED)? 'D' : ' ');
X	}
X}
X
Xtag_message()
X{
X	/** Tag current message.  If already tagged, untag it. **/
X
X	if (ison(header_table[current-1].status, TAGGED))
X	  clearit(header_table[current-1].status, TAGGED);
X	else
X	  setit(header_table[current-1].status, TAGGED);
X
X	show_msg_tag(current-1);
X}
X
Xshow_msg_tag(msg)
Xint msg;
X{
X	/** show the tag status of the current message only.  **/
X
X	if (on_page(msg)) {
X	  MoveCursor((msg % headers_per_page) + 4, 4);
X	  if (msg == current && !arrow_cursor) {
X	    StartBold();
X	    Writechar( ison(header_table[msg].status, TAGGED)? '+' : ' ');
X	    EndBold();
X	  }
X	  else
X	    Writechar( ison(header_table[msg].status, TAGGED)? '+' : ' ');
X	}	
X}
X
Xshow_new_status(msg)
Xint msg;
X{
X	/** If the specified message is on this screen, show
X	    the new status (could be marked for deletion now,
X	    and could have tag removed...)
X	**/
X
X	if (on_page(msg)) 
X	  if (msg == current && !arrow_cursor) {
X	    StartBold();
X	    PutLine2((msg % headers_per_page) + 4, 3, "%c%c",
X		   ison(header_table[msg].status, DELETED)? 'D' : ' ',
X		   ison(header_table[msg].status, TAGGED )? '+' : ' ');
X	    EndBold();
X	  }
X	  else
X	    PutLine2((msg % headers_per_page) + 4, 3, "%c%c",
X		   ison(header_table[msg].status, DELETED)? 'D' : ' ',
X		   ison(header_table[msg].status, TAGGED )? '+' : ' ');
X}
END_OF_src/delete.c
if test 2451 -ne `wc -c <src/delete.c`; then
    echo shar: \"src/delete.c\" unpacked with wrong size!?
fi
# end of overwriting check
fi
echo shar: Extracting \"src/getopt.c\" \(2152 characters\)
if test -f src/getopt.c ; then 
  echo shar: Will not over-write existing file \"src/getopt.c\"
else
sed "s/^X//" >src/getopt.c <<'END_OF_src/getopt.c'
X/**			getopt.c			**/
X
X/** starting argument parsing routine... 
X
X    (C) Copyright 1986 Dave Taylor
X**/
X
X#include "defs.h"
X
X#ifndef NULL
X# define NULL		0
X#endif
X
X#define DONE		0
X#define ERROR		-1
X
Xchar *optional_arg;			/* optional argument as we go */
Xint   opt_index;			/* argnum + 1 when we leave   */
X
X/***********************
X
X   Typical usage of this routine is exemplified by;
X
X	register int c;
X
X	while ((c = get_options(argc, argv, "ad:f:")) > 0) {
X	   switch (c) {
X	     case 'a' : arrow_cursor++;		break;
X	     case 'd' : debug = atoi(optional_arg);	break;
X	     case 'f' : strcpy(infile, optional_arg); 
X	                mbox_specified = 2;  break;
X	    }
X	 }
X
X	 if (c == ERROR) {
X	   printf("Usage: %s [a] [-d level] [-f file] <names>\n\n", argv[0]);
X	   exit(1);
X	}
X
X***********************/
X
Xint  _indx = 1, _argnum = 1;
X
Xint
Xget_options(argc, argv, options)
Xint argc;
Xchar *argv[], *options;
X{
X	/** Returns the character argument next, and optionally instantiates 
X	    "argument" to the argument associated with the particular option 
X	**/
X	
X	char        *word, *strchr();
X
X	if (_argnum >= argc) {	/* quick check first - no arguments! */
X	  opt_index = argc;
X	  return(DONE);
X	}
X
X	if (_indx >= strlen(argv[_argnum]) && _indx > 1) {
X	  _argnum++;
X	  _indx = 1;		/* zeroeth char is '-' */
X	}
X
X	if (_argnum >= argc) {
X	  opt_index = _argnum; /* no more args */
X	  return(DONE);
X	}
X
X	if (argv[_argnum][0] != '-') {
X	  opt_index = _argnum;
X	  return(DONE);
X	}
X
X        word = strchr(options, argv[_argnum][_indx++]);
X
X	if (word == NULL)
X	  return(ERROR);		/* Sun compatibility */
X
X	if (word == NULL || strlen(word) == 0) 
X	  return(ERROR);
X	
X	if (word[1] == ':') {
X
X	  /** Two possibilities - either tailing end of this argument or the 
X	      next argument in the list **/
X
X	  if (_indx < strlen(argv[_argnum])) { /* first possibility */
X	    optional_arg = (char *) (argv[_argnum] + _indx);
X	    _argnum++;
X	    _indx = 1;
X	  }
X	  else {				/* second choice     */
X	    if (++_argnum >= argc) 
X	      return(ERROR);			/* no argument!!     */
X
X	    optional_arg = (char *) argv[_argnum++];
X	    _indx = 1;
X	  }
X	}
X
X	return((int) word[0]);
X}
END_OF_src/getopt.c
if test 2152 -ne `wc -c <src/getopt.c`; then
    echo shar: \"src/getopt.c\" unpacked with wrong size!?
fi
# end of overwriting check
fi
echo shar: Extracting \"src/output_utils.c\" \(2034 characters\)
if test -f src/output_utils.c ; then 
  echo shar: Will not over-write existing file \"src/output_utils.c\"
else
sed "s/^X//" >src/output_utils.c <<'END_OF_src/output_utils.c'
X/**			output_utils.c			**/
X
X/** This file contains routines used for output in the ELM program.
X
X    These routines (C) Copyright 1986 Dave Taylor
X**/
X
X#include "headers.h"
X
X
Xstatic char err_buffer[SLEN];		/* store last error message */
X
Xstatic char central_message_buffer[SLEN];
X
Xchar *strcpy();
X
Xshow_last_error()
X{
X	/** rewrite last error message! **/
X
X	error(err_buffer);
X}
X
Xclear_error()
X{
X	MoveCursor(LINES,0);
X	CleartoEOLN();
X	err_buffer[0] = '\0';
X}
X
Xset_error(s)
Xchar *s;
X{
X	strcpy(err_buffer, s);
X}
X
Xerror(s)
Xchar *s;
X{
X	/** outputs error 's' to screen at line 22, centered! **/
X
X	MoveCursor(LINES,0);
X	CleartoEOLN();
X	PutLine0(LINES,(COLUMNS-strlen(s))/2,s);
X	fflush(stdout);
X	strcpy(err_buffer, s);	/* save it too! */
X}
X
X/*VARARGS1*/
X
Xerror1(s, a)
Xchar *s, *a;
X{
X	/** same as error, but with a 'printf' argument **/
X	char buffer[SLEN];
X
X	sprintf(buffer,s,a);
X	error(buffer);
X}
X
X/*VARARGS1*/
X
Xerror2(s, a1, a2)
Xchar *s, *a1, *a2;
X{
X	/** same as error, but with two 'printf' arguments **/
X	char buffer[SLEN];
X
X	sprintf(buffer,s, a1, a2);
X	error(buffer);
X}
X
X/*VARARGS1*/
X
Xerror3(s, a1, a2, a3)
Xchar *s, *a1, *a2, *a3;
X{
X	/** same as error, but with three 'printf' arguments **/
X	char buffer[SLEN];
X
X	sprintf(buffer,s, a1, a2, a3);
X	error(buffer);
X}
X
Xlower_prompt(s)
Xchar *s;
X{
X	/** prompt user for input on LINES-1 line, left justified **/
X
X	PutLine0(LINES-1,0,s);
X	CleartoEOLN();
X}
X
Xprompt(s)
Xchar *s;
X{
X	/** prompt user for input on LINES-3 line, left justified **/
X
X	PutLine0(LINES-3,0,s);
X	CleartoEOLN();
X}
X
X
Xset_central_message(string, arg)
Xchar *string, *arg;
X{
X	/** set up the given message to be displayed in the center of
X	    the current window **/ 
X
X	sprintf(central_message_buffer, string, arg);
X}
X
Xdisplay_central_message()
X{
X	/** display the message if set... **/
X
X	if (central_message_buffer[0] != '\0') {
X	  ClearLine(LINES-15);
X	  Centerline(LINES-15, central_message_buffer);
X	  fflush(stdout);
X	}
X}
X
Xclear_central_message()
X{
X	/** clear the central message buffer **/
X
X	central_message_buffer[0] = '\0';
X}
END_OF_src/output_utils.c
if test 2034 -ne `wc -c <src/output_utils.c`; then
    echo shar: \"src/output_utils.c\" unpacked with wrong size!?
fi
# end of overwriting check
fi
echo shar: Extracting \"src/pmalloc.c\" \(1249 characters\)
if test -f src/pmalloc.c ; then 
  echo shar: Will not over-write existing file \"src/pmalloc.c\"
else
sed "s/^X//" >src/pmalloc.c <<'END_OF_src/pmalloc.c'
X/**			pmalloc.c		**/
X
X/** This routine contains a cheap permanent version of the malloc call to 
X    speed up the initial allocation of the weedout headers and the uuname 
X    data.  
X
X      This routine is originally from Jim Davis of HP Labs, with some 
X    mods by me.
X**/
X
X#include <stdio.h>
X#include "defs.h"
X
X/*VARARGS0*/
X
Xchar *pmalloc(size)
Xint size; 
X{
X	/** return the address of a specified block **/
X
X	static char *our_block = NULL;
X	static int   free_mem  = 0;
X
X	char   *return_value, *malloc();
X
X	/** if bigger than our threshold, just do the real thing! **/
X
X	if (size > PMALLOC_THRESHOLD) 
X	   return(malloc(size));
X
X	/** if bigger than available space, get more, tossing what's left **/
X
X	if (size > free_mem) {
X	  if ((our_block = malloc(PMALLOC_BUFFER_SIZE)) == NULL) {
X	    fprintf(stderr, "\n\r\n\rCouldn't malloc %d bytes!!\n\r\n\r",
X		    PMALLOC_BUFFER_SIZE);
X	    leave();	
X          }
X	  our_block += 4;  /* just for safety, don't give back true address */
X	  free_mem = PMALLOC_BUFFER_SIZE-4;
X	}
X	
X	return_value  = our_block;	/* get the memory */
X	size = ((size+3)/4)*4;		/* Go to quad byte boundary */
X	our_block += size;		/* use it up      */
X	free_mem  -= size;		/*  and decrement */
X
X	return( (char *) return_value);
X}
END_OF_src/pmalloc.c
if test 1249 -ne `wc -c <src/pmalloc.c`; then
    echo shar: \"src/pmalloc.c\" unpacked with wrong size!?
fi
# end of overwriting check
fi
echo shar: Extracting \"src/quit.c\" \(577 characters\)
if test -f src/quit.c ; then 
  echo shar: Will not over-write existing file \"src/quit.c\"
else
sed "s/^X//" >src/quit.c <<'END_OF_src/quit.c'
X/**		quit.c		**/
X
X/** quit: leave the current mailbox and quit the program.
X  
X    (C) Copyright 1985, Dave Taylor
X**/
X
X#include "headers.h"
X
Xlong bytes();
X
Xquit()
X{
X	/* a wonderfully short routine!! */
X
X	if (leave_mbox(1) == -1)
X	  return;			/* new mail!  (damn it)  resync */
X
X	leave();
X}
X
Xresync()
X{
X	/** Resync on the current mailbox... This is simple: simply call
X	   'newmbox' to read the file in again, set the size (to avoid
X	    confusion in the main loop) and refresh the screen!
X	**/
X
X	  newmbox(1, TRUE, TRUE);
X	  mailfile_size = bytes(infile);	
X	  showscreen();
X}
END_OF_src/quit.c
if test 577 -ne `wc -c <src/quit.c`; then
    echo shar: \"src/quit.c\" unpacked with wrong size!?
fi
# end of overwriting check
fi
echo shar: Extracting \"src/remail.c\" \(2019 characters\)
if test -f src/remail.c ; then 
  echo shar: Will not over-write existing file \"src/remail.c\"
else
sed "s/^X//" >src/remail.c <<'END_OF_src/remail.c'
X/**			remail.c			**/
X
X/** For those cases when you want to have a message continue along
X    to another person in such a way as they end up receiving it with
X    the return address the person YOU received the mail from (does
X    this comment make any sense yet??)...
X
X    (C) Copyright 1986  Dave Taylor
X**/
X
X#include "headers.h"
X#include <errno.h>
X
Xextern int errno;
X
Xchar *error_name(), *error_description();
X
Xint
Xremail()
X{
X	/** remail a message... returns TRUE if new foot needed ... **/
X	
X	FILE *mailfd;
X	char entered[VERY_LONG_STRING], expanded[VERY_LONG_STRING];
X	char filename[SLEN], buffer[VERY_LONG_STRING];
X
X	entered[0] = '\0';
X
X	get_to(entered, expanded);
X	if (strlen(entered) == 0)
X	  return(0);
X
X	display_to(expanded);
X
X	/** now the munge... **/
X
X	sprintf(filename, "%s%d", temp_file, getpid());
X
X	if ((mailfd = fopen(filename, "w")) == NULL) {
X	  dprint1(1,"couldn't open temp file %s! (remail)\n", filename);
X	  dprint2(1,"** %s - %s **\n", error_name(errno),
X		  error_description(errno));
X	  sprintf(buffer, "Sorry - couldn't open file %s for writing (%s)",
X		  error_name(errno));
X	  set_error(buffer);
X	  return(1);
X	}
X
X	/** now let's copy the message into the newly opened
X	    buffer... **/
X
X	copy_message("", mailfd, FALSE, TRUE);  
X
X	fclose(mailfd);
X
X	/** Got the messsage, now let's ensure the person really wants to 
X	    remail it... **/
X
X	ClearLine(LINES-1);
X	ClearLine(LINES);
X	PutLine1(LINES-1,0,
X	    "Are you sure you want to remail this message (y/n) ? y%c",
X	    BACKSPACE);
X	fflush(stdin);
X	fflush(stdout);
X	if (tolower(ReadCh()) == 'n') { /* another day, another No... */
X	  Write_to_screen("No", 0);
X	  set_error("Bounce of message cancelled");
X          return(1);
X	}
X	Write_to_screen("Yes!", 0);
X
X	sprintf(buffer, "%s %s < %s", mailer, expanded, filename);
X
X	PutLine0(LINES,0,"resending mail...");
X
X	if ((errno = system_call(buffer, SH)) != 0) {
X	  sprintf(buffer, "Remail failed with error %d!", errno);
X	  set_error(buffer);
X	}
X	else
X	  set_error("mail resent");
X
X	return(1);
X}
END_OF_src/remail.c
if test 2019 -ne `wc -c <src/remail.c`; then
    echo shar: \"src/remail.c\" unpacked with wrong size!?
fi
# end of overwriting check
fi
echo shar: Extracting \"src/signals.c\" \(1384 characters\)
if test -f src/signals.c ; then 
  echo shar: Will not over-write existing file \"src/signals.c\"
else
sed "s/^X//" >src/signals.c <<'END_OF_src/signals.c'
X/**			signals.c		**/
X
X/** This set of routines traps various signals and informs the
X    user of the error, leaving the program in a nice, graceful
X    manner.
X
X	(C) Copyright 1986 Dave Taylor
X**/
X
X#include "headers.h"
X#include <signal.h>
X
Xextern int pipe_abort;		/* set to TRUE if receive SIGPIPE */
X
Xquit_signal()
X{
X	dprint0(2,"\n\n** Received SIGQUIT **\n\n\n\n");
X	leave();
X}
X
Xterm_signal() 
X{
X	dprint0(2,"\n\n** Received SIGTERM **\n\n\n\n");
X	leave();
X}
X
Xill_signal()
X{
X	dprint0(1,"\n\n** Received SIGILL **\n\n\n\n");
X	PutLine0(LINES, 0, "\n\nIllegal Instruction signal!\n\n");
X	emergency_exit();
X}
X
Xfpe_signal()  
X{
X	dprint0(1,"\n\n** Received SIGFPE **\n\n\n\n");
X	PutLine0(LINES, 0,"\n\nFloating Point Exception signal!\n\n");
X	emergency_exit();
X}
X
Xbus_signal()
X{
X	dprint0(1,"\n\n** Received SIGBUS **\n\n\n\n");
X	PutLine0(LINES, 0,"\n\nBus Error signal!\n\n");
X	emergency_exit();
X}
X
Xsegv_signal()
X{
X	dprint0(1,"\n\n** Received SIGSEGV **\n\n\n\n");
X	PutLine0(LINES, 0,"\n\nSegment Violation signal!\n\n");
X	emergency_exit();
X}
X
Xalarm_signal()
X{	
X	/** silently process alarm signal for timeouts... **/
X
X	int alarm_signal();
X
X	signal(SIGALRM, alarm_signal);
X}
X
Xpipe_signal()
X{
X	/** silently process pipe signal... **/
X
X	int pipe_signal();
X
X	dprint0(2,"*** received SIGPIPE ***\n\n");
X	
X	pipe_abort = TRUE;	/* internal signal ... wheeee!  */
X
X	signal(SIGPIPE, pipe_signal);
X}
END_OF_src/signals.c
if test 1384 -ne `wc -c <src/signals.c`; then
    echo shar: \"src/signals.c\" unpacked with wrong size!?
fi
# end of overwriting check
fi
echo shar: Extracting \"src/string2.c\" \(993 characters\)
if test -f src/string2.c ; then 
  echo shar: Will not over-write existing file \"src/string2.c\"
else
sed "s/^X//" >src/string2.c <<'END_OF_src/string2.c'
X/**			string2.c		**/
X
X/** This file contains string functions that are shared throughout the
X    various ELM utilities...
X
X    (C) Copyright 1986 Dave Taylor
X**/
X
X#ifndef TRUE
X#define TRUE		1
X#define FALSE		0
X#endif
X
Xint 
Xin_string(buffer, pattern)
Xchar *buffer, *pattern;
X{
X	/** Returns TRUE iff pattern occurs IN IT'S ENTIRETY in buffer. **/ 
X
X	register int i = 0, j = 0;
X	
X	while (buffer[i] != '\0') {
X	  while (buffer[i++] == pattern[j++]) 
X	    if (pattern[j] == '\0') 
X	      return(TRUE);
X	  i = i - j + 1;
X	  j = 0;
X	}
X	return(FALSE);
X}
X
Xint
Xchloc(string, ch)
Xchar *string, ch;
X{
X	/** returns the index of ch in string, or -1 if not in string **/
X	register int i;
X
X	for (i=0; i<strlen(string); i++)
X	  if (string[i] == ch) return(i);
X	return(-1);
X}
X
Xint
Xoccurances_of(ch, string)
Xchar ch, *string;
X{
X	/** returns the number of occurances of 'ch' in string 'string' **/
X
X	register int count = 0, i;
X
X	for (i=0; i<strlen(string); i++)
X	  if (string[i] == ch) count++;
X
X	return(count);
X}
END_OF_src/string2.c
if test 993 -ne `wc -c <src/string2.c`; then
    echo shar: \"src/string2.c\" unpacked with wrong size!?
fi
# end of overwriting check
fi
echo shar: Extracting \"src/validname.c\" \(848 characters\)
if test -f src/validname.c ; then 
  echo shar: Will not over-write existing file \"src/validname.c\"
else
sed "s/^X//" >src/validname.c <<'END_OF_src/validname.c'
X/**			validname.c			**/
X
X/** This routine takes a single address, no machine hops or
X    anything, and returns 1 if it's valid and 0 if not.  The
X    algorithm it uses is the same one that uux uses, namely:
X
X	1. Is there a file '/usr/mail/%s'?  
X	2. Is there a password entry for %s?
X	
X   (C) Copyright 1986 Dave Taylor 
X**/
X
X#include "defs.h"
X
X#include <stdio.h>
X
X#ifndef NOCHECK_VALIDNAME
X#  ifdef BSD4.1
X#    include <sys/pwd.h>
X#  else
X#    include <pwd.h>
X#  endif
X#endif
X
Xint
Xvalid_name(name)
Xchar *name;
X{
X	/** does what it says above, boss! **/
X
X#ifdef NOCHECK_VALIDNAME
X
X	return(1);		/* always say it's okay! */
X
X#else
X	struct passwd *getpwname();
X	char filebuf[SLEN];
X
X	sprintf(filebuf,"%s/%s", mailhome, name);
X	
X	if (access(filebuf, ACCESS_EXISTS) == 0)
X	  return(1);
X
X	if (getpwnam(name) != NULL)
X	  return(1);
X
X	return(0);
X
X#endif
X
X}
END_OF_src/validname.c
if test 848 -ne `wc -c <src/validname.c`; then
    echo shar: \"src/validname.c\" unpacked with wrong size!?
fi
# end of overwriting check
fi
if test ! -d test ; then
    echo shar: Creating directory \"test\"
    mkdir test
fi
echo shar: Extracting \"test/test.empty\" \(0 character\)
if test -f test/test.empty ; then 
  echo shar: Will not over-write existing file \"test/test.empty\"
else
sed "s/^X//" >test/test.empty <<'END_OF_test/test.empty'
END_OF_test/test.empty
if test 0 -ne `wc -c <test/test.empty`; then
    echo shar: \"test/test.empty\" unpacked with wrong size!?
fi
# end of overwriting check
fi
if test ! -d utils ; then
    echo shar: Creating directory \"utils\"
    mkdir utils
fi
echo shar: Extracting \"utils/listalias.c\" \(1786 characters\)
if test -f utils/listalias.c ; then 
  echo shar: Will not over-write existing file \"utils/listalias.c\"
else
sed "s/^X//" >utils/listalias.c <<'END_OF_utils/listalias.c'
X/**			listalias.c			**/
X
X/** Program that lists all the available aliases.  This one uses the pipe 
X    command, feeding the stuff to egrep then sort, or just sort.
X
X    (C) Copyright 1986, Dave Taylor
X**/
X
X#include <stdio.h>
X#include <fcntl.h>
X
X#include "defs.h"
X
X#define alias_hash	".alias_hash"
X#define alias_data	".alias_data"
X
X#ifdef BSD
X  FILE *popen();
X#endif
X
Xchar *getenv();
X
Xmain(argc, argv)
Xint argc;
Xchar *argv[];
X{
X	FILE *datafile, *fd_pipe;
X	struct alias_rec hash_record;
X	int hashfile, count = 0;
X	char buffer[LONG_SLEN], fd_hash[SLEN], 
X	     fd_data[SLEN], *home;
X
X	if (argc > 2) {
X	  printf("Usage: listalias <optional-regular-expression>\n");
X	  exit(1);
X	}
X
X	home = getenv("HOME");
X
X	sprintf(fd_hash, "%s/%s", home, alias_hash);
X	sprintf(fd_data, "%s/%s", home, alias_data);
X
X	if (argc > 1)
X	  sprintf(buffer, "egrep \"%s\" | sort", argv[1]);
X	else
X	  sprintf(buffer, "sort");
X
X	if ((fd_pipe = popen(buffer, "w")) == NULL) {
X	  if (argc > 1) 
X	    printf("cannot open pipe to egrep program for expressions!\n");
X	  fd_pipe = stdout;
X	}
X
X	do {
X
X	  if ((hashfile = open(fd_hash, O_RDONLY)) > 0) {
X	    if ((datafile = fopen(fd_data, "r")) == NULL) {
X	      fprintf("Opened %s hash file, but couldn't open data file!\n",
X		       count? "system" : "user");
X	      goto next_file;
X	    }
X	
X	    /** Otherwise let us continue... **/
X
X	    while (read(hashfile, &hash_record, sizeof (hash_record)) != 0) {
X	      if (strlen(hash_record.name) > 0) {
X	        fseek(datafile, hash_record.byte, 0L);
X	        fgets(buffer, LONG_SLEN, datafile);
X	        fprintf(fd_pipe, "%-15s  %s", hash_record.name, buffer);
X	      }
X	    }
X	  }
X
Xnext_file: strcpy(fd_hash, system_hash_file);
X	   strcpy(fd_data, system_data_file);
X
X	} while (++count < 2);
X
X	pclose(fd_pipe);
X
X	exit(0);
X}
END_OF_utils/listalias.c
if test 1786 -ne `wc -c <utils/listalias.c`; then
    echo shar: \"utils/listalias.c\" unpacked with wrong size!?
fi
# end of overwriting check
fi
echo shar: Extracting \"utils/mailrc.awk\" \(930 characters\)
if test -f utils/mailrc.awk ; then 
  echo shar: Will not over-write existing file \"utils/mailrc.awk\"
else
sed "s/^X//" >utils/mailrc.awk <<'END_OF_utils/mailrc.awk'
XBEGIN { 
X	print "# MSG alias_text file, from a .mailrc file..." 
X	print ""
X      }
X
Xnext_line == 1 { 
X
X	next_line = 0;
X        group = ""
X	for (i = 1; i <= NF; i++) {
X	  if (i == NF && $i == "\\") sep = ""
X	  else                       sep = ", "
X	
X	  if ($i == "\\") {
X	    group = sprintf("%s,", group)
X	    next_line = 1;
X	  }
X	  else if (length(group) > 0)
X	    group = sprintf("%s%s%s", group, sep, $i);
X	  else
X	    group = $i;
X	  }
X	  print "\t" group
X
X	}
X
X$1 ~ /[Aa]lias|[Gg]roup/ { 
X
X	if ( NF == 3)
X	  print $2 " : user alias : " $3;
X	else {
X	  group = ""
X	  for (i = 3; i <= NF; i++) {
X	    if (i == NF && $i == "\\") sep = ""
X	    else        sep = ", "
X	
X	    if ($i == "\\") {
X 	      group = sprintf("%s,", group)
X 	      next_line = 1;
X	    }
X	    else if (length(group) > 0) 
X 	      group = sprintf("%s%s%s", group, sep, $i);
X	    else
X 	      group = $i;
X	    }
X	    print $2 " : group alias : " group;
X	  }
X 	}
END_OF_utils/mailrc.awk
if test 930 -ne `wc -c <utils/mailrc.awk`; then
    echo shar: \"utils/mailrc.awk\" unpacked with wrong size!?
fi
# end of overwriting check
fi
echo shar: Extracting \"utils/trim-headers\" \(1201 characters\)
if test -f utils/trim-headers ; then 
  echo shar: Will not over-write existing file \"utils/trim-headers\"
else
sed "s/^X//" >utils/trim-headers <<'END_OF_utils/trim-headers'
X: Use /bin/sh
X
X# This shell script is designed to be used either to trim the 'junk' headers
X# out of an archived/saved mailbox file or to trim the headers off a file 
X# that is being piped to it.  The program considers the following headers
X# to be worth saving - everything else is junked.
X#
X#	From <user> <date>
X#	From: name <address>
X#	Subject:
X#	To: 
X#	Cc:
X#	Date:
X#
X# all others are ignored and trashed.
X#
X# (C) Copyright 1986, Dave Taylor
X
X# first off, let's make the 'awk' script we'll be using...
X
Xcat << 'END_OF_AWK_SCRIPT' > /tmp/awk.$$
XBEGIN { in_body = 1 }
X{	if (in_body) {
X	  if ($1 == "From") in_body = 0;
X	  print $0
X	}
X	else if ($1 == "From:" || $1 == "Subject:" || $1 == "To:" || \
X	         $1 == "Cc:" || $1 == "Date:")
X	  print $0
X	else if (length($0) == 0) {
X	  in_body = 1;
X	  print $0
X	}
X}
XEND_OF_AWK_SCRIPT
X
X# next let's see if we're being piped to or if we've been handed
X# either a file name or list of file names...
X
Xif [ "$1" = "" ]
Xthen
X  cat - | awk -f /tmp/awk.$$ | uniq
X  rm -f /tmp/awk.$$
Xelse
X  for filename in $*
X  do
X    echo filtering file $filename
X    cat $filename | awk -f /tmp/awk.$$ | uniq > OUTFILE
X    mv OUTFILE $filename
X  done
X  echo done
Xfi
X  
Xexit 0 
END_OF_utils/trim-headers
if test 1201 -ne `wc -c <utils/trim-headers`; then
    echo shar: \"utils/trim-headers\" unpacked with wrong size!?
fi
chmod +x utils/trim-headers
# end of overwriting check
fi
echo shar: End of archive 1 \(of 19\).
cp /dev/null ark1isdone
DONE=true
for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ; do
    if test ! -f ark${I}isdone ; then
	echo shar: You still need to run archive ${I}.
	DONE=false
    fi
done
if test "$DONE" = "true" ; then
	echo You have unpacked all 19 archives.
	echo "See the Instructions file"
	rm -f ark[1-9]isdone ark[1-9][0-9]isdone
fi
##  End of shell archive.
exit 0