mdapoz@watdragon.UUCP (Mark Dapoz) (07/18/87)
While we're on the topic of time programs, I may as well put my 2 cents in.
Here's a little program I wrote a while back to tell you the time in
english. It compiles fine on 4.[23] BSD machines and should be ok on
most other systems, although no warranties are expresses or implied :-)
-Mark
--- cut here --- cut here --- cut here --- cut here --- cut here --- 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".
#
# Wrapped by watdragon!mdapoz on Fri Jun 26 00:21:34 EDT 1987
# Contents: qt.c qt.p
echo x - qt.c
sed 's/^@//' > "qt.c" <<'@//E*O*F qt.c//'
/* qt.c - Displays time in real English, also chimes. */
/* Mark Dapoz, Converted to C for UNIX, April 1986 */
/* Mike Cowlishaw, December 1979 - December 1982 */
/* 86/11/13 - major update, code really cleaned up :-) */
#include <sys/types.h>
#include <sys/time.h>
#define TIMESIZ 80 /* size of our saying */
#define DEBUG
#undef DEBUG
char *h[13] = { /* numbers in words */
"one",
"two",
"three",
"four",
"five",
"six",
"seven",
"eight",
"nine",
"ten",
"eleven",
""
};
main(argc,argv)
int argc;
char **argv;
{
char ot[TIMESIZ]; /* words to display */
short int hr,mn,sc; /* time of day */
short int five_mn; /* time to nearest five min */
time_t clock; /* struct for time function */
struct tm *tm;
struct tm *localtime(); /* conver to local time function*/
time_t time(); /* GMT time function */
strcpy(ot,"It's "); /* our saying */
time(&clock); /* GMT time of day from system */
tm=localtime(&clock); /* get local time */
hr=(short int)tm->tm_hour;
mn=(short int)tm->tm_min;
sc=(short int)tm->tm_sec;
#ifdef DEBUG
if (argc > 1) { /* debug */
hr=atoi(argv[1]);
mn=atoi(argv[2]);
sc=atoi(argv[3]);
printf("hr=%u, mn=%u, sc=%u\n",hr,mn,sc);
}
#endif
if (sc > 29) /* round up mins */
mn+=1;
if (mn > 32) /* round up hours */
hr+=1;
/* how far off 5 min mark? */
switch(mn%5) {
case 0: /* exact hour */
break;
case 1:
strcat(ot,"just gone ");
break;
case 2:
strcat(ot,"just after ");
break;
case 3:
strcat(ot,"nearly ");
break;
case 4:
strcat(ot,"almost ");
break;
}
five_mn = mn;
if (mn%5 >= 3) /* round up */
five_mn = mn+5;
/* what part of the hour? */
switch(five_mn-(five_mn%5)) { /* 5 minute resolution */
case 0:
case 60:
break;
case 5:
strcat(ot,"five past ");
break;
case 10:
strcat(ot,"ten past ");
break;
case 15:
strcat(ot,"a quarter past ");
break;
case 20:
strcat(ot,"twenty past ");
break;
case 25:
strcat(ot,"twenty-five past ");
break;
case 30:
strcat(ot,"half past ");
break;
case 35:
strcat(ot,"twenty-five to ");
break;
case 40:
strcat(ot,"twenty to ");
break;
case 45:
strcat(ot,"a quarter to ");
break;
case 50:
strcat(ot,"ten to ");
break;
case 55:
strcat(ot,"five to ");
break;
}
if ((hr%12) == 0)
midnoon(&hr,ot); /* noon and midnight */
if (hr > 12)
hr -= 12; /* get rid of 24-hour clock */
else
if (hr == 0)
hr=12; /* cater for midnight */
/* add the o'clock */
strcat(ot,h[hr-1]);
if ((mn%60 == 0) && (hr != 12))
strcat(ot," o'clock");
strcat(ot,"."); /* end of sentence */
if ((mn%15) == 0) /* chime every 15 minutes */
chime(&hr,&mn);
printf("\n%s\n\n",ot); /* town crier :-) */
}
midnoon(hr,ot) /* is it noon or midnight? */
short int *hr; /* hour of day */
char *ot; /* the saying */
{
if (*hr == 12) /* it's noon */
strcat(ot,"Noon");
else /* it's midnight */
strcat(ot,"Midnight");
*hr=12; /* make it noon */
}
chime(hr,mn) /* ring the bells */
short int *hr; /* hour of day */
short int *mn; /* minute of day */
{
int num,i;
char bell[16], ring[80];
if ((*mn%60) == 0) { /* on the hour? */
strcpy(bell,"Bong");
num = *hr;
}
else { /* must be quarter hour */
strcpy(bell,"Ding-Dong");
num=(*mn%15);
}
strcpy(ring,"(");
strcat(ring,bell); /* ring the bells */
for (i=0;i < num-1;i++) {
strcat(ring,",");
strcat(ring,bell);
}
strcat(ring,"!)");
printf("\n%s",ring);
}
@//E*O*F qt.c//
chmod u=rw,g=r,o=r qt.c
echo x - qt.p
sed 's/^@//' > "qt.p" <<'@//E*O*F qt.p//'
@.TH QT PUBLIC UW
@.SH NAME
qt \- print the current time in english (also chimes)
@.SH SYNOPSIS
@.B public qt
@.SH DESCRIPTION
@.PP
QT can be used to display the current time in a more "user friedly" manner
than date does.
@.SH AUTHOR
Mark Dapoz, University of Waterloo
@.SH SEE ALSO
date(1)
@.SH BUGS
@.PP
This is the first public release. Unknown bugs may still be present :-).
@.SH SUPPORT
This software is
@.I not
supported by
@.SM MFCF.
@.PP
Send complaints or suggestions to mdapoz@watdragon.
@//E*O*F qt.p//
chmod u=rw,g=r,o=r qt.p
echo Inspecting for damage in transit...
temp=/tmp/shar$$; dtemp=/tmp/.shar$$
trap "rm -f $temp $dtemp; exit" 0 1 2 3 15
cat > $temp <<\!!!
175 538 3587 qt.c
23 87 487 qt.p
198 625 4074 total
!!!
wc qt.c qt.p | sed 's=[^ ]*/==' | diff -b $temp - >$dtemp
if [ -s $dtemp ]
then echo "Ouch [diff of wc output]:" ; cat $dtemp
else echo "No problems found."
fi
exit 0