Vcalendar (part 3 of 3) is available upon request.

James Pierre Lewis james at yunexus.UUCP
Wed Feb 1 12:58:22 AEST 1989


Vcalendar is a calendar/schedule keeping program that allows one to
keep track of appointments, classes, meetings, and dates, etc. It is
posted upon request from panetta at duphy4.drexel.edu. Vcalendar is
written in C running on VAX/VMS 4.xx or higher. It is free.

If you are interested, please cut the three parts - VCAL1.SHAR,
VCAL2.SHAR and VCAL3.SHAR; follow the instructions in 0REAME.1ST and 
have fun.

-----CUT-----CUT-----CUT-----CUT-----CUT-----CUT-----CUT-----CUT-----CUT-----
#! /bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #! /bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create the files:
#	vcal-purge.c
#	vcal-remind.c
#	vcal-sum.c
#	vcal-util.c
#	vcal.c
#	vcal.h
#	vcalendar.cld
#	vcalendar.rnh
# This archive created: Tue Jan 31 21:50:25 1989
export PATH; PATH=/bin:$PATH
echo shar: extracting "'vcal-purge.c'" '(3855 characters)'
if test -f 'vcal-purge.c'
then
	echo shar: will not over-write existing file "'vcal-purge.c'"
else
sed 's/^	X//' << \SHAR_EOF > 'vcal-purge.c'
	X/*
	X *	  -------------------------------------------------------
	X *        Neither  York  University,   Department  of   Computer
	X *        Science   nor   the  author  assume any responsibility
	X *        for the use or reliability of this software.
	X *
	X *                 Copyright (C) 1987, York University
	X *                    Department of Computer Science
	X *
	X *        General permission to copy  or  modify,  but  not  for
	X *        profit,  is  hereby granted, provided  that  the above
	X *        copyright notice is included  and  reference  made  to
	X *        the fact that reproduction  privileges  were   granted
	X *        by the York University, Department of Computer Science.
	X *	  -------------------------------------------------------
	X *
	X *	  Written by: James Pierre Lewis
	X *		      Department of Computer Science
	X *		      York University
	X *		      1987 - Version V1.0
	X */
	X
	X#include	<descrip.h>
	X#include	<stdio.h>
	X#include	<time.h>
	X#include	"vcal.h"
	X
	Xchar	msgdata[MAX_ENT][MAX_BUF];	/* message pointers */
	X
	Xint	daydata[MAX_ENT],		/* day data */
	X	monthdata[MAX_ENT],		/* month data */
	X	tmonth,				/* current month */
	X	tday,				/* current day */
	X	tyear,				/* current year */
	X	yeardata[MAX_ENT]; 		/* year data */
	X 
	Xmain()
	X{
	X	timeset();
	X	loaddata();
	X	updatedata();
	X}
	X
	X/*----------------------------------------------------------------------------*/
	X
	Xtimeset()
	X{
	X	int	tloc;
	X	struct	tm	*localtime(),
	X			*tp;
	X
	X	time(&tloc);
	X	tp = localtime(&tloc);
	X
	X	tyear = tp->tm_year;
	X	tmonth = tp->tm_mon + 1;
	X	tday = tp->tm_mday;
	X	tyear += LYEAR;
	X}	
	X
	X/*----------------------------------------------------------------------------*/
	X
	Xloaddata()
	X{
	X	char	basedata[MAX_BUF],
	X		key[MAX_BUF],
	X		tmp[MAX_BUF];
	X	int	field,
	X		i,
	X		j,
	X		k,
	X		l;
	X 	FILE	*fptr;
	X 
	X	for (i = NULL; i < MAX_ENT; i++)
	X	{
	X		daydata[i] = monthdata[i] = yeardata[i] = *msgdata[i] = NULL;
	X	}
	X
	X	if (access(APPTS_FILE, __) == -1)
	X	{
	X		CHK_STAT("", __, OWN_MSG, VCAL_ACCESS);	
	X	}
	X
	X	fptr = fopen(APPTS_FILE, "r");
	X	i = NULL;
	X	cuserid(key);
	X	strcat(key, "-VCAL");
	X
	X	while(fgets(basedata, MAX_BUF, fptr) != NULL)
	X	{
	X		basedata[strlen(basedata) - 1] = NULL;
	X		crypt_it(basedata, key);
	X		j = k = field = NULL;
	X
	X		while(basedata[j] != NULL ) 
	X		{
	X	                if (basedata[j] != ',') 
	X				tmp[k++] = basedata[j];
	X	                else 
	X			{
	X				switch(field) {
	X
	X				case 0 :
	X					tmp[k] = NULL;
	X					monthdata[i] = atoi(tmp);
	X					k = NULL;
	X					break;
	X
	X				case 1 : 
	X					tmp[k] = NULL;
	X					daydata[i] = atoi(tmp);
	X					k = NULL;
	X					break;
	X
	X				case 2 : 
	X					tmp[k] = NULL;
	X					yeardata[i] = atoi(tmp);
	X					k = NULL;
	X					break;
	X
	X				case 3 : 
	X					tmp[k++] = ' ';
	X					tmp[k++] = ' ';
	X					break;
	X				}
	X				field++;
	X			}
	X			j++;
	X		}
	X
	X		tmp[k] = NULL;
	X		strncpy(msgdata[i], tmp, MAX_BUF);
	X		msgdata[i][MAX_BUF - 1] = NULL;
	X 
	X		if (++i >= MAX_ENT) 
	X			break;
	X	}
	X
	X	fclose(fptr);
	X} 
	X
	X/*----------------------------------------------------------------------------*/
	X
	Xupdatedata(final_stat)
	X
	Xint	*final_stat;
	X{
	X	char	*c,
	X		key[MAX_BUF],
	X		tmp1[MAX_BUF],
	X		tmp2[MAX_BUF],
	X		tmpnam[MAX_BUF];
	X	int	i,
	X		stat;
	X	FILE	*fptr;
	X
	X	c = mktemp("SYS$LOGIN:TMPXXXXXX");
	X	sprintf(tmpnam, "%s.DAT", c);
	X	fptr = fopen(tmpnam, "w", "fop = cif", "mrs = 80", "rat = cr", 
	X		"rfm = var, stm");
	X	cuserid(key);
	X	strcat(key, "-VCAL");
	X
	X	stat = lib$disable_ctrl(&LIB$M_CLI_CTRLY, __);
	X
	X	for (i = NULL; i < MAX_ENT; i++)
	X	{
	X
	X		if ((daydata[i] != NULL) &&
	X		   ((monthdata[i] >= tmonth) && (yeardata[i] >= tyear)))
	X		{
	X			strcpy(tmp1, msgdata[i]);
	X			tmp1[4] = NULL;
	X			sprintf(tmp2, "%d,%d,%d,%4.4s,%s",
	X				monthdata[i], daydata[i], yeardata[i],
	X				tmp1, &tmp1[6]);
	X			crypt_it(tmp2, key);
	X			fprintf(fptr, "%s\n", tmp2);
	X		}
	X	}
	X
	X	fclose(fptr);
	X	delete(APPTS_FILE);
	X	stat = lib$rename_file(mkdesc(tmpnam), mkdesc(APPTS_FILE), __,
	X		__, __, __, __, __, __, __, __, __);
	X
	X	stat = lib$enable_ctrl(&LIB$M_CLI_CTRLY, __);
	X}
