A simple date/time program for Wyse terminals
Jay A. Konigsberg
jak at sactoh0.SAC.CA.US
Wed Dec 26 04:05:42 AEST 1990
The following is a clock that resides in the F8 function key label
(the date goes into F7).
The features are:
1) Clock will sync to change time with the system (to the second).
2) The date is displayed on startup and again when the time is 00:00
(in case you left your terminal logged in overnight).
3) SIGQUIT (logout) and SIGTERM (kill -15) will clear the clock from
the labels (too bad about SIGKILL :-( ).
4) The display is done with write(2) to avoid system buffering (using
puts(3S) or printf(3S) with clock sometimes results in the time
being displayed across the screen - yes I could have used setbuf(3S)
and fflush(3S), but I chose write(2) ).
5) The ESC codes can be easily changed and the code recomplied.
The bugs are:
1) No command line options (i.e. you can't turn the date or time off).
2) Only Wyse ESC codes are included.
If there is enough interest (and requests) I'll modify the program
to accept command line options for:
- [-t[wyse|ansi|vt100] | -c clockESC -d dateESC] -C -D
(C & D would be clock_only and date_only)
anyway, here is the source:
--------------------------------- cut here -----------------------------------
/*LINTLIBRARY*/
#include <stdio.h>
#include <sys/types.h>
#include <time.h>
#include <utmp.h>
#include <signal.h>
#define F7LABEL "\033z6" /* esc code for F7 label */
#define F8LABEL "\033z7" /* esc code for F8 label */
main()
{
extern int sprintf(),
exit();
extern void cleanup();
void date_display(),
time_display();
unsigned sleep();
struct tm *locatime();
time_t time();
struct tm *timenow;
time_t clock;
/* initial display of the date and time */
clock = time(&clock);
timenow = localtime((time_t *)&clock);
date_display(timenow);
time_display(timenow);
if ( fork() == 0 )
{
signal(SIGINT, SIG_IGN);
signal(SIGQUIT, SIG_IGN);
signal(SIGHUP, cleanup);
signal(SIGTERM, cleanup);
for (;;)
{
/* sync the time to change on the exact boundry. Once initilized,
* it should never loop more than once or twice */
do
{
sleep(1);
clock = time(&clock);
timenow = localtime((time_t *)&clock);
}
while ( timenow->tm_sec != 0 );
/* change the date at midnight */
if ( timenow->tm_hour == 0 && timenow->tm_min == 0 )
date_display(timenow);
time_display(timenow);
sleep (58);
}
}
return(0);
}
/*
* display the date
*/
void date_display(timenow)
struct tm *timenow;
{
char date_buff[10];
sprintf(date_buff, "%2d/%2d/%2d", timenow->tm_mon+1,
timenow->tm_mday, timenow->tm_year);
write ( 1, F7LABEL, sizeof(F7LABEL));
write ( 1, date_buff, (unsigned)strlen(date_buff));
}
/*
* display the time
*/
void time_display(timenow)
struct tm *timenow;
{
char meridian[3], /* anti-meridian, post-meridian (am/pm) */
time_buff[10];
/* setup 12 hour AM/PM notation */
if (timenow->tm_hour == 0)
{
timenow->tm_hour = 12;
meridian[0]='A';
}
else
if (timenow->tm_hour == 12)
meridian[0]='P';
else
if (timenow->tm_hour > 12)
{
timenow->tm_hour -= 12;
meridian[0]='P';
}
else /* its in the AM */
meridian[0]='A';
meridian[1]='M';
meridian[2]='\0';
if (timenow->tm_min >= 10)
sprintf (time_buff, "%2d:%d %s", timenow->tm_hour, timenow->tm_min, meridian);
else
sprintf (time_buff, "%2d:0%1d %s", timenow->tm_hour, timenow->tm_min, meridian);
write(1, F8LABEL, sizeof(F8LABEL));
write(1, time_buff, (unsigned)strlen(time_buff));
}
/*
* remove the date and time at logout
*/
void cleanup()
{
write(1, F7LABEL, sizeof(F7LABEL));
write(1, " ", 8);
write(1, F8LABEL, sizeof(F8LABEL));
write(1, " ", 8);
exit(0);
}
--
-------------------------------------------------------------
Jay @ SAC-UNIX, Sacramento, Ca. UUCP=...pacbell!sactoh0!jak
If something is worth doing, it's worth doing correctly.
More information about the Alt.sources
mailing list