-# $OpenBSD: Makefile,v 1.2 1996/06/26 05:31:44 deraadt Exp $
-# $NetBSD: Makefile,v 1.6 1995/03/27 08:46:11 glass Exp $
+# $OpenBSD: Makefile,v 1.3 1996/12/05 06:04:36 millert Exp $
+# from: @(#)Makefile 8.1 (Berkeley) 6/6/93
PROG= calendar
+SRCS= calendar.c io.c day.c ostern.c paskha.c
+INTER= de_DE.ISO_8859-1 hr_HR.ISO_8859-2 ru_SU.KOI8-R
beforeinstall:
install -c -o ${BINOWN} -g ${BINGRP} -m 444 \
${.CURDIR}/calendars/calendar.* ${DESTDIR}/usr/share/calendar
+.for lang in ${INTER}
+ @test -d ${DESTDIR}/usr/share/calendar/${lang} || \
+ mkdir ${DESTDIR}/usr/share/calendar/${lang}
+ install -c -o ${BINOWN} -g ${BINGRP} -m 444 \
+ ${.CURDIR}/calendars/${lang}/calendar.* \
+ ${DESTDIR}/usr/share/calendar/${lang};
+.endfor
.include <bsd.prog.mk>
-.\" $OpenBSD: calendar.1,v 1.2 1996/06/26 05:31:45 deraadt Exp $
-.\" $NetBSD: calendar.1,v 1.7 1995/03/27 08:46:13 glass Exp $
+.\" $OpenBSD: calendar.1,v 1.3 1996/12/05 06:04:37 millert Exp $
.\"
.\" Copyright (c) 1989, 1990, 1993
-.\" The Regents of the University of California. All rights reserved.
+.\" The Regents of the University of California. All rights reserved.
.\"
.\" Redistribution and use in source and binary forms, with or without
.\" modification, are permitted provided that the following conditions
.\" 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.
+.\" 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
.\" may be used to endorse or promote products derived from this software
.\" without specific prior written permission.
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
-.\" @(#)calendar.1 8.1 (Berkeley) 6/29/93
+.\" @(#)calendar.1 8.1 (Berkeley) 6/29/93
.\"
.Dd June 29, 1993
.Dt CALENDAR 1
.Sh SYNOPSIS
.Nm calendar
.Op Fl a
+.Op Fl A Ar num
+.Op Fl B Ar num
+.Oo Fl t Ar dd
+.Sm off
+.Op . Ar mm Op . Ar year
+.Sm on
+.Oc
+.Op Fl f Ar calendarfile
.Sh DESCRIPTION
-The
+The
.Nm calendar
utility checks the current directory or the directory specified by the
.Dq Ev CALENDAR_DIR
Process the ``calendar'' files of all users and mail the results
to them.
This requires super-user privileges.
+.It Fl A Ar num
+print lines from today and next
+.Ar num
+days (forward, future)
+.It Fl B Ar num
+print lines from today and previous
+.Ar num
+days (backward, past)
+.It Fl f Pa calendarfile
+use
+.Pa calendarfile
+as default calendar file.
+.It Xo Fl t
+.Sm off
+.Ar dd
+.Op . Ar mm Op . Ar year
+.Sm on
+.Xc
+for test purposes only: set date directly to argument values.
.El
.Pp
-Lines should begin with a month and day.
+To handle calendars in your national code table you can specify
+.Dq LANG=<locale_name>
+in the calendar file as early as possible. To handle national Easter
+names in the calendars
+.Dq Easter=<national_name>
+(for Catholic Easter) or
+.Dq Paskha=<national_name>
+(for Orthodox Easter) can be used.
+.Pp
+Other lines should begin with a month and day.
They may be entered in almost any format, either numeric or as character
strings.
+If proper locale is set, national months and weekdays
+names can be used.
A single asterisk (``*'') matches every month.
A day without a month matches that day of every week.
A month without a day matches the first of that month.
Two numbers default to the month followed by the day.
Lines with leading tabs default to the last entered date, allowing
multiple line specifications for a single date.
+``Easter'', may be followed by an positive or negative integer, is
+Easter for this year.
+``Paskha'', may be followed by an positive or negative integer, is
+Orthodox Easter for this year.
+Weekdays may be followed by ``-4'' ... ``+5'' (aliases
+last, first, second, third, fourth) for moving events like
+``the last Monday in April''
+.Pp
By convention, dates followed by an asterisk are not fixed, i.e., change
from year to year.
.Pp
+Day description start after the first <tab> character in the line;
+if the line not contains <tab> character, it isn't printed out.
+If the first character in the line is a <tab> character, it is treated as
+continue of previous description.
+.Pp
The ``calendar'' file is preprocessed by
.Xr cpp 1 ,
allowing the inclusion of shared files such as company holidays or
.Pq Li /* ... */
are ignored.
.Pp
-Some possible calendar entries:
+Some possible calendar entries (<tab> characters highlighted by
+\fB\et\fR sequence)
.Bd -unfilled -offset indent
-#include <calendar.usholiday>
-#include <calendar.birthday>
-
-6/15 ... June 15 (if ambiguous, will default to month/day).
-Jun. 15 ... June 15.
-15 June ... June 15.
-Thursday ... Every Thursday.
-June ... Every June 1st.
-15 * ... 15th of every month.
+LANG=C
+Easter=Ostern
+
+#include <calendar.usholiday>
+#include <calendar.birthday>
+
+6/15\fB\et\fRJune 15 (if ambiguous, will default to month/day).
+Jun. 15\fB\et\fRJune 15.
+15 June\fB\et\fRJune 15.
+Thursday\fB\et\fREvery Thursday.
+June\fB\et\fREvery June 1st.
+15 *\fB\et\fR15th of every month.
+
+May Sun+2\fB\et\fRsecond Sunday in May (Muttertag)
+04/SunLast\fB\et\fRlast Sunday in April,
+\fB\et\fRsummer time in Europe
+Easter\fB\et\fREaster
+Ostern-2\fB\et\fRGood Friday (2 days before Easter)
+Paskha\fB\et\fROrthodox Easter
.Ed
.Sh FILES
+.Pp
+.Bl -tag -width calendar.christian -compact
+.It Pa calendar
+file in current directory
+
+.It Pa ~/.calendar
+.Pa calendar
+HOME directory.
+.Nm calendar
+does a chdir into this directory if it exists.
+
+.It Pa ~/.calendar/calendar
+calendar file to use if no calendar file exists in the current directory.
+
+.It Pa ~/.calendar/nomail
+do not send mail if this file exists.
+.El
+
The following default calendar files are provided:
.Pp
.Bl -tag -width calendar.christian -compact
.It Pa calendar.birthday
Births and deaths of famous (and not-so-famous) people.
+
.It Pa calendar.christian
Christian holidays.
This calendar should be updated yearly by the local system administrator
so that roving holidays are set correctly for the current year.
+
.It Pa calendar.computer
Days of special significance to computer people.
+
.It Pa calendar.history
Everything else, mostly U. S. historical events.
+
.It Pa calendar.holiday
Other holidays, including the not-well-known, obscure, and
.Em really
obscure.
+
.It Pa calendar.judaic
Jewish holidays.
This calendar should be updated yearly by the local system administrator
so that roving holidays are set correctly for the current year.
+
.It Pa calendar.music
-Musical events, births, and deaths.
-Strongly oriented toward rock 'n' roll.
+Musical events, births, and deaths.
+Strongly oriented toward rock 'n' roll.
+
.It Pa calendar.usholiday
U.S. holidays.
This calendar should be updated yearly by the local system administrator
so that roving holidays are set correctly for the current year.
+
+.It Pa calendar.german
+German calendar.
+
+.It Pa calendar.russian
+Russian calendar.
.El
.Sh SEE ALSO
.Xr at 1 ,
.Xr cpp 1 ,
-.Xr cron 8
+.Xr cron 8 ,
+.Xr mail 1
.Sh COMPATIBILITY
The
.Nm calendar
program previously selected lines which had the correct date anywhere
in the line.
This is no longer true, the date is only recognized when it occurs
-first on the line.
+at the beginning of a line.
.Sh HISTORY
A
.Nm
-command appeared in
+command appeared in
.At v7 .
.Sh BUGS
.Nm Calendar
-doesn't handle events that move around from year to year, i.e.,
-``the last Monday in April''.
+doesn't handle Jewish holidays and moon phases.
-/* $OpenBSD: calendar.c,v 1.4 1996/12/04 09:06:00 deraadt Exp $ */
-/* $NetBSD: calendar.c,v 1.8 1995/09/02 05:38:38 jtc Exp $ */
+/* $OpenBSD: calendar.c,v 1.5 1996/12/05 06:04:38 millert Exp $ */
/*
* Copyright (c) 1989, 1993, 1994
*/
#ifndef lint
-static char copyright[] =
+static const char copyright[] =
"@(#) Copyright (c) 1989, 1993\n\
The Regents of the University of California. All rights reserved.\n";
#endif /* not lint */
#ifndef lint
#if 0
-static char sccsid[] = "@(#)calendar.c 8.4 (Berkeley) 1/7/95";
+static const char sccsid[] = "@(#)calendar.c 8.3 (Berkeley) 3/25/94";
+#else
+static char rcsid[] = "$OpenBSD: calendar.c,v 1.5 1996/12/05 06:04:38 millert Exp $";
#endif
-static char rcsid[] = "$OpenBSD: calendar.c,v 1.4 1996/12/04 09:06:00 deraadt Exp $";
#endif /* not lint */
-#include <sys/param.h>
-#include <sys/time.h>
-#include <sys/stat.h>
-#include <sys/uio.h>
-#include <sys/wait.h>
-
-#include <ctype.h>
#include <err.h>
#include <errno.h>
-#include <fcntl.h>
+#include <locale.h>
#include <pwd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#include <tzfile.h>
+#include <time.h>
#include <unistd.h>
#include "pathnames.h"
+#include "calendar.h"
struct passwd *pw;
-int doall;
+int doall = 0;
+time_t f_time = 0;
-void cal __P((void));
-void closecal __P((FILE *));
-int getday __P((char *));
-int getfield __P((char *, char **, int *));
-int getmonth __P((char *));
-int isnow __P((char *));
-FILE *opencal __P((void));
-void settime __P((void));
-void usage __P((void));
+int f_dayAfter = 0; /* days after current date */
+int f_dayBefore = 0; /* days before current date */
int
main(argc, argv)
int argc;
char *argv[];
{
- extern int optind;
int ch;
char *caldir;
- while ((ch = getopt(argc, argv, "-a")) != EOF)
+ (void) setlocale(LC_ALL, "");
+
+ while ((ch = getopt(argc, argv, "?-af:t:A:B:")) != EOF)
switch (ch) {
case '-': /* backward contemptible */
case 'a':
- if (getuid()) {
- errno = EPERM;
- err(1, NULL);
- }
+ if (getuid())
+ errx(1, strerror(EPERM));
doall = 1;
break;
+
+
+ case 'f': /* other calendar file */
+ calendarFile = optarg;
+ break;
+
+ case 't': /* other date, undocumented, for tests */
+ f_time = Mktime (optarg);
+ break;
+
+ case 'A': /* days after current date */
+ f_dayAfter = atoi(optarg);
+ break;
+
+ case 'B': /* days before current date */
+ f_dayBefore = atoi(optarg);
+ break;
+
case '?':
default:
usage();
if (argc)
usage();
- settime();
+ /* use current time */
+ if (f_time <= 0)
+ (void)time(&f_time);
+
+ settime(f_time);
+
if (doall)
while ((pw = getpwent()) != NULL) {
(void)setegid(pw->pw_gid);
(void)seteuid(0);
}
else if ((caldir = getenv("CALENDAR_DIR")) != NULL) {
- if(!chdir(caldir))
- cal();
+ if(!chdir(caldir))
+ cal();
} else
cal();
- exit(0);
-}
-
-void
-cal()
-{
- register int printing;
- register char *p;
- FILE *fp;
- int ch;
- char buf[2048 + 1];
-
- if ((fp = opencal()) == NULL)
- return;
- for (printing = 0; fgets(buf, sizeof(buf), stdin) != NULL;) {
- if ((p = strchr(buf, '\n')) != NULL)
- *p = '\0';
- else
- while ((ch = getchar()) != '\n' && ch != EOF)
- ;
- if (buf[0] == '\0')
- continue;
- if (buf[0] != '\t')
- printing = isnow(buf) ? 1 : 0;
- if (printing)
- (void)fprintf(fp, "%s\n", buf);
- }
- closecal(fp);
-}
-
-struct iovec header[] = {
- "From: ", 6,
- NULL, 0,
- " (Reminder Service)\nTo: ", 24,
- NULL, 0,
- "\nSubject: ", 10,
- NULL, 0,
- "'s Calendar\nPrecedence: bulk\n\n", 30,
-};
-
-/* 1-based month, 0-based days, cumulative */
-int daytab[][14] = {
- 0, -1, 30, 58, 89, 119, 150, 180, 211, 242, 272, 303, 333, 364,
- 0, -1, 30, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365,
-};
-struct tm *tp;
-int *cumdays, offset, yrdays;
-char dayname[10];
-
-void
-settime()
-{
- time_t now;
-
- (void)time(&now);
- tp = localtime(&now);
- if (isleap(tp->tm_year + 1900)) {
- yrdays = DAYSPERLYEAR;
- cumdays = daytab[1];
- } else {
- yrdays = DAYSPERNYEAR;
- cumdays = daytab[0];
- }
- /* Friday displays Monday's events */
- offset = tp->tm_wday == 5 ? 3 : 1;
- header[5].iov_base = dayname;
- header[5].iov_len = strftime(dayname, sizeof(dayname), "%A", tp);
-}
-
-/*
- * Possible date formats include any combination of:
- * 3-charmonth (January, Jan, Jan)
- * 3-charweekday (Friday, Monday, mon.)
- * numeric month or day (1, 2, 04)
- *
- * Any character may separate them, or they may not be separated. Any line,
- * following a line that is matched, that starts with "whitespace", is shown
- * along with the matched line.
- */
-int
-isnow(endp)
- char *endp;
-{
- int day, flags, month, v1, v2;
-#define F_ISMONTH 0x01
-#define F_ISDAY 0x02
- flags = 0;
- /* didn't recognize anything, skip it */
- if (!(v1 = getfield(endp, &endp, &flags)))
- return (0);
- if (flags & F_ISDAY || v1 > 12) {
- /* found a day */
- day = v1;
- month = tp->tm_mon + 1;
- } else if (flags & F_ISMONTH) {
- month = v1;
- /* if no recognizable day, assume the first */
- if (!(day = getfield(endp, &endp, &flags)))
- day = 1;
- } else {
- v2 = getfield(endp, &endp, &flags);
- if (flags & F_ISMONTH) {
- day = v1;
- month = v2;
- } else {
- /* F_ISDAY set, v2 > 12, or no way to tell */
- month = v1;
- /* if no recognizable day, assume the first */
- day = v2 ? v2 : 1;
- }
- }
- if (flags & F_ISDAY)
- day = tp->tm_mday + (((day - 1) - tp->tm_wday + 7) % 7);
- day = cumdays[month] + day;
-
- /* if today or today + offset days */
- if (day >= tp->tm_yday && day <= tp->tm_yday + offset)
- return (1);
- /* if number of days left in this year + days to event in next year */
- if (yrdays - tp->tm_yday + day <= offset)
- return (1);
- return (0);
-}
-
-int
-getfield(p, endp, flags)
- char *p, **endp;
- int *flags;
-{
- int val;
- char *start, savech;
-
- for (; !isdigit(*p) && !isalpha(*p) && *p != '*'; ++p)
- ;
- if (*p == '*') { /* `*' is current month */
- *flags |= F_ISMONTH;
- *endp = p+1;
- return (tp->tm_mon + 1);
- }
- if (isdigit(*p)) {
- val = strtol(p, &p, 10); /* if 0, it's failure */
- for (; !isdigit(*p) && !isalpha(*p) && *p != '*'; ++p)
- ;
- *endp = p;
- return (val);
- }
- for (start = p; isalpha(*++p);)
- ;
- savech = *p;
- *p = '\0';
- if ((val = getmonth(start)) != 0)
- *flags |= F_ISMONTH;
- else if ((val = getday(start)) != 0)
- *flags |= F_ISDAY;
- else {
- *p = savech;
- return (0);
- }
- for (*p = savech; !isdigit(*p) && !isalpha(*p) && *p != '*'; ++p)
- ;
- *endp = p;
- return (val);
-}
-
-char path[MAXPATHLEN];
-
-FILE *
-opencal()
-{
- int fd, pdes[2];
-
- /* open up calendar file as stdin */
- if (!freopen("calendar", "r", stdin)) {
- if (doall)
- return (NULL);
- errx(1, "no calendar file.");
- }
- if (pipe(pdes) < 0)
- return (NULL);
- switch (vfork()) {
- case -1: /* error */
- (void)close(pdes[0]);
- (void)close(pdes[1]);
- return (NULL);
- case 0:
- /* child -- stdin already setup, set stdout to pipe input */
- if (pdes[1] != STDOUT_FILENO) {
- (void)dup2(pdes[1], STDOUT_FILENO);
- (void)close(pdes[1]);
- }
- (void)close(pdes[0]);
- (void)setuid(geteuid());
- (void)setgid(getegid());
- execl(_PATH_CPP, "cpp", "-P", "-I.", _PATH_INCLUDE, NULL);
- warn("execl: %s", _PATH_CPP);
- _exit(1);
- }
- /* parent -- set stdin to pipe output */
- (void)dup2(pdes[0], STDIN_FILENO);
- (void)close(pdes[0]);
- (void)close(pdes[1]);
-
- /* not reading all calendar files, just set output to stdout */
- if (!doall)
- return (stdout);
-
- /* set output to a temporary file, so if no output don't send mail */
- (void)snprintf(path, sizeof(path), "%s_calXXXXXX", _PATH_TMP);
- if ((fd = mkstemp(path)) < 0)
- return (NULL);
- return (fdopen(fd, "w+"));
-}
-
-void
-closecal(fp)
- FILE *fp;
-{
- struct stat sbuf;
- int nread, pdes[2], status;
- char buf[1024];
-
- if (!doall)
- return;
-
- (void)rewind(fp);
- if (fstat(fileno(fp), &sbuf) || !sbuf.st_size)
- goto done;
- if (pipe(pdes) < 0)
- goto done;
- switch (vfork()) {
- case -1: /* error */
- (void)close(pdes[0]);
- (void)close(pdes[1]);
- goto done;
- case 0:
- /* child -- set stdin to pipe output */
- if (pdes[0] != STDIN_FILENO) {
- (void)dup2(pdes[0], STDIN_FILENO);
- (void)close(pdes[0]);
- }
- (void)close(pdes[1]);
- (void)setuid(geteuid());
- (void)setgid(getegid());
- execl(_PATH_SENDMAIL, "sendmail", "-i", "-t", "-F",
- "\"Reminder Service\"", "-f", "root", NULL);
- warn("execl: %s", _PATH_SENDMAIL);
- _exit(1);
- }
- /* parent -- write to pipe input */
- (void)close(pdes[0]);
-
- header[1].iov_base = header[3].iov_base = pw->pw_name;
- header[1].iov_len = header[3].iov_len = strlen(pw->pw_name);
- writev(pdes[1], header, 7);
- while ((nread = read(fileno(fp), buf, sizeof(buf))) > 0)
- (void)write(pdes[1], buf, nread);
- (void)close(pdes[1]);
-done: (void)fclose(fp);
- (void)unlink(path);
- while (wait(&status) >= 0)
- ;
-}
-
-static char *months[] = {
- "jan", "feb", "mar", "apr", "may", "jun",
- "jul", "aug", "sep", "oct", "nov", "dec", NULL,
-};
-
-int
-getmonth(s)
- register char *s;
-{
- register char **p;
-
- for (p = months; *p; ++p)
- if (!strncasecmp(s, *p, 3))
- return ((p - months) + 1);
- return (0);
+ exit(0);
}
-static char *days[] = {
- "sun", "mon", "tue", "wed", "thu", "fri", "sat", NULL,
-};
-
-int
-getday(s)
- register char *s;
-{
- register char **p;
-
- for (p = days; *p; ++p)
- if (!strncasecmp(s, *p, 3))
- return ((p - days) + 1);
- return (0);
-}
void
usage()
{
- (void)fprintf(stderr, "usage: calendar [-a]\n");
+ (void)fprintf(stderr,
+ "usage: calendar [-a] [-A days] [-B days] [-f calendarfile]\n");
exit(1);
}
--- /dev/null
+/* $OpenBSD: calendar.h,v 1.1 1996/12/05 06:04:38 millert Exp $ */
+
+/*
+ * Copyright (c) 1989, 1993, 1994
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 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
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+extern struct passwd *pw;
+extern int doall;
+extern struct iovec header[];
+extern struct tm *tp;
+extern char *calendarFile;
+extern char *optarg;
+
+void cal __P((void));
+void closecal __P((FILE *));
+int getday __P((char *));
+int getdayvar __P((char *));
+int getfield __P((char *, char **, int *));
+int getmonth __P((char *));
+int geteaster __P((char *, int));
+int getpaskha __P((char *, int));
+int easter __P((int));
+int isnow __P((char *, int *, int *, int *));
+FILE *opencal __P((void));
+void settime __P((time_t));
+time_t Mktime __P((char *));
+void usage __P((void));
+void setnnames __P((void));
+
+/* some flags */
+#define F_ISMONTH 0x01 /* month (Januar ...) */
+#define F_ISDAY 0x02 /* day of week (Sun, Mon, ...) */
+#define F_ISDAYVAR 0x04 /* variables day of week, like SundayLast */
+#define F_EASTER 0x08 /* Easter or easter depending days */
+
+extern f_dayAfter; /* days after current date */
+extern f_dayBefore; /* days bevore current date */
+
+struct fixs {
+ char *name;
+ int len;
+};
--- /dev/null
+/*
+ * International and national calendar files
+ *
+ * $OpenBSD: calendar.all,v 1.1 1996/12/05 06:04:43 millert Exp $
+ */
+
+#ifndef _calendar_all_
+#define _calendar_all_
+
+#include <calendar.world>
+#include <calendar.german>
+#include <calendar.usholiday>
+#include <calendar.croatian>
+#include <calendar.russian>
+
+#endif /* !_calendar_all_ */
+/*
+ * Birthday
+ *
+ * $OpenBSD: calendar.birthday,v 1.2 1996/12/05 06:04:44 millert Exp $
+ */
+
+#ifndef _calendar_birthday_
+#define _calendar_birthday_
+
01/01 J.D. Salinger born, 1919
01/01 Paul Revere born in Boston, 1735
01/02 Isaac Asimov born in Petrovichi, Russian SFSR (now part of USSR), 1920
07/12 Thoreau's Birthday, 1817
08/12 Thomas Mann's Death, 1955
08/20 Leon Trotsky assassinated, 1940
+
+#endif /* !_calendar_birthday_ */
-01/06* Epiphany
-02/11* Shrove Tuesday / Mardi Gras (day before Ash Wednesday)
-02/08* Ash Wednesday (First day of Lent)
-03/19* Palm Sunday (7 days before Easter)
-03/23* Maundy Thursday (3 days before Easter)
-03/24* Good Friday (2 days before Easter)
-03/26* Easter Sunday
-05/04* Ascension Day (10 days before Pentecost)
-05/14* Pentecost (Whitsunday)
-05/15* Whitmonday
-05/21* Trinity Sunday (7 days after Pentecost)
-05/25* Corpus Christi (11 days after Pentecost)
+/*
+ * Christian
+ *
+ * $OpenBSD: calendar.christian,v 1.2 1996/12/05 06:04:44 millert Exp $
+ */
+
+#ifndef _calendar_christian_
+#define _calendar_christian_
+
+01/06* Epiphany
+Easter-47 Shrove Tuesday / Mardi Gras (day before Ash Wednesday)
+Easter-46 Ash Wednesday (First day of Lent)
+Easter-7 Palm Sunday (7 days before Easter)
+Easter-3 Maundy Thursday (3 days before Easter)
+Easter-2 Good Friday (2 days before Easter)
+Easter Easter Sunday
+Easter+39 Ascension Day (10 days before Pentecost)
+Easter+49 Pentecost (Whitsunday)
+Easter+50 Whitmonday
+Easter+56 Trinity Sunday (7 days after Pentecost)
+Easter+60 Corpus Christi (11 days after Pentecost)
05/28* Rogation Sunday
10/18 Feast Day of St. Luke
-12/03* First Sunday of Advent (4th Sunday before Christmas)
+11/SunLast First Sunday of Advent (4th Sunday before Christmas)
+12/SunFirst First Sunday of Advent (4th Sunday before Christmas)
12/06 St. Nicholas' Day
+
+#endif /* !_calendar_christian_ */
+/*
+ * Computer
+ *
+ * $OpenBSD: calendar.computer,v 1.2 1996/12/05 06:04:45 millert Exp $
+ */
+
+#ifndef _calendar_computer_
+#define _calendar_computer_
+
01/01 AT&T officially divests its local Bell companies, 1984
01/01 The Epoch (Time 0 for UNIX systems, Midnight GMT, 1970)
01/03 Apple Computer founded, 1977
10/25 DEC announces VAX-11/780
11/04 UNIVAC I program predicts Eisenhower victory based on 7% of votes, 1952
12/08 First Ph.D. awarded by Computer Science Dept, Univ. of Penna, 1965
+
+#endif /* !_calendar_computer_ */
--- /dev/null
+/*
+ * Croatian calendar files
+ *
+ * $OpenBSD: calendar.croatian,v 1.1 1996/12/05 06:04:45 millert Exp $
+ */
+
+#ifndef _calendar_croatian_
+#define _calendar_croatian_
+
+#include <hr_HR.ISO_8859-2/calendar.all>
+
+#endif /* !_calendar_croatian_ */
--- /dev/null
+/*
+ * German calendar file(s)
+ *
+ * $OpenBSD: calendar.german,v 1.1 1996/12/05 06:04:46 millert Exp $
+ */
+
+#ifndef _calendar_german_
+#define _calendar_german_
+
+#include <de_DE.ISO_8859-1/calendar.all>
+
+#endif /* !_calendar_german_ */
+/*
+ * History
+ *
+ * $OpenBSD: calendar.history,v 1.2 1996/12/05 06:04:47 millert Exp $
+ */
+
+#ifndef _calendar_history_
+#define _calendar_history_
+
01/01 Anniversary of the Triumph of the Revolution in Cuba
-01/01 Castro expells Cuban President Batista, 1959
+01/01 Castro expels Cuban President Batista, 1959
01/01 Churchill delivers his "Iron Curtain" speech, 1947
01/01 First Rose Bowl; Michigan 49 - Stanford 0, 1902
01/04 Quadrantid meteor shower (look north)
02/01 First TV soap: Secret Storm, 1954
02/01 Forces lead by Khomeini take over Iran, 1979
02/04 Cybernet inaugurated, 1969
-02/04 Patricia Hearst kidnapped by Symbionese Liberation Army, 1974
+02/04 Patricia Hearst kidnaped by Symbionese Liberation Army, 1974
02/07 Fellowship leaves Lorien (LOTR)
02/08 1963 Revolution Anniversary in Iraq
02/09 -51 degrees F, Vanderbilt MI, 1934
04/21 Lyrid meteor shower
04/23 Crowning of King Ellesar (LOTR)
04/23 Hank Aaron hits his first home run, 1954
-04/26 William Shakespeare baptised in Stratford-on-Avon, England, 1564,
+04/26 William Shakespeare baptized in Stratford-on-Avon, England, 1564,
birthdate unknown
-04/27 Magellan killed in Phillippines, 1521
+04/27 Magellan killed in Philippines, 1521
04/29 Zipper patented by Gideon Sindback, 1913
05/01 Beltaine; Feast of the god Bel, sun god
05/03 Anti-war protest disrupts business in Washington, 1971
05/30 US Marines sent to Nicaragua, 1912
06/02 Native Americans "granted" citizenship, 1924
06/04 Roquefort cheese developed, 1070
-06/05 Robert Kennedy assasinated, 1968
+06/05 Robert Kennedy assassinated, 1968
06/05 US leaves the Gold Standard, 1933
06/06 First drive-in movie, 1933
06/06 Normandy landing, 1944
08/13 Li'l Abner debut, 1934
08/14 Social Security begins in U.S., 1935
08/15 Gandhi's movement obtains independence for Pakistan and India, 1947
-08/15 Hurricane hits Plimoth Plantation, 1635
+08/15 Hurricane hits Plymouth Plantation, 1635
08/16 Roller Coaster patented, 1898
08/17 First public bath opened in N.Y., 1891
08/18 Anti-Cigarette League of America formed
09/20 The Roxy Theater opens in Hollywood, 1973
09/22 Allied forces form the independent nation West Germany, 1953
09/22 President Lincoln issues the Emancipation Proclamation, 1862
-09/22 Special prosecutor Leon Jeworski subpoenaes President Nixon, 1974
+09/22 Special prosecutor Leon Jeworski subpoenas President Nixon, 1974
09/22 The first Soviet atomic bomb explodes, 1949
-09/23 Phillippine President Ferdinand Marcos declares martial law, 1972
+09/23 Philippine President Ferdinand Marcos declares martial law, 1972
09/23 The New York Knickerbockers becomes the first U.S. Baseball club, 1845
09/23 V.P. Nixon denies campaign fund fraud with his "Checkers" speech, 1952
09/25 Sandra Day O'Connor becomes first woman on US Supreme Court, 1981
10/16 Boromir reaches Rivendell (LOTR)
10/17 Council of Elrond (LOTR)
10/18 Boston Shoemakers form first U.S. labor org., 1648
-10/18 Soviets anounce their probe took photos of the Moon's far side, 1959
+10/18 Soviets announce their probe took photos of the Moon's far side, 1959
10/19 Mao Tse-tung establishes the People's Republic of China, 1949
10/19 Napoleon's beaten army begins the long retreat from Moscow, 1812
10/20 "Saturday Night Massacre", 1973
10/29 Stock Market Crash, 1929
10/30 Orson Welles' "War of the Worlds" broadcast, 1938
10/31 Luther nails 95 Theses to door of Castle Church, Wittenberg, 1517
-11/01 Austria-Hungary become two seperate nations, 1918
+11/01 Austria-Hungary become two separate nations, 1918
11/01 Puerto Rican nationalists try to kill Truman at the Blair House, 1950
11/02 Luftwaffe completes 57 consecutive nights of bombing of London, 1940
11/02 Two Frenchmen make the first free hot air balloon flight, 1783
11/03 Beef rises to 3 cents a pound, IL, 1837
11/03 Linus Pauling wins Nobel Chemistry Prize, 1954
-11/03 Sputnik II launched, 1957, bearing spacedog Laika
+11/03 Sputnik II launched, 1957, bearing space dog Laika
11/04 Iranian militants seize US embassy personnel in Teheran, 1979
11/04 Soviet forces crush the anti-communist revolt in Hungary, 1956
11/05 Guy Fawkes' Plot, 1605
11/09 Jack the Ripper kills fifth and final victim, Jane Kelly, 1888
11/09 Margaret Sanger forms American Birth Control League, 1921
11/09 Roosevelt establishes the Civil Works Administration, 1933
-11/10 41 Women arrested in suffragette demonstartions near White House, 1917
+11/10 41 Women arrested in suffragette demonstrations near White House, 1917
11/10 Cpt. Wirz, commandant of Andersonville Prison hanged, 1865
11/10 Henry Stanley asks David Livingston, "Dr. Livingston, I presume?", 1871
11/11 Washington becomes the 42nd state, 1889
12/30 First Los Angeles freeway dedicated, 1940
12/31 St. Sylvester in Switzerland
12/31 Winterland closes its doors, 1978
+
+#endif /* !_calendar_history_ */
+/*
+ * Holiday
+ *
+ * $OpenBSD: calendar.holiday,v 1.4 1996/12/05 06:04:48 millert Exp $
+ */
+
+#ifndef _calendar_holiday_
+#define _calendar_holiday_
+
01/01 Independence Day in Haiti, Sudan
01/01 Universal Fraternity Day in Mozambique
01/02 Ancestry Day in Haiti
01/19 Nameday of Archbishop Makarios in Cyprus
01/20 Army Day in Mali
01/20 National Heroes Day in Guinea-Bissau
-01/20* Lee-Jackson Day in Virginia (3rd Monday)
-01/20* Martin Luther King Day in New York (3rd Sunday)
-01/20* Robert E. Lee's Birthday in Alabama & Mississippi (3rd Monday)
+01/SunThird Martin Luther King Day in New York (3rd Sunday)
+01/MonThird Robert E. Lee's Birthday in Alabama & Mississippi (3rd Monday)
+01/MonThird Lee-Jackson Day in Virginia (3rd Monday)
01/21 Our Lady of Altagracia in Dominican Republic
-01/21* Lee-Jackson Day in Virginia (3rd Monday)
01/23 Feast of St. Ildefonsus
01/23 National Handwriting Day
01/24 Economic Liberation Day in Togo
03/12 Moshoeshoe's Birthday in Lesotho
03/12 Renovation Day in Gabon
03/13 National Day in Grenada
-03/15 Day of the 1848 revolution in Hungary
03/16 Black Press Day; first Black newspaper founded in 1827
03/17 Evacuation Day in Suffolk County, Massachusetts
03/17 St. Patrick's Day
03/25 Lady Day (a.k.a. the Feast of the Annunciation)
03/25 Maryland Day in Maryland
03/25 National Holiday in Greece
-03/25* Seward's Day in Alaska (last Monday)
+03/MonLast Seward's Day in Alaska (last Monday)
03/26 Independence Day in Bangladesh
03/26 Prince Jonah Kuhio Kalanianaole Day in Hawaii
03/27 Armed Forces Day in Burma
04/02 Malvinas Day in Argentina
04/02 Pascua Florida Day in Florida
04/04 Ching Ming Festival in Hong Kong
+04/04 Liberation Day in Hungary
04/04 National Day in Senegal
04/05 Arbor Day in South Korea
04/05 Tomb Sweeping Day in Taiwan
04/13 Songkron Day in Thailand
04/14 Day of the Americas in Honduras
04/15 Bengali New Year in Bangladesh
-04/15* Patriot's Day in Maine & Massachusetts (3rd Monday)
+04/MonThird Patriot's Day in Maine & Massachusetts (3rd Monday)
04/16 De Diego's Birthday (celebrated in Puerto Rico)
04/16 Holy Week (5 days) in Venezuela
04/16 Tourist Week (5 days) in Uruguay
04/26 Confederate Memorial Day in Florida & Georgia
04/26 Union Day in Tanzania
04/27 Independence Day in Togo
-04/28* Arbor Day in Wyoming (last Monday)
-04/28* Confederate Memorial Day in Alabama & Mississippi (last Monday)
+04/MonLast Arbor Day in Wyoming (last Monday)
+04/MonLast Confederate Memorial Day in Alabama & Mississippi (last Monday)
04/30 The Workers Day in Uruguay
05/01 Labor Day in many places
05/01 Law Day (decl. by Eisenhower)
05/09 Liberation Day in Czechoslovakia
05/09 Victory Day in Poland, U.S.S.R.
05/10 Confederate Memorial Day in South Carolina
-05/10 Mothers Day in Guatamala
+05/10 Mothers Day in Guatemala
05/11 Minnesota Day in Minnesota
05/14 Buddhist Holiday (Waisak 2528) in Indonesia
05/14 Independence Day (2 days) in Paraguay
05/18 Flag Day in Haiti
05/18 Prayer Day in Denmark
05/19 Youth and Sports Day in Turkey
-05/19* Memorial Day in Michigan (3rd Monday)
+05/MonThird Memorial Day in Michigan (3rd Monday)
05/20 Mecklenburg Independence Day in North Carolina
05/20 National Day in Cameroon
05/20 Victoria Day in Canada
-05/20* Memorial Day in Michigan (3rd Monday)
05/22 National Heroes Day in Sri Lanka
05/23 Commonwealth Day in Jamaica, Belize
05/23 National Labor Day in Jamaica
07/09 Independence Day in Argentina
07/10 Independence Day in Bahamas
07/11 National Holiday in the Mongolian People's Republic
-07/14 Bastille Day, anniversary of French revolution, 1789
+07/14 Bastille Day
07/14 National Holiday in Monaco
07/15 St. Swithin's Day
-07/16 Presidents Day in Botswanna
+07/16 Presidents Day in Botswana
07/17 Constitution Day in South Korea
-07/17 Public Holiday in Botswanna
+07/17 Public Holiday in Botswana
07/18 Constitution Day in Uruguay
07/18 Liberation Day in Nicaragua
07/19 Martyrs Day in Burma
07/20 Independence Day in Colombia
07/21 National Holiday in Belgium
07/22 National Day in Poland
-07/23 Eqyptian National Day in Syrian Arab Republic
+07/23 Egyptian National Day in Syrian Arab Republic
07/23 Remembrance Day in Papua, New Guinea
07/24 Pioneer Day in Utah
07/24 Simon Bolivar's Day in Ecuador, Venezuela
08/15 Independence Day in India
08/15 Liberation Day in South Korea
08/15 National Day in Congo
-08/15* Admission Day in Hawaii, 1984 (3rd Friday)
+08/FriThird Admission Day in Hawaii, 1984 (3rd Friday)
08/16 Bennington Battle Day in Vermont
08/16 Independence Days (3 days) in Gabon
08/16 Restoration Day in Dominican Republic
08/17 Independence Day in Indonesia
08/19 Independence Day in Afghanistan
-08/20 Constitution Day in Hungary and birthday of King St. Istvan
+08/20 Constitution Day in Hungary
08/23 Liberation Days (2 days) in Romania
08/24 National Flag Day in Liberia
08/25 Constitution Day in Paragual
08/25 Independence Day in Uruguay
-08/26 Susan B. Anthony Day in Massachussetts
+08/26 Susan B. Anthony Day in Massachusetts
08/26* Bank Holiday in England and Wales
08/27 Liberation Day in Hong Kong
08/28 Heroes Day in Philippines
09/24 Republic Day in Trinidad, Tobago
09/25 Army Day in Mozambique
09/25 Referendum Day in Rwanda
-09/26 National Day in Maldives, Yemem Deomcratic Republic
-09/26 Revoluation Anniversary Day in Yemen Arab
-09/28 Confucious' Day in Taiwan
-09/30 Botswanna Day in Botswanna
+09/26 National Day in Maldives, Yemem Democratic Republic
+09/26 Revolution Anniversary Day in Yemen Arab
+09/28 Confucius' Day in Taiwan
+09/30 Botswana Day in Botswana
09/30 First Day of Sukkot
10/01 Armed Forces Day in South Korea
10/01 Independence Day in Nigeria
10/01 Labor Day in Australia
10/01 National Liberation Day (2 days) in China
-10/01 Public Holiday in Botswanna
+10/01 Public Holiday in Botswana
10/03 National Foundation Day in South Korea
10/03 U.N. Day in Varbados
-10/03 Day of German union
10/04 Independence Day in Lesotho
10/06 National Sports Day in Lesotho
10/07 National Heroes Day in Jamaica
10/12 Our Lady Aparecida Day in Brazil
10/12 Pan American Day in Belize
10/13 St. Edward's Day - Patron saint of England
-10/14 National Day in Yemen Arab Repyblic
+10/14 National Day in Yemen Arab Republic
10/14 Young People's Day in Zaire
10/14* Thanksgiving Day in Canada
10/15 Evacuation Day in Tunisia
10/20 Kenyatta Day in Kenya
10/21 Armed Forces Day in Honduras
10/21 Revolution Days (2 days) in Somalia
-10/23 Chulalongkron's Day in Thsailand
-10/23 Day of the 1956 revolution in Hungary
+10/23 Chulalongkron's Day in Thailand
10/24 Independence Day in Zambia
10/24 United Nations Day
10/25 Labor Day in New Zealand
11/04 Will Rogers Day
11/06 Green March Day in Morocco
11/07 National Revolution Day
+11/07 October Revolution Day in Hungary
11/11 Independence Day in Angola
-11/11 Rememberance Day in Canada
+11/11 Remembrance Day in Canada
11/11 Republic Day in Maldives
11/15 Dynasty Day in Belgium
11/17 Army Day in Zaire
11/29 Goodwill Day in Liberia
11/29 Liberation Day in Albania
11/29 National Day in Burma
-11/30 Independence Day in Barbados, Yemen Deomcratic Republic
+11/30 Independence Day in Barbados, Yemen Democratic Republic
11/30 National Day in Benin
11/30 National Heroes Day in Philippines
11/30 St. Andrew's Day
12/16 Constitution Day in Nepal
12/16 Day of the Covenant in South Africa
12/16 National Day in Bahrain
-12/16 Victry Day in Bangladesh
+12/16 Victory Day in Bangladesh
12/17 National Day in Bhutan
12/18 Republic Day in Niger
12/23 Victory Day in Egypt
05/05 Battle of Puebla in Mexico
05/08 Buddha's Birthday in South Korea
05/08 Elections for the National Assembly in Philippines
-05/14 Anniversary of the Founding of Guinean Deomcratic Party in Guinea
+05/14 Anniversary of the Founding of Guinean Democratic Party in Guinea
05/25 Anniversary of the Revolution of 1810 in Argentina
05/25 Revolution in the Sudan in Libyan Arab Republic
05/27 Afghanistan attains sovereignty, 1921
06/02 Corpus Christi in Paraguay
-06/03 Jefferson Davis's Birthday in Alabama & Mississippi (1st Monday)
-06/03 Jefferson Davis's Birthday in Florida, Georgia, & S. Carolina
+06/MonFirst Jefferson Davis's Birthday in Alabama & Mississippi (1st Monday)
+06/MonFirst Jefferson Davis's Birthday in Florida, Georgia, & S. Carolina
06/04 Queen's Birthday in New Zealand
06/06 His Majesty, Yang Di-Pertuan Agong's Birthday in Malaysia
06/11 Queen's Birthday
08/17 Anniversary of the Death of General San Martin in Argentina
09/09 Anniversary of the Socialist Revolution (2 days) in Bulgaria
09/10 Moon Festival in Taiwan
-09/11 Aniversary of military coup in Chile
+09/11 Anniversary of military coup in Chile
09/11 Ethiopian New Year in Ethiopia
09/12 Amilcar Cabral's Birthday in Guinea-Bissau
09/14 Battle of San Jacinto in Nicaragua
12/29 His Majesty, the King's Birthday in Nepal
12/30 Anniversary of the Democratic Republic of Madagascar in Madagascar
12/31 Proclamation of the Republic in Congo
+
+#endif /* !_calendar_holiday_ */
+/*
+ * Judaic
+ *
+ * $OpenBSD: calendar.judaic,v 1.2 1996/12/05 06:04:49 millert Exp $
+ */
+
+#ifndef _calendar_judaic_
+#define _calendar_judaic_
+
03/08* Fast of Esther (Battle of Purim; 1 day before Purim; fast day)
03/11* Purim (Feast of Lots; 30 days before Pesach)
03/12* Purim (Feast of Lots)
10/12* Shmini Atzeres/Simchas Torah (Rejoicing of the Law; sabbatical)
12/12* First Day of Chanukah
12/27* Fast of Asara B'Tevet (Babylonians put siege on Jerusalem; fast day)
+
+#endif /* !_calendar_judaic_ */
+/*
+ * Music
+ *
+ * $OpenBSD: calendar.music,v 1.2 1996/12/05 06:04:50 millert Exp $
+ */
+
+#ifndef _calendar_music_
+#define _calendar_music_
+
01/01 Country Joe McDonald is born in El Monte, California, 1942
01/03 Steven Stills is born in Dallas, 1945
01/04 Jazz great Charlie Mingus dies at 57 in Cuernavaca, Mexico, 1979
01/08 David Bowie (then David Robert Jones) is born in London, 1947
01/09 James Patrick Page (Led Zeppelin) is born in Middlesex, England, 1945
01/10 Blues guitarist Howlin' Wolf dies in Chicago, 1976
-01/10 Jim Croce is born in Phildelphia, 1943
+01/10 Jim Croce is born in Philadelphia, 1943
01/10 Pat Benatar is born in Long Island, 1952
01/10 Rod Stewart is born in Glasgow, Scotland, 1945
01/13 Eric Clapton plays the "Rainbow Concert" in London, 1973
07/14 Woodie Guthrie born, 1912
07/16 Cream forms in the U.K., 1966
07/16 Harry Chapin dies on Long Island Expressway, 1981
-07/17 "Yellow Submarine" premieres at the London Pavilon, 1968
+07/17 "Yellow Submarine" premieres at the London Pavilion, 1968
07/20 Carlos Santana is born in Autlan, Mexico, 1947
07/25 Bob Dylan goes electric at the Newport Folk Festival, 1965
07/25 Crosby, Stills, Nash & Young debut at the Fillmore East, 1969
12/23 First G&S collaboration, Thespis, 1871
12/28 Edgar Winter is born in Beaumont, Texas, 1946
12/31 Jimi Hendrix introduces the Band of Gypsies at the Fillmore East, 1969
+
+#endif /* !_calendar_music_ */
--- /dev/null
+/*
+ * Russian calendar files
+ *
+ * $OpenBSD: calendar.russian,v 1.1 1996/12/05 06:04:50 millert Exp $
+ */
+
+#ifndef _calendar_russian_
+#define _calendar_russian_
+
+#include <ru_SU.KOI8-R/calendar.all>
+
+#endif /* !_calendar_russian_ */
+/*
+ * USA holiday
+ *
+ * $OpenBSD: calendar.usholiday,v 1.2 1996/12/05 06:04:51 millert Exp $
+ */
+
+#ifndef _calendar_usholiday_
+#define _calendar_usholiday_
+
01/01 New Year's Day
01/14 Julian Calendar New Year's Day
02/02 Groundhog Day
02/14 St. Valentine's Day
-02/20* President's Day (3rd Monday of February)
+02/MonThird President's Day (3rd Monday of February)
03/05 Mother-in-Law Day
03/17 St. Patrick's Day
03/20* Vernal Equinox
04/01 April Fool's Day
04/15 Income Tax Day
-04/03* Daylight Savings Time begins; clocks move forward (1st Sunday of April)
+04/SunFirst Daylight Savings Time begins; clocks move forward (1st Sunday of April)
04/28* Arbor Day (varies from state to state)
-05/14* Mother's Day (2nd Sunday of May)
-05/20* Armed Forces Day (3rd Saturday of May)
-05/29* Memorial Day (Last Monday of May)
-06/18* Father's Day (3rd Sunday of June)
+05/SunSecond Mother's Day (2nd Sunday of May)
+05/SatThird Armed Forces Day (3rd Saturday of May)
+05/MonLast Memorial Day (Last Monday of May)
+06/SunThird Father's Day (3rd Sunday of June)
06/21* Summer Solstice
07/04 Independence Day
-09/04* Labor Day (1st Monday of September)
-09/09* Grandparent's Day (2nd Sunday of September; varies from state to state)
+09/MonFirst Labor Day (1st Monday of September)
+09/SunSecond Grandparent's Day (2nd Sunday of September; varies from state to state)
09/22* Autumnal Equinox
-10/09* Columbus Day (2nd Monday of October)
-10/29* Daylight Savings Time ends; clocks move back (Last Sunday in October)
+10/MonSecond Columbus Day (2nd Monday of October)
+10/SunLast Daylight Savings Time ends; clocks move back (Last Sunday in October)
10/31 All Hallows Eve (Halloween)
-11/06* Election Day (1st Tuesday after 1st Monday for even years)
+11/05* Election Day (1st Tuesday after 1st Monday for even years)
11/11 Veterans' Day
-11/29 Thanksgiving Day (Last Thursday in November)
+11/ThuFourth Thanksgiving Day (4th Thursday in November)
12/21* Winter Solstice
12/24 Christmas Eve
12/25 Christmas
12/31 New Year's Eve
+
+#endif /* !_calendar_usholiday_ */
--- /dev/null
+/*
+ * World wide calendar files, except national calendars
+ *
+ * $OpenBSD: calendar.world,v 1.1 1996/12/05 06:04:51 millert Exp $
+ */
+
+#ifndef _calendar_world_
+#define _calendar_world_
+
+#include <calendar.birthday>
+#include <calendar.christian>
+#include <calendar.computer>
+#include <calendar.history>
+#include <calendar.holiday>
+#include <calendar.judaic>
+#include <calendar.music>
+
+#endif /* !_calendar_world_ */
--- /dev/null
+/*
+ * deutscher Kalender
+ *
+ * $OpenBSD: calendar.all,v 1.1 1996/12/05 06:04:52 millert Exp $
+ */
+
+#ifndef _de_DE_ISO_8859_1_all_
+#define _de_DE_ISO_8859_1_all_
+
+#include <de_DE.ISO_8859-1/calendar.feiertag>
+#include <de_DE.ISO_8859-1/calendar.geschichte>
+#include <de_DE.ISO_8859-1/calendar.kirche>
+#include <de_DE.ISO_8859-1/calendar.literatur>
+#include <de_DE.ISO_8859-1/calendar.musik>
+#include <de_DE.ISO_8859-1/calendar.wissenschaft>
+
+#endif /* !_de_DE.ISO_8859-1_all_ */
--- /dev/null
+/*
+ * Feiertage
+ *
+ * $OpenBSD: calendar.feiertag,v 1.1 1996/12/05 06:04:53 millert Exp $
+ */
+
+#ifndef _de_DE_ISO_8859_1_feiertag_
+#define _de_DE_ISO_8859_1_feiertag_
+
+LANG=de_DE.ISO_8859-1
+
+/* arbeitsfreie staatliche Feiertage */
+01/01 Neujahr
+05/01 Maifeiertag
+10/03 Tag der deutschen Einheit
+
+/* arbeitsfreie christliche Feiertage */
+Easter-2 Karfreitag
+Easter Ostersonntag
+Easter+1 Ostermontag
+Easter+49 Pfingstsonntag
+Easter+50 Pfingstmontag
+Easter+39 Christi Himmelfahrt
+
+/* Gedenktage - nicht arbeitsfreie Feiertage :-( */
+06/17 Arbeiteraufstand am 17. Juni 1953
+/* ??/?? Befreiung des KZs Auschwitz */
+
+/* Jahreszeiten */
+03/21* Frühlingsanfang
+06/21* Sommeranfang
+09/21* Herbstanfang
+12/21* Winteranfang
+
+/* Sommer- und Winterzeit */
+03/SundayLast Anfang der Sommerzeit
+10/SundayLast Ende der Sommerzeit
+
+/* Blumenverkäufer */
+May Sun+2 Muttertag
+
+#endif /*! _de_DE_ISO_8859_1_feiertag_ */
--- /dev/null
+/*
+ * deutsche Geschichte
+ *
+ *
+ * Die Angaben wurden überwiegend entnommen aus dem Buch:
+ *
+ * Fragen an die deutsch Geschichte, Ideen, Kräfte, Entscheidungen von
+ * 1800 bis zur Gegenwart; historische Ausstellung im Reichstagsgebäude
+ * in Berlin; Katalog, 16. Auflage, Sonderausgabe - Bonn: Deutscher
+ * Bundestag, Referat Öffentlichkeitsarbeit, 1990
+ *
+ * English Title: Question on German history
+ *
+ * ISBN 3-924521-59-X
+ *
+ * $OpenBSD: calendar.geschichte,v 1.1 1996/12/05 06:04:53 millert Exp $
+ */
+
+#ifndef _de_DE_ISO_8859_1_geschichte_
+#define _de_DE_ISO_8859_1_geschichte_
+
+LANG=de_DE.ISO_8859-1
+
+/* 1800-1933 */
+07/11 Gründung der Rheinbundes, 1806
+10/14 Doppelschlacht bei Jena und Auerstedt, 1806
+10/16 Völkerschlacht bei Leipzig, 1813
+06/18 Niederlage Napoleons bei Waterloo, 1815
+10/18 Wartburgfest der Deutschen Burschenschaften, 1817
+01/01 Inkrafttreten des Vertrages über den deutschen. Zollverein, 1834
+12/07 erste deutsche Eisenbahn zwischen Nürnberg und Fürth, 1835
+06 Aufstand der schlesischen Weber, 1844
+12/21 Verabschiedung des Gesetzes über die Grundrechte des deutschen
+ Volkes durch die Frankfurter Nationalversammlung, 1848
+03/27 Annahme der deutschen Reichsverfassung in der Frankfurter
+ Paulskirche, Wahl von Friedrich Wilhelm IV von Preußen zum
+ deutschen Kaiser, 1849
+04/28 Ablehnung der deutschen Kaiserkrone durch den preußichen König, 1849
+07/03 Schlacht von Königgrätz
+07/13 Emser Depesche, 1870
+07/18 Verkündung des Dogmas von der päpstlichen Unfehlbarkeit
+ durch das I. Vatikanische Konzil
+01/18 Proklamation des deutschen Kaiserreiches in Versailles, 1871
+10/18 Verabschiedung des Sozialistengesetzes durch den Reichstag, 1878
+03/20 Entlassung von Bismarck als Reichskanzler und
+ preußischer Ministerpräsident, 1890
+06/21 Eröffnung des Nord-Ostsee-Kanals, 1895
+01/07 Billigung des Bürgerlichen Gesetzbuches (BGB) durch den Reichstag, 1896
+01/01 Bürgerliches Gesetzbuches tritt in Kraft, 1900
+06/28 Ermordung des österreichischen Thronfolgers Erzherzog Franz
+ Ferdinand durch serbische Nationalisten in Sarajewo, 1914
+07/28 Kriegserklärung Österreich-Ungarns an Serbien, 1914
+08/01 Deutsche Mobilmachung und Kriegserklärung an Rußland, 1914
+08/03 Deutsche Kriegserklärung an Frankreich, 1914
+08/04 Kriegserklärung Großbritaniens an Deutschland, 1914
+08/04 Bewilligung der Kriegskredite im Reichstag, 1914
+08/26 Schlacht bei Tannenberg, 1914
+02/21 Schlacht um Verdun, 1916
+03/08 Ausbruch der Revolution in Rußland, Abdankung von Zar Nikolaus II, 1917
+04/06 Kriegserklärung der USA an Deutschland
+12/15 Waffenstillstand zwisch Rußland und Deutschland, 1917
+03/03 Frieden von Brest-Litowsk, 1918
+11/03 Matrosenaufstand in Kiel, 1918
+11/09 Ausrufung der Republik durch Scheidemann (SPD), 1918
+02/11 Friedrich Ebert wird Reichspräsident, Weimar 1919
+06/28 Unterzeichnung des Versailler Vertrages, 1919
+03/21 Volksabstimmung in Oberschlesien, 1921
+04/16 Vertrag von Rapallo, 1922
+06/24 Ermordung von Reichsaußenminister Rathenau, 1922
+01/11 Besetzung des Ruhrgebietes durch Frankreich+Belgien, 1923
+09/10 Eintritt Deutschlands in den Völkerbund, 1926
+10/25 Schwarzer Freitag in New York, Beginn der Weltwirtschaftskrise, 1929
+
+
+/* II. Weltkrieg */
+10/14 Austritt auf dem Völkerbund, 1933
+03/16 Wiedereinführung der allgemeinen Wehrpflicht, 1935
+10/25 Deutsch-italienischer Vertrag, Achse Berlin-Rom, 1936
+11/25 Antikominternpakt zwischen Deutschland und Japan, 1936
+01/13 Volksabstimmung im Saargebiet über die Rückführung ins Reich, 1935
+03/12 Einmarsch deutscher Truppen in Österreich, 1938
+09/29 Münchner Abkommen, 1938
+03/15 Einmarsch deutscher Truppen in die Tschechoslowakei, 1939
+03/23 Rückgabe des Memelgebietes an Deutschland, 1939
+08/23 Abschluß des Hitler-Stalin-Paktes, 1939
+09/03 Kriegserklärung Großbritaniens und Frankreichs an Deutschland, 1939
+04/09 Besetzung Dänemarks, Invasion in Norwegen, 1940
+05/10 Deutscher Angriff auf Belgien, die Niederlande, Luxemburg
+ und Frankreich, 1940
+06/22 Angriff gegen die Sowjetunion, 1941
+12/11 Kriegserklärung Deutschlands an die USA, 1941
+01/14 Konferenz von Casablanca, 1943
+01/31 Kapitulation der 6. deutschen Armee in Stalingrad, 1943
+06/06 Alliierte Landung in Nordwestfrankreich, 1944
+02/04 Konferenz von Jalta, 4.-11.2. 1945
+04/25 Zusammentreffen von amerikanischen und sowjetischer Truppen
+ bei Torgau an der Elbe, 1945
+05/08 Bedingungslose Kapitulation von Deutschland, 1945
+07/01 Rückzug der britischen und amerikanischen Truppen aus
+ Sachsen, Thüringen und Mecklenburg, Einmarsch westlicher
+ Truppen in Berlin, 1945
+07/17 Potsdammer Konferenz, 1945
+09/01 Überfall auf Polen, Beginn des 2. Weltkrieges, 1939
+10/01 Verkündigung der Urteile im Nürnberger
+ Hauptkriegsverbrecherprozeß, 1946
+02/25 Auflösung der Landes Preußen durch den Kontrollrat, 1947
+08/06 erster Atombombenabwurf auf Hiroshima, 1945
+08/08 Atombombenabwurf auf Nagasaki, 1945
+04/19 Warschauer Ghetto Aufstand, 1943
+12/07 Japan bombardiert Pearl Harbor, 1941
+
+/* Deutschland nach dem 2. Weltkrieg */
+04/11 Attentat auf Dutschke, Studentenunruhen, 1958
+04/26 GAU in Tschernobyl
+05/05 Natobeitritt, Wiederbewaffnung, Souveränität der Bundesrepublik, 1955
+05/06 Rücktritt von Brandt, 1974
+05/16 Wahl von Schmidt (SPD) zum Bundeskanzler, 1974
+05/23 Verkündung des Grundgesetzes
+05/23 Wahl von Richard von Weizäcker zum Bundespräsidenten, 1984
+06/05 Marshallplan, 1947
+06/20 Währungsreform in den Westzonen, 1948
+06/24 Beginn der Berliner Blockade, 1948
+07/01 Wahl von Heinrich Lübke zum Bundespräsidenten, 1959
+07/01 Währungs- und Währungsunion, 1990
+08/12 deutsch-sowjetischer Gewaltverzichtsvertrag, Moskau 1970
+08/14 Wahl zum ersten deutschen Bundestag, 1949
+09/03 Vier-Mächte-Abkommen über Berlin, 1971
+09/05 Entführung und Ermordung von Arbeitgeberpräsident Schleyer, Entführung einer Lufthansa-Maschine nach Mogadischu, 1977
+09/07 DDR-Staatsratsvorsitzender Honecker in der Bundesrepublik, 1987
+09/12 Wahl von Theodor Heuss (FDP) zum Bundespräsidenten, 1949
+09/15 Wahl von Konrad Adenauer (CDU) zum Bundeskanzler, 1949
+09/17 Bruch der Sozialliberalen Koalition, 1982
+09/18 Aufnahme von Bundesrepublik und DDR in die UNO, 1993
+10/01 Ablösung von Bundeskanzler Schmidt durch Kohl, 1982
+10/23 Volksabstimmung im Saargebiet, 1955
+12/02 Washingtoner Abkommen über Bi-Zone, 1946
+12/07 deutsch-polnischer Vertrag, Warschau 1970
+12/10 Friedensnobelpreis für Brandt, 1971
+12/12 Nachrüstungsbeschluß des NATO-Ministerates, 1979
+12/21 Grundlagenvertrag zwischen DDR und Bundesrepublik, 1972
+
+
+/* Nationalsozialismus */
+11/09 Hitler-Putsch in München/Marsch auf die Feldherrenhalle, 1923
+11/09 Reichskristallnacht, 1938
+09/14 Reichstagswahl: Erdrutsch zugunsten der NSDAP, 1930
+07/31 Reichstagswahl: NSDAP wird stärkste Fraktion, 1932
+11/06 Reichstagswahl: Rückgang der NSDAP, 1932
+01/30 Ernennung von Hitler zum Reichskanzler, 1933
+02/27 Reichstagsbrand, 1933
+03/05 Reichstagswahl: Mehrheit für NSDAP+DNVP, 1933
+03/23 Annahme des Ermächtigungsgesetzes, 1933
+03/31 Erstes Gesetz zur Gleichschaltung der Länder, 1933
+04/01 Organisierter Boykott jüdischer Geschäfte, 1933
+04/07 Zweites Gesetz zur Gleichschaltung der Länder, 1933
+05/02 Auflösung der Gewerkschaften, 1933
+06 Auflösung aller Parteien außer NSDAP, 1933
+07/20 Konkordat zwischen Deutschland und dem Vatikan, 1933
+06/30 Röhm-Putsch, Ausschaltung der SA-Führung, 1934
+09/15 Nürnberger Gesetze, 1935
+01/08 Eröffnung der olympischen Spiele in Berlin, 1936
+01/20 Wannseekonferenz, 1942
+04/30 Selbstmord Hitlers, 1945
+07/29 Mussolini geboren, 1883
+
+/* Sozialismus */
+01/21 Lenin gestorben, 1924
+06 Gründung des Bundes der Kommunisten in London durch Marx+Engels, 1847
+05/23 Gründung des Allgemeinen Deutschen Arbeitervereins in Leipzig
+ unter Führung von Ferdinand Lassalles, 1863
+08/07 Gründung der Sozialdemokratischen Arbeiterpartei in Eisenach
+ unter der Führung von August Begel und Wilhelm Liebknecht, 1869
+04/06 Gründung der Unabhängigen Sozialdemokratischen Partei, Gotha 1917
+11/07 Oktoberrevolution in Rußland, Putsch der Bolschewisten, 1917
+12/31 Gründung der KPD, 1918
+01/15 Ermordung von Rosa Luxemburg und Karl Liebknecht, 1919
+03/05 Tod Stalins, 1953
+03/18 Erste demokratische Volkskammerwahl, 1990
+04/21 Zwangsvereinigung von KPD und SPD zur SED, 1946
+05/14 Gründung der Warschauer Paktes, 1955
+06/17 Arbeiteraufstand am 17. Juni 1953
+06/25 Begin der Korea-Krieges, 1950
+08/13 Bau der Berliner Mauer, 1961
+08/21 Einmarsch des Warschauer Pakts in die Tschechoslowakei, 1968
+10/03 Offizielles Ende der DDR :-)
+10/07 Gründung der DDR 1949
+10/09 Massendemonstration in Leipzig, 1989
+10/14 Kuba-Krise, 1962
+10/18 Ablösung von Erich Honecker als SED-Generalsekretär, 1989
+11/09 Fall der Berliner Mauer, 1989
+09/09 Mao Tse-Tung gestorben im Alter von 82 Jahren, 1976
+11/10 Sowjetischer Präsident Leonid Breschnew gestorben, Alter 75, 1982
+03/27 Chruschtschow wird sowjetischer Präsident, 1958
+10/12 Chruschtschow schlägt während einer Rede in der UNO mit den
+ Schuhen auf den Tisch, 1960
+
+#endif /* _de_DE_ISO_8859_1_geschichte_ */
--- /dev/null
+/*
+ * Kirche in Deutschland
+ *
+ * $OpenBSD: calendar.kirche,v 1.1 1996/12/05 06:04:54 millert Exp $
+ */
+
+#ifndef _de_DE_ISO_8859_1_kirche_
+#define _de_DE_ISO_8859_1_kirche_
+
+LANG=de_DE.ISO_8859-1
+
+Easter-46 Aschermittwoch
+Easter-48 Rosenmontag
+Easter-7 Palmsonntag
+
+11/Sun-3 Volkstrauertag (maybe)
+11/Sun-2 Volkstrauertag oder Totensonntag
+11/Sun-1 1. Advent oder Totensonntag
+12/Sun+1 1. oder 2. Advent
+12/Sun+2 2. oder 3. Advent
+12/Sun+3 3. oder 4. Advent
+12/Sun+4 4. Advent (maybe)
+
+12/06 Nikolaus
+12/25 1. Weihnachtstag
+12/26 2. Weihnachtstag
+
+/* Evangelische Kirche */
+11/10 Martin Luther geboren in Eisleben, 1483
+10/31 95 Thesen von Luther, Wittenberg, 1517
+
+#endif /* !_de_DE_ISO_8859_1_kirche_ */
--- /dev/null
+/*
+ * Literatur
+ *
+ * $OpenBSD: calendar.literatur,v 1.1 1996/12/05 06:04:54 millert Exp $
+ */
+
+#ifndef _de_DE_ISO_8859_1_literatur_
+#define _de_DE_ISO_8859_1_literatur_
+
+LANG=de_DE.ISO_8859-1
+
+/* Schriftsteller
+
+ Fontane
+ Goethe
+ Grass
+ Hegel
+ Heine
+ Schiller
+ */
+
+01/04 Jakob Grimm geboren, 1785
+04/22 Kant geboren, 1724
+07/03 Franz Kafka geboren, 1883
+08/12 Thomas Mann gestorben, 1955
+
+
+/* Verlage */
+03/09 "die tageszeitung" als erste täglich aktualisierte deutsche
+ Tageszeitung im WWW, 1995, Betatest, vollständige Ausgabe
+05/05 Schweriner Volkszeitung als erste deutsche Tageszeitung im WWW, 1995
+05/12 "die tageszeitung" offiziell im WWW, 1995
+08/31 Hitler stellt Frankfurter Zeitung ein, 1943
+11/01 Frankfurter Allgemeine Zeitung in Leben gerufen, 1949
+
+#endif /* !_de_DE_ISO_8859_1_literatur_ */
--- /dev/null
+/*
+ * Musik
+ *
+ * $OpenBSD: calendar.musik,v 1.1 1996/12/05 06:04:55 millert Exp $
+ */
+
+#ifndef _de_DE_ISO_8859_1_musik_
+#define _de_DE_ISO_8859_1_musik_
+
+LANG=de_DE.ISO_8859-1
+
+/* Klassik */
+02/23 Händel geboren, 1685
+03/21 J.S. Bach geboren, 1685
+05/07 Johannes Brahms geboren in Hamburg, 1833
+05/22 Johann Sebastian Bach geboren in Eisenach, 1665
+07/28 Bach gestorben, 1750
+10/22 Franz Liszt geboren, 1811
+12/05 Mozart gestorben, 1791
+12/16 Beethoven gestorben, 1770
+
+/* Pop */
+09/18 Jimi Hendrix gestorben
+
+#endif /* !_de_DE_ISO_8859_1_musik_ */
--- /dev/null
+/*
+ * Wissenschaft
+ *
+ * $OpenBSD: calendar.wissenschaft,v 1.1 1996/12/05 06:04:55 millert Exp $
+ */
+
+#ifndef _de_DE_ISO_8859_1_wissenschaft_
+#define _de_DE_ISO_8859_1_wissenschaft_
+
+LANG=de_DE.ISO_8859-1
+
+04/12 erster Mann im All, Juri Gagarin, 1961
+04/18 Einstein gestorben, 1955
+06/22 Konrad Zuse geboren, 1919, Berlin
+10/04 Sputnik 1, erster Satellit im Weltraum, 1957
+12/18 Konrad Zuse gestorben, 1995, Hünfeld
+
+
+#endif /* ! _de_DE_ISO_8859_1_wissenschaft_ */
--- /dev/null
+/*
+ * hrvatski calendar
+ *
+ * $OpenBSD: calendar.all,v 1.1 1996/12/05 06:04:56 millert Exp $
+ */
+
+#ifndef _hr_HR_ISO_8859_2_all
+#define _hr_HR_ISO_8859_2_all
+
+#include <hr_HR.ISO_8859-2/calendar.praznici>
+
+#endif /* !_hr_HR_ISO_8859_2_all */
--- /dev/null
+/*
+ * hrvatski praznici
+ *
+ * $OpenBSD: calendar.praznici,v 1.1 1996/12/05 06:04:57 millert Exp $
+ */
+
+#ifndef _hr_HR_ISO_8859_2_praznici
+#define _hr_HR_ISO_8859_2_praznici
+
+LANG=hr_HR.ISO_8859-2
+
+/* slobodni dr¾avni praznici */
+01/01 Nova godina
+05/01 Prvi maj
+
+
+/* slobodni kr¹æanski praznici */
+Easter-2 Veliki petak
+Easter Uskrs
+Easter+1 Uskrsni ponedjeljak
+Easter+49 Duhovi
+Easter+50 Duhovni ponedjeljak
+Easter+39 Uza¹a¹æe
+12/25 Bo¾iæ
+12/26 Stjepandan
+
+/* godi¹nja doba */
+03/21* Poèetak proljeæa
+06/21* Poèetak ljeta
+09/21* Poèetak jesena
+12/21* Poèetak zime
+
+/* ljetno vrijeme */
+03/SundayLast Poèetak ljetnog vremena
+10/SundayLast Kraj ljetnog vremena
+
+#endif /* !_hr_HR_ISO_8859_2_praznici */
--- /dev/null
+/*
+ * òÕÓÓËÉÊ ËÁÌÅÎÄÁÒØ
+ *
+ * $OpenBSD: calendar.all,v 1.1 1996/12/05 06:04:58 millert Exp $
+ */
+
+#ifndef _ru_SU_KOI8_R_all
+#define _ru_SU_KOI8_R_all
+
+#include <ru_SU.KOI8-R/calendar.common>
+#include <ru_SU.KOI8-R/calendar.msk>
+#include <ru_SU.KOI8-R/calendar.pagan>
+#include <ru_SU.KOI8-R/calendar.orthodox>
+
+#endif /* !_ru_SU_KOI8_R_all */
--- /dev/null
+/*
+ * òÕÓÓËÉÅ ÐÒÁÚÄÎÉËÉ
+ *
+ * $OpenBSD: calendar.common,v 1.1 1996/12/05 06:04:59 millert Exp $
+ */
+
+#ifndef _ru_SU_KOI8_R_common_
+#define _ru_SU_KOI8_R_common_
+
+LANG=ru_SU.KOI8-R
+
+ 1 ÑÎ× îÏ×ÙÊ çÏÄ
+14 ÑÎ× óÔÁÒÙÊ îÏ×ÙÊ çÏÄ
+23 ÆÅ× äÅÎØ ÷ÏÏÒÕÖ£ÎÎÙÈ óÉÌ
+ 8 ÍÁÒ íÅÖÄÕÎÁÒÏÄÎÙÊ öÅÎÓËÉÊ äÅÎØ
+ 1 ÁÐÒ äÅÎØ ûÕÔÏË
+ 1 ÍÁÊ íÅÖÄÕÎÁÒÏÄÎÙÊ äÅÎØ óÏÌÉÄÁÒÎÏÓÔÉ ôÒÕÄÑÝÉÈÓÑ
+ 9 ÍÁÊ äÅÎØ ðÏÂÅÄÙ
+ 1 ÉÀÎ äÅÎØ úÁÝÉÔÙ äÅÔÅÊ
+ 1 ÓÅÎ äÅÎØ úÎÁÎÉÊ
+
+#endif /* !_ru_SU_KOI8_R_common_ */
+
--- /dev/null
+/*
+ * ðÅÒÅ×ÏÄ ÞÁÓÏ× ÄÌÑ ÍÏÓËÏ×ÓËÏÊ ×ÒÅÍÅÎÎÏÊ ÚÏÎÙ
+ *
+ * $OpenBSD: calendar.msk,v 1.1 1996/12/05 06:05:00 millert Exp $
+ */
+
+#ifndef _ru_SU_KOI8_R_msk_
+#define _ru_SU_KOI8_R_msk_
+
+LANG=ru_SU.KOI8-R
+
+03/SunLast îÁÞÁÌÏ ÍÏÓËÏ×ÓËÏÇÏ ÌÅÔÎÅÇÏ ×ÒÅÍÅÎÉ; ÞÁÓÙ ÐÅÒÅ×ÏÄÑÔÓÑ ×ÐÅÒÅÄ
+10/SunLast ëÏÎÅà ÍÏÓËÏ×ÓËÏÇÏ ÌÅÔÎÅÇÏ ×ÒÅÍÅÎÉ; ÞÁÓÙ ÐÅÒÅ×ÏÄÑÔÓÑ ÎÁÚÁÄ
+
+#endif /* !_ru_SU_KOI8_R_msk_ */
+
--- /dev/null
+/*
+ * ðÒÁ×ÏÓÌÁ×ÎÙÅ ÐÒÁÚÄÎÉËÉ
+ *
+ * $OpenBSD: calendar.orthodox,v 1.1 1996/12/05 06:05:00 millert Exp $
+ */
+
+#ifndef _ru_SU_KOI8_R_orthodox_
+#define _ru_SU_KOI8_R_orthodox_
+
+LANG=ru_SU.KOI8-R
+Paskha=ðÁÓÈÁ
+
+21 ÓÅÎ òÏÖÄÅÓÔ×Ï ðÒÅÓ×ÑÔÏÊ âÏÇÏÒÏÄÉÃÙ
+28 ÓÅÎ ÷ÏÚÄ×ÉÖÅÎÉÅ ëÒÅÓÔÁ çÏÓÐÏÄÎÑ
+14 ÏËÔ ðÏËÒÏ× ðÒÅÓ×ÑÔÏÊ âÏÇÏÒÏÄÉÃÙ
+ 4 ÄÅË ÷×ÅÄÅÎÉÅ ×Ï ÈÒÁÍ ðÒÅÓ×ÑÔÏÊ âÏÇÏÒÏÄÉÃÙ
+ 7 ÑÎ× òÏÖÄÅÓÔ×Ï èÒÉÓÔÏ×Ï
+19 ÑÎ× âÏÇÏÑ×ÌÅÎÉÅ ÉÌÉ ëÒÅÝÅÎÉÅ çÏÓÐÏÄÎÅ
+15 ÆÅ× óÒÅÔÅÎÉÅ çÏÓÐÏÄÎÅ
+ðÁÓÈÁ-46 ÷ÅÌÉËÉÊ ðÏÓÔ
+ðÁÓÈÁ-7 ÷ÅÒÂÎÏÅ ÷ÏÓËÒÅÓÅÎØÅ
+ðÁÓÈÁ-3 ÷ÅÌÉËÉÊ þÅÔ×ÅÒÇ
+ðÁÓÈÁ-2 óÔÒÁÓÔÎÁÑ ðÑÔÎÉÃÁ
+ðÁÓÈÁ ÷ÏÓËÒÅÓÅÎÉÅ èÒÉÓÔÏ×Ï
+ðÁÓÈÁ+39 ÷ÏÚÎÅÓÅÎÉÅ
+ðÁÓÈÁ+49 ðÑÔÉÄÅÓÑÔÎÉÃÁ
+ðÁÓÈÁ+56 ôÒÏÉÃÉÎ äÅÎØ
+ðÁÓÈÁ+60 ðÒÁÚÄÎÉË ôÅÌÁ èÒÉÓÔÏ×Á
+ 7 ÁÐÒ âÌÁÇÏ×ÅÝÅÎÉÅ ðÒÅÓ×ÑÔÏÊ âÏÇÏÒÏÄÉÃÙ
+19 Á×Ç ðÒÅÏÂÒÁÖÅÎÉÅ çÏÓÐÏÄÎÅ
+28 Á×Ç õÓÐÅÎÉÅ ðÒÅÓ×ÑÔÏÊ âÏÇÏÒÏÄÉÃÙ
+
+#endif /* !_ru_SU_KOI8_R_orthodox_ */
+
--- /dev/null
+/*
+ * ñÚÙÞÅÓËÉÅ ÐÒÁÚÄÎÉËÉ
+ *
+ * $OpenBSD: calendar.pagan,v 1.1 1996/12/05 06:05:01 millert Exp $
+ */
+
+#ifndef _ru_SU_KOI8_R_pagan_
+#define _ru_SU_KOI8_R_pagan_
+
+LANG=ru_SU.KOI8-R
+Paskha=ðÁÓÈÁ
+
+21 ÄÅË* úÉÍÎÅÅ ÓÏÌÎÃÅÓÔÏÑÎÉÅ
+25 ÄÅË ëÏÌÑÄÁ (ÓÄ×ÉÎÕÔÏÅ ÚÉÍÎÅÅ ÓÏÌÎÃÅÓÔÏÑÎÉÅ)
+31 ÄÅË îÅÄÅÌÑ ðÒÁÏÔÃÏ×
+ 6 ÑÎ× äÅÎØ ëÁÝÅÑ É ÷ÅÌÅÓÁ, ÐÏÓÔ
+24 ÆÅ× äÅÎØ ÷ÅÌÅÓÁ
+29 ÆÅ× äÅÎØ ëÁÝÅÑ
+ 1 ÍÁÒ äÅÎØ íÁÒÅÎÙ
+14 ÍÁÒ îÏ×ÙÊ çÏÄ, ï×ÓÅÎØ ÍÁÌÙÊ
+ðÁÓÈÁ-47 íÁÓÌÅÎÉÃÁ
+ðÁÓÈÁ+7 ëÒÁÓÎÁÑ çÏÒËÁ
+ðÁÓÈÁ+16 òÁÄÕÎÉÃÁ
+20 ÍÁÒ* ÷ÅÓÅÎÎÉÅ ÒÁ×ÎÏÄÅÎÓÔ×ÉÅ
+ 7 ÁÐÒ äÅÎØ íÁÒÅÎÙ (ÓÄ×ÉÎÕÔÏÅ ×ÅÓÅÎÎÅÅ ÒÁ×ÎÏÄÅÎÓÔ×ÉÅ)
+ 6 ÍÁÊ äÅÎØ äÁÖØÂÏÇÁ, ï×ÓÅÎØ ÂÏÌØÛÏÊ
+22 ÍÁÊ ñÒÉÌÉÎ äÅÎØ
+21 ÉÀÎ* ìÅÔÎÅÅ ÓÏÌÎÃÅÓÔÏÑÎÉÅ
+ 1 ÉÀÌ òÕÓÁÌØÎÁÑ îÅÄÅÌÑ
+ 7 ÉÀÌ ëÕÐÁÌÁ (ÓÄ×ÉÎÕÔÏÅ ÌÅÔÎÅÅ ÓÏÌÎÃÅÓÔÏÑÎÉÅ)
+27 ÉÀÌ ïÔÂÏÒ ÖÅÒÔ× ðÅÒÕÎÕ, ÒÕÓÁÌÉÉ
+ 2 Á×Ç ðÅÒÕÎÏ× äÅÎØ
+21 Á×Ç äÅÎØ óÔÒÉÂÏÇÁ
+28 Á×Ç õÓÐÅÎÉÅ úÌÁÔÏÇÏÒËÉ
+14 ÓÅÎ äÅÎØ ÷ÏÌÈÁ úÍÅÅ×ÉÞÁ
+22 ÓÅÎ* ðÏ×ÏÒÏÔ Ë ÚÉÍÅ (ÏÓÅÎÎÅÅ ÒÁ×ÎÏÄÅÎÓÔ×ÉÅ)
+10 ÎÏÑ äÅÎØ íÁËÏÛÉ
+21 ÎÏÑ äÅÎØ ó×ÁÒÏÇÁ É óÅÍÁÒÇÌÁ
+ 9 ÄÅË äÅÎØ äÁÖØÂÏÇÁ É íÁÒÅÎÙ
+
+#endif /* !_ru_SU_KOI8_R_pagan_ */
+
--- /dev/null
+/* $OpenBSD: day.c,v 1.1 1996/12/05 06:04:39 millert Exp $ */
+
+/*
+ * Copyright (c) 1989, 1993, 1994
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 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
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef lint
+static const char copyright[] =
+"@(#) Copyright (c) 1989, 1993\n\
+ The Regents of the University of California. All rights reserved.\n";
+#endif /* not lint */
+
+#ifndef lint
+#if 0
+static const char sccsid[] = "@(#)calendar.c 8.3 (Berkeley) 3/25/94";
+#else
+static char rcsid[] = "$OpenBSD: day.c,v 1.1 1996/12/05 06:04:39 millert Exp $";
+#endif
+#endif /* not lint */
+
+#include <sys/types.h>
+#include <sys/uio.h>
+
+#include <ctype.h>
+#include <err.h>
+#include <locale.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <tzfile.h>
+
+#include "pathnames.h"
+#include "calendar.h"
+
+struct tm *tp;
+int *cumdays, offset, yrdays;
+char dayname[10];
+
+
+/* 1-based month, 0-based days, cumulative */
+int daytab[][14] = {
+ { 0, -1, 30, 58, 89, 119, 150, 180, 211, 242, 272, 303, 333, 364 },
+ { 0, -1, 30, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 },
+};
+
+static char *days[] = {
+ "sun", "mon", "tue", "wed", "thu", "fri", "sat", NULL,
+};
+
+static char *months[] = {
+ "jan", "feb", "mar", "apr", "may", "jun",
+ "jul", "aug", "sep", "oct", "nov", "dec", NULL,
+};
+
+static struct fixs fndays[8]; /* full national days names */
+static struct fixs ndays[8]; /* short national days names */
+
+static struct fixs fnmonths[13]; /* full national months names */
+static struct fixs nmonths[13]; /* short national month names */
+
+
+void setnnames(void)
+{
+ char buf[80];
+ int i, l;
+ struct tm tm;
+
+ for (i = 0; i < 7; i++) {
+ tm.tm_wday = i;
+ strftime(buf, sizeof(buf), "%a", &tm);
+ for (l = strlen(buf);
+ l > 0 && isspace((int)buf[l - 1]);
+ l--)
+ ;
+ buf[l] = '\0';
+ if (ndays[i].name != NULL)
+ free(ndays[i].name);
+ if ((ndays[i].name = strdup(buf)) == NULL)
+ errx(1, "cannot allocate memory");
+ ndays[i].len = strlen(buf);
+
+ strftime(buf, sizeof(buf), "%A", &tm);
+ for (l = strlen(buf);
+ l > 0 && isspace((int)buf[l - 1]);
+ l--)
+ ;
+ buf[l] = '\0';
+ if (fndays[i].name != NULL)
+ free(fndays[i].name);
+ if ((fndays[i].name = strdup(buf)) == NULL)
+ errx(1, "cannot allocate memory");
+ fndays[i].len = strlen(buf);
+ }
+
+ for (i = 0; i < 12; i++) {
+ tm.tm_mon = i;
+ strftime(buf, sizeof(buf), "%b", &tm);
+ for (l = strlen(buf);
+ l > 0 && isspace((int)buf[l - 1]);
+ l--)
+ ;
+ buf[l] = '\0';
+ if (nmonths[i].name != NULL)
+ free(nmonths[i].name);
+ if ((nmonths[i].name = strdup(buf)) == NULL)
+ errx(1, "cannot allocate memory");
+ nmonths[i].len = strlen(buf);
+
+ strftime(buf, sizeof(buf), "%B", &tm);
+ for (l = strlen(buf);
+ l > 0 && isspace((int)buf[l - 1]);
+ l--)
+ ;
+ buf[l] = '\0';
+ if (fnmonths[i].name != NULL)
+ free(fnmonths[i].name);
+ if ((fnmonths[i].name = strdup(buf)) == NULL)
+ errx(1, "cannot allocate memory");
+ fnmonths[i].len = strlen(buf);
+ }
+}
+
+void
+settime(now)
+ time_t now;
+{
+ tp = localtime(&now);
+ if (isleap(tp->tm_year + 1900)) {
+ yrdays = DAYSPERLYEAR;
+ cumdays = daytab[1];
+ } else {
+ yrdays = DAYSPERNYEAR;
+ cumdays = daytab[0];
+ }
+ /* Friday displays Monday's events */
+ offset = tp->tm_wday == 5 ? 3 : 1;
+ header[5].iov_base = dayname;
+
+ (void) setlocale(LC_TIME, "C");
+ header[5].iov_len = strftime(dayname, sizeof(dayname), "%A", tp);
+ (void) setlocale(LC_TIME, "");
+
+ setnnames();
+}
+
+/* convert Day[/Month][/Year] into unix time (since 1970)
+ * Day: two digits, Month: two digits, Year: digits
+ */
+time_t Mktime (date)
+ char *date;
+{
+ time_t t;
+ int len;
+ struct tm tm;
+
+ (void)time(&t);
+ tp = localtime(&t);
+
+ len = strlen(date);
+ tm.tm_sec = 0;
+ tm.tm_min = 0;
+ tm.tm_hour = 0;
+ tm.tm_wday = 0;
+ tm.tm_mday = tp->tm_mday;
+ tm.tm_mon = tp->tm_mon;
+ tm.tm_year = tp->tm_year;
+
+
+ /* day */
+ *(date+2) = NULL;
+ tm.tm_mday = atoi(date);
+
+ /* month */
+ if (len >= 4) {
+ *(date+5) = NULL;
+ tm.tm_mon = atoi(date+3) - 1;
+ }
+
+ /* Year */
+ if (len >= 7) {
+ tm.tm_year = atoi(date+6);
+
+ /* tm_year up 1900 ... */
+ if (tm.tm_year > 1900)
+ tm.tm_year -= 1900;
+ }
+
+#if DEBUG
+ printf("Mktime: %d %d %d %s\n", (int)mktime(&tm), (int)t, len,
+ asctime(&tm));
+#endif
+ return(mktime(&tm));
+}
+
+/*
+ * Possible date formats include any combination of:
+ * 3-charmonth (January, Jan, Jan)
+ * 3-charweekday (Friday, Monday, mon.)
+ * numeric month or day (1, 2, 04)
+ *
+ * Any character may separate them, or they may not be separated. Any line,
+ * following a line that is matched, that starts with "whitespace", is shown
+ * along with the matched line.
+ */
+int
+isnow(endp, monthp, dayp, varp)
+ char *endp;
+ int *monthp;
+ int *dayp;
+ int *varp;
+{
+ int day, flags = 0, month = 0, v1, v2;
+
+ /*
+ * CONVENTION
+ *
+ * Month: 1-12
+ * Monthname: Jan .. Dec
+ * Day: 1-31
+ * Weekday: Mon-Sun
+ *
+ */
+
+ /* read first field */
+ /* didn't recognize anything, skip it */
+ if (!(v1 = getfield(endp, &endp, &flags)))
+ return (0);
+
+ /* Easter or Easter depending days */
+ if (flags & F_EASTER)
+ day = v1 - 1; /* days since January 1 [0-365] */
+
+ /*
+ * 1. {Weekday,Day} XYZ ...
+ *
+ * where Day is > 12
+ */
+ else if (flags & F_ISDAY || v1 > 12) {
+
+ /* found a day; day: 1-31 or weekday: 1-7 */
+ day = v1;
+
+ /* {Day,Weekday} {Month,Monthname} ... */
+ /* if no recognizable month, assume just a day alone
+ * in other words, find month or use current month */
+ if (!(month = getfield(endp, &endp, &flags)))
+ month = tp->tm_mon + 1;
+ }
+
+ /* 2. {Monthname} XYZ ... */
+ else if (flags & F_ISMONTH) {
+ month = v1;
+
+ /* Monthname {day,weekday} */
+ /* if no recognizable day, assume the first day in month */
+ if (!(day = getfield(endp, &endp, &flags)))
+ day = 1;
+ }
+
+ /* Hm ... */
+ else {
+ v2 = getfield(endp, &endp, &flags);
+
+ /*
+ * {Day} {Monthname} ...
+ * where Day <= 12
+ */
+ if (flags & F_ISMONTH) {
+ day = v1;
+ month = v2;
+ *varp = 0;
+ }
+
+ /* {Month} {Weekday,Day} ... */
+ else {
+ /* F_ISDAY set, v2 > 12, or no way to tell */
+ month = v1;
+ /* if no recognizable day, assume the first */
+ day = v2 ? v2 : 1;
+ *varp = 0;
+ }
+ }
+
+ /* convert Weekday into *next* Day,
+ * e.g.: 'Sunday' -> 22
+ * 'SunayLast' -> ??
+ */
+ if (flags & F_ISDAY) {
+#if DEBUG
+ fprintf(stderr, "\nday: %d %s month %d\n", day, endp, month);
+#endif
+
+ *varp = 1;
+ /* variable weekday, SundayLast, MondayFirst ... */
+ if (day < 0 || day >= 10) {
+
+ /* negative offset; last, -4 .. -1 */
+ if (day < 0) {
+ v1 = day/10 - 1; /* offset -4 ... -1 */
+ day = 10 + (day % 10); /* day 1 ... 7 */
+
+ /* day, eg '22th' */
+ v2 = tp->tm_mday + (((day - 1) - tp->tm_wday + 7) % 7);
+
+ /* (month length - day) / 7 + 1 */
+ if (((int)((cumdays[month+1] -
+ cumdays[month] - v2) / 7) + 1) == -v1)
+ /* bingo ! */
+ day = v2;
+
+ /* set to yesterday */
+ else
+ day = tp->tm_mday - 1;
+ }
+
+ /* first, second ... +1 ... +5 */
+ else {
+ v1 = day/10; /* offset: +1 (first Sunday) ... */
+ day = day % 10;
+
+ /* day, eg '22th' */
+ v2 = tp->tm_mday + (((day - 1) - tp->tm_wday + 7) % 7);
+
+ /* Hurrah! matched */
+ if ( ((v2 - 1 + 7) / 7) == v1 )
+ day = v2;
+
+ /* set to yesterday */
+ else
+ day = tp->tm_mday - 1;
+ }
+ }
+
+ /* wired */
+ else {
+ day = tp->tm_mday + (((day - 1) - tp->tm_wday + 7) % 7);
+ *varp = 1;
+ }
+ }
+
+ if (!(flags & F_EASTER)) {
+ *monthp = month;
+ *dayp = day;
+ day = cumdays[month] + day;
+ }
+ else {
+ for (v1 = 0; day > cumdays[v1]; v1++)
+ ;
+ *monthp = v1 - 1;
+ *dayp = day - cumdays[v1 - 1];
+ *varp = 1;
+ }
+
+#if DEBUG
+ fprintf(stderr, "day2: day %d(%d) yday %d\n", *dayp, day, tp->tm_yday);
+#endif
+ /* if today or today + offset days */
+ if (day >= tp->tm_yday - f_dayBefore &&
+ day <= tp->tm_yday + offset + f_dayAfter)
+ return (1);
+
+ /* if number of days left in this year + days to event in next year */
+ if (yrdays - tp->tm_yday + day <= offset + f_dayAfter ||
+ /* a year backward, eg. 6 Jan and 10 days before -> 27. Dec */
+ tp->tm_yday + day - f_dayBefore < 0
+ )
+ return (1);
+ return (0);
+}
+
+
+int
+getmonth(s)
+ register char *s;
+{
+ register char **p;
+ struct fixs *n;
+
+ for (n = fnmonths; n->name; ++n)
+ if (!strncasecmp(s, n->name, n->len))
+ return ((n - fnmonths) + 1);
+ for (n = nmonths; n->name; ++n)
+ if (!strncasecmp(s, n->name, n->len))
+ return ((n - nmonths) + 1);
+ for (p = months; *p; ++p)
+ if (!strncasecmp(s, *p, 3))
+ return ((p - months) + 1);
+ return (0);
+}
+
+
+int
+getday(s)
+ register char *s;
+{
+ register char **p;
+ struct fixs *n;
+
+ for (n = fndays; n->name; ++n)
+ if (!strncasecmp(s, n->name, n->len))
+ return ((n - fndays) + 1);
+ for (n = ndays; n->name; ++n)
+ if (!strncasecmp(s, n->name, n->len))
+ return ((n - ndays) + 1);
+ for (p = days; *p; ++p)
+ if (!strncasecmp(s, *p, 3))
+ return ((p - days) + 1);
+ return (0);
+}
+
+/* return offset for variable weekdays
+ * -1 -> last weekday in month
+ * +1 -> first weekday in month
+ * ... etc ...
+ */
+int
+getdayvar(s)
+ register char *s;
+{
+ register int offset;
+
+
+ offset = strlen(s);
+
+
+ /* Sun+1 or Wednesday-2
+ * ^ ^ */
+
+ /* printf ("x: %s %s %d\n", s, s + offset - 2, offset); */
+ switch(*(s + offset - 2)) {
+ case '-':
+ return(-(atoi(s + offset - 1)));
+ break;
+ case '+':
+ return(atoi(s + offset - 1));
+ break;
+ }
+
+
+ /*
+ * some aliases: last, first, second, third, fourth
+ */
+
+ /* last */
+ if (offset > 4 && !strcasecmp(s + offset - 4, "last"))
+ return(-1);
+ else if (offset > 5 && !strcasecmp(s + offset - 5, "first"))
+ return(+1);
+ else if (offset > 6 && !strcasecmp(s + offset - 6, "second"))
+ return(+2);
+ else if (offset > 5 && !strcasecmp(s + offset - 5, "third"))
+ return(+3);
+ else if (offset > 6 && !strcasecmp(s + offset - 6, "fourth"))
+ return(+4);
+
+
+ /* no offset detected */
+ return(0);
+}
--- /dev/null
+/* $OpenBSD: io.c,v 1.1 1996/12/05 06:04:40 millert Exp $ */
+
+/*
+ * Copyright (c) 1989, 1993, 1994
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 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
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef lint
+static const char copyright[] =
+"@(#) Copyright (c) 1989, 1993\n\
+ The Regents of the University of California. All rights reserved.\n";
+#endif /* not lint */
+
+#ifndef lint
+#if 0
+static const char sccsid[] = "@(#)calendar.c 8.3 (Berkeley) 3/25/94";
+#else
+static char rcsid[] = "$OpenBSD: io.c,v 1.1 1996/12/05 06:04:40 millert Exp $";
+#endif
+#endif /* not lint */
+
+#include <sys/param.h>
+#include <sys/stat.h>
+#include <sys/time.h>
+#include <sys/types.h>
+#include <sys/uio.h>
+#include <sys/wait.h>
+
+#include <ctype.h>
+#include <err.h>
+#include <errno.h>
+#include <locale.h>
+#include <pwd.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "pathnames.h"
+#include "calendar.h"
+
+
+char *calendarFile = "calendar"; /* default calendar file */
+char *calendarHome = ".calendar"; /* HOME */
+char *calendarNoMail = "nomail"; /* don't sent mail if this file exist */
+
+struct fixs neaster, npaskha;
+
+struct iovec header[] = {
+ {"From: ", 6},
+ {NULL, 0},
+ {" (Reminder Service)\nTo: ", 24},
+ {NULL, 0},
+ {"\nSubject: ", 10},
+ {NULL, 0},
+ {"'s Calendar\nPrecedence: bulk\n\n", 30},
+};
+
+
+void
+cal()
+{
+ register int printing;
+ register char *p;
+ FILE *fp;
+ int ch, l;
+ int month;
+ int day;
+ int var;
+ char buf[2048 + 1];
+
+ if ((fp = opencal()) == NULL)
+ return;
+ for (printing = 0; fgets(buf, sizeof(buf), stdin) != NULL;) {
+ if ((p = strchr(buf, '\n')) != NULL)
+ *p = '\0';
+ else
+ while ((ch = getchar()) != '\n' && ch != EOF);
+ for (l = strlen(buf);
+ l > 0 && isspace(buf[l - 1]);
+ l--)
+ ;
+ buf[l] = '\0';
+ if (buf[0] == '\0')
+ continue;
+ if (strncmp(buf, "LANG=", 5) == 0) {
+ (void) setlocale(LC_ALL, buf + 5);
+ setnnames();
+ continue;
+ }
+ if (strncasecmp(buf, "Easter=", 7) == 0 && buf[7]) {
+ if (neaster.name != NULL)
+ free(neaster.name);
+ if ((neaster.name = strdup(buf + 7)) == NULL)
+ errx(1, "cannot allocate memory");
+ neaster.len = strlen(buf + 7);
+ continue;
+ }
+ if (strncasecmp(buf, "Paskha=", 7) == 0 && buf[7]) {
+ if (npaskha.name != NULL)
+ free(npaskha.name);
+ if ((npaskha.name = strdup(buf + 7)) == NULL)
+ errx(1, "cannot allocate memory");
+ npaskha.len = strlen(buf + 7);
+ continue;
+ }
+ if (buf[0] != '\t') {
+ printing = isnow(buf, &month, &day, &var) ? 1 : 0;
+ if ((p = strchr(buf, '\t')) == NULL)
+ continue;
+ if (p > buf && p[-1] == '*')
+ var = 1;
+ if (printing) {
+ struct tm tm;
+ char dbuf[30];
+
+ tm.tm_sec = 0; /* unused */
+ tm.tm_min = 0; /* unused */
+ tm.tm_hour = 0; /* unused */
+ tm.tm_wday = 0; /* unused */
+ tm.tm_mon = month - 1;
+ tm.tm_mday = day;
+ tm.tm_year = tp->tm_year; /* unused */
+ (void)strftime(dbuf, sizeof(dbuf), "%c", &tm);
+ dbuf[10] = '\0';
+ (void)fprintf(fp, "%s%c%s\n",
+ dbuf + 4/* skip weekdays */,
+ var ? '*' : ' ', p);
+ }
+ }
+ else if (printing)
+ fprintf(fp, "%s\n", buf);
+ }
+ closecal(fp);
+}
+
+int
+getfield(p, endp, flags)
+ char *p, **endp;
+ int *flags;
+{
+ int val, var;
+ char *start, savech;
+
+ for (; !isdigit(*p) && !isalpha(*p) && *p != '*'; ++p)
+ ;
+ if (*p == '*') { /* `*' is current month */
+ *flags |= F_ISMONTH;
+ *endp = p+1;
+ return (tp->tm_mon + 1);
+ }
+ if (isdigit(*p)) {
+ val = strtol(p, &p, 10); /* if 0, it's failure */
+ for (; !isdigit(*p) && !isalpha(*p) && *p != '*'; ++p)
+ ;
+ *endp = p;
+ return (val);
+ }
+ for (start = p; isalpha(*++p);)
+ ;
+
+ /* Sunday-1 */
+ if (*p == '+' || *p == '-')
+ for(; isdigit(*++p);)
+ ;
+
+ savech = *p;
+ *p = '\0';
+
+ /* Month */
+ if ((val = getmonth(start)) != 0)
+ *flags |= F_ISMONTH;
+
+ /* Day */
+ else if ((val = getday(start)) != 0) {
+ *flags |= F_ISDAY;
+
+ /* variable weekday */
+ if ((var = getdayvar(start)) != 0) {
+ if (var <=5 && var >= -4)
+ val += var * 10;
+#ifdef DEBUG
+ printf("var: %d\n", var);
+#endif
+ }
+ }
+
+ /* Easter */
+ else if ((val = geteaster(start, tp->tm_year + 1900)) != 0)
+ *flags |= F_EASTER;
+
+ /* Paskha */
+ else if ((val = getpaskha(start, tp->tm_year + 1900)) != 0)
+ *flags |= F_EASTER;
+
+ /* undefined rest */
+ else {
+ *p = savech;
+ return (0);
+ }
+ for (*p = savech; !isdigit(*p) && !isalpha(*p) && *p != '*'; ++p)
+ ;
+ *endp = p;
+ return (val);
+}
+
+char path[MAXPATHLEN];
+
+FILE *
+opencal()
+{
+ int fd, pdes[2];
+ struct stat sbuf;
+
+ /* open up calendar file as stdin */
+ if (!freopen(calendarFile, "r", stdin)) {
+ if (doall) {
+ if (chdir(calendarHome) != 0)
+ return (NULL);
+ if (stat(calendarNoMail, &sbuf) == 0)
+ return (NULL);
+ if (!freopen(calendarFile, "r", stdin))
+ return (NULL);
+ } else {
+ chdir(getenv("HOME"));
+ if (!(chdir(calendarHome) == 0 &&
+ freopen(calendarFile, "r", stdin)))
+ errx(1, "no calendar file: ``%s'' or ``~/%s/%s\n", calendarFile, calendarHome, calendarFile);
+ }
+ }
+ if (pipe(pdes) < 0)
+ return (NULL);
+ switch (vfork()) {
+ case -1: /* error */
+ (void)close(pdes[0]);
+ (void)close(pdes[1]);
+ return (NULL);
+ case 0:
+ /* child -- stdin already setup, set stdout to pipe input */
+ if (pdes[1] != STDOUT_FILENO) {
+ (void)dup2(pdes[1], STDOUT_FILENO);
+ (void)close(pdes[1]);
+ }
+ (void)close(pdes[0]);
+ (void)setuid(geteuid());
+ (void)setgid(getegid());
+ execl(_PATH_CPP, "cpp", "-P", "-I.", _PATH_INCLUDE, NULL);
+ warn(_PATH_CPP);
+ _exit(1);
+ }
+ /* parent -- set stdin to pipe output */
+ (void)dup2(pdes[0], STDIN_FILENO);
+ (void)close(pdes[0]);
+ (void)close(pdes[1]);
+
+ /* not reading all calendar files, just set output to stdout */
+ if (!doall)
+ return (stdout);
+
+ /* set output to a temporary file, so if no output don't send mail */
+ (void)snprintf(path, sizeof(path), "%s/_calXXXXXX", _PATH_TMP);
+ if ((fd = mkstemp(path)) < 0)
+ return (NULL);
+ return (fdopen(fd, "w+"));
+}
+
+void
+closecal(fp)
+ FILE *fp;
+{
+ struct stat sbuf;
+ int nread, pdes[2], status;
+ char buf[1024];
+
+ if (!doall)
+ return;
+
+ (void)rewind(fp);
+ if (fstat(fileno(fp), &sbuf) || !sbuf.st_size)
+ goto done;
+ if (pipe(pdes) < 0)
+ goto done;
+ switch (vfork()) {
+ case -1: /* error */
+ (void)close(pdes[0]);
+ (void)close(pdes[1]);
+ goto done;
+ case 0:
+ /* child -- set stdin to pipe output */
+ if (pdes[0] != STDIN_FILENO) {
+ (void)dup2(pdes[0], STDIN_FILENO);
+ (void)close(pdes[0]);
+ }
+ (void)close(pdes[1]);
+ (void)setuid(geteuid());
+ (void)setgid(getegid());
+ execl(_PATH_SENDMAIL, "sendmail", "-i", "-t", "-F",
+ "\"Reminder Service\"", "-f", "root", NULL);
+ warn(_PATH_SENDMAIL);
+ _exit(1);
+ }
+ /* parent -- write to pipe input */
+ (void)close(pdes[0]);
+
+ header[1].iov_base = header[3].iov_base = pw->pw_name;
+ header[1].iov_len = header[3].iov_len = strlen(pw->pw_name);
+ writev(pdes[1], header, 7);
+ while ((nread = read(fileno(fp), buf, sizeof(buf))) > 0)
+ (void)write(pdes[1], buf, nread);
+ (void)close(pdes[1]);
+done: (void)fclose(fp);
+ (void)unlink(path);
+ while (wait(&status) >= 0);
+}
--- /dev/null
+/* $OpenBSD: ostern.c,v 1.1 1996/12/05 06:04:40 millert Exp $ */
+
+/*
+ * Copyright (c) 1996 Wolfram Schneider <wosch@FreeBSD.org>. Berlin.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $Id: ostern.c,v 1.1 1996/12/05 06:04:40 millert Exp $
+ */
+
+#ifndef lint
+static char rcsid[] = "$OpenBSD: ostern.c,v 1.1 1996/12/05 06:04:40 millert Exp $";
+#endif /* not lint */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+
+#include "calendar.h"
+
+/* return year day for Easter */
+
+int easter (year)
+ int year; /* 0 ... abcd, NOT since 1900 */
+{
+
+ int e_a, e_b, e_c, e_d, e_e,e_f, e_g, e_h, e_i, e_k,
+ e_l, e_m, e_n, e_p, e_q;
+
+ /* silly, but it works */
+ e_a = year % 19;
+ e_b = year / 100;
+ e_c = year % 100;
+
+ e_d = e_b / 4;
+ e_e = e_b % 4;
+ e_f = (e_b + 8) / 25;
+ e_g = (e_b + 1 - e_f) / 3;
+ e_h = ((19 * e_a) + 15 + e_b - (e_d + e_g)) % 30;
+ e_i = e_c / 4;
+ e_k = e_c % 4;
+ e_l = (32 + 2 * e_e + 2 * e_i - (e_h + e_k)) % 7;
+ e_m = (e_a + 11 * e_h + 22 * e_l) / 451;
+ e_n = (e_h + e_l + 114 - (7 * e_m)) / 31;
+ e_p = (e_h + e_l + 114 - (7 * e_m)) % 31;
+ e_p = e_p + 1;
+
+ e_q = 31 + 28;
+
+ if (e_k == 0 && e_c != 0)
+ e_q += 1;
+
+ if (e_n == 4)
+ e_q += 31;
+
+ e_q += e_p;
+
+#if DEBUG
+ printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d\n", e_a , e_b , e_c , e_d , e_e , e_f , e_g , e_h , e_i , e_k , e_l , e_m , e_n , e_p , e_q);
+#endif
+
+ return (e_q);
+}
+
+/* return year day for Easter or easter depending days
+ * Match: Easter([+-][0-9]+)?
+ * e.g: Easter-2 is Good Friday (2 days before Easter)
+ */
+
+int
+geteaster(s, year)
+ char *s;
+ int year;
+{
+ register int offset = 0;
+ extern struct fixs neaster;
+
+#define EASTER "easter"
+#define EASTERNAMELEN (sizeof(EASTER) - 1)
+
+ if (strncasecmp(s, EASTER, EASTERNAMELEN) == 0)
+ s += EASTERNAMELEN;
+ else if ( neaster.name != NULL
+ && strncasecmp(s, neaster.name, neaster.len) == 0
+ )
+ s += neaster.len;
+ else
+ return(0);
+
+#if DEBUG
+ printf("%s %d %d\n", s, year, EASTERNAMELEN);
+#endif
+
+ /* Easter+1 or Easter-2
+ * ^ ^ */
+
+ switch(*s) {
+
+ case '-':
+ case '+':
+ offset = atoi(s);
+ break;
+
+ default:
+ offset = 0;
+ }
+
+ return (easter(year) + offset);
+}
--- /dev/null
+/* $OpenBSD: paskha.c,v 1.1 1996/12/05 06:04:41 millert Exp $ */
+
+/*
+ * Copyright (C) 1993-1996 by Andrey A. Chernov, Moscow, Russia.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef lint
+static char rcsid[] = "$OpenBSD: paskha.c,v 1.1 1996/12/05 06:04:41 millert Exp $";
+#endif /* not lint */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+
+#include "calendar.h"
+
+#define PASKHA "paskha"
+#define PASKHALEN (sizeof(PASKHA) - 1)
+
+/* return year day for Orthodox Easter using Gauss formula */
+/* (old style result) */
+
+static int
+paskha (R)
+int R; /*year*/
+{
+ int a, b, c, d, e;
+ static int x = 15;
+ static int y = 6;
+ extern int *cumdays;
+
+ a = R % 19;
+ b = R % 4;
+ c = R % 7;
+ d = (19*a + x) % 30;
+ e = (2*b + 4*c + 6*d + y) % 7;
+ return (((cumdays[3] + 1) + 22) + (d + e));
+}
+
+/* return year day for Orthodox Easter depending days */
+
+int
+getpaskha(s, year)
+ char *s;
+ int year;
+{
+ int offset;
+ extern struct fixs npaskha;
+
+ if (strncasecmp(s, PASKHA, PASKHALEN) == 0)
+ s += PASKHALEN;
+ else if ( npaskha.name != NULL
+ && strncasecmp(s, npaskha.name, npaskha.len) == 0
+ )
+ s += npaskha.len;
+ else
+ return 0;
+
+
+ /* Paskha+1 or Paskha-2
+ * ^ ^ */
+
+ switch(*s) {
+
+ case '-':
+ case '+':
+ offset = atoi(s);
+ break;
+
+ default:
+ offset = 0;
+ break;
+ }
+
+ return (paskha(year) + offset + 13/* new style */);
+}
-/* $OpenBSD: pathnames.h,v 1.2 1996/06/26 05:31:46 deraadt Exp $ */
-/* $NetBSD: pathnames.h,v 1.3 1995/03/27 08:46:15 glass Exp $ */
+/* $OpenBSD: pathnames.h,v 1.3 1996/12/05 06:04:41 millert Exp $ */
/*
* Copyright (c) 1989, 1993
#include <paths.h>
#define _PATH_CPP "/usr/bin/cpp"
+
/* XXX -- fix when cpp parses arguments rationally */
#define _PATH_INCLUDE "-I/usr/share/calendar"