=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/calendar/io.c,v retrieving revision 1.14 retrieving revision 1.29 diff -u -r1.14 -r1.29 --- src/usr.bin/calendar/io.c 2001/09/03 16:15:08 1.14 +++ src/usr.bin/calendar/io.c 2005/04/15 14:28:56 1.29 @@ -1,4 +1,4 @@ -/* $OpenBSD: io.c,v 1.14 2001/09/03 16:15:08 pjanzen Exp $ */ +/* $OpenBSD: io.c,v 1.29 2005/04/15 14:28:56 otto Exp $ */ /* * Copyright (c) 1989, 1993, 1994 @@ -12,11 +12,7 @@ * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors + * 3. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * @@ -43,7 +39,7 @@ #if 0 static const char sccsid[] = "@(#)calendar.c 8.3 (Berkeley) 3/25/94"; #else -static char rcsid[] = "$OpenBSD: io.c,v 1.14 2001/09/03 16:15:08 pjanzen Exp $"; +static const char rcsid[] = "$OpenBSD: io.c,v 1.29 2005/04/15 14:28:56 otto Exp $"; #endif #endif /* not lint */ @@ -82,16 +78,17 @@ void -cal() +cal(void) { - register int printing; - register char *p; + int printing; + char *p; FILE *fp; - int ch, l, i; + int ch, l, i, bodun = 0, bodun_maybe = 0; int var; - char buf[2048 + 1]; + char buf[2048 + 1], *prefix = NULL; struct event *events, *cur_evt, *ev1, *tmp; struct match *m; + size_t nlen; events = NULL; cur_evt = NULL; @@ -110,7 +107,42 @@ if (strncmp(buf, "LANG=", 5) == 0) { (void) setlocale(LC_ALL, buf + 5); setnnames(); + if (!strcmp(buf + 5, "ru_RU.KOI8-R") || + !strcmp(buf + 5, "uk_UA.KOI8-U") || + !strcmp(buf + 5, "by_BY.KOI8-B")) { + bodun_maybe++; + bodun = 0; + if (prefix) + free(prefix); + prefix = NULL; + } else + bodun_maybe = 0; continue; + } else if (strncmp(buf, "CALENDAR=", 9) == 0) { + char *ep; + + if (buf[9] == '\0') + calendar = 0; + else if (!strcasecmp(buf + 9, "julian")) { + calendar = JULIAN; + errno = 0; + julian = strtoul(buf + 14, &ep, 10); + if (buf[0] == '\0' || *ep != '\0') + julian = 13; + if ((errno == ERANGE && julian == ULONG_MAX) || + julian > 14) + errx(1, "Julian calendar offset is too large"); + } else if (!strcasecmp(buf + 9, "gregorian")) + calendar = GREGORIAN; + else if (!strcasecmp(buf + 9, "lunar")) + calendar = LUNAR; + } else if (bodun_maybe && strncmp(buf, "BODUN=", 6) == 0) { + bodun++; + if (prefix) + free(prefix); + if ((prefix = strdup(buf + 6)) == NULL) + err(1, NULL); + continue; } /* User defined names for special events */ if ((p = strchr(buf, '='))) { @@ -130,7 +162,7 @@ continue; } if (buf[0] != '\t') { - printing = (m = isnow(buf)) ? 1 : 0; + printing = (m = isnow(buf, bodun)) ? 1 : 0; if ((p = strchr(buf, '\t')) == NULL) { printing = 0; continue; @@ -158,7 +190,17 @@ cur_evt->desc = ev1->desc; cur_evt->ldesc = NULL; } else { - if ((cur_evt->ldesc = strdup(p)) == NULL) + if (m->bodun && prefix) { + int l1 = strlen(prefix); + int l2 = strlen(p); + int len = l1 + l2 + 2; + if ((cur_evt->ldesc = + malloc(len)) == NULL) + err(1, NULL); + snprintf(cur_evt->ldesc, len, + "\t%s %s", prefix, p + 1); + } else if ((cur_evt->ldesc = + strdup(p)) == NULL) err(1, NULL); cur_evt->desc = &(cur_evt->ldesc); ev1 = cur_evt; @@ -171,11 +213,10 @@ } } else if (printing) { - if ((ev1->ldesc = realloc(ev1->ldesc, - (2 + strlen(ev1->ldesc) + strlen(buf)))) == NULL) + nlen = strlen(ev1->ldesc) + strlen(buf) + 2; + if ((ev1->ldesc = realloc(ev1->ldesc, nlen)) == NULL) err(1, NULL); - strcat(ev1->ldesc, "\n"); - strcat(ev1->ldesc, buf); + snprintf(ev1->ldesc, nlen, "%s\n%s", ev1->ldesc, buf); } } tmp = events; @@ -289,13 +330,14 @@ FILE * -opencal() +opencal(void) { - int pdes[2]; - int fdin; + int pdes[2], fdin; + struct stat st; /* open up calendar file as stdin */ - if ((fdin = open(calendarFile, O_RDONLY)) == -1) { + if ((fdin = open(calendarFile, O_RDONLY)) == -1 || + fstat(fdin, &st) == -1 || !S_ISREG(st.st_mode)) { if (!doall) { char *home = getenv("HOME"); if (home == NULL || *home == '\0') @@ -303,10 +345,11 @@ if (!(chdir(home) == 0 && chdir(calendarHome) == 0 && (fdin = open(calendarFile, O_RDONLY)) != -1)) - errx(1, "no calendar file: ``%s'' or ``~/%s/%s", + errx(1, "no calendar file: ``%s'' or ``~/%s/%s''", calendarFile, calendarHome, calendarFile); } } + if (pipe(pdes) < 0) return (NULL); switch (vfork()) { @@ -322,7 +365,8 @@ (void)close(pdes[1]); } (void)close(pdes[0]); - /* Set stderr to /dev/null. Necessary so that cron does not + /* + * Set stderr to /dev/null. Necessary so that cron does not * wait for cpp to finish if it's running calendar -a. */ if (doall) { @@ -333,7 +377,8 @@ (void)dup2(fderr, STDERR_FILENO); (void)close(fderr); } - execl(_PATH_CPP, "cpp", "-P", "-I.", _PATH_INCLUDE, (char *)NULL); + execl(_PATH_CPP, "cpp", "-traditional", "-undef", "-U__GNUC__", + "-P", "-I.", _PATH_INCLUDE, (char *)NULL); warn(_PATH_CPP); _exit(1); }