v06i006: mail digest utilities (maildigest)

sources-request at mirror.UUCP sources-request at mirror.UUCP
Thu Jun 19 00:41:07 AEST 1986


Submitted: taylor at hplabs
Mod.sources: Volume 6, Issue 6
Archive-name: maildigest

[ The mail.digest.m program refers to mailx; change this to Mail
  if you have it.  If you have neither, you'll have to do something
  else to get the subject lines in there.  Change the "SEE ALSO"
  in digest.1 also, which has to be the chattiest manpage in Unix(tm)
  history.  --r$]

--------------------------------cut here--------------------
# This is a shell archive.  Remove anything before this line,
# then unpack it by saving it in a file and typing "sh file".
# Contents:  Makefile center.1 center.c digest.1 digest.all digest.awk
#	issue.master mail.digest.m mail.issue.m mydate.1 mydate.c readword.c
 
echo x - Makefile
sed 's/^XX//' > "Makefile" <<'@//E*O*F Makefile//'
XX# Makefile for the Digest system...
XX#
XX# This entire Digest system is;
XX#   (C) Copyright 1986, Dave Taylor, Hewlett-Packard
XX#

XX# To use, merely type "make all"

XXSHELL=/bin/csh

XXCFILES= readword.c center.c mydate.c
XXSCRIPTS= digest.all digest.awk digest.tail issue mail.digest mail_issue \
XX	volume_number

XXCC=/bin/cc
XXCFLAGS=-O

XXall:	readword .DIGESTNAME .DIGESTADDR .MODERATOR .MOD_ADDR \
XX	center mydate ${SCRIPTS}
XX	@chmod a+rx digest.all issue mail.digest mail_issue
XX	@echo digest system ready to go...

XXreadword : readword.c
XX	@echo Creating readword program for interactive section of Makefile
XX	@echo " "
XX	${CC} ${CFLAGS} readword.c -o readword

XXcenter : center.c
XX	${CC} ${CFLAGS} center.c -o center
XX	
XXmydate: mydate.c
XX	${CC} ${CFLAGS} mydate.c -o mydate

XX.DIGESTNAME: 
XX	@echo " "
XX	@echo -n "Please enter the name of the digest: "
XX	@readword .DIGESTNAME

XX.DIGESTADDR:
XX	@echo -n "Please enter the alias you'll use for sending the digest: "
XX	@readword .DIGESTADDR

XX.MODERATOR: 
XX	@echo -n "Please enter the full name of the moderator: "
XX	@readword .MODERATOR

XX.MOD_ADDR:
XX	@echo -n "Please enter the mailing address for mail to the moderator: "
XX	@readword .MOD_ADDR
XX	@echo " "

XXdigest.tail: 
XX	@echo 'Creating digest.tail...'
XX	@echo " " > digest.tail
XX	@echo "-------------------------------------" >> digest.tail
XX	@echo " " >> digest.tail
XX	@echo \
XX        "To join this group or have your thoughts in the next issue, please" \
XX	>> digest.tail
XX	@echo \
XX	"send electronic mail to `cat .MODERATOR` at the following address;" \
XX	>> digest.tail
XX	@echo " " >> digest.tail
XX	@echo "		`cat .MOD_ADDR`" >> digest.tail
XX	@echo " " >> digest.tail
XX	@echo "The views expressed in `cat .DIGESTNAME`" >> digest.tail
XX	@echo "are those of the individual authors only.">> digest.tail
XX	@echo " " >> digest.tail
XX	@echo "*********************" >> digest.tail
XX	@echo "End of `cat .DIGESTNAME`" >> digest.tail
XX	@echo "*********************" >> digest.tail

XXissue: issue.master 
XX	@echo "Creating issue script..."
XX	@echo " " > issue
XX	@echo " digest_name='`cat .DIGESTNAME`'" >> issue
XX	@cat issue.master >> issue

XXmail.digest: mail.digest.m 
XX	@echo "Creating mail.digest..."
XX	@echo " " > mail.digest
XX	@echo " digest_name='`cat .DIGESTNAME`'" >> mail.digest
XX	@cat mail.digest.m >> mail.digest