SHAR_EOF
if test 3855 -ne "`wc -c < 'vcal-purge.c'`"
then
	echo shar: error transmitting "'vcal-purge.c'" '(should have been 3855 characters)'
fi
fi # end of overwriting check
echo shar: extracting "'vcal-remind.c'" '(2154 characters)'
if test -f 'vcal-remind.c'
then
	echo shar: will not over-write existing file "'vcal-remind.c'"
else
sed 's/^	X//' << \SHAR_EOF > 'vcal-remind.c'
	X/*
	X *	  -------------------------------------------------------
	X *        Neither  York  University,   Department  of   Computer
	X *        Science   nor   the  author  assume any responsibility
	X *        for the use or reliability of this software.
	X *
	X *                 Copyright (C) 1987, York University
	X *                    Department of Computer Science
	X *
	X *        General permission to copy  or  modify,  but  not  for
	X *        profit,  is  hereby granted, provided  that  the above
	X *        copyright notice is included  and  reference  made  to
	X *        the fact that reproduction  privileges  were   granted
	X *        by the York University, Department of Computer Science.
	X *	  -------------------------------------------------------
	X *
	X *	  Written by: James Pierre Lewis
	X *		      Department of Computer Science
	X *		      York University
	X *		      1987 - Version V1.0
	X */
	X
	X#include	<climsgdef.h>
	X#include	<descrip.h>
	X#include	<lnmdef.h>
	X#include	<stdio.h>
	X#include	"vcal.h"
	X
	Xmain()
	X{
	X	char	min[MAX_BUF],
	X		prc_nam[MAX_BUF],
	X		tmp[MAX_BUF];
	X	int	flag = 0x00000001,	/* no wait */
	X		stat;
	X	$DESCRIPTOR(image, REMIND_IMAGE);
	X	$DESCRIPTOR(log_nam, VCAL_MIN);
	X	$DESCRIPTOR(tab_nam, "LNM$JOB");
	X	ITEM_LST item_lst[] =
	X	{
	X		{ 2, 	LNM$_STRING, 	min, 	0 },
	X                { 0, 	0,		0,	0 }
	X        };
	X
	X	cuserid(tmp);
	X	sprintf(prc_nam, "REM_%s", tmp);
	X	prc_nam[15] = NULL;
	X	get_data(min);
	X
	X	stat = sys$crelnm(__, &tab_nam, &log_nam, __, &item_lst);
	X	CHK_STAT("", __, SYS_MSG, stat);	
	X
	X	stat = lib$spawn(&image, __, __, &flag, mkdesc(prc_nam), __, __, __, 
	X		__, __, __, __);
	X	CHK_STAT("", __, SYS_MSG, stat);	
	X}
	X
	X/*----------------------------------------------------------------------------*/
	X
	Xget_data(min)
	X
	Xchar	*min;
	X{
	X	char	min_tmp[MAX_BUF];
	X	short	len = NULL;
	X	int	i,
	X		stat;
	X	$DESCRIPTOR(min_inp, min_tmp);
	X	$DESCRIPTOR(min_lbl, MIN);
	X
	X	if ((stat = cli$present(&min_lbl)) == CLI$_PRESENT)
	X	{
	X		stat = cli$get_value(&min_lbl, &min_inp, &len);
	X		min_tmp[len] = NULL;
	X
	X		if ((i = atoi(min_tmp)) < 5 || i > 20)
	X		{
	X			CHK_STAT("", __, OWN_MSG, VCAL_INVMIN);	
	X		}
	X	
	X		sprintf(min, "%-2.2s", min_tmp);
	X	}
	X	else	sprintf(min, "%-2.2s", DEF_MIN);
	X}
SHAR_EOF
if test 2154 -ne "`wc -c < 'vcal-remind.c'`"
then
	echo shar: error transmitting "'vcal-remind.c'" '(should have been 2154 characters)'
fi
fi # end of overwriting check
echo shar: extracting "'vcal-sum.c'" '(7808 characters)'
if test -f 'vcal-sum.c'
then
	echo shar: will not over-write existing file "'vcal-sum.c'"
