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 l

⟦45e162cc4⟧ TextFile

    Length: 7948 (0x1f0c)
    Types: TextFile
    Names: »lcal.c«

Derivation

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

TextFile

/*
 * Module:	lcal.c
 *
 * Purpose:	print month's appointments
 *
 * Author:	Mike Essex
 *
 * Date:	Sep. 16, 1986
 *
 * Includes:
 *	time.h, stdio.h, ctype.h, signal.h
 *
 * Discussion:
 *	Reads data from ~/.appointments and/or designated file and
 *      writes to standard *	out any appoinments which fall in
 *      the current or optionally specified month.
 * 
 *
 * Edit History
 * ==== =======
 *
 * Date      Who	What
 * ----      ---	----------------------------------------------
 *
 */
\f


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


char	*malloc();

int		monthdata[1000];	/* month data */
int		daydata[1000];		/* month data */
int		yeardata[1000];	/* month data */
char		*msgdata[1000];	/* message pointers */
char		msghold[40];
int		maxentries;
int		maxmsgs;
int		cmonth,cday,cyear;
int		argvindex;


\f


/*
 * Procedure:	main()
 *
 * Function:	prints out listing of appointments
 *
 * Discussion:
 *	Parses command line for optional month and year, initializes
 *	varialbes, calls required funtions.
 */

main (argc,argv)

    int		argc;
    char	*argv[];
{

    int		month,day,year;
    int		i;
    int		tempmonth,tempyear;
    int		atoi();
    int		maxindex;
    extern int	abort();

    timeset();
    year = cyear;
    month = cmonth;
    day = cday;

    if (argc > 2) {
	tempmonth = atoi(argv[1]);
	tempyear = atoi(argv[2]);
	if (tempmonth && tempyear){
	    month = tempmonth;
	    year = tempyear;
	    if (year < 100) year += 1900;
	    if (argc > 3) {
		argvindex = 3;
		maxindex = argc;
	    }
	    else {
		argvindex = 0;
		maxindex = 1;
	    }
	}
	else {
	    if (tempmonth || tempyear) {
		printf("Syntax error:  Incorrect date arguments\n");
		exit(1);
	    }
	    else {
		argvindex = 1;
		maxindex = argc;
	    }
	}
    }
    else {
        if (argc == 1) {
	    argvindex = 0;
	    maxindex = argc;
	}
	else {
	    argvindex = 1;
	    maxindex = argc;
	}
    }

    
    signal(2,abort);
    signal(3,abort);

    day = 1;
    maxentries = 1000;
    maxmsgs = 18;
    msghold[0] = NULL;

    printf("                            C A L E N D A R   L I S T\n");
    while (argvindex < maxindex) {
	loaddata(argv[argvindex]);
	table(month,day,year,argv[argvindex]);
	argvindex++;
    }

    printf("------------------------------------------------------------------------------\n");
} /* main */

\f


/*
 * Procedure:	abort()
 *
 * Function:	error exit routine
 */

abort()

{
    exit(1);
} /* abort */

\f


/*
 * Procedure:	table(month,day,year)
 *
 * Function:	outputs appointments in tabular format
 *
 * Parameters:
 *	p1	- int - month
 *	p2	- int - day
 *	p3	- int - year
 *      p3      - char * - file name
 *
 * Discussion:
 *	Searches data arrays for appointments in the specified
 *	month and year and outputs them in tabular form to standard out.
 */

table(month,day,year,filename)

    int		month,day,year;
    char	*filename;