XXmail_issue: mail.issue.m 
XX	@echo "Creating mail_issue..."
XX	@echo " " > mail_issue
XX	@echo " digest_name='`cat .DIGESTNAME`'" >> mail_issue
XX	@echo "          to='`cat .DIGESTADDR`'" >> mail_issue
XX	@cat mail.issue.m >> mail_issue

XXvolume_number: 
XX	@echo 'Creating volume_number file...'
XX	@echo 1 > volume_number

XXclean:
XX	/bin/rm -f .DIGESTNAME .DIGESTADDR .MODERATOR \
XX	.MOD_ADDR digest.tail issue digest.title \
XX	mail.digest mail_issue volume_number center mydate readword

@//E*O*F Makefile//
chmod u=rw,g=rw,o=rw Makefile
 
echo x - center.1
sed 's/^XX//' > "center.1" <<'@//E*O*F center.1//'
XX.TH CENTER 1L 
XX.ad b
XX.SH NAME
XXcenter \- read stdin, output each line centered in 80 cols
XX.SH SYNOPSIS
XX.B center
XX< text > centered-text
XX.SH HP-UX COMPATIBILITY
XX.TP 10
XXLevel:
XXHP-UX/USER CONTRIBUTED
XX.TP
XXOrigin:
XXHewlett-Packard Laboratories
XX.SH DESCRIPTION
XX.I Center
XXis a simple program that is useful within shell scripts.  There
XXare no doubt millions of `better' ways to accomplish what
XXthis program does, but it does work!
XX.SH EXAMPLE
XX.P
XXLet's assume we're in "sh";
XX.nf

XX        $ name="John Doe"
XX        $ echo $name
XX        John Doe
XX        $ name1=`echo $name | center`
XX        $ echo $name1
XX                                John Doe
XX        $

XX.fi
XX.SH AUTHOR
XXDave Taylor, Hewlett-Packard Laboratories
XX.SH "SEE ALSO"
XXdigest(1)
@//E*O*F center.1//
chmod u=rw,g=r,o=r center.1
 
echo x - center.c
sed 's/^XX//' > "center.c" <<'@//E*O*F center.c//'
XX/**			center.c		 **/

XX/** Simple program that filters stdin to stdout centering each line
XX    it reads.  For batch/shell script processing, mostly. **/

XX#include <stdio.h>

XXmain()
XX{
XX	char buffer[100];
XX	register int i;

XX	while (gets(buffer, 100) != NULL) {
XX	  for (i = 0; i < (80-strlen(buffer))/2; i++)
XX	    putchar(' ');
XX	  printf("%s\n", buffer);
XX	}
XX}
@//E*O*F center.c//
chmod u=rw,g=r,o=r center.c
 
echo x - digest.1
sed 's/^XX//' > "digest.1" <<'@//E*O*F digest.1//'
XX.TH DIGEST 1L 
XX.ad b
XX.SH NAME
XXdigest \- tools to help maintain a mailing list/digest
XX.SH HP-UX COMPATIBILITY
XX.TP 10
XXLevel:
XXHP-UX/USER CONTRIBUTED
XX.TP
XXOrigin:
XXHewlett-Packard Laboratories
XX.SH DESCRIPTION
XXThe
XX.I digest
XXsystem is composed of a number of programs and scripts;
XX.nf

XX  Makefile            - to customize all the scripts, etc
XX  center.c            - to center lines for formatting
XX  center.1            -   manual entry for \fIcenter\fR
XX  digest.all          - script to create an individual digest
XX  digest.awk          - awk script to `massage' mailboxes
XX  issue.master        - master copy of issue script
XX  mail.digest.master  - master copy of mail.digest script
XX  mail_issue.master   - master copy of mail_issue script
XX  mydate.c            - program for `nice' date strings
XX  mydate.1            -   manual entry for \fImydate\fR
XX  readword.c          - dumb program for reading line from stdin

XX.fi
XXWhen the \fImake\fR is done, a number of other files will appear
XXand will comprise the full \fIdigest\fR script and mailing system;
XX.nf

XX  DIGEST_ALIAS_ADDRESS - the address you use to send mail to everyone
XX  DIGEST_NAME          - the full name of the digest
XX  MODERATOR            - the full name of the moderator
XX  MODERATOR_ADDRESS    - the email addres of MODERATOR
XX  center               - executable version of center.c
XX  digest.tail          - localized copy of digest.tail
XX  issue                - localized copy of issue
XX  mail.digest          - localized copy of mail.digest
XX  mail_issue           - localized copy of mail_issue 
XX  mydate               - executable version of mydate.c
XX  readword             - executable version of readword.c
XX  volume_number        - file used to autoincrement issues

XX.fi
XXThe easiest way to see how they all interact is by example...
XX.SH EXAMPLE
XXLet's say that we want to create a new mailing list called
XXcalled "Snail-Fans Digest", and we've already created the
XXaliases "snail-fans-request" and "snail-fans" as the mail
XXaddresses for requests to join the list/submit articles and
XXto send mail to everyone in the group, respectively.
XX.P
XXWe could then type...[user input in \fBbold face\fR, comments in 
XXsquare brackets like this];
XX.nf

XX  $ \fBmake all\fR

XX	/bin/cc -O readword.c -o readword [for interactive makefile]

XX The name of the digest: \fBSnail-Fans Digest\fR
XX The alias you'll use for sending it out: \fBsnail-fans\fR
XX The full name of the moderator: \fBJohn Q. Public\fR
XX The mailing address of the moderator: \fBsnail-fans-request\fR

XX 	/bin/cc -O center.c -o center
XX	/bin/cc -O mydate.c -o mydate

XX Creating digest.tail...
XX Creating issue script...
XX Creating mail.digest...
XX Creating mail_issue...
XX Creating volume_number file...
XX digest system ready to go...

XX  $ \fBmore digest.tail\fR

XX  -------------------------------------
XX 
XX  To join this group or have your thoughts in the next issue, please
XX  send electronic mail to John Q. Public at the following address;
XX   
XX	  snail-fans-request
XX 
XX  *********************
XX  End of Snail-Fans Digest
XX  *********************

XX  $ \fBhead issue\fR
XX 
XX   digest_name='Snail-Fans Digest'

XX  # ISSUE  - Shell script creates a new issue of a mailing-list Digest.
XX  #          To do this it creates a new title file then calls the digest.all
XX  #          program to summarize the mailings.  It then drops you into the
XX  #          editor to modify the subject headers, if desired.  Upon leaving
XX  #          it then starts up the batchmail program in the background and
XX  #          exits.
XX  #

XX  $ \fBhead mail.digest\fR
XX 
XX   digest_name='Snail-Fans Digest'
XX  
XX  # mail_issue - This shell script mails out the previously created digest...
XX  #
XX  
XX         digest="outbound.digest"
XX        archive="Digest."
XX         volume="volume_number"
XX  

XX  $ \fBhead mail_issue\fR
XX 
XX   digest_name='Snail-Fans Digest'
XX            to='snail-fans'
XX  
XX  # mail_issue - This shell script mails out the previously created digest...
XX  #
XX  
XX         digest="outbound.digest"
XX        archive="Digest."
XX         volume="volume_number"


XX  $ \fBmore volume_number\fR

XX  1

XX.fi
XXThat's an idea of the files it creates.  Now let's actually send out
XXan issue of the digest!
XX.P
XXFirst off, a few administration details - the \fIdigest\fR system 
XXassumes that you use \fIoutbound\fR as the name of the mailbox that
XXall outbound mail is queued in (note that no processing whatsoever
XXneed be done beforehand on the mailbox) and that you won't mind
XXsaving back issues as Digest.\fIn\fR where \fIn\fR is the number of
XXthe digest...the most recently mailed digest mailbox is also saved
XX(until the next mailing) as \fIoutbound.last\fR.
XX.P
XX.nf

XX  $ \fBcat outbound\fR

XX  From jqpublic Mon Jun  2 17:40:31 1986
XX  To: jqpublic
XX  Date: Mon Jun 2 17:40:31 1986 PST
XX  Subject: Welcome to the Snail Fans Digest!

XX  Just a short hello to welcome everyone to the list and
XX  to try out the digest software.

XX  Please let me know if you have any problems!

XX				-- JQ

XX  [ now we can actually send it out... ]

XX  $ \fBissue\fR

XX  Creating Snail-Fans Digest, Number 1
XX 
XX  Extracting all the 'subject' lines...
XX 
XX  ...feeding the file to awk...
XX 
XX  [your favorite editor is then invoked with the ready-to-be-sent
XX   digest, for a final pass through (recommended)]

XX  Are you sure you want to send this issue out now? (y/n) \fBno\fR
XX  just type "mail_issue" when you're ready to mail it out!

XX  [since we cancelled the actual mailing, let's look at the digest
XX   it created...]

XX  $ \fBcat outbound.digest\fR
XX 
XX                          Snail-Fans Digest, Number 1
XX 
XX                             Monday, June 2nd 1986
XX 
XX  Today's Topics:
XX 
XX                       Welcome to the Snail Fans Digest!
XX  ----------------------------------------------------------------------
XX 
XX  Date: Mon Jun 2 17:40:31 1986 PST
XX  Subject: Welcome to the Snail Fans Digest!
XX  From: jqpublic

XX  Just a short hello to welcome everyone to the list and
XX  to try out the digest software.

XX  Please let me know if you have any problems!

XX				-- JQ
XX 
XX  -------------------------------------
XX 
XX  To join this group or have your thoughts in the next issue, please
XX  send electronic mail to John Q. Public at the following address;
XX 
XX	  snail-fans-request
XX 
XX  *********************
XX  End of Snail-Fans Digest
XX  *********************
XX   
XX  $ \fBmail_issue\fR

XX  Mailing Snail-Fans Digest, Number 1
XX 
XX  $

XX.fi
XXPretty slick, eh?  In practice, maintaining a mailing list is
XXmostly maintaining the actual addresses themselves.  The overhead
XXof creating a digest (etc) is all avoided.
XX.SH AUTHOR
XXDave Taylor, Hewlett-Packard Laboratories
XX.SH "SEE ALSO"
XXawk(1), center(1), mydate(1), mailx(1), sendmail(1).
@//E*O*F digest.1//
chmod u=rw,g=r,o=r digest.1
 
echo x - digest.all
sed 's/^XX//' > "digest.all" <<'@//E*O*F digest.all//'

XX#				DIGEST-ALL
XX#
XX# This shell script is to help create a 'digest' suitable for mailing out
XX#    of all messages in a given mailbox...
XX#
XX# Dave Taylor, Hewlett-Packard Laboratories

XX	awk_script="digest.awk"

XXif [ $# -ne 4 ]
XXthen
XX  echo "Usage: $0 <header> <mailbox-name> <digest-name> <tail>"
XX  exit 1
XXfi

XXif [ ! -r $1 -o ! -r $4 ]
XXthen
XX  echo "$0: Can't find the header and/or tail files!"
XX  exit 2
XXfi

XXif [ ! -r $awk_script ]
XXthen
XX  echo "$0: Can't find the AWK script I need."
XX  exit 2
XXfi

XXif [ ! -r $2 ]
XXthen
XX  echo "$0: Can't find specified mailbox - $2"
XX  exit 3
XXfi

XXif [ -z $2 ]
XXthen
XX  echo "$0: Mailbox $2 is EMPTY!"
XX  exit 4
XXfi

XXif [ -r $3 ]
XXthen
XX  if [ "`echo -n hi | grep n`" = "" ]		# can echo use "-n" ??
XX  then
XX    echo -n "$0: File $3 exists!  Overwrite it? (y/n) "	  # yes!
XX  else
XX    echo "$0: File $3 exists!  Overwrite it? (y/n) \\c"	  #  no!
XX  fi
XX  read answer junk
XX  if [ "$answer" = "y" -o "$answer" = "yes" ]
XX  then
XX    echo "$0: removing current copy of file $3..."
XX    rm -f $3
XX  else
XX    echo "$0: Digest processing cancelled!"
XX    exit 5
XX  fi
XXfi

XX# Now let's try to do something!

XXcat $1 > $3

XX# first collect all the 'subject' lines at the top of the file...

XXecho ' '
XXecho "Extracting all the 'subject' lines..."

XXegrep -e "^Subject:" $2 | sed 's/Subject://' | center >> $3

XXecho ' '

XX# now digest the file...

XXecho "...feeding the file to awk..."

XXcat $2 | awk -f $awk_script - >> $3

XXcat $4 >> $3
XX 
XXecho ' '
XXexit 0
@//E*O*F digest.all//
chmod u=rwx,g=rx,o=rx digest.all
 
echo x - digest.awk
sed 's/^XX//' > "digest.awk" <<'@//E*O*F digest.awk//'
XX#
XX# Awk Script called by 'digest'.  See DIGEST(1)
XX#
XX# Version two - sucks in the '>From' lines too...
XX#               (guarantees a "valid" return address!)

XXBEGIN {
XX	message = 0;
XX	last = "this should never be matched"
XX	in_header = 1;
XX        have_from = 0;
XX      }

XX$1 ~ /^From$/	 {  if (message == 0) {
XX		      print "----------------------------------------------------------------------"
XX		      print " "
XX		    }
XX		    else {
XX		      print "------------------------------"
XX	              print " "
XX	   	    }
XX		    message++;
XX	            in_header = 1;
XX	            from = $2;
XX		    parse_count = 0;
XX	            have_from = 0;
XX		    last = "we should have a hard time matching this, too"
XX	         }

XX$1 ~ /^From:/    { if (in_header) print $0; 
XX		   have_from = 1 }
XX$1 ~ /^>From/	 { parse_count++;
XX		   address = $2
XX		   if (parse_count > 1)
XX		     from = from"!"$10
XX	           else
XX		     from = $10
XX		 }
XX$1 ~ /^Subject:/ { if (in_header) print $0 }
XX$1 ~ /^Date:/    { if (in_header) print $0 }

XXlength($0) < 2   { 
XX	           if (in_header == 1)
XX	             if (have_from == 0)
XX		       print "From: "from"!"address

XX		   if ($0 != last)
XX		     print $0
XX		   in_header = 0
XX		   last = $0
XX	         }

XXin_header == 0   { if ($0 != last) 
XX                     print $0
XX		   last = $0 
XX		 }
@//E*O*F digest.awk//
chmod u=rw,g=r,o=r digest.awk
 
echo x - issue.master
sed 's/^XX//' > "issue.master" <<'@//E*O*F issue.master//'

XX# ISSUE  - Shell script creates a new issue of a mailing-list Digest.
XX#          To do this it creates a new title file then calls the digest.all
XX#          program to summarize the mailings.  It then drops you into the
XX#          editor to modify the subject headers, if desired.  Upon leaving
XX#          it then starts up the batchmail program in the background and
XX#          exits.
XX#
XX# (C) 1985, Dave Taylor, Hewlett-Packard Laboratories
XX#

XX  titles=digest.title
XX     vol=volume_number
XX    tail=digest.tail

XXif [ ! -r outbound ]
XXthen
XX  echo Nothing queued to go out.
XX  exit 0
XXfi

XXecho " "
XXecho "Creating $digest_name, Number `cat $vol`"

XXrm -f $titles
XXecho ' ' > $titles
XXecho "$digest_name, Number `cat $vol`" | center >> $titles
XXecho " " >> $titles
XXmydate notime | center >> $titles
XXecho ' ' >> $titles
XXecho "Today's Topics:" >> $titles
XXecho ' ' >> $titles

XXdigest.all $titles outbound outbound.digest $tail
XXmv outbound outbound.last

XXif [ "$EDITOR" = "" ]
XXthen
XX  /bin/vi outbound.digest
XXelse
XX  $EDITOR outbound.digest
XXfi

XXecho ' '
XXecho ' '
XXif [ "`echo -n hi | grep n`" = "" ]	# can echo deal with -n ?
XXthen
XX  echo -n "Are you sure you want to send this issue out now? (y/n) "
XXelse
XX  echo "Are you sure you want to send this issue out now? (y/n) \\c"
XXfi
XXread answer junk

XXif [ "$answer" = "yes" -o "$answer" = "y" ]
XXthen
XX  echo " "
XX  rm -f $issue_log
XX  echo "starting up mail daemon..."

XX  mail_issue

XX  echo " "
XXelse
XX  echo "just type \"mail_issue\" when you're ready to mail it out!"
XXfi

XXexit 0
@//E*O*F issue.master//
chmod u=rw,g=r,o=r issue.master
 
echo x - mail.digest.m
sed 's/^XX//' > "mail.digest.m" <<'@//E*O*F mail.digest.m//'

XX# mail_issue - This shell script mails out the previously created digest...
XX#

XX       digest="outbound.digest"
XX      archive="Digest."
XX       volume="volume_number"

XX# does the file exist???

XXif [ -r $digest ]
XXthen
XX  volnum=`cat $volume`

XX  (mailx -s "$digest_name, #$volnum" $to < $digest

XX  mv $digest $archive$volnum;
XX  rm -f $digest;

XX  rm -f $volume;
XX  echo Incrementing volume number..
XX  echo `expr $volnum + 1` > $volume) > $log 2>&1 &
XX  
XXfi

XXexit 0
@//E*O*F mail.digest.m//
chmod u=rw,g=r,o=r mail.digest.m
 
echo x - mail.issue.m
sed 's/^XX//' > "mail.issue.m" <<'@//E*O*F mail.issue.m//'

XX# Front end for mailing out the digest...

XX            vol=volume_number

XXecho "Mailing \"$digest_name, Volume `cat $vol`\""

XXexec nohup mail.digest
@//E*O*F mail.issue.m//
chmod u=rw,g=r,o=r mail.issue.m
 
echo x - mydate.1
sed 's/^XX//' > "mydate.1" <<'@//E*O*F mydate.1//'
XX.TH MYDATE 1L 
XX.ad b
XX.SH NAME
XXmydate \- readable date format
XX.SH SYNOPSIS
XX.B mydate
XX.br
XX.B "mydate notime"
XX.SH HP-UX COMPATIBILITY
XX.TP 10
XXLevel:
XXHP-UX/USER CONTRIBUTED
XX.TP
XXOrigin:
XXHewlett-Packard Laboratories
XX.SH DESCRIPTION
XX.I Mydate
XXis a simple program that displays the local date in a much more
XXreadable format than possible by the \fIdate\fR(1) program.
XXThere are two ways to use it, both exemplified below.
XX.P
XXThis is most useful for use within scripts.
XX.SN EXAMPLE
XX.nf

XX	% date 
XX	Mon Jun  2 18:35:24 PDT 1986

XX	% mydate
XX	Monday, June 2nd 1986 at 6:35 pm

XX	% mydate notime
XX	Monday, June 2nd 1986
XX	 	
XX.fi
XX.SH AUTHOR
XXDave Taylor, Hewlett-Packard Laboratories
XX.SH "SEE ALSO"
XXdate(1), digest(1)
@//E*O*F mydate.1//
chmod u=rw,g=r,o=r mydate.1
 
echo x - mydate.c
sed 's/^XX//' > "mydate.c" <<'@//E*O*F mydate.c//'
XX/**		mydate.c		**/

XX/** This program outputs the date in the format:
XX	DAY, MONTH DATE YEAR at HH:MM am|pm
XX	("Monday, January 17th, 1985 at 4:17 pm" for example)
XX    or, with ANY parameters at all;
XX	DAY, MONTH DATE YEAR
XX        without any 'time' string...

XX    Dave Taylor, Colorado Networks Operation
XX**/

XX#include <time.h>
XX#include <stdio.h>

XX#define ampm(n)		(n > 12? n - 12 : n)
XX#define am_or_pm(n)	(n > 12? "pm" : "am")

XXchar *dayname[] = { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday",
XX		  "Friday", "Saturday", "" };

XXchar *monname[] = { "January", "February", "March", "April", "May", "June",
XX		  "July", "August", "September", "October", "November",
XX		  "December", ""};

XXmain(argc, argv)
XXint argc;
XXchar *argv[];
XX{
XX	struct tm *the_time;		/* Time structure, see CTIME(3C) */
XX	char      *suffix();	 	/* digit suffix for date	 */
XX	long	  junk;			/* time in seconds....		 */

XX	junk = time(0);	/* this must be here for it to work! */
XX	the_time = (struct tm * ) localtime(&junk);
XX		
XX	if (argc == 1)  	/* normal format... */
XX	  printf("%s, %s %d%s %d at %d:%02d %s\n",
XX		 dayname[the_time->tm_wday],	/* weekday */
XX		 monname[the_time->tm_mon],	/* month   */
XX		 the_time->tm_mday,		/* day     */
XX		 suffix(the_time->tm_mday),	/* suffix  */
XX		 the_time->tm_year + 1900,	/* year    */
XX		 ampm(the_time->tm_hour),	/* hour    */
XX		 the_time->tm_min,		/* minute  */
XX		 am_or_pm(the_time->tm_hour));	/* am | pm */
XX	else 			/* sccs (retch) format */
XX	  printf("%s, %s %d%s %d\n",
XX		 dayname[the_time->tm_wday],	/* weekday */
XX		 monname[the_time->tm_mon],	/* month   */
XX		 the_time->tm_mday,		/* day     */
XX		 suffix(the_time->tm_mday),	/* suffix  */
XX		 the_time->tm_year + 1900);	/* year    */
XX}

XXchar *suffix(day)
XXint day;
XX{
XX	/** this routine returns the suffix appropriate for the
XX	    specified number to make it an ordinal number.  ie,
XX	    if given '1' it would return 'st', and '2' => 'nd'
XX	**/

XX	static char buffer[10];
XX	register int digit;

XX	digit = day % 10;

XX	if (digit == 0 || digit > 3 || (day > 10 && day < 14))
XX	  strcpy(buffer,"th");
XX	else if (digit == 1)
XX	  strcpy(buffer,"st");
XX	else if (digit == 2)
XX	  strcpy(buffer, "nd");
XX	else
XX	  strcpy(buffer, "rd");

XX	return( (char *) buffer);
XX}
@//E*O*F mydate.c//
chmod u=rw,g=r,o=r mydate.c
 
echo x - readword.c
sed 's/^XX//' > "readword.c" <<'@//E*O*F readword.c//'
XX/**			readword.c			**/

XX/* Stupid little program to read a line from stdin and write it to the
XX   specified filename.  This SHOULD be equivalent to

XX	read var ; echo $var > filename

XX   but that doesn't work from within Makefiles *sigh*

XX*/

XX#include <stdio.h>

XXmain(argc, argv)
XXint argc;
XXchar *argv[];
XX{
XX	FILE *file_device;	/* file descriptor... */
XX	char  buffer[100];	/* and input buffer   */

XX	/** first lets check the starting arguments... **/

XX	if (argc != 2) {
XX	  fprintf(stderr,"Usage: readword <filename>\n");
XX	  exit(1);
XX	}

XX	/** can we open the file for writing??? **/

XX	if ((file_device = fopen(argv[1], "w")) == NULL) {
XX	  fprintf(stderr,"Cannot open file %s for writing!\n", argv[1]);
XX	  exit(2);
XX	}

XX	/** okay...read and write the input **/

XX	gets(buffer);

XX	fputs(buffer, file_device);

XX	/** close the file... **/

XX	fclose(file_device);

XX	/** and we're done! **/

XX	exit(0);
XX}
@//E*O*F readword.c//
chmod u=rw,g=rw,o=rw readword.c
 
exit 0



More information about the Mod.sources mailing list