home *** CD-ROM | disk | FTP | other *** search
- From: mdapoz@watdragon.UUCP (Mark Dapoz)
- Newsgroups: comp.sources.misc
- Subject: Yet Another Time Program......
- Message-ID: <2926@ncoast.UUCP>
- Date: 17 Jul 87 22:25:50 GMT
- Sender: allbery@ncoast.UUCP
- Organization: U. of Waterloo, Ontario
- Lines: 235
- Approved: allbery@ncoast.UUCP
- X-Archive: comp.sources.misc/8707/47
-
- 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
-