mcgrew@dartagnan.rutgers.edu (Charles Mcgrew) (01/10/90)
Submitted-by: Bill Randle <billr@saab.cna.tek.com> Posting-number: Volume 2, Issue 6 Archive-name: calentool/patch5d #! /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 archive 4 (of 4)." # Contents: patches05d # Wrapped by billr@saab on Tue Dec 19 11:47:41 1989 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f 'patches05d' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'patches05d'\" else echo shar: Extracting \"'patches05d'\" \(51460 characters\) sed "s/^X//" >'patches05d' <<'END_OF_FILE' X*** /tmp/,RCSt1a02457 Tue Dec 19 11:34:42 1989 X--- utils.c Tue Dec 19 11:34:15 1989 X*************** X*** 1,5 X /* X! * $Header: utils.c,v 2.3 89/07/19 20:31:40 billr Exp $ X */ X /* X * utils.c X X--- 1,5 ----- X /* X! * $Header: utils.c,v 2.5 89/12/19 11:33:44 billr Exp $ X */ X /* X * utils.c X*************** X*** 22,27 X * Permission is hereby granted to use and modify the modifications in source X * or binary form as long as they are not sold for profit and this copyright X * notice remains intact. X */ X /******************************************** X * * X X--- 22,29 ----- X * Permission is hereby granted to use and modify the modifications in source X * or binary form as long as they are not sold for profit and this copyright X * notice remains intact. X+ * Modified parse_date to allow +nnn and -nnn syntax for dates relative to the X+ * current date. Peter Marshall <peter.marshall@uwo.ca>. 1989-09-19. X */ X /******************************************** X * * X*************** X*** 33,38 X X #include "ct.h" X #include <stdio.h> X #include <suntool/sunview.h> X #include <suntool/canvas.h> X #include <ctype.h> X X--- 35,41 ----- X X #include "ct.h" X #include <stdio.h> X+ #ifndef NOTOOL X #include <suntool/sunview.h> X #include <suntool/canvas.h> X #endif /* NOTOOL */ X*************** X*** 35,40 X #include <stdio.h> X #include <suntool/sunview.h> X #include <suntool/canvas.h> X #include <ctype.h> X #include <sys/types.h> X #include <sys/file.h> X X--- 38,44 ----- X #ifndef NOTOOL X #include <suntool/sunview.h> X #include <suntool/canvas.h> X+ #endif /* NOTOOL */ X #include <ctype.h> X #include <sys/types.h> X #include <sys/time.h> X*************** X*** 37,42 X #include <suntool/canvas.h> X #include <ctype.h> X #include <sys/types.h> X #include <sys/file.h> X #include <sys/stat.h> X #include <sys/errno.h> X X--- 41,47 ----- X #endif /* NOTOOL */ X #include <ctype.h> X #include <sys/types.h> X+ #include <sys/time.h> X #include <sys/file.h> X #include <sys/stat.h> X #include <sys/errno.h> X*************** X*** 54,60 X extern int one_based, version2, new_entry; X extern int findex; X extern struct appt_entry future[]; X- extern char todays_date[]; X extern char apts_dir[], lib_dir[]; X extern char printer[]; X extern int include_old, save_old; X X--- 59,64 ----- X extern int one_based, version2, new_entry; X extern int findex; X extern struct appt_entry future[]; X extern char apts_dir[], lib_dir[]; X extern int include_old, save_old, expire_days; X #ifndef NOTOOL X*************** X*** 56,61 X extern struct appt_entry future[]; X extern char todays_date[]; X extern char apts_dir[], lib_dir[]; X extern char printer[]; X extern int include_old, save_old; X extern Frame frame; X X--- 60,67 ----- X extern int findex; X extern struct appt_entry future[]; X extern char apts_dir[], lib_dir[]; X+ extern int include_old, save_old, expire_days; X+ #ifndef NOTOOL X extern char printer[]; X extern Frame frame; X extern Canvas canvas; X*************** X*** 57,63 X extern char todays_date[]; X extern char apts_dir[], lib_dir[]; X extern char printer[]; X- extern int include_old, save_old; X extern Frame frame; X extern Canvas canvas; X extern Pixwin *main_pixwin; X X--- 63,68 ----- X extern int include_old, save_old, expire_days; X #ifndef NOTOOL X extern char printer[]; X extern Frame frame; X extern Canvas canvas; X extern Pixwin *main_pixwin; X*************** X*** 65,70 X extern Pixfont *font, *sfont; X extern Frame prompt_frame; X extern int update_interval; X extern int errno; X X char inbuf[512], strbuf[256], errbuf[64]; X X--- 70,77 ----- X extern Pixfont *font, *sfont; X extern Frame prompt_frame; X extern int update_interval; X+ extern int monday_first, hour24, day_first; X+ #endif /* NOTOOL */ X extern int errno; X X char inbuf[512], strbuf[256], errbuf[128]; X*************** X*** 67,75 X extern int update_interval; X extern int errno; X X! char inbuf[512], strbuf[256], errbuf[64]; X! char todays_date[32]; X! static int including; X static int log_to_console; X char *daynames[] = {"Sunday","Monday","Tuesday","Wednesday", X "Thursday","Friday","Saturday"}; X X--- 74,82 ----- X #endif /* NOTOOL */ X extern int errno; X X! char inbuf[512], strbuf[256], errbuf[128]; X! char clockstr[32]; X! static int include_level = 0; X static int log_to_console; X char *daynames[] = {"Sunday","Monday","Tuesday","Wednesday", X "Thursday","Friday","Saturday"}; X*************** X*** 76,81 X char *monthnames[] = {"January","February","March","April", X "May","June","July","August", X "September","October","November","December"}; X char *dayname[7] = {"SU", "MO", "TU", "WE", "TH", "FR", "SA"}; X char rasfile[] = "/usr/tmp/calentool.ras"; X char psfile[] = "/usr/tmp/calentool.ps"; X X--- 83,91 ----- X char *monthnames[] = {"January","February","March","April", X "May","June","July","August", X "September","October","November","December"}; X+ char *smonthnames[] = {"Jan","Feb","Mar","Apr", X+ "May","Jun","Jul","Aug", X+ "Sep","Oct","Nov","Dec"}; X char *dayname[7] = {"SU", "MO", "TU", "WE", "TH", "FR", "SA"}; X char rasfile[] = "/usr/tmp/calentool.ras"; X char psfile[] = "/usr/tmp/calentool.ps"; X*************** X*** 91,96 X { X struct tm *tm; X struct timeval tv; X X gettimeofday(&tv, 0); X tm = localtime(&tv.tv_sec); X X--- 101,107 ----- X { X struct tm *tm; X struct timeval tv; X+ char timstr[16]; X X gettimeofday(&tv, 0); X tm = localtime(&tv.tv_sec); X*************** X*** 97,103 X X today = *tm; X X! strcpy(todays_date, asctime(tm)); X if (update_interval >= 60) X /* overwrite seconds field with year */ X sprintf(&todays_date[16], " %d", today.tm_year+1900); X X--- 108,120 ----- X X today = *tm; X X! #ifndef CALENCHECK X! if (day_first) X! sprintf(clockstr, "%3.3s %d %s %d, ", daynames[today.tm_wday], X! today.tm_mday, smonthnames[today.tm_mon], today.tm_year+1900); X! else X! sprintf(clockstr, "%3.3s %s %d %d, ", daynames[today.tm_wday], X! smonthnames[today.tm_mon], today.tm_mday, today.tm_year+1900); X if (update_interval >= 60) X sprintf(timstr, "%02d:%02d", today.tm_hour, today.tm_min); X else X*************** X*** 99,106 X X strcpy(todays_date, asctime(tm)); X if (update_interval >= 60) X! /* overwrite seconds field with year */ X! sprintf(&todays_date[16], " %d", today.tm_year+1900); X else X /* just delete trailing \n */ X todays_date[strlen(todays_date)-1] = '\0'; X X--- 116,122 ----- X sprintf(clockstr, "%3.3s %s %d %d, ", daynames[today.tm_wday], X smonthnames[today.tm_mon], today.tm_mday, today.tm_year+1900); X if (update_interval >= 60) X! sprintf(timstr, "%02d:%02d", today.tm_hour, today.tm_min); X else X sprintf(timstr, "%02d:%02d:%02d", today.tm_hour, today.tm_min, today.tm_sec); X if (!hour24) { X*************** X*** 102,109 X /* overwrite seconds field with year */ X sprintf(&todays_date[16], " %d", today.tm_year+1900); X else X! /* just delete trailing \n */ X! todays_date[strlen(todays_date)-1] = '\0'; X } X X /* X X--- 118,140 ----- X if (update_interval >= 60) X sprintf(timstr, "%02d:%02d", today.tm_hour, today.tm_min); X else X! sprintf(timstr, "%02d:%02d:%02d", today.tm_hour, today.tm_min, today.tm_sec); X! if (!hour24) { X! /* display am/pm for 12-hour time */ X! if (today.tm_hour > 12) { X! strcat(timstr, "pm"); X! timstr[0] = ((today.tm_hour - 12) / 10) + '0'; X! timstr[1] = ((today.tm_hour - 12) % 10) + '0'; X! } else if (today.tm_hour == 12) { X! strcat(timstr, "pm"); X! } else { X! strcat(timstr, "am"); X! } X! if (timstr[0] == '0') X! timstr[0] = ' '; X! } X! strcat(clockstr, timstr); X! #endif /* CALENCHECK */ X } X X /* X*************** X*** 140,169 X current.tm_year++; X } X } X! current.tm_yday = current.tm_mday - 1; X! for (month = 0; month < current.tm_mon; month++) { X! current.tm_yday += monthlength(month); X! } X! if ((current.tm_year < today.tm_year) X! || ((current.tm_year == today.tm_year) X! && (current.tm_yday < today.tm_yday))) { X! from = current; X! to = today; X! } else { X! from = today; X! to = current; X! } X! if (from.tm_year != to.tm_year) { X! for (totdays = 0; from.tm_year < to.tm_year; from.tm_year++) X! totdays += dysize(from.tm_year + 1900); X! } X! totdays += to.tm_yday - from.tm_yday; X! if ((current.tm_year < today.tm_year) X! || ((current.tm_year == today.tm_year) X! && (current.tm_yday < today.tm_yday))) X! totdays = -totdays; X! current.tm_wday = X! ((totdays % 7) + 7 + today.tm_wday) % 7; X } X X /* X X--- 171,178 ----- X current.tm_year++; X } X } X! current.tm_yday = day_of_year((double)current.tm_mday, current.tm_mon+1, current.tm_year+1900); X! current.tm_wday = get_day_of_week((double)current.tm_mday, current.tm_mon+1, current.tm_year+1900); X } X X /* X*************** X*** 188,194 X { X static int monthlengths[] = {31,28,31,30,31,30,31,31,30,31,30,31}; X X! if (month == FEB && (dysize(current.tm_year + 1900) == 366)) X return(29); X else X return(monthlengths[month]); X X--- 197,203 ----- X { X static int monthlengths[] = {31,28,31,30,31,30,31,31,30,31,30,31}; X X! if (month == FEB && (length_of_year(current.tm_year + 1900) == 366)) X return(29); X else X return(monthlengths[month]); X*************** X*** 194,199 X return(monthlengths[month]); X } X X /* X * X * Append data from active timeslots to end of "tmp.appointments" X X--- 203,209 ----- X return(monthlengths[month]); X } X X+ #ifndef CALENCHECK X /* X * X * Append data from active timeslots to end of "tmp.appointments" X*************** X*** 256,261 X return(1); X xrename(tmpapts_pathname, apts_pathname); X } X X /* X * get entry from appointments file X X--- 266,272 ----- X return(1); X xrename(tmpapts_pathname, apts_pathname); X } X+ #endif /* CALENCHECK */ X X /* X * get entry from appointments file X*************** X*** 260,266 X /* X * get entry from appointments file X */ X! get_aentry(apts_file, appt) X FILE *apts_file; X struct appt_entry *appt; X { X X--- 271,277 ----- X /* X * get entry from appointments file X */ X! get_aentry(apts_file, appt, noInclude) X FILE *apts_file; X struct appt_entry *appt; X int noInclude; X*************** X*** 263,268 X get_aentry(apts_file, appt) X FILE *apts_file; X struct appt_entry *appt; X { X char *ptr, *str; X char *fgets(), *index(); X X--- 274,280 ----- X get_aentry(apts_file, appt, noInclude) X FILE *apts_file; X struct appt_entry *appt; X+ int noInclude; X { X char *ptr, *str; X char *fgets(), *index(); X*************** X*** 267,273 X char *ptr, *str; X char *fgets(), *index(); X char *incl_ptr, incl_buf[128], wday[3]; X! int i, lib; X struct stat sbuf; X static FILE *include; X X X--- 279,285 ----- X char *ptr, *str; X char *fgets(), *index(); X char *incl_ptr, incl_buf[128], wday[3]; X! int i, lib, parse_options, nodata = 1; X struct stat sbuf; X static FILE *include[MAX_INCLUDE_NESTING]; X X*************** X*** 269,275 X char *incl_ptr, incl_buf[128], wday[3]; X int i, lib; X struct stat sbuf; X! static FILE *include; X X appt->flags = appt->repeat = appt->lookahead = 0; X appt->sindex = 0; X X--- 281,287 ----- X char *incl_ptr, incl_buf[128], wday[3]; X int i, lib, parse_options, nodata = 1; X struct stat sbuf; X! static FILE *include[MAX_INCLUDE_NESTING]; X X appt->flags = appt->repeat = appt->lookahead = 0; X appt->sindex = 0; X*************** X*** 273,278 X X appt->flags = appt->repeat = appt->lookahead = 0; X appt->sindex = 0; X appt->next = NULL; X if (including) { X if (fgets(inbuf, 512, include) == NULL) { X X--- 285,291 ----- X X appt->flags = appt->repeat = appt->lookahead = 0; X appt->sindex = 0; X+ appt->runlength = 0; X appt->next = NULL; X /* If noInclude is set then don't follow include files, i.e. X * treat #include directives as comments. This is useful for X*************** X*** 274,286 X appt->flags = appt->repeat = appt->lookahead = 0; X appt->sindex = 0; X appt->next = NULL; X! if (including) { X! if (fgets(inbuf, 512, include) == NULL) { X! /* end of include file - get next entry X! * from main file X! */ X! including = 0; X! fclose(include); X if (fgets(inbuf, 512, apts_file) == NULL) X return(EOF); X } else { X X--- 287,310 ----- X appt->sindex = 0; X appt->runlength = 0; X appt->next = NULL; X! /* If noInclude is set then don't follow include files, i.e. X! * treat #include directives as comments. This is useful for X! * copying the appts file. X! */ X! while (nodata) { X! if (include_level) { X! if (fgets(inbuf, 512, include[include_level-1]) == NULL) { X! /* end of include file - get next entry X! * from previous level of nesting X! */ X! fclose(include[include_level-1]); X! include_level--; X! } else { X! /* don't modify stuff from include files */ X! appt->flags |= READONLY; X! nodata = 0; /* still data in file */ X! } X! } else { X if (fgets(inbuf, 512, apts_file) == NULL) X return(EOF); X else X*************** X*** 283,292 X fclose(include); X if (fgets(inbuf, 512, apts_file) == NULL) X return(EOF); X! } else { X! including = 2; X! /* don't modify stuff from include files */ X! appt->flags |= READONLY; X } X } else X if (fgets(inbuf, 512, apts_file) == NULL) X X--- 307,314 ----- X } else { X if (fgets(inbuf, 512, apts_file) == NULL) X return(EOF); X! else X! nodata = 0; /* still data in file */ X } X } X ptr = inbuf; X*************** X*** 288,296 X /* don't modify stuff from include files */ X appt->flags |= READONLY; X } X! } else X! if (fgets(inbuf, 512, apts_file) == NULL) X! return(EOF); X ptr = inbuf; X if (*ptr == '#') { X if (!strcmp(inbuf, HEADER) && !including) { X X--- 310,316 ----- X else X nodata = 0; /* still data in file */ X } X! } X ptr = inbuf; X if (noInclude && *ptr == '#') { X appt->flags |= A_COMMENT; X*************** X*** 292,297 X if (fgets(inbuf, 512, apts_file) == NULL) X return(EOF); X ptr = inbuf; X if (*ptr == '#') { X if (!strcmp(inbuf, HEADER) && !including) { X /* first line in file read */ X X--- 312,321 ----- X } X } X ptr = inbuf; X+ if (noInclude && *ptr == '#') { X+ appt->flags |= A_COMMENT; X+ return(0); X+ } X if (*ptr == '#') { X if (!strcmp(inbuf, HEADER) && !include_level) { X /* first line in base file read */ X*************** X*** 293,300 X return(EOF); X ptr = inbuf; X if (*ptr == '#') { X! if (!strcmp(inbuf, HEADER) && !including) { X! /* first line in file read */ X if (include_old && (First.tm_year < today.tm_year)) { X /* read in old include file (if it exists) */ X /* prepend directory info */ X X--- 317,324 ----- X return(0); X } X if (*ptr == '#') { X! if (!strcmp(inbuf, HEADER) && !include_level) { X! /* first line in base file read */ X if (include_old && (First.tm_year < today.tm_year)) { X /* read in old include file (if it exists) */ X /* prepend directory info */ X*************** X*** 301,310 X sprintf(incl_buf, "%s/.appointments.%02d", X apts_dir, First.tm_year); X if (!stat(incl_buf, &sbuf)) { X! if ((include = fopen(incl_buf, "r")) == NULL) X! err_rpt("can't open include file (ignored)", NON_FATAL); X! else X! including = 1; X } X } X } else if (!strncmp(inbuf, "#include", 8)) { X X--- 325,337 ----- X sprintf(incl_buf, "%s/.appointments.%02d", X apts_dir, First.tm_year); X if (!stat(incl_buf, &sbuf)) { X! if ((include[include_level] = fopen(incl_buf, "r")) == NULL) { X! strcpy(errbuf, "can't open include file <"); X! strcat(errbuf, incl_buf); X! strcat(errbuf, "> (ignored)"); X! err_rpt(errbuf, NON_FATAL); X! } else X! include_level++; X } X } X } else if (!strncmp(inbuf, "#include", 8)) { X*************** X*** 309,316 X } X } else if (!strncmp(inbuf, "#include", 8)) { X /* include file */ X! if (including) X! err_rpt("include files may not be nested", FATAL); X incl_ptr = strbuf; X if ((ptr = index(inbuf, '"')) == NULL) X X X--- 336,346 ----- X } X } else if (!strncmp(inbuf, "#include", 8)) { X /* include file */ X! if (include_level > MAX_INCLUDE_NESTING) { X! err_rpt("include files nested too deep (ignored)", NON_FATAL); X! appt->flags |= A_COMMENT; X! return(0); X! } X incl_ptr = strbuf; X if ((ptr = index(inbuf, '"')) == NULL) X X*************** X*** 316,321 X X if ((ptr = index(inbuf, '<')) == NULL) { X err_rpt("missing '\"' or '<' in include file spec", NON_FATAL); X return(0); X } else { X lib = 1; X X--- 346,352 ----- X X if ((ptr = index(inbuf, '<')) == NULL) { X err_rpt("missing '\"' or '<' in include file spec", NON_FATAL); X+ appt->flags |= A_COMMENT; X return(0); X } else { X lib = 1; X*************** X*** 327,332 X *incl_ptr++ = *ptr++; X if (! *ptr) { X err_rpt("missing '\"' or '>' in include file spec", NON_FATAL); X return(0); X } X *incl_ptr = '\0'; X X--- 358,364 ----- X *incl_ptr++ = *ptr++; X if (! *ptr) { X err_rpt("missing '\"' or '>' in include file spec", NON_FATAL); X+ appt->flags |= A_COMMENT; X return(0); X } X *incl_ptr = '\0'; X*************** X*** 339,348 X sprintf(incl_buf, "%s/%s", lib_dir, strbuf); X else X sprintf(incl_buf, "%s/%s", apts_dir, strbuf); X! if ((include = fopen(incl_buf, "r")) == NULL) X! err_rpt("can't open include file (ignored)", NON_FATAL); X! else X! including = 1; X } X appt->flags |= A_COMMENT; X return(0); X X--- 371,383 ----- X sprintf(incl_buf, "%s/%s", lib_dir, strbuf); X else X sprintf(incl_buf, "%s/%s", apts_dir, strbuf); X! if ((include[include_level] = fopen(incl_buf, "r")) == NULL) { X! strcpy(errbuf, "can't open include file <"); X! strcat(errbuf, incl_buf); X! strcat(errbuf, "> (ignored)"); X! err_rpt(errbuf, NON_FATAL); X! } else X! include_level++; X } X appt->flags |= A_COMMENT; X return(0); X*************** X*** 367,373 X } X /* sanity check */ X if (appt->year < 0) { X! err_rpt("illegal year value (ignored)", NON_FATAL); X return(1); X } X } X X--- 402,409 ----- X } X /* sanity check */ X if (appt->year < 0) { X! sprintf(errbuf, "illegal year value [%d] (ignored)", appt->year); X! err_rpt(errbuf, NON_FATAL); X return(1); X } X } X*************** X*** 383,389 X if (one_based) (appt->month)--; X /* sanity check */ X if (appt->month < JAN || appt->month > DEC) { X- /* X sprintf(errbuf, "illegal month value [%d] (ignored)", appt->month); X err_rpt(errbuf, NON_FATAL); X */ X X--- 419,424 ----- X if (one_based) (appt->month)--; X /* sanity check */ X if (appt->month < JAN || appt->month > DEC) { X sprintf(errbuf, "illegal month value [%d] (ignored)", appt->month); X err_rpt(errbuf, NON_FATAL); X return(1); X*************** X*** 386,393 X /* X sprintf(errbuf, "illegal month value [%d] (ignored)", appt->month); X err_rpt(errbuf, NON_FATAL); X- */ X- err_rpt("illegal month value (ignored)", NON_FATAL); X return(1); X } X } X X--- 421,426 ----- X if (appt->month < JAN || appt->month > DEC) { X sprintf(errbuf, "illegal month value [%d] (ignored)", appt->month); X err_rpt(errbuf, NON_FATAL); X return(1); X } X } X*************** X*** 405,411 X if (!one_based) (appt->day)++; X /* sanity check */ X if (appt->day < 1 || appt->day > 31) { X! err_rpt("illegal day value (ignored)", NON_FATAL); X return(1); X } X } else { X X--- 438,445 ----- X if (!one_based) (appt->day)++; X /* sanity check */ X if (appt->day < 1 || appt->day > 31) { X! sprintf(errbuf, "illegal day value [%d] (ignored)", appt->day); X! err_rpt(errbuf, NON_FATAL); X return(1); X } X } else { X*************** X*** 431,437 X appt->flags |= EVERY_SAT; X else { X /* sanity check */ X! err_rpt("illegal day name (ignored)", NON_FATAL); X return(1); X } X appt->day = 0; X X--- 465,472 ----- X appt->flags |= EVERY_SAT; X else { X /* sanity check */ X! sprintf(errbuf, "illegal day name [%s] (ignored)", wday); X! err_rpt(errbuf, NON_FATAL); X return(1); X } X appt->day = 0; X*************** X*** 445,451 X appt->hour += *++ptr - '0'; X /* sanity check */ X if (appt->hour < 0 || (appt->hour > 23 && appt->hour != 99)) { X! err_rpt("illegal hour value (ignored)", NON_FATAL); X return(1); X } X if ((version2 && appt->hour == 99) || (!version2 && appt->hour == 0)) X X--- 480,487 ----- X appt->hour += *++ptr - '0'; X /* sanity check */ X if (appt->hour < 0 || (appt->hour > 23 && appt->hour != 99)) { X! sprintf(errbuf, "illegal hour value [%d] (ignored)", appt->hour); X! err_rpt(errbuf, NON_FATAL); X return(1); X } X if ((version2 && appt->hour == 99) || (!version2 && appt->hour == 0)) X*************** X*** 460,466 X /* minutes currently can only be 00 or 30 X * unless it's a note. X */ X! err_rpt("illegal minute value (ignored)", NON_FATAL); X return(1); X } X if ((appt->flags & A_NOTE) && version2 && appt->minute == 99) X X--- 496,503 ----- X /* minutes currently can only be 00 or 30 X * unless it's a note. X */ X! sprintf(errbuf, "illegal minute value [%d] (ignored)", appt->minute); X! err_rpt(errbuf, NON_FATAL); X return(1); X } X if ((appt->flags & A_NOTE) && version2 && appt->minute == 99) X*************** X*** 472,478 X appt->arrows += *++ptr - '0'; X /* sanity check */ X if (appt->arrows < 0 || appt->arrows > N_TSLOTS) { X! err_rpt("illegal arrow value (ignored)", NON_FATAL); X return(1); X } X ++ptr; X X--- 509,516 ----- X appt->arrows += *++ptr - '0'; X /* sanity check */ X if (appt->arrows < 0 || appt->arrows > N_TSLOTS) { X! sprintf(errbuf, "illegal arrow value [%d] (ignored)", appt->arrows); X! err_rpt(errbuf, NON_FATAL); X return(1); X } X ++ptr; X*************** X*** 480,513 X ++ptr; X /* lookahead and repeat entries are free format, i.e. they */ X /* can occur in either order */ X! if (*ptr == '[') { X! appt->flags |= REPEAT; X! if (appt->flags & EVERY_SOMEDAY) { X! if ((appt->repeat = do_wk_repeat(&ptr)) < 0) X! return(1); X! } else { X! if ((appt->repeat = do_repeat(&ptr)) < 0) X! return(1); X! } X! if (*ptr == '<') { X! appt->flags |= LOOKAHEAD; X! if ((appt->lookahead = do_lookahead(&ptr)) < 0) X! return(1); X! } X! if (*ptr == '#') { X! appt->flags |= DELETED; X! ++ptr; X! while (isspace(*ptr)) X! ++ptr; X! } X! } else if (*ptr == '<') { X! appt->flags |= LOOKAHEAD; X! if ((appt->lookahead = do_lookahead(&ptr)) < 0) X! return(1); X! if (*ptr == '[') { X! appt->flags |= REPEAT; X! if (appt->flags & EVERY_SOMEDAY) { X! if ((appt->repeat = do_wk_repeat(&ptr)) < 0) X return(1); X } else { X if ((appt->repeat = do_repeat(&ptr)) < 0) X X--- 518,542 ----- X ++ptr; X /* lookahead and repeat entries are free format, i.e. they */ X /* can occur in either order */ X! parse_options = TRUE; X! while (parse_options) { X! switch (*ptr) { X! case '[': X! /* repeating appointment */ X! appt->flags |= REPEAT; X! if (appt->flags & EVERY_SOMEDAY) { X! if ((appt->repeat = do_wk_repeat(&ptr)) < 0) X! return(1); X! } else { X! if ((appt->repeat = do_repeat(&ptr)) < 0) X! return(1); X! } X! break; X! X! case '<': X! /* remind us ahead of time */ X! appt->flags |= LOOKAHEAD; X! if ((appt->lookahead = do_lookahead(&ptr)) < 0) X return(1); X break; X X*************** X*** 509,516 X if (appt->flags & EVERY_SOMEDAY) { X if ((appt->repeat = do_wk_repeat(&ptr)) < 0) X return(1); X! } else { X! if ((appt->repeat = do_repeat(&ptr)) < 0) X return(1); X } X } X X--- 538,551 ----- X appt->flags |= LOOKAHEAD; X if ((appt->lookahead = do_lookahead(&ptr)) < 0) X return(1); X! break; X! X! case '+': X! /* this appointment lasts for n days */ X! appt->flags |= RUN; X! while (isdigit(*++ptr)) X! appt->runlength = appt->runlength * 10 + (int)(*ptr - '0'); X! if (appt->runlength < 0) X return(1); X if (!(appt->flags & REPEAT)) { X /* default to run of days */ X*************** X*** 512,523 X } else { X if ((appt->repeat = do_repeat(&ptr)) < 0) X return(1); X! } X! } X! if (*ptr == '#') { X! appt->flags |= DELETED; X! ++ptr; X! while (isspace(*ptr)) X ++ptr; X } X } else if (*ptr == '#') { X X--- 547,562 ----- X appt->runlength = appt->runlength * 10 + (int)(*ptr - '0'); X if (appt->runlength < 0) X return(1); X! if (!(appt->flags & REPEAT)) { X! /* default to run of days */ X! appt->flags |= REPEAT; X! appt->repeat = 1; X! } X! break; X! X! case '#': X! /* deleted appointment */ X! appt->flags |= DELETED; X ++ptr; X break; X X*************** X*** 519,524 X ++ptr; X while (isspace(*ptr)) X ++ptr; X } X } else if (*ptr == '#') { X appt->flags |= DELETED; X X--- 558,568 ----- X /* deleted appointment */ X appt->flags |= DELETED; X ++ptr; X+ break; X+ X+ default: X+ parse_options = FALSE; X+ break; X } X while (isspace(*ptr)) X ++ptr; X*************** X*** 520,528 X while (isspace(*ptr)) X ++ptr; X } X- } else if (*ptr == '#') { X- appt->flags |= DELETED; X- ++ptr; X while (isspace(*ptr)) X ++ptr; X } X X--- 564,569 ----- X parse_options = FALSE; X break; X } X while (isspace(*ptr)) X ++ptr; X } X*************** X*** 553,560 X return(-1); X } X ++*ptr; X- while (isspace(**ptr)) X- ++*ptr; X return(repeat); X } X X X--- 594,599 ----- X return(-1); X } X ++*ptr; X return(repeat); X } X X*************** X*** 584,592 X return(-1); X } X ++*ptr; X- while (isspace(**ptr)) X- ++*ptr; X- X return(repeat); X } X X X--- 623,628 ----- X return(-1); X } X ++*ptr; X return(repeat); X } X X*************** X*** 608,615 X return(-1); X } X ++*ptr; X- while (isspace(**ptr)) X- ++*ptr; X return(lookahead); X } X X X--- 644,649 ----- X return(-1); X } X ++*ptr; X return(lookahead); X } X X*************** X*** 687,692 X X if (appt->flags & LOOKAHEAD) X fprintf(apts_file, "<%d> ", appt->lookahead); X if (appt->flags & DELETED) X fprintf(apts_file, "# %s\n", appt->str); X else X X--- 721,728 ----- X X if (appt->flags & LOOKAHEAD) X fprintf(apts_file, "<%d> ", appt->lookahead); X+ if (appt->flags & RUN) X+ fprintf(apts_file, "+%d ", appt->runlength); X if (appt->flags & DELETED) X fprintf(apts_file, "# %s\n", appt->str); X else X*************** X*** 726,731 X return (rptstr); X } X X /* X * Print today's appointments to stdout or mail (useful if we only have an ASCII X * terminal connected to our Sun). Invoked by the "-p", "-P" or "-m" options. X X--- 762,768 ----- X return (rptstr); X } X X+ #ifndef CALENCHECK X /* X * Print today's appointments to stdout or mail (useful if we only have an ASCII X * terminal connected to our Sun). Invoked by the "-p", "-P", "-m" or X*************** X*** 728,734 X X /* X * Print today's appointments to stdout or mail (useful if we only have an ASCII X! * terminal connected to our Sun). Invoked by the "-p", "-P" or "-m" options. X * Month information is only printed as PostScript output. X */ X print_apts(which, dest) X X--- 765,772 ----- X #ifndef CALENCHECK X /* X * Print today's appointments to stdout or mail (useful if we only have an ASCII X! * terminal connected to our Sun). Invoked by the "-p", "-P", "-m" or X! * "-M" options. X * Month information is only printed as PostScript output. X */ X print_apts(which, dest) X*************** X*** 734,740 X print_apts(which, dest) X int which, dest; X { X! int i; X FILE *output, *pfp, *popen(); X char cmd[80], *name, *cuserid(); X X X--- 772,778 ----- X print_apts(which, dest) X int which, dest; X { X! int i, gd_rtn; X FILE *output, *pfp, *popen(); X char cmd[80], *name, *cuserid(); X X*************** X*** 738,746 X FILE *output, *pfp, *popen(); X char cmd[80], *name, *cuserid(); X X- if (dest == DST_MAIL) X- /* only mail one day's appts */ X- which = PRI_DAY; X fix_current_day(); X if ((which == PRI_DAY) && !get_day_appts()) X return; /* nothing to show */ X X--- 776,781 ----- X FILE *output, *pfp, *popen(); X char cmd[80], *name, *cuserid(); X X fix_current_day(); X gd_rtn = get_day_appts(); X if (which == PRI_DAY && !gd_rtn) X*************** X*** 742,748 X /* only mail one day's appts */ X which = PRI_DAY; X fix_current_day(); X! if ((which == PRI_DAY) && !get_day_appts()) X return; /* nothing to show */ X if (dest == DST_MAIL) { X if (mailto != NULL) { X X--- 777,784 ----- X char cmd[80], *name, *cuserid(); X X fix_current_day(); X! gd_rtn = get_day_appts(); X! if (which == PRI_DAY && !gd_rtn) X return; /* nothing to show */ X if (which == PRI_DAY_XNOTES && gd_rtn == SOME_MKNOTES) X /* all we have is marked notes */ X*************** X*** 744,749 X fix_current_day(); X if ((which == PRI_DAY) && !get_day_appts()) X return; /* nothing to show */ X if (dest == DST_MAIL) { X if (mailto != NULL) { X name = mailto; X X--- 780,788 ----- X gd_rtn = get_day_appts(); X if (which == PRI_DAY && !gd_rtn) X return; /* nothing to show */ X+ if (which == PRI_DAY_XNOTES && gd_rtn == SOME_MKNOTES) X+ /* all we have is marked notes */ X+ return; /* nothing to show */ X if (dest == DST_MAIL) { X if (mailto != NULL) { X name = mailto; X*************** X*** 750,756 X } else if ((name = cuserid(NULL)) == NULL) { X err_rpt("nobody to mail to", FATAL); X } X! sprintf(cmd, "mail -s \"Appointments for today\" %s", name); X if ((output = popen(cmd, "w")) == NULL) X err_rpt("Couldn't pipe to 'mail'", FATAL); X } else { X X--- 789,795 ----- X } else if ((name = cuserid(NULL)) == NULL) { X err_rpt("nobody to mail to", FATAL); X } X! sprintf(cmd, "%s -s \"Appointments for today\" %s", MAILPROG, name); X if ((output = popen(cmd, "w")) == NULL) X err_rpt("Couldn't pipe to 'mail'", FATAL); X } else { X*************** X*** 758,764 X } X X if (which == PRI_DAY || which == PRI_DAY_XNOTES) { X! print_one_day(which, output); X } else if (which == PRI_WEEK || which == PRI_WEEK_XNOTES) { X current.tm_mday -= current.tm_wday; /* Sunday of this week */ X fix_current_day(); X X--- 797,803 ----- X } X X if (which == PRI_DAY || which == PRI_DAY_XNOTES) { X! print_one_day(which, output, gd_rtn); X } else if (which == PRI_WEEK || which == PRI_WEEK_XNOTES) { X current.tm_mday -= current.tm_wday; /* Sunday of this week */ X fix_current_day(); X*************** X*** 762,768 X } else if (which == PRI_WEEK || which == PRI_WEEK_XNOTES) { X current.tm_mday -= current.tm_wday; /* Sunday of this week */ X fix_current_day(); X! if (nr_weekdays < 7) { X current.tm_mday++; X fix_current_day(); X } X X--- 801,807 ----- X } else if (which == PRI_WEEK || which == PRI_WEEK_XNOTES) { X current.tm_mday -= current.tm_wday; /* Sunday of this week */ X fix_current_day(); X! if (nr_weekdays < 7 || monday_first) { X current.tm_mday++; X fix_current_day(); X } X*************** X*** 767,774 X fix_current_day(); X } X for (i=0;i<nr_weekdays;i++) { X! if (get_day_appts()) X! print_one_day(which, output); X current.tm_mday++; X fix_current_day(); X } X X--- 806,814 ----- X fix_current_day(); X } X for (i=0;i<nr_weekdays;i++) { X! gd_rtn = get_day_appts(); X! if ((gd_rtn && which == PRI_WEEK) || (gd_rtn & ~SOME_MKNOTES && which == PRI_WEEK_XNOTES)) X! print_one_day(which, output, gd_rtn); X current.tm_mday++; X fix_current_day(); X } X*************** X*** 780,786 X pclose(output); X } X X! print_one_day(which, output) X int which; X FILE *output; X { X X--- 820,826 ----- X pclose(output); X } X X! print_one_day(which, output, gdrtn) X int which; X FILE *output; X int gdrtn; X*************** X*** 783,788 X print_one_day(which, output) X int which; X FILE *output; X { X int i; X struct appt_entry tmp_apt; X X--- 823,829 ----- X print_one_day(which, output, gdrtn) X int which; X FILE *output; X+ int gdrtn; X { X int i; X struct appt_entry tmp_apt; X*************** X*** 788,796 X struct appt_entry tmp_apt; X char *format_appt(); X X! fprintf(output,"\n\t*** Appointments for %s %s %d, %d ***\n\n", X! daynames[current.tm_wday], monthnames[current.tm_mon], X! current.tm_mday, current.tm_year+1900); X X for (i=0; i<N_SLOTS; i++) { X if (i == n_tslots) X X--- 829,842 ----- X struct appt_entry tmp_apt; X char *format_appt(); X X! if (day_first) X! fprintf(output,"\n\t*** Appointments for %s %d %s %d ***\n\n", X! daynames[current.tm_wday], current.tm_mday, X! monthnames[current.tm_mon], current.tm_year+1900); X! else X! fprintf(output,"\n\t*** Appointments for %s %s %d, %d ***\n\n", X! daynames[current.tm_wday], monthnames[current.tm_mon], X! current.tm_mday, current.tm_year+1900); X X for (i=0; i<N_SLOTS; i++) { X if (i == n_tslots) X*************** X*** 795,801 X for (i=0; i<N_SLOTS; i++) { X if (i == n_tslots) X /* start of notes section */ X! fprintf(output,"\n\t\t ===== Notes =====\n"); X if (slots[i].first != NULL && slots[i].count > 0) { X /* at least one appt here */ X slots[i].cur_appt = slots[i].first; X X--- 841,849 ----- X for (i=0; i<N_SLOTS; i++) { X if (i == n_tslots) X /* start of notes section */ X! if ((gdrtn & SOME_NOTES) || X! (!(which & PRI_XNOTES) && (gdrtn & SOME_MKNOTES))) X! fprintf(output,"\n\t\t ===== Notes =====\n"); X if (slots[i].first != NULL && slots[i].count > 0) { X /* at least one appt here */ X slots[i].cur_appt = slots[i].first; X*************** X*** 841,847 X * also support a "lookahead" reminder service to remind one X * in advance of a future appointment. X * If "save_old" is set, then any appointments for years prior X! * to this one are save in a special file of the form X * ".appointments.YY", where YY is the year. X */ X X X--- 889,895 ----- X * also support a "lookahead" reminder service to remind one X * in advance of a future appointment. X * If "save_old" is set, then any appointments for years prior X! * to this one are saved in a special file of the form X * ".appointments.YY", where YY is the year. X */ X X*************** X*** 864,870 X X /* copy existing entries to the new file */ X save_base = one_based; X! while ((err_flag = get_aentry(oappts, &appt)) != EOF) { X if (err_flag) X continue; /* ignore badly formatted input */ X if (appt.hour == 0) X X--- 912,918 ----- X X /* copy existing entries to the new file */ X save_base = one_based; X! while ((err_flag = get_aentry(oappts, &appt, TRUE)) != EOF) { X if (err_flag) X continue; /* ignore badly formatted input */ X if (appt.hour == 0) X*************** X*** 891,898 X fclose(fp); X } X } else { X! if (put_aentry(nappts, &appt)) X! err_rpt("write to new appt file failed, bailing out", FATAL); X } X one_based = save_base; /* (maybe) force old format input */ X } X X--- 939,949 ----- X fclose(fp); X } X } else { X! if (appt.flags & A_COMMENT) X! fputs(inbuf, nappts); X! else X! if (put_aentry(nappts, &appt)) X! err_rpt("write to new appt file failed, bailing out", FATAL); X } X one_based = save_base; /* (maybe) force old format input */ X } X*************** X*** 904,971 X } X X /* X- * Scan appointments file for outdated appointments and save them to a X- * special file of the form ".appointments.YY", where YY is the year X- * of that appointment. X- */ X- create_old_files() X- { X- FILE *oappts, *nappts, *fp; X- struct appt_entry appt; X- int err_flag; X- char save_file[128]; X- struct stat stbuf; X- X- if (read_only != 0) { X- err_rpt("appts file is read-only, no conversion done", NON_FATAL); X- return; X- } X- X- /* open files, etc */ X- if ((oappts = fopen(apts_pathname, "r")) == NULL) { X- err_rpt("can't open appts file for reading", FATAL); X- /* NOT REACHED */ X- } X- if ((nappts = fopen(tmpapts_pathname, "w")) == NULL) { X- err_rpt("can't open temp file for writing", NON_FATAL); X- return; X- } X- X- /* copy existing entries to the tmp file, checking dates */ X- while ((err_flag = get_aentry(oappts, &appt)) != EOF) { X- if (err_flag) X- continue; /* ignore badly formatted input */ X- if (!(appt.flags & A_COMMENT) X- && !(appt.flags & ALL_YEARS) && (appt.year < today.tm_year) X- && !((appt.flags & REPEAT) && !(appt.flags & EVERY_SOMEDAY))) { X- /* prepend directory info */ X- sprintf(save_file, "%s/.appointments.%02d", X- apts_dir, appt.year); X- if (stat(save_file, &stbuf) && errno == ENOENT) { X- /* new file*/ X- if ((fp = fopen(save_file, "w")) == NULL) X- err_rpt("can't open save file, bailing out", FATAL); X- fputs(HEADER, fp); X- fclose(fp); X- } X- if ((fp = fopen(save_file, "a+")) == NULL) X- err_rpt("can't open save file, bailing out", FATAL); X- else { X- if (put_aentry(fp, &appt)) X- err_rpt("write to save appt file failed, bailing out", FATAL); X- fclose(fp); X- } X- } else { X- if (put_aentry(nappts, &appt)) X- err_rpt("write to new appt file failed, bailing out", FATAL); X- } X- } X- fclose(oappts); X- fclose(nappts); X- xrename(tmpapts_pathname, apts_pathname); X- } X- X- /* X * convert appt entry to ASCII string for display with date, time and msg X */ X char * X X--- 955,960 ----- X } X X /* X * convert appt entry to ASCII string for display with date, time and msg X */ X char * X*************** X*** 997,1005 X if (appt->flags & A_NOTE) { X /* note */ X if (appt->flags & ALL_YEARS) X! sprintf(strbuf,"%3.3s %2d/%02d -- %s", X! daynames[current.tm_wday], appt->month+1, X! appt->day, appt->str); X else if (appt->year > 99) X sprintf(strbuf,"%3.3s %2d/%02d/%02d -- %s", X daynames[current.tm_wday], appt->month+1, X X--- 986,999 ----- X if (appt->flags & A_NOTE) { X /* note */ X if (appt->flags & ALL_YEARS) X! if (day_first) X! sprintf(strbuf,"%3.3s %2d/%02d -- %s", X! daynames[current.tm_wday], appt->day, X! appt->month+1, appt->str); X! else X! sprintf(strbuf,"%3.3s %2d/%02d -- %s", X! daynames[current.tm_wday], appt->month+1, X! appt->day, appt->str); X else if (appt->year > 99) X if (day_first) X sprintf(strbuf,"%3.3s %2d/%02d/%02d -- %s", X*************** X*** 1001,1009 X daynames[current.tm_wday], appt->month+1, X appt->day, appt->str); X else if (appt->year > 99) X! sprintf(strbuf,"%3.3s %2d/%02d/%02d -- %s", X! daynames[current.tm_wday], appt->month+1, X! appt->day, appt->year-100, appt->str); X else X sprintf(strbuf,"%3.3s %2d/%02d/%02d -- %s", X daynames[current.tm_wday], appt->month+1, X X--- 995,1008 ----- X daynames[current.tm_wday], appt->month+1, X appt->day, appt->str); X else if (appt->year > 99) X! if (day_first) X! sprintf(strbuf,"%3.3s %2d/%02d/%02d -- %s", X! daynames[current.tm_wday], appt->day, X! appt->month+1, appt->year-100, appt->str); X! else X! sprintf(strbuf,"%3.3s %2d/%02d/%02d -- %s", X! daynames[current.tm_wday], appt->month+1, X! appt->day, appt->year-100, appt->str); X else X if (day_first) X sprintf(strbuf,"%3.3s %2d/%02d/%02d -- %s", X*************** X*** 1005,1014 X daynames[current.tm_wday], appt->month+1, X appt->day, appt->year-100, appt->str); X else X! sprintf(strbuf,"%3.3s %2d/%02d/%02d -- %s", X! daynames[current.tm_wday], appt->month+1, X! appt->day, appt->year, appt->str); X! } else X /* standard appointment */ X sprintf(strbuf,"%3.3s %2d/%02d/%02d -- %2d:%02d to %2d:%02d %s", X daynames[current.tm_wday], appt->month+1, X X--- 1004,1018 ----- X daynames[current.tm_wday], appt->month+1, X appt->day, appt->year-100, appt->str); X else X! if (day_first) X! sprintf(strbuf,"%3.3s %2d/%02d/%02d -- %s", X! daynames[current.tm_wday], appt->day, X! appt->month+1, appt->year, appt->str); X! else X! sprintf(strbuf,"%3.3s %2d/%02d/%02d -- %s", X! daynames[current.tm_wday], appt->month+1, X! appt->day, appt->year, appt->str); X! } else { X /* standard appointment */ X if (hour24) X if (day_first) X*************** X*** 1010,1020 X appt->day, appt->year, appt->str); X } else X /* standard appointment */ X! sprintf(strbuf,"%3.3s %2d/%02d/%02d -- %2d:%02d to %2d:%02d %s", X! daynames[current.tm_wday], appt->month+1, X! appt->day, appt->year, appt->hour, appt->minute, X! e_hour, e_minutes, appt->str); X! X current = Save; X return(strbuf); X } X X--- 1014,1048 ----- X appt->day, appt->year, appt->str); X } else { X /* standard appointment */ X! if (hour24) X! if (day_first) X! sprintf(strbuf,"%3.3s %2d/%02d/%02d -- %2d:%02d to %2d:%02d %s", X! daynames[current.tm_wday], appt->day, X! appt->month+1, appt->year, appt->hour, appt->minute, X! e_hour, e_minutes, appt->str); X! else X! sprintf(strbuf,"%3.3s %2d/%02d/%02d -- %2d:%02d to %2d:%02d %s", X! daynames[current.tm_wday], appt->month+1, X! appt->day, appt->year, appt->hour, appt->minute, X! e_hour, e_minutes, appt->str); X! else X! if (day_first) X! sprintf(strbuf,"%3.3s %2d/%02d/%02d -- %2d:%02d%s to %2d:%02d%s %s", X! daynames[current.tm_wday], appt->day, X! appt->month+1, appt->year, (appt->hour < 13 ? appt->hour : appt->hour-12), appt->minute, X! (appt->hour < 12 ? "am" : "pm"), X! (e_hour < 13 ? e_hour : e_hour-12), e_minutes, X! (e_hour < 12 ? "am" : "pm"), X! appt->str); X! else X! sprintf(strbuf,"%3.3s %2d/%02d/%02d -- %2d:%02d%s to %2d:%02d%s %s", X! daynames[current.tm_wday], appt->month+1, X! appt->day, appt->year, (appt->hour < 13 ? appt->hour : appt->hour-12), appt->minute, X! (appt->hour < 12 ? "am" : "pm"), X! (e_hour < 13 ? e_hour : e_hour-12), e_minutes, X! (e_hour < 12 ? "am" : "pm"), X! appt->str); X! } X current = Save; X return(strbuf); X } X*************** X*** 1046,1052 X } X X strbuf[0] = '\0'; X! if (!(appt->flags & A_NOTE)) X /* standard appointment */ X sprintf(strbuf,"%2d:%02d to %2d:%02d ", X appt->hour, appt->minute, e_hour, e_minutes); X X--- 1074,1080 ----- X } X X strbuf[0] = '\0'; X! if (!(appt->flags & A_NOTE)) { X /* standard appointment */ X if (hour24) X sprintf(strbuf,"%2d:%02d to %2d:%02d ", X*************** X*** 1048,1055 X strbuf[0] = '\0'; X if (!(appt->flags & A_NOTE)) X /* standard appointment */ X! sprintf(strbuf,"%2d:%02d to %2d:%02d ", X! appt->hour, appt->minute, e_hour, e_minutes); X p = appt->str; X q = strbuf + strlen(strbuf); X while (*p) { X X--- 1076,1091 ----- X strbuf[0] = '\0'; X if (!(appt->flags & A_NOTE)) { X /* standard appointment */ X! if (hour24) X! sprintf(strbuf,"%2d:%02d to %2d:%02d ", X! appt->hour, appt->minute, e_hour, e_minutes); X! else X! sprintf(strbuf,"%2d:%02d%s to %2d:%02d%s ", X! (appt->hour < 13 ? appt->hour : appt->hour-12), appt->minute, X! (appt->hour < 12 ? "am" : "pm"), X! (e_hour < 13 ? e_hour : e_hour-12), e_minutes, X! (e_hour < 12 ? "am" : "pm")); X! } X p = appt->str; X q = strbuf + strlen(strbuf); X while (*p) { X*************** X*** 1077,1083 X } X X /* X! * parse the date on the given tring and reset the "current" X * date to reflect that date. The date may take the form of a X * day name (e.g. Tu, Tue, Tuesday) or a date in m/d/y format X * where the month and/or year may be missing (e.g. 27 = 27th X X--- 1113,1119 ----- X } X X /* X! * parse the date on the given string and reset the "current" X * date to reflect that date. The date may take the form of a X * day name (e.g. Tu, Tue, Tuesday) or a date in m/d/y format X * where the month and/or year may be missing (e.g. 27 = 27th X*************** X*** 1084,1089 X * of this month, 8/27 = August 27 of this year, 8/27/89 = X * August 27 of 1989. If 'cmdline' is true, then the string X * came from the command line '-d' option. X */ X int X parse_date(str, cmdline) X X--- 1120,1128 ----- X * of this month, 8/27 = August 27 of this year, 8/27/89 = X * August 27 of 1989. If 'cmdline' is true, then the string X * came from the command line '-d' option. X+ * If the first character of the date is + or - scan the number and X+ * use it as an offset in days from the current date. Thus -1 becomes X+ * yesterday and +1 becomes tomorrow. pbm. X */ X int X parse_date(str, cmdline) X*************** X*** 1125,1134 X } X if (y > 0) X current.tm_year = y; X! if (m > 0) X! current.tm_mon = m - 1; X! if (d > 0) X! current.tm_mday = d; X fix_current_day(); X } else { X /* day of week */ X X--- 1164,1182 ----- X } X if (y > 0) X current.tm_year = y; X! if (day_first) { X! if (m > 0) { X! current.tm_mon = d - 1; X! current.tm_mday = m; X! } else if (d > 0) X! current.tm_mday = d; X! } else { X! if (m > 0) { X! current.tm_mon = m - 1; X! current.tm_mday = d; X! } else if (d > 0) X! current.tm_mday = d; X! } X fix_current_day(); X } else if (*str == '-' || *str == '+') { X /* X*************** X*** 1130,1135 X if (d > 0) X current.tm_mday = d; X fix_current_day(); X } else { X /* day of week */ X /* check for day names */ X X--- 1178,1193 ----- X current.tm_mday = d; X } X fix_current_day(); X+ } else if (*str == '-' || *str == '+') { X+ /* X+ * If the argument begins with a + or - assume that it is an X+ * offset in days from the current date. Use current date if the X+ * number doesn't scan after the - or +. pbm X+ */ X+ if (sscanf(str, "%d", &i) == 1) { X+ current.tm_mday += i; X+ fix_current_day(); X+ } X } else { X /* day of week */ X /* check for day names */ X*************** X*** 1180,1186 X X lock_cursors(); X working(TRUE); X! sprintf(buf, "Appointments file \"%s\" printed for %s on %s", apts_pathname, cuserid(NULL), todays_date); X if (mainsw_state != DISPLAYING_MONTH) { X if ((fp = fopen(rasfile, "w")) != NULL) { X rect = (Rect *) window_get(canvas, WIN_RECT); X X--- 1238,1244 ----- X X lock_cursors(); X working(TRUE); X! sprintf(buf, "Appointments file \"%s\" printed for %s on %s", apts_pathname, cuserid(NULL), clockstr); X if (mainsw_state != DISPLAYING_MONTH) { X if ((fp = fopen(rasfile, "w")) != NULL) { X rect = (Rect *) window_get(canvas, WIN_RECT); X*************** X*** 1217,1223 X err_rpt("only PostScript output available for month printout", NON_FATAL); X } else { X if ((pfp = fopen(psfile, "w")) != NULL) { X! print_month(pfp, FALSE); X fclose(pfp); X sprintf(prntcmd, "%s %s", printer, psfile); X system(prntcmd); X X--- 1275,1281 ----- X err_rpt("only PostScript output available for month printout", NON_FATAL); X } else { X if ((pfp = fopen(psfile, "w")) != NULL) { X! print_month(pfp, TRUE); X fclose(pfp); X sprintf(prntcmd, "%s %s", printer, psfile); X system(prntcmd); X*************** X*** 1230,1235 X unlock_cursors(); X } X #endif /* NO_PRINTER */ X X /* set error logging flag */ X err2console(state) X X--- 1288,1294 ----- X unlock_cursors(); X } X #endif /* NO_PRINTER */ X+ #endif /* CALENCHECK */ X X /* set error logging flag */ X err2console(state) X*************** X*** 1252,1257 X { X FILE *f; X int closed; X X closed = (int) window_get(frame, FRAME_CLOSED); X if (frame && !log_to_console && !closed) { X X--- 1311,1317 ----- X { X FILE *f; X int closed; X+ char *getenv(); X X #ifndef NOTOOL X closed = (int) window_get(frame, FRAME_CLOSED); X*************** X*** 1253,1258 X FILE *f; X int closed; X X closed = (int) window_get(frame, FRAME_CLOSED); X if (frame && !log_to_console && !closed) { X /* base frame exists */ X X--- 1313,1319 ----- X int closed; X char *getenv(); X X+ #ifndef NOTOOL X closed = (int) window_get(frame, FRAME_CLOSED); X if (frame && !log_to_console && !closed) { X /* base frame exists */ X*************** X*** 1260,1265 X (void) window_loop(prompt_frame); X window_set(prompt_frame, WIN_SHOW, FALSE, 0); X } else if ((f=fopen("/dev/console", "w")) != NULL) { X fprintf(f, "%s: %s\n", progname, errstr); X fclose(f); X } else X X--- 1321,1329 ----- X (void) window_loop(prompt_frame); X window_set(prompt_frame, WIN_SHOW, FALSE, 0); X } else if ((f=fopen("/dev/console", "w")) != NULL) { X+ #else X+ if (getenv("WINDOW_PARENT") != NULL && (f=fopen("/dev/console", "w")) != NULL) { X+ #endif X fprintf(f, "%s: %s\n", progname, errstr); X fclose(f); X } else X*************** X*** 1268,1273 X exit(1); X } X X /* Clean-up */ X cleanup() X { X X--- 1332,1338 ----- X exit(1); X } X X+ #ifndef CALENCHECK X /* Clean-up */ X cleanup() X { X*************** X*** 1275,1282 X close_day(); X X /* create outdated include files (if necessary) */ X! if (save_old) X! create_old_files(); X X /* delete tmp file */ X if (access(tmpapts_pathname, R_OK) == 0 && unlink(tmpapts_pathname) < 0) X X--- 1340,1347 ----- X close_day(); X X /* create outdated include files (if necessary) */ X! if (save_old || expire_days) X! expire(expire_days); X X /* delete tmp file */ X if (access(tmpapts_pathname, R_OK) == 0 && unlink(tmpapts_pathname) < 0) X*************** X*** 1296,1298 X err_rpt("couldn't rename/copy tmp file", NON_FATAL); X } X } X X--- 1361,1364 ----- X err_rpt("couldn't rename/copy tmp file", NON_FATAL); X } X } X+ #endif /* CALENCHECK */ X*** /tmp/,RCSt1a16998 Fri Dec 15 17:24:01 1989 X--- version.c Fri Dec 15 17:18:34 1989 X*************** X*** 1,5 X /* X! * $Header: version.c,v 2.5 89/09/19 06:09:07 billr Exp $ X */ X /* X * version.c - current version of calentool program X X--- 1,5 ----- X /* X! * $Header: version.c,v 2.6 89/12/15 17:18:32 billr Exp $ X */ X /* X * version.c - current version of calentool program X*************** X*** 24,27 X * notice remains intact. X */ X X! char version[] = "Calendar Tool V2.1p4"; X X--- 24,27 ----- X * notice remains intact. X */ X X! char version[] = "Calendar Tool V2.1p5"; X*** /tmp/,RCSt1a17003 Fri Dec 15 17:24:04 1989 X--- wevent.c Fri Dec 15 17:18:37 1989 X*************** X*** 1,5 X /* X! * $Header: wevent.c,v 2.1 89/05/09 14:19:57 billr Exp $ X */ X /* X * wevent.c X X--- 1,5 ----- X /* X! * $Header: wevent.c,v 2.2 89/12/15 17:18:35 billr Exp $ X */ X /* X * wevent.c X*************** X*** 36,41 X #include "event.h" X X extern Frame prompt_frame; X X week_inputevent(canvas, event) X Canvas canvas; X X--- 36,42 ----- X #include "event.h" X X extern Frame prompt_frame; X+ extern int monday_first; X X week_inputevent(canvas, event) X Canvas canvas; X*************** X*** 84,89 X return; X } X current.tm_mday -= current.tm_wday; X current.tm_mday += day_chosen_from_week; X fix_current_day(); X if (nr_weekdays == 5) { X X--- 85,96 ----- X return; X } X current.tm_mday -= current.tm_wday; X+ if (monday_first) { X+ if (current.tm_wday == SUN) X+ current.tm_mday -= 7; X+ if (nr_weekdays == 7) X+ current.tm_mday++; X+ } X current.tm_mday += day_chosen_from_week; X fix_current_day(); X if (nr_weekdays < 7) { X*************** X*** 86,92 X current.tm_mday -= current.tm_wday; X current.tm_mday += day_chosen_from_week; X fix_current_day(); X! if (nr_weekdays == 5) { X current.tm_mday++; X fix_current_day(); X } X X--- 93,99 ----- X } X current.tm_mday += day_chosen_from_week; X fix_current_day(); X! if (nr_weekdays < 7) { X current.tm_mday++; X fix_current_day(); X } END_OF_FILE if test 51460 -ne `wc -c <'patches05d'`; then echo shar: \"'patches05d'\" unpacked with wrong size! fi # end of 'patches05d' fi echo shar: End of archive 4 \(of 4\). cp /dev/null ark4isdone MISSING="" for I in 1 2 3 4 ; do if test ! -f ark${I}isdone ; then MISSING="${MISSING} ${I}" fi done if test "${MISSING}" = "" ; then echo You have unpacked all 4 archives. rm -f ark[1-9]isdone else echo You still need to unpack the following archives: echo " " ${MISSING} fi ## End of shell archive. exit 0