else
sed 's/^	X//' << \SHAR_EOF > 'vcal-sum.c'
	X/*
	X *	  -------------------------------------------------------
	X *        Neither  York  University,   Department  of   Computer
	X *        Science   nor   the  author  assume any responsibility
	X *        for the use or reliability of this software.
	X *
	X *                 Copyright (C) 1987, York University
	X *                    Department of Computer Science
	X *
	X *        General permission to copy  or  modify,  but  not  for
	X *        profit,  is  hereby granted, provided  that  the above
	X *        copyright notice is included  and  reference  made  to
	X *        the fact that reproduction  privileges  were   granted
	X *        by the York University, Department of Computer Science.
	X *	  -------------------------------------------------------
	X *
	X *	  Written by: James Pierre Lewis
	X *		      Department of Computer Science
	X *		      York University
	X *		      1987 - Version V1.0
	X */
	X
	X#include	<climsgdef.h>
	X#include	<descrip.h>
	X#include	<stdio.h>
	X#include	<time.h>
	X#include	"vcal.h"
	X
	Xchar	msgdata[MAX_ENT][MAX_BUF];	/* message pointers */
	X
	Xint	cday,				/* current day */
	X	cmonth,				/* current month */
	X	cyear,				/* current year */
	X	daydata[MAX_ENT],		/* day data */
	X	dayindex[MAX_MSG],		/* day index to day, month, year */
	X	monthdata[MAX_ENT],		/* month data */
	X	yeardata[MAX_ENT]; 		/* year data */
	X
	Xmain()
	X{
	X	char	file_nam[FILE_LEN];
	X	int	month,
	X		year;
	X
	X	timeset();
	X	year = cyear;
	X	month = cmonth;
	X	get_data(&month, &year, file_nam);
	X
	X	if (*file_nam)
	X		stdout = freopen(file_nam, "w", stdout, "shr = nil");
	X
	X	if (stdout == NULL)
	X	{
	X		CHK_STAT("", __, OWN_MSG, VCAL_INVFILE);	
	X	}
	X
	X        loaddata();
	X	fprintf(stdout,
	X		"                        A P P O I N T M E N T S   L I S T\n");
	X	repeat('-', 78); 
	X	table(month, year);
	X	repeat('-', 78);
	X}
	X
	X/*----------------------------------------------------------------------------*/
	X
	Xget_data(month, year, file_nam)
	X
	Xchar	*file_nam;
	Xint	*month,
	X	*year;
	X{
	X	char	month_tmp[MAX_BUF],
	X		year_tmp[MAX_BUF];
	X	short	len = NULL;
	X	int	stat;
	X	struct	{
	X		int	: 32;
	X		struct	{
	X			char	*month_nam;
	X			int	: 32;
	X		} month_tbl[12];
	X	} key_tbl = 
	X	{
	X		24,
	X		{
	X			{ "7JANUARY", 	1 },
	X			{ "8FEBRUARY", 	2 },
	X			{ "5MARCH",	3 },
	X			{ "5APRIL",	4 },
	X			{ "3MAY",	5 },
	X			{ "3JUN",	6 },
	X			{ "4JULY",	7 },
	X			{ "6AUGUST",	8 },
	X			{ "9SEPTEMBER",	9 },
	X			{ "8OCTOBER",	10 },
	X			{ "8NOVEMBER",	11 },
	X			{ "8DECEMBER",	12 }
	X		}
	X	};
	X	$PTR_DESCRIPTOR(FILE_LEN, file_inp, file_nam);
	X	$DESCRIPTOR(file_lbl, OUT_FILE);
	X	$DESCRIPTOR(month_inp, month_tmp);
	X	$DESCRIPTOR(month_lbl, MONTH);
	X	$DESCRIPTOR(year_inp, year_tmp);
	X	$DESCRIPTOR(year_lbl, YEAR);
	X
	X	if ((stat = cli$present(&month_lbl)) == CLI$_PRESENT)
	X	{
	X		stat = cli$get_value(&month_lbl, &month_inp, &len);
	X		month_tmp[len] = NULL;
	X		stat = lib$lookup_key(mkdesc(month_tmp), &key_tbl, month, 
	X			__, __);
	X		CHK_STAT("", stat, SS$_NORMAL, VCAL_INVMONTH); 
	X	}
	X
	X	if ((stat = cli$present(&year_lbl)) == CLI$_PRESENT)
	X	{
	X		stat = cli$get_value(&year_lbl, &year_inp, &len);
	X		year_tmp[len] = NULL;
	X		*year = atoi(year_tmp);
	X
	X		if (*year == NULL || *year > UYEAR || *year < LYEAR)
	X		{
	X			CHK_STAT("", __, OWN_MSG, VCAL_INVYEAR);
	X		}
	X	}
	X
	X	if ((stat = cli$present(&file_lbl)) == CLI$_PRESENT)
	X	{
	X		stat = cli$get_value(&file_lbl, &file_inp, &len);
	X		file_nam[len] = NULL;
	X	}
	X}
	X
	X/*----------------------------------------------------------------------------*/
	X
	Xrepeat(c, num)
	X
	Xchar	c;
	Xint	num;
	X{
	X	char	tmp[MAX_BUF];
	X	int	i;
	X
	X	for (i = NULL; i < num; tmp[i] = c, i++);
	X
	X	tmp[0] = tmp[num - 1] = '+';
	X	tmp[i] = NULL;
	X	fprintf(stdout, "%s\n", tmp);
	X}
	X
	X/*----------------------------------------------------------------------------*/
	X
	Xtable(month, year)
	X
	Xint	month,
	X	year;
	X{
	X	char	*dayw[] =
	X	{	
	X		"Sat   ",	"Sun   ",	"Mon   ", 	"Tue   ",
	X		"Wed    ", 	"Thu    ", 	"Fri    "
	X	};
	X	char	*smon[] =
	X	{
	X		"JANUARY   ",    "FEBRUARY   ", "MARCH    ",    "APRIL    ",
	X		"MAY    ",       "JUNE    ",    "JULY    ",     "AUGUST    ",
	X		"SEPTEMBER    ", "OCTOBER    ", "NOVEMBER    ", "DECEMBER    "
	X	};
	X	int	dow,
	X		first,
	X		i,
	X		j,
	X		monthday = NULL;
	X 
	X        fprintf(stdout,
	X		"| %-10.10s %4.4u                                            \
	X                |\n", smon[month-1], year);
	X
	X	while (++monthday <= 31) 
	X	{
	X		first = TRUE;
	X
	X		for (i = j = NULL; i <= MAX_ENT; i++)
	X		{
	X			if ((yeardata[i] == year) && (monthdata[i] == month) &&
	X			    (daydata[i] == monthday)) 
	X			{
	X				dayindex[j++] = i;
	X			}
	X
	X			if (j > MAX_MSG)
	X				break;
	X		}
	X
	X		sort(j - 1);
	X
	X		for (i = NULL; i < j; i++)
	X		{
	X			if (first == TRUE)
	X			{
	X				dow = getdow(monthday, month, year);
	X				first = FALSE;
	X				fprintf(stdout,
	X					"|                                    \
	X                                        |\n");
	X				fprintf(stdout,
	X					"| %-7.7s%2d  %-64.64s|\n", dayw[dow], 
	X					monthday, msgdata[dayindex[i]]);
	X			}
	X			else 	fprintf(stdout,
	X					"|            %-64.64s|\n", 
	X					msgdata[dayindex[i]]);
	X		}
	X	}
	X}
	X
	X/*----------------------------------------------------------------------------*/
	X
	Xgetdow(tday, tmonth, tyear)
	X
	Xint	tday,
	X	tmonth,
	X	tyear;
	X{
	X
	X	static	int	mdays[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
	X	int	day = 1,
	X		days,
	X		mcnt,
	X		month = 1,
	X		year = 79;
	X 
	X 
	X	if ((tmonth == month) && (tyear == year)) 
	X	        days = abs(day - tday);
	X	else 
	X	{
	X		days = mdays[month] - day;
	X
	X		if (tyear == year)
	X		{
	X			while (++month < tmonth)
	X			{
	X				days += mdays[month];
	X				days = ((month == 2) && ((year % 4) == 0)) ?
	X					days + 1 : days;
	X			}
	X		}
	X		else 
	X		{
	X			while (++month < 13) 
	X			{
	X				days += mdays[month];
	X				days = ((month == 2) && ((year % 4) == 0)) ?
	X					days + 1 : days;
	X			}
	X
	X			while (++year < tyear) 
	X			{
	X				days += 365;
	X				days = ((year % 4) == 0) ? days + 1 : days;
	X			}
	X     
	X			for (mcnt = 1; mcnt < tmonth; mcnt++)
	X			{
	X		                days += mdays[mcnt];
	X				days = ((mcnt == 2) && ((tyear % 4) == 0)) ?
	X					days + 1 : days;
	X			}
	X		}
	X
	X		days += tday;
	X	}
	X 
	X	return (days % 7);
	X}
	X
	X/*----------------------------------------------------------------------------*/
	X
	Xloaddata()
	X{
	X	char	basedata[MAX_BUF],
	X		key[MAX_BUF],
	X		tmp[MAX_BUF];
	X	int	field,
	X		i,
	X		j,
	X		k,
	X		l;
	X 	FILE	*fptr;
	X
	X	for (i = NULL; i < MAX_ENT; i++)
	X	{
	X		daydata[i] = monthdata[i] = yeardata[i] = *msgdata[i] = NULL;
	X	}
	X 
	X	if (access(APPTS_FILE, __) == -1)
	X	{
	X		CHK_STAT("", __, OWN_MSG, VCAL_ACCESS);	
	X	}
	X
	X	fptr = fopen(APPTS_FILE, "r");
	X	i = NULL;
	X	cuserid(key);
	X	strcat(key, "-VCAL");
	X
	X	while(fgets(basedata, MAX_BUF, fptr) != NULL)
	X	{
	X		basedata[strlen(basedata) - 1] = NULL;
	X		crypt_it(basedata, key);
	X		j = k = field = NULL;
	X
	X		while(basedata[j] != NULL ) 
	X		{
	X	                if (basedata[j] != ',') 
	X				tmp[k++] = basedata[j];
	X	                else 
	X			{
	X				switch(field) {
	X
	X				case 0 :
	X					tmp[k] = NULL;
	X					monthdata[i] = atoi(tmp);
	X					k = NULL;
	X					break;
	X
	X				case 1 : 
	X					tmp[k] = NULL;
	X					daydata[i] = atoi(tmp);
	X					k = NULL;
	X					break;
	X
	X				case 2 : 
	X					tmp[k] = NULL;
	X					yeardata[i] = atoi(tmp);
	X					k = NULL;
	X					break;
	X
	X				case 3 : 
	X					tmp[k++] = ' ';
	X					tmp[k++] = ' ';
	X					break;
	X				}
	X				field++;
	X			}
	X			j++;
	X		}
	X
	X		tmp[k] = NULL;
	X		strncpy(msgdata[i], tmp, MAX_BUF);
	X		msgdata[i][MAX_BUF - 1] = NULL;
	X 
	X		if (++i >= MAX_ENT) 
	X			break;
	X	}
	X
	X	fclose(fptr);
	X} 
	X
	X/*----------------------------------------------------------------------------*/
	X
	Xtimeset()
	X{
	X	int	tloc;
	X	struct	tm	*localtime(),
	X			*tp;
	X
	X	time(&tloc);
	X	tp = localtime(&tloc);
	X
	X	cyear = tp->tm_year;
	X	cmonth = tp->tm_mon + 1;
	X	cday = tp->tm_mday;
	X	cyear += LYEAR;
	X}	
	X
	X/*----------------------------------------------------------------------------*/
	X
	Xsort(upbound)
	X
	Xint	upbound;
	X{
	X	int	i,
	X		j,
	X		k;
	X
	X	for (i = upbound; i > NULL; i--)
	X	{
	X		for (j = NULL; j < i; j++)
	X		{
	X			if (strncmp(msgdata[dayindex[j]],
	X			    msgdata[dayindex[j + 1]], 4) > NULL)
	X			{
	X				k = dayindex[j];
	X				dayindex[j] = dayindex[j + 1];
	X				dayindex[j + 1] = k;
	X			}
	X		}
	X	}
	X}
SHAR_EOF
if test 7808 -ne "`wc -c < 'vcal-sum.c'`"
then
	echo shar: error transmitting "'vcal-sum.c'" '(should have been 7808 characters)'
fi
fi # end of overwriting check
echo shar: extracting "'vcal-util.c'" '(7891 characters)'
if test -f 'vcal-util.c'
then
	echo shar: will not over-write existing file "'vcal-util.c'"
else
sed 's/^	X//' << \SHAR_EOF > 'vcal-util.c'
	X/*
	X *	  -------------------------------------------------------
	X *        Neither  York  University,   Department  of   Computer
	X *        Science   nor   the  author  assume any responsibility
	X *        for the use or reliability of this software.
	X *
	X *                 Copyright (C) 1987, York University
	X *                    Department of Computer Science
	X *
	X *        General permission to copy  or  modify,  but  not  for
	X *        profit,  is  hereby granted, provided  that  the above
	X *        copyright notice is included  and  reference  made  to
	X *        the fact that reproduction  privileges  were   granted
	X *        by the York University, Department of Computer Science.
	X *	  -------------------------------------------------------
	X *
	X *	  Written by: James Pierre Lewis
	X *		      Department of Computer Science
	X *		      York University
	X *		      1987 - Version V1.0
	X */
	X
	X#include	<dcdef.h>
	X#include 	<descrip.h>
	X#include	<dvidef.h>
	X#include	<iodef.h>
	X#include 	<stdio.h>
	X#include	<ttdef.h>
	X#include	<tt2def.h>
	X#include	<smgdef.h>
	X#include	"smgtrmptr.h"
	X#include	"vcal.h"
	X
	Xsetup_tty()
	X{
	X	int 	i,
	X		stat;
	X	ITEM_LST item_lst[] =
	X	{
	X		{ 4,	DVI$_DEVCLASS, 	&tty_class, 	0 },
	X                { 4, 	DVI$_DEVTYPE, 	&tty_type, 	0 },
	X                { 4, 	DVI$_DEVDEPEND, &tty_depend, 	0 },
	X                { 0, 	0, 		0, 		0 }
	X        };
	X	$DESCRIPTOR(tty, "TT");
	X
	X	stat = sys$getdvi(__, __, &tty, &item_lst, __, __, __, __);
	X	CHK_STAT("", tty_class, DC$_TERM, VCAL_NOT_TRM); 
	X
	X	stat = sys$assign(&tty, &tty_chan, __, __);
	X	CHK_STAT("", __, SYS_MSG, stat);	
	X
	X	stat = sys$qiow(__, tty_chan, IO$_SENSEMODE, __, __, __, tty_oldchar, 
	X		12, __, __, __, __); 
	X
	X	for (i = NULL; i < 3; i++)
	X		tty_newchar[i] = tty_oldchar[i];	/* new tty mode */
	X
	X	tty_newchar[1] &= ~TT$M_MECHTAB;	/* no tabbing is allowed */
	X	tty_newchar[1] &= ~TT$M_WRAP;		/* no wrapping is allowed */
	X
	X	stat = sys$qiow(__, tty_chan, IO$_SETMODE, __, __, __, tty_newchar, 
	X		12, __, __, __, __); 
	X}
	X
	X/*----------------------------------------------------------------------------*/
	X
	Xfresh_tty()
	X{
	X	char	tty_clear[ESC_LEN],
	X		tty_nowrap[ESC_LEN],
	X		tty_setorigin[ESC_LEN],
	X		tty_setscroll[ESC_LEN];
	X	int	esc_len,
	X		stat;
	X	ESC_ARG	std_region = { 2, 1, 24};	/* Normal scrolling */
	X
	X	if (tty_depend & TT$M_SCOPE)
	X	{
	X		stat = smg$init_term_table_by_type(&tty_type, &tty_entry, __);
	X		CHK_STAT("", __, SYS_MSG, stat);	
	X
	X		stat = smg$get_term_data(&tty_entry, &SMG$K_ERASE_WHOLE_DISPLAY,
	X			&ESC_LEN, &esc_len, tty_clear, __);
	X		tty_clear[esc_len] = 0;
	X
	X		stat = smg$get_term_data(&tty_entry, &SMG$K_SET_SCROLL_REGION,
	X			&ESC_LEN, &esc_len, tty_setscroll, &std_region);
	X		tty_setscroll[esc_len] = 0;
	X
	X		stat = smg$get_term_data(&tty_entry, &SMG$K_SET_ORIGIN_ABSOLUTE,
	X			&ESC_LEN, &esc_len, tty_setorigin, __);
	X		tty_setorigin[esc_len] = 0;
	X
	X		stat = smg$get_term_data(&tty_entry, &SMG$K_END_AUTOWRAP_MODE,
	X			&ESC_LEN, &esc_len, tty_nowrap, __);
	X		tty_nowrap[esc_len] = 0;
	X
	X		if (*tty_clear && *tty_setscroll && 
	X		    *tty_setorigin && *tty_nowrap)
	X		{
	X			printf("%s%s%s%s", tty_clear, tty_setscroll, 
	X				tty_setorigin, tty_nowrap);
	X		}
	X		else
	X		{
	X			CHK_STAT("", __, OWN_MSG, VCAL_NOT_COMP);	
	X		}
	X	}
	X	else
	X	{
	X		CHK_STAT("", __, OWN_MSG, VCAL_NOT_COMP);	
	X	}
	X}
	X
	X/*----------------------------------------------------------------------------*/
	X
	Xcreat_window()
	X{
	X	int	stat;
	X
	X	stat = smg$create_pasteboard(&pstbrd_id, __, &BRD_LEN, &BRD_WID, __);
	X	stat = smg$create_virtual_display(&VCAL_LEN, &VCAL_WID, &vcal_id,
	X		__, __, __);
	X	stat = smg$paste_virtual_display(&vcal_id, &pstbrd_id, 
	X		&TOP_ROW, &TOP_COL);
	X	stat = smg$create_virtual_display(&VCAL_LEN, &VCAL_WID, &hlp_id,
	X		&SMG$M_BORDER, __, __);
	X	stat = smg$create_virtual_keyboard(&keybrd_id, __, __, __);
	X}
	X
	X/*----------------------------------------------------------------------------*/
	X
	Xctrl_trap()
	X{
	X	extern int	trap_ast();
	X	int	stat;
	X
	X	stat = smg$set_out_of_band_asts(&pstbrd_id, &CTRL_MASK, &trap_ast, __);
	X}
	X
	X/*----------------------------------------------------------------------------*/
	X
	Xtrap_ast()
	X{
	X	int	stat;
	X
	X	stat = smg$cancel_input(&keybrd_id);	/* cancel pending I/O */
	X	stat = sys$canexh(__);	/* cancel exit handler */
	X	stat = smg$delete_pasteboard(&pstbrd_id, __);	/* clear it */
	X	stat = smg$delete_virtual_keyboard(&keybrd_id);	/* reset keyboard */
	X	stat = sys$qiow(__, tty_chan, IO$_SETMODE, __, __, __, tty_oldchar, 
	X		12, __, __, __, __);	/* reset tty mode */
	X	stat = sys$cancel(tty_chan);	/* Cancel pending I/O. */
	X 	stat = sys$dassgn(tty_chan);	/* Cancel a channel for I/O. */
	X	stat = sys$exit(SS$_NORMAL);	/* exit normally */
	X}
	X
	X/*----------------------------------------------------------------------------*/
	X
	Xchar
	X*mkstr(len)
	X
	Xint	len;
	X{
	X        char    *s;
	X        int	i;
	X
	X        s = malloc(len + 1);
	X
	X        for (i = NULL;  i < len; s[i] = ' ', i++);
	X
	X        s[len] = NULL;
	X
	X        return s;
	X}
	X
	X/*----------------------------------------------------------------------------*/
	X
	Xstruct dsc$descriptor
	X*mkdesc(str)
	X
	Xchar    *str;
	X{
	X        struct  dsc$descriptor  *p;
	X
	X        p = (struct dsc$descriptor *) malloc(sizeof(struct dsc$descriptor));
	X
	X        p->dsc$w_length = strlen(str);
	X        p->dsc$b_dtype = DSC$K_DTYPE_T;
	X        p->dsc$b_class = DSC$K_CLASS_S;
	X        p->dsc$a_pointer = str;
	X
	X        return p;
	X}
	X
	X/*----------------------------------------------------------------------------*/
	X
	Xget_key(id)
	X
	Xint	id;
	X{                       
	X        int	func = IO$M_NOECHO | IO$M_ESCAPE | IO$M_NOFILTR,
	X		len = 0,
	X		stat,
	X		trm_cd = 0;
	X        struct  dsc$descriptor  *tmp;
	X
	X	tmp = mkdesc(mkstr(ESC_LEN));
	X	stat = smg$read_string(&keybrd_id, tmp, __, &KEY_LEN, &func, __,
	X		__, &len, &trm_cd, &id, __, __, __);
	X
	X        switch(trm_cd) {
	X
	X	case SMG$K_TRM_UP:
	X	case SMG$K_TRM_DOWN:
	X	case SMG$K_TRM_LEFT:
	X	case SMG$K_TRM_RIGHT:
	X	case SMG$K_TRM_CR:
	X	case SMG$K_TRM_SPACE:
	X	case SMG$K_TRM_DELETE:
	X	case SMG$K_TRM_CTRLA:
	X	case SMG$K_TRM_CTRLU:
	X	case SMG$K_TRM_CTRLW:
	X	case SMG$K_TRM_CTRLZ:
	X		return trm_cd;
	X                break;
	X
	X        default:
	X		if (!len)
	X			return NULL;
	X                else   	return (*tmp->dsc$a_pointer & CHAR_MASK);
	X		break;
	X        }
	X}
	X
	X/*----------------------------------------------------------------------------*/
	X
	Xexit_handler(handler_rtn, arg)
	X
	Xint	(*handler_rtn)(),
	X	*arg[];
	X{
	X	int	stat;
	X	EXIT_BLK	*exit_blk;
	X
	X        exit_blk = (EXIT_BLK *) malloc(sizeof(EXIT_BLK));
	X        
	X        exit_blk->nxt = 0;
	X        exit_blk->exit_rtn = handler_rtn;
	X        exit_blk->num_arg = 2;
	X        exit_blk->final_stat = malloc(sizeof(int));
	X        exit_blk->arg = (int *) arg;
	X
	X        stat = sys$dclexh(exit_blk);
	X}
	X
	X/*----------------------------------------------------------------------------*/
	X
	Xreset_tty(final_stat)
	X
	Xint	*final_stat;
	X{
	X	int	stat;
	X
	X        stat = smg$delete_pasteboard(&pstbrd_id, &CLEAR);	/* clear it */
	X        stat = smg$delete_virtual_keyboard(&keybrd_id);	/* reset keyboard */
	X	stat = sys$qiow(__, tty_chan, IO$_SETMODE, __, __, __, tty_oldchar, 
	X		12, __, __, __, __);	/* reset tty mode */
	X	stat = sys$cancel(tty_chan);	/* Cancel pending I/O. */
	X 	stat = sys$dassgn(tty_chan);	/* Cancel a channel for I/O. */
	X}
	X
	X/*----------------------------------------------------------------------------*/
	X
	Xcrypt_it(x, key)
	X
	Xchar	*x,
	X	*key;
	X{
	X	char	c;
	X	int	i,
	X		j,
	X		k;
	X
	X	for (i = k = NULL, j = strlen(key); *x; x++, i = ++k % j)
	X	{
	X		c = *x;
	X		*x = (*x & ~key[i]) | (~*x & key[i]);
	X		*x = (*x == NULL || 
	X		      *x == CR   || 
	X		      *x == LF   || 
	X		      *x == FF    ) ? c : *x;
	X	}
	X}
	X
	X/*----------------------------------------------------------------------------*/
	X
	Xfill_fld(src, dest, len)
	X
	Xchar	*src,
	X	*dest;
	Xint	len;
	X{
	X	int	i;
	X
	X	/*
	X	 * Copy a src to dest field. The field is padded with blanks.
	X	 * Therefore, pointer must be correct at the boundary.
	X	 */
	X
	X  	for (i = 1; i <= len && *src; *dest = *src, i++, dest++, src++);
	X
	X   	for (; i <= len; *dest = ' ', i++, dest++);
	X
	X	dest[len] = NULL;
	X}
SHAR_EOF
if test 7891 -ne "`wc -c < 'vcal-util.c'`"
then
	echo shar: error transmitting "'vcal-util.c'" '(should have been 7891 characters)'
fi
fi # end of overwriting check
echo shar: extracting "'vcal.c'" '(993 characters)'
if test -f 'vcal.c'
then
	echo shar: will not over-write existing file "'vcal.c'"
else
sed 's/^	X//' << \SHAR_EOF > 'vcal.c'
	X/*
	X *	  -------------------------------------------------------
	X *        Neither  York  University,   Department  of   Computer
	X *        Science   nor   the  author  assume any responsibility
	X *        for the use or reliability of this software.
	X *
	X *                 Copyright (C) 1987, York University
	X *                    Department of Computer Science
	X *
	X *        General permission to copy  or  modify,  but  not  for
	X *        profit,  is  hereby granted, provided  that  the above
	X *        copyright notice is included  and  reference  made  to
	X *        the fact that reproduction  privileges  were   granted
	X *        by the York University, Department of Computer Science.
	X *	  -------------------------------------------------------
	X *
	X *	  Written by: James Pierre Lewis
	X *		      Department of Computer Science
	X *		      York University
	X *		      1987 - Version V1.0
	X */
	X
	X#include	"vcal.h"
	X
	Xmain()
	X{
	X	setup_tty();
	X	fresh_tty();
	X	creat_window();
	X	ctrl_trap();
	X	do_appts();
	X}
SHAR_EOF
if test 993 -ne "`wc -c < 'vcal.c'`"
then
	echo shar: error transmitting "'vcal.c'" '(should have been 993 characters)'
fi
fi # end of overwriting check
echo shar: extracting "'vcal.h'" '(3554 characters)'
if test -f 'vcal.h'
then
	echo shar: will not over-write existing file "'vcal.h'"
else
sed 's/^	X//' << \SHAR_EOF > 'vcal.h'
	X#include	<ssdef.h>
	X#include 	<stsdef.h>
	X
	X/*	Volatile definitions that can be customized to your needs	*/
	X/*									*/
	X/*	LYEAR    should be changed when the year 2000 comes. That's	*/
	X/*		 a long way to go.					*/
	X/*	MAX_ENT  shoud not be changed to a value less than MAX_MSG	*/
	X/*									*/
	X
	X#define		APPTS_FILE	"SYS$LOGIN:APPOINTMENTS.DAT"
	X#define		LYEAR		1900
	X#define		MAX_ENT		1000	/* Maximum entries in the file */
	X#define		REMIND_IMAGE	"RUN CS:DO-CALLS.EXE"
	X
	X/*	Static definitions that should not be changed carelessly	*/
	X
	X#define		__		0
	X#define		CHAR_MASK	0xffffffff
	X#define		CLEAR		1
	X#define		CR		'\015'
	X#define 	CTRL_MASK	0x02000008
	X#define		BEL		'\007'
	X#define		BRD_LEN		24
	X#define		BRD_WID		80
	X#define		DEF_MIN		"5"
	X#define		ESC_LEN		20
	X#define		EXIT_MSG	"Press <CTRL-Z> to complete and exit"
	X#define		FF		'\014'
	X#define		FILE_LEN	256
	X#define		KEY_LEN		1
	X#define		LF		'\012'
	X#define		LIB$M_CLI_CTRLY	0x02000000
	X#define		MAX_BUF		80
	X#define		MAX_MSG		17
	X#define		MAX_TXT		61
	X#define		MIN		"MIN"
	X#define		MONTH		"MONTH"
	X#define		MSG_BUF		256
	X#define		OUT_FILE	"FILE"
	X#define		OWN_MSG		-1
	X#define		QST_MARK	'\037'
	X#define		WAIT_MSG	"Press <RETURN> to continue ..."
	X#define		R_MAR		38
	X#define		SYS_MSG		0
	X#define		TOP_ROW		1
	X#define		TOP_COL		1
	X#define		TXT_COL		42
	X#define		TXT_LEN		39
	X#define		TXT_ROW		8
	X#define		UYEAR		9999
	X#define		VCAL_LEN	24
	X#define		VCAL_MIN	"VCAL_MIN"
	X#define		VCAL_TITLE	"V I S U A L  C A L E N D A R"
	X#define		VCAL_WID	80
	X#define		WRAP		1
	X#define		YEAR		"YEAR"
	X
	X#define 	CHK_STAT(msg, lft_val, rht_val, stat) { \
	X		switch(rht_val) {\
	X		case OWN_MSG: \
	X			lib$signal(stat); \
	X			if (*msg) \
	X				fprintf(stderr, " \\%s\\\r\n", msg); \
	X			sys$exit(SS$_NORMAL); \
	X			break; \
	X		case SYS_MSG: \
	X			if (!((stat & STS$M_SUCCESS) >> STS$V_SUCCESS)) \
	X			{ \
	X				lib$signal(stat); \
	X				if (*msg) \
	X					fprintf(stderr, " \\%s\\\r\n", msg); \
	X				sys$exit(SS$_NORMAL); \
	X			} \
	X			break; \
	X		default: \
	X			if (lft_val != rht_val) \
	X			{ \
	X				lib$signal(stat); \
	X				if (*msg) \
	X					fprintf(stderr, " \\%s\\\r\n", msg); \
	X				sys$exit(SS$_NORMAL); \
	X			} \
	X			break; \
	X		} \
	X}	
	X
	X#define 	$PTR_DESCRIPTOR(len, name, str) struct dsc$descriptor_s name = \
	X		{ len, DSC$K_DTYPE_T, DSC$K_CLASS_S, str }
	X
	Xtypedef		struct
	X		{
	X			short   : 16;	/* buffer length */
	X			short   : 16;	/* item code */
	X			int	*buf_addr;
	X			int	*len_addr;
	X		} ITEM_LST; 
	X
	Xtypedef		struct
	X		{
	X			int	: 32;	/* number of arguments */
	X			int	: 32;	/* first argument */
	X			int	: 32;	/* second argument */
	X		} ESC_ARG;
	X
	Xtypedef		struct
	X		{
	X			int	nxt;	/* forward link */
	X			int	(*exit_rtn)();	/* handler address */
	X			int	num_arg;	/* number of arguments */
	X			int	*final_stat;	/* final status */
	X			int	arg;	/*	/* optional argument */
	X		} EXIT_BLK;
	X
	Xextern	short	tty_chan;		/* tty channel */
	X
	Xextern 	int	hlp_id,			/* help display */
	X		keybrd_id,		/* keyboard id */
	X		pstbrd_id,		/* pasteboard id */
	X		tty_class,		/* terminal class */
	X		tty_depend,		/* terminal dependency */
	X		tty_entry,		/* terminal entry */
	X		tty_newchar[3],		/* new characteristics */
	X		tty_oldchar[3],		/* old characteristics */
	X		tty_type,		/* terminal type */
	X		vcal_id;		/* calendar display */
	X
	Xglobalvalue	
	X	int	VCAL_ACCESS,		/* no access to appointments file */
	X		VCAL_FILE,		/* file creation */
	X		VCAL_INVFILE,		/* file creation problem */
	X		VCAL_INVMIN,		/* invalid min */
	X		VCAL_INVMONTH,		/* invalid month */
	X		VCAL_INVYEAR,		/* invalid year */
	X		VCAL_NOT_COMP,		/* terminal not compatible */
	X		VCAL_NOT_TRM,		/* not a terminal */
	X		VCAL_PURGE;		/* old entries should be purged */
