DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download
Index: ┃ T a

⟦8bae4e441⟧ TextFile

    Length: 5505 (0x1581)
    Types: TextFile
    Names: »autocall.c«

Derivation

└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki
    └─ ⟦this⟧ »EUUGD11/euug-87hel/sec1/vcal/autocall.c« 

TextFile

/*
 * Module:	autocall.c
 *
 * Purpose:	notifies user at specified day and time of an
 *		appointment
 *
 * Author:	Mike Essex
 *
 * Date:	Sep 19, 1986
 *
 * Includes:
 *	time.h, stdio.h, signal.h
 *
 * Discussion:
 *	This program spawns background processes for each of the
 *	current date's entries in the user's ~/.appointments file.
 *      At the specified time of day the process outputs the
 *	message associated with the entry and dies.
 * 
 *
 * Edit History
 * ==== =======
 *
 * Date      Who	What
 * ----      ---	----------------------------------------------
 * 12/1/86   me		added multi-datafile capability
 * 12/1/86   me		changed 'home' from *home[80] to home[80]
 * 12/1/86   me		changed int maxentries to #define MAXENTRIES
 *  2/6/87   me		change '<=' to '<' in file while loop
 *
 */
\f


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

#define		MAXENTRIES 1000

int		monthdata[MAXENTRIES];
int		daydata[MAXENTRIES];
int		yeardata[MAXENTRIES];
int		timedata[MAXENTRIES];
char		*msgdata[MAXENTRIES];
int		month,day,year,hour,mhour,min,sec,dow,ampm;
int		cntr;
int		argvindex;

\f


/*
 * Procedure:	main()
 *
 * Function:	initializes variables, calls data load, calculates
 *		sleep time for message, forks message process
 */

main(argc,argv)

int	argc;
char	*argv[];

{
    int		cnt,timeout,status,nowtime;
    int		loaddata();

    signal(SIGINT,SIG_IGN);
    signal(SIGQUIT,SIG_IGN);

    if (argc > 1) {
	argvindex = 1;
    }
    else {
	argvindex = 0;
    }
    while (argvindex < argc) {
	cntr = 0;
	if ((cnt = loaddata(argv[argvindex])) != 0 ) {
	    timeset();
	    while (cntr < cnt) {
		nowtime = (mhour * 60) + min;
		if ((monthdata[cntr] == month) && (daydata[cntr] == day)
		&& (yeardata[cntr] == year) && (timedata[cntr] > nowtime)) {
		    timeout = (timedata[cntr] - nowtime) * 60;
		    if ( timeout > 300 ) {
			timeout -= 300;
		    }
		    if ((status = fork()) == 0) {
			ringer(timeout,msgdata[cntr]);
			exit(0);
		    }
		    else {
			if (status < 0) {
			    printf("Error:  Cannot start new autocall process\n");
			}
		    }
		}
		cntr++;
	    }
	}
	argvindex++;
    }
    exit(0);
} /* main */


\f


/*
 * Procedure:	timeset()
 *
 * Function:	sets current date and time
 *
 * Return Values:
 *	sets global varialbes to date and time
 */

timeset()

{
    struct	tm *localtime();

    struct tm *tp;		/* time structure */
    long	tloc;		/* number of seconds since 1970 */

    time(&tloc);	/* fills tloc */

    tp = localtime(&tloc);

    dow =	tp->tm_wday;
    year =	tp->tm_year;
    month =	tp->tm_mon + 1;
    day =	tp->tm_mday;
    hour = tp->tm_hour;
    mhour = tp->tm_hour;
    min = tp->tm_min;
    sec = tp->tm_sec;

    year += 1900;

    if (sec >= 30)
    {
	min += 1;	/* round up minutes */
	if (min == 60)
	{
	mhour += 1;
	hour += 1;
	min = 0;
	}
    }

    if (hour > 12)
    {
	hour -= 12;
    }
    if (mhour >= 12)
    {
	ampm = 1;
    }
    else {
	ampm = 0;
    }
} /* timeset */


\f


/*
 * Procedure:	loaddata()
 *
 * Function:	load appointments data
 *
 * Return Values:
 *	loads various global arrays with appointment data
 *
 * Discussion:
 *	opens ~/.appointments file and inputs data, then puts
 *	it into appropriate arrays
 */

loaddata(datafile)

char	*datafile;
{
    char	basedata[80];
    char	tmpbuf[80];
    char	*getenv();
    FILE 	*fptr;
    char	home[80];
    int		msgtime,i,j,k,l,field;
    char	*malloc();

    i = 0;
    while (i < MAXENTRIES) {
	daydata[i] = 0;
	monthdata[i] = 0;
	yeardata[i] = 0;
	msgdata[i] = 0;
	i++;
    }

    if (argvindex == 0) {
	strcpy(home,getenv("HOME"));
	strcat(home,"/.appointments");
    }
    else {
	strcpy(home,datafile);
    }

    if ((fptr = fopen(home,"r")) != NULL) {
	i = 0;
	while((fgets(basedata,80,fptr) != NULL)) {

	    basedata[strlen(basedata)-1] = NULL;

	    j = 0;
	    k = 0;
	    field = 0;
	    while (basedata[j] != NULL ) {
                 
                if (basedata[j] != ',') {

		    tmpbuf[k++] = basedata[j];
		}
		else {
		    switch (field) {

			case 0 : {
			    tmpbuf[k] = NULL;
			    monthdata[i] = atoi(tmpbuf);
			    k = 0;
			    break;
			}
			case 1 : {
			    tmpbuf[k] = NULL;
			    daydata[i] = atoi(tmpbuf);
			    k = 0;
			    break;
			}
			case 2 : {
			    tmpbuf[k] = NULL;
			    yeardata[i] = atoi(tmpbuf);
			    k = 0;
			    break;
			}
			case 3 : {
			    tmpbuf[k] = NULL;
			    msgtime = atoi(tmpbuf);
			    timedata[i] = ((msgtime / 100 ) * 60) + (msgtime % 100);
			    k = 0;
			    break;
			}
		    }
		    field++;
		}
		j++;
	    }
	    tmpbuf[k] = NULL;
	    msgdata[i] = malloc(80);
	    strncpy(msgdata[i],tmpbuf,80);
	    msgdata[79] = NULL;

	    if (i >= MAXENTRIES) {
		printf("Warning:  Over 1000 entries in %s file.  Data truncated.\n",datafile);
		break;
	    }
	    i++;
	}
	fclose(fptr);
    }
    else {
	printf("Error:  cannot open %s file.\n",datafile);
    }
    return(i);
} /* loaddata */

\f


/*
 * Procedure:	ringer(delay,message)
 *
 * Function:	outputs appointment message at appropriate time
 *
 * Parameters:
 *	p1	- int - delay time in seconds
 *	p2	- char pointer - pointer to appointment message
 *
 * Discussion:
 *	Takes in delay time and sleeps until delay is completed.
 *	Then it outputs the message to standard out and dies.
 */

ringer(delay,message)

    int		delay;
    char	*message;
{
    sleep(delay);
    timeset();
    printf("\r\nTime %d:%02d %2s    ", hour, min, (ampm == 0 ? "AM" : "PM"));
    printf("Activity scheduled:  %s \r\n\n",message);
} /* ringer */