v03i056: clock program
chad at anasaz.UUCP
chad at anasaz.UUCP
Fri Jun 17 08:22:50 AEST 1988
comp.sources.misc: Volume 3, Issue 56
Submitted-By: "A. Nonymous" <chad at anasaz.UUCP>
Archive-Name: clock
This program is rather simple-minded, but it gets a surprising amount
of use as the idle behavior on some terminals. It is a full screen
date-and-time display for SysV.
-crl
----(cut)----(cut)----(cut)----(cut)----(cut)----(cut)----(cut)----
#! /bin/sh
# This is a shell archive. Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file". To overwrite existing
# files, type "sh file -c". You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g.. If this archive is complete, you
# will see the following message at the end:
# "End of shell archive."
# Contents: Makefile clock.c
# Wrapped by chad at anasaz on Thu Jun 16 00:47:19 1988
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'Makefile' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'Makefile'\"
else
echo shar: Extracting \"'Makefile'\" \(468 characters\)
sed "s/^X//" >'Makefile' <<'END_OF_FILE'
X#
X# Makefile for clock routine
X# Last changed 4/30/88 01:35:39
X#
X
X# note: this should be able to be compiled with -DMINICURSES to save
X# size and speed, but an apparent bug causes noecho() to get broken
X
XBINDIR = /usr/local/bin
X
Xclock: clock.c
X# $(CC) $(CFLAGS) -DMINICURSES -o clock clock.c -lcurses
X $(CC) $(CFLAGS) -o clock clock.c -lcurses
X
Xinstall: clock
X strip clock
X -rm $(BINDIR)/clock
X ln clock $(BINDIR)
X touch install
X
Xlint: clock.c
X lint -pu clock.c >LINT
END_OF_FILE
if test 468 -ne `wc -c <'Makefile'`; then
echo shar: \"'Makefile'\" unpacked with wrong size!
fi
# end of 'Makefile'
fi
if test -f 'clock.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'clock.c'\"
else
echo shar: Extracting \"'clock.c'\" \(5019 characters\)
sed "s/^X//" >'clock.c' <<'END_OF_FILE'
X/*TITLE clock.c - Clock/calendar on terminal - 5/4/88 */
X
X/*
X** This program will place a full screen (readable across the room)
X** date and time display on your terminal. The display will update
X** automagically. To run it, make sure your TERM environmental
X** variable is set properly and type "clock". To end the program,
X** type your "interrupt" character (usually cntl-c or delete).
X** The program also traps the "terminate" signal, so it can be
X** gracefully stopped by shutdown(1M) or a kill command from another
X** terminal.
X**
X** It has been tested on several System V machines, but no others.
X** To compile: cc -O -s clock.c -o clock -lcurses
X*/
X
X/* This program, and the procedures in it are Copyright 1988 by:
X** DCF, Inc.
X** 14623 North 49th Place
X** Scottsdale, AZ 85254
X** You may use it as you wish, including re-distribution, as long
X** as this notice remains intact and with the source code.
X** This program was suggested by a similar one written by
X** anasazi!duane.
X*/
X
X/*SUBTTL Includes, defines, and declarations */
X
Xstatic char SCCS[] = "@(#)clock.c 1.4 4/30/88 09:04:54";
X
X#include <stdio.h>
X#include <curses.h>
X#include <string.h>
X#include <errno.h>
X#include <signal.h>
X#include <time.h>
X
X#define MAXLINES 8 /* number of lines output by banner */
X#define BANNER "/usr/bin/banner " /* banner program to use */
X#define DAY_LINE 0 /* screen location for display elements */
X#define DATE_LINE 8
X#define TIME_LINE 16
X
X
X/* global data */
Xchar time_buf[24]; /* local time as a string */
Xstruct tm *time_tm; /* local time as a structure */
X
X/* forward references */
Xvoid put_scr(), do_time(), do_date(), blammo(), end_win(), exit();
Xint cat_int();
Xunsigned sleep();
Xextern FILE *popen();
Xextern long time();
X
X
X/*SUBTTL Main procedure */
Xmain()
X{
X long ticks; /* seconds since epoch */
X int old_day = -1; /* previous julian day */
X
X if ( !initscr() )
X blammo("curses initialization failed", 0);
X
X signal(SIGINT, cat_int); /* provide an exit path */
X signal(SIGTERM, cat_int);
X clear(); /* setup */
X noecho();
X
X while (TRUE) {
X /* get the local time for us to use */
X ticks = time( (long *)NULL );
X strncpy(time_buf, ctime(&ticks), 24);
X time_tm = localtime(&ticks);
X
X /* put date & time on the screen */
X if (old_day != time_tm->tm_yday) {
X old_day = time_tm->tm_yday;
X do_date(); /* build a new date */
X }
X do_time(); /* build the time */
X move(0, 0); /* update the screen */
X refresh();
X
X /* wait for clock to roll over the next minute */
X sleep( (unsigned)(60 - time_tm->tm_sec) );
X }
X}
X
X
X/*SUBTTL do_date - display the date banner */
X/*
X** Construct and display the date banner
X*/
Xvoid do_date()
X{
X static char *days[] = { /* days of the week */
X "Sunday", "Monday", "Tuesday", "Wednesday",
X "Thursday", "Friday", "Saturday" };
X char buf[7];
X
X erase(); /* in case new date is shorter than current */
X put_scr(DAY_LINE, days[time_tm->tm_wday]);
X strncpy(buf, &time_buf[4], 6);
X buf[6] = '\0';
X put_scr(DATE_LINE, buf);
X}
X
X
X/*SUBTTL do_time - display the time banner */
X/*
X** Construct and display the time banner
X*/
Xvoid do_time()
X{
X char buf[6];
X
X strncpy(buf, &time_buf[11], 5);
X buf[5] = '\0';
X put_scr(TIME_LINE, buf);
X}
X
X
X/*SUBTTL put_scr - put a banner in the screen buffer */
X/*
X** Construct and display a banner string
X*/
X
Xvoid put_scr(where, what)
Xint where;
Xchar *what;
X{
X char ban_buf[MAXLINES][80];
X char buf[80];
X FILE *proc_stream;
X int length = 0;
X register int line;
X
X /* start a "banner" stream in our direction */
X strncpy(buf, BANNER, 80);
X strcat(buf, "'");
X strcat(buf, what);
X strcat(buf, "'");
X if ( (proc_stream = popen(buf, "r") ) == (FILE *)NULL )
X blammo("Popen", errno);
X
X /* capture the stream in our buffer */
X for (line = 0; line < MAXLINES; line++) {
X fgets(ban_buf[line], 80, proc_stream);
X if ( feof(proc_stream) )
X blammo("Premature eof", 0);
X }
X (void)pclose(proc_stream);
X
X /* figure out how long this banner is (for centering) */
X for (line = 0; line < MAXLINES; line++)
X length = (length < strlen(ban_buf[line]) ?
X strlen(ban_buf[line]) : length);
X
X /* put the banner in the screen buffer */
X for (line = 0; line < MAXLINES; line++)
X mvaddstr(where + line, (COLS - length) / 2, ban_buf[line]);
X}
X
X
X/*SUBTTL blammo - display message and terminate program */
X/*
X** Reset the screen, issue an error message, and exit.
X*/
X
Xvoid blammo(msg, code)
Xchar *msg;
Xint code;
X{
X end_win();
X if (code)
X fprintf(stderr, "%s error %d\n", msg, code);
X else
X fprintf(stderr, "%s\n", msg);
X exit(-1);
X}
X
X
X/*SUBTTL end_win - clean up the window stuff */
X/*
X** Terminate the window stuff - clear the window and move the cursor.
X*/
X
Xvoid end_win()
X{
X clear();
X move(LINES - 1, 0);
X refresh();
X endwin();
X}
X
X
X/*SUBTTL cat_int - signal catcher */
X/*
X** Catch an interrupt signal and terminate the program.
X*/
X
Xint cat_int()
X{
X end_win();
X exit(0);
X}
END_OF_FILE
if test 5019 -ne `wc -c <'clock.c'`; then
echo shar: \"'clock.c'\" unpacked with wrong size!
fi
# end of 'clock.c'
fi
echo shar: End of shell archive.
exit 0
More information about the Comp.sources.misc
mailing list