{
    int		i,j,k,d,dow,monthday,searchcnt,first;
    int		getdow();

    static char	*dayw[]= {
	"Sat   ","Sun   ","Mon   ", "Tue   ",
	"Wed    ", "Thu    ", "Fri    "
    };

    static char	*smon[]= {
    "JANUARY   ", "FEBRUARY   ", "MARCH    ", "APRIL    ",
    "MAY    ", "JUNE    ", "JULY    ", "AUGUST    ",
    "SEPTEMBER    ", "OCTOBER    ", "NOVEMBER    ", "DECEMBER    "
    };

    printf("------------------------------------------------------------------------------\n");
    if (argvindex) {
	printf("|  %-10.10s%u                       %30.30s       |\n", smon[month-1], year,filename);
    }
    else {
	printf("|  %-10.10s%u                                                            |\n", smon[month-1], year);
    }
    monthday = 0;
    while (++monthday <= 31) {
	searchcnt = 0;
	first = 1;
	while (searchcnt <= maxentries) {
	    if ((yeardata[searchcnt] == year) &&
	      (monthdata[searchcnt] == month) &&
	      (daydata[searchcnt] == monthday)) {
		if (first) {
		    dow = getdow(month,monthday,year);
		    first = 0;
		    /* printf("|----------------------------------------------------------------------------|\n"); */
		     printf("|                                                                            |\n"); 
		    printf("| %-7.7s%2d  %-64.64s|\n",dayw[dow],monthday,msgdata[searchcnt]);
		}
		else {
		    printf("|            %-64.64s|\n",msgdata[searchcnt]);
		}
	    }
	    searchcnt++;
	}
    }
} /* table */

\f


/*
 * Procedure:	getdow(tmonth,tday,tyear)
 *
 * Function:	calculates day of week
 *
 * Parameters:
 *	p1	- int - month
 *	p2	- int - day
 *	p3	- int - year
 *
 * Return Values:
 *	interger value of day of week, sat=0, . . ., etc
 *
 * Discussion:
 *	calculates number of days from 1,1,1979 and determines dow
 */

getdow(tmonth,tday,tyear)

    int		tmonth,tday,tyear;
{

    static    int    mdays[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
    int    month,day,year,mcnt;
    long   days;
    int    tdow;

    month = 1;
    day = 1;
    year = 79;

    if ((tmonth == month) && (tyear == year)) {
	days = abs(day - tday);
    }
    else {
        days = mdays[month] - day;
        if (tyear == year) {
            while (++month < tmonth) {
	        days += mdays[month];
	        if ((month == 2) && ((year % 4) == 0)) days++;
	    }
        }
        else {
            while (++month < 13) {
	        days += mdays[month];
                if ((month == 2) && ((year % 4) == 0)) days++;
            }
	    while (++year < tyear) {
	        days += 365;
	        if ((year % 4) == 0 ) days ++;
            }
    
	    mcnt = 0;
            while (++mcnt < tmonth) {
	        days += mdays[mcnt];
	        if ((mcnt == 2) && ((tyear % 4) == 0)) days++;
	    }
        }
        days += tday;
    }

    tdow = (days%7);

    return(tdow);
} /* get dow */

\f


/*
 * Procedure:	loaddata()
 *
 * Function:	loads appointment data from ~/.appointments file
 *
 * Return Values:
 *	various global arrays loaded with appointment data
 *
 */

loaddata(filename)

char	*filename;

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

    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,filename);
    }
    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++] = ' ';
			    tmpbuf[k++] = ' ';
			    break;
			}
		    }
		    field++;
		}
		j++;
	    }
	    tmpbuf[k] = '\0';
	    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",filename);
		break;
	    }
	    i++;
	}
	fclose(fptr);
    }
    else {
	printf("Error:  Cannot open %s file.\n",filename);
    }
} /* loaddata */

\f


/*
 * Procedure:	timeset()
 *
 * Function:	Gets current time and date
 *
 * Return Values:
 *	loads time and date info into global variables
 *
 */

timeset()

{
    struct	tm *localtime();

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

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

    tp = localtime(&tloc);

    cyear =	tp->tm_year;
    cmonth =	tp->tm_mon + 1;
    cday =	tp->tm_mday;

    cyear += 1900;

} /* timeset */