SHAR_EOF
if test 3554 -ne "`wc -c < 'vcal.h'`"
then
	echo shar: error transmitting "'vcal.h'" '(should have been 3554 characters)'
fi
fi # end of overwriting check
echo shar: extracting "'vcalendar.cld'" '(836 characters)'
if test -f 'vcalendar.cld'
then
	echo shar: will not over-write existing file "'vcalendar.cld'"
else
sed 's/^	X//' << \SHAR_EOF > 'vcalendar.cld'
	Xdefine	verb		vcalendar
	X	image		CS:vcal.exe
	X	noparameters
	X	qualifier	purge,
	X			label=purge,
	X			nonnegatable,
	X			syntax=purge
	X	qualifier	remind,
	X			label=remind,
	X			nonnegatable,
	X			syntax=remind
	X	qualifier	summary
	X			label=summary
	X			nonnegatable,
	X			syntax=summary
	X	disallow	any2(purge, remind, summary)
	Xdefine	syntax		purge
	X	image		CS:vcal-purge.exe	
	X	noparameters
	X	noqualifiers
	Xdefine	syntax		remind
	X	image		CS:vcal-remind.exe
	X	noparameters
	X	qualifier	min,
	X			label=min,
	X			nonnegatable,
	X			value(type=$number, required)
	Xdefine	syntax		summary
	X	image		CS:vcal-sum.exe
	X	noparameters
	X	qualifier	month,
	X			label=month,
	X			nonnegatable,
	X			value(type=$quoted_string, required)
	X	qualifier	year,
	X			label=year,
	X			nonnegatable,
	X			value(type=$number, required)
	X	qualifier	out,
	X			label=file,
	X			nonnegatable,
	X			value(type=$file, required)
SHAR_EOF
if test 836 -ne "`wc -c < 'vcalendar.cld'`"
then
	echo shar: error transmitting "'vcalendar.cld'" '(should have been 836 characters)'
fi
fi # end of overwriting check
echo shar: extracting "'vcalendar.rnh'" '(5905 characters)'
if test -f 'vcalendar.rnh'
then
	echo shar: will not over-write existing file "'vcalendar.rnh'"
else
sed 's/^	X//' << \SHAR_EOF > 'vcalendar.rnh'
	X1 VCALENDAR
	X.lm+2 .s1
	XThe command $ VCALENDAR invokes the calendar utility. This utility 
	Xhelps you to keep track of your appointments.
	X.s1 .lit
	XFormat:
	X
	X	$ VCALENDAR [/qualifiers]
	X.end lit
	X.lm-2 
	X2 Acknowledgements
	X.lm+2 .s1
	XThanks to Mike Essex at Berkeley who, together with many others, wrote VCAL. 
	XMike's version has been reported to work on 
	XUNIX 
	XVersion 7, BSD 4.3, and ULTRIX. The software was written in C using C curses 
	Xand Termcap.
	XIt 
	Xcould, perhaps, be ported to VAX/VMS without making changes. However, excellent 
	XVAX/VMS screen management features are not fully utilized; therefore, VCAL was 
	Xthen C-modified using SMG. There are differences and similarities between UNIX 
	XC and VAX C; and C curses and SMG. However, they are not discussed here.
	X.lm-2
	X2 Features
	X.lm+2 .s1
	X VCAL provides you a calendar of each month. From this 
	Xcalendar, you can pick any day to record appointments (Day Picking Phase). When 
	Xa day is picked, you enter the second phase (Appointments Making Phase). You 
	Xcan switch back and forth between these two phases. You can record 17 
	Xappointments for a day. The length of each appointments is 60 characters. Just 
	Xthink that you are using a calendar pad. The design was based on this 
	Xphilosophy. It sounds complicated, but don't worry! The software is a 
	Xmenu-driven one, so it will help you when you go along. You just have to pay 
	Xattention to the small help window in the lower left-hand corner.
	X.s1
	XThat's not all. VCAL does also provides you the reminding service for today if 
	Xyou want. Before the appointment time approximately 5 minutes, it will beep at 
	Xyour terminal, displaying the scheduled activity you had recorded before. You 
	Xcould set the reminding service to remind you from 5 to 20 minutes before 
	Xschedule events.
	X.s1
	XThat's still not all. VCAL, furthermore, provides you the appointments summary 
	Xfor any month between the year 1900 and 9999 if you want.
	X.s1
	XFinally, when your appointments file grows bigger until it reaches the threshold
	Xsize, you will be notified to purge all old appointments leaving only 
	Xappointments for the current month and the future ones.
	X.lm-2
	X2 Limitations
	X.lm+2 .s1
	XVCAL expects you to enter the hour in the format "hhhh". If the hour is not 
	Xunderstood, say 2500, then it is set to 0000.
	X.s1
	XIf you have several appointments scheduled for the same hour, you may be 
	Xreminded for the first one only.
	X.lm-2
	X2 Commands
	X.lm+2 .s1
	X1) To record appointments, please type:
	X.skip
	X$ VCAL
	X.skip
	XThen follow the instructions provided in the small lower left-hand window. When 
	Xyou complete and exit, the file APPOINTMENTS.DAT is created in your main 
	Xdirectory. DONOT delete this file. It is where all appointments are kept. If 
	Xyou frequently purge all old appointments, the size of this file will be at 
	Xmaximum 1 block.
	X.skip
	X2) To ask for reminding service for today:
	X.skip
	X$ VCAL/REMIND/MIN=[min]#####/* 5 <= min <= 20. Default = 5 min. */
	X.SKIP
	XA sub-process is created. It hibernates until approximately 5 minutes before
	Xeach appointment for that day, wakes up reminding you the scheduled event, then
	Xgoes back into hibernation until no more appointments. (You could set the
	Xreminding service to remind you from 5 to 20 minutes before schedule events).
	XThe sub-process then terminates. In terms of system resources, it doesn't bog
	Xdown any thing because when the process hibernates, it is swapped out of
	Xmemory. When you log out, the sub-process is automatically terminated also. If
	Xyou want to terminate this sub-process instead, just type: 
	X.skip
	X$ STOP REM__username#####/* For example, $ STOP REM__CS100002 */
	X.skip
	X3) To ask for an appointments summary for a month, please type:
	X.skip
	X$ VCAL/SUMMARY
	X.SKIP
	XThe summary for this month's appointments will be displayed on screen. You can 
	Xre-direct the output to a file by typing:
	X.skip
	X$ VCAL/SUMMARY/OUT=[file]
	X.skip
	XYou can also add the qualifiers /MON=[month], and /YEAR=[year] to the command. 
	XMonth is any month. i.e., JANUARY, FEBRUARY, etc. Year is any year from 1900 to 
	X9999.
	X.skip
	X4) To purge all old appointments leaving only current month's appointments and 
	Xfuture ones, please type:
	X.skip
	X$ VCAL/PURGE
	X.SKIP
	X5) To get help such as this one, just type:
	X.skip
	X$ HELP VCAL
	X.SKIP
	X.lm-2
	X2 Qualifiers
	X.lm+2 .s1
	XIf there is no qualifier specified, VCAL will display a calendar of each month.
	XFrom this calendar, you can pick any day to make appointments.
	X.lm-2 
	X/SUMMARY
	X.lit
	X       /SUMMARY
	X.end lit
	X.lm+2 .s1
	XDisplays the appointments summary for the current month if no /MON and /YEAR
	Xare specified.
	X.lm-2
	X/MIN
	X.lit
	X	/MIN=[min]	/* 5 <= min <= 20. Default = 5 min. */
	X.end lit
	X.lm+2 .s1
	XIf you want the reminding sub-process wakes up earlier than 5 minutes before 
	Xscheduled events, use this qualifier together with /REMIND.
	X.lm-2
	X/OUT
	X.lit
	X	/OUT=[file]
	X.end lit
	X.lm+2 .s1
	XIf you want to re-direct the output of appointments summary to a file, then 
	Xuse this qualifier.
	X.lm-2
	X/REMIND
	X.lit
	X	/REMIND
	X.end lit
	X.lm+2 .s1
	XCall for the reminding service. A sub-process is created under the name
	X"REM__username", i.e., REM__CS100002. It hibernates until approximately 5
	Xminutes before each appointment for that day, wakes up reminding you the
	Xscheduled event, then goes back into hibernation until no more appointments.
	X(You could set the reminding service to remind you from 5 to 20 minutes before
	Xschedule events). The sub-process then terminates. In terms of system resources,
	Xit doesn't bog down any thing because when the process hibernates, it is
	Xswapped out of memory. When you log out, the sub-process is automatically
	Xterminated also. If you want to terminate this sub-process instead, just type:
	X$ STOP REM__username. 
	X.lm-2
	X/PURGE
	X.lit
	X	/PURGE
	X.end lit
	X.lm+2 .s1
	XWhen your APPOINTMENTS.DAT in the main directory grows bigger to a threshold 
	Xsize, you will be notified to purge old appointments leaving behind those of 
	Xcurrent and future months.
SHAR_EOF
if test 5905 -ne "`wc -c < 'vcalendar.rnh'`"
then
	echo shar: error transmitting "'vcalendar.rnh'" '(should have been 5905 characters)'
fi
fi # end of overwriting check
#	End of shell archive
exit 0



More information about the Alt.sources mailing list