aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorConrad Meyer <cem@FreeBSD.org>2020-03-03 00:20:08 +0000
committerConrad Meyer <cem@FreeBSD.org>2020-03-03 00:20:08 +0000
commitfd1efedc79e2d29a68478fd400a42d59f1b56c7b (patch)
tree4603273d43a532cc6bd7bdadadc7683e9313b8d9
parent3c565de33ffc81158721d038abfaac68c5709444 (diff)
downloadsrc-fd1efedc79e2d29a68478fd400a42d59f1b56c7b.tar.gz
src-fd1efedc79e2d29a68478fd400a42d59f1b56c7b.zip
Add extremely useful calendar(1) application to FreeBSD
It does extremely useful things like execute sendmail and spew dubiously accurate factoids. From the feedback, it seems like it is an essential utility in a modern unix and not at all a useless bikeshed. How do those Linux people live without it? Reverts r358561.
Notes
Notes: svn path=/head/; revision=358562
-rw-r--r--ObsoleteFiles.inc5
-rw-r--r--share/man/man5/periodic.conf.58
-rw-r--r--share/man/man5/src.conf.53
-rw-r--r--share/man/man7/hier.74
-rw-r--r--tools/build/options/WITHOUT_CALENDAR3
-rw-r--r--tools/tools/nanobsd/dhcpd/common1
-rw-r--r--tools/tools/nanobsd/embedded/common1
-rw-r--r--usr.bin/Makefile1
-rw-r--r--usr.bin/calendar/Makefile117
-rw-r--r--usr.bin/calendar/Makefile.depend18
-rw-r--r--usr.bin/calendar/calendar.1333
-rw-r--r--usr.bin/calendar/calendar.c258
-rw-r--r--usr.bin/calendar/calendar.h206
-rw-r--r--usr.bin/calendar/calendars/calendar.all24
-rw-r--r--usr.bin/calendar/calendars/calendar.australia72
-rw-r--r--usr.bin/calendar/calendars/calendar.birthday304
-rw-r--r--usr.bin/calendar/calendars/calendar.brazilian13
-rw-r--r--usr.bin/calendar/calendars/calendar.christian36
-rw-r--r--usr.bin/calendar/calendars/calendar.computer76
-rw-r--r--usr.bin/calendar/calendars/calendar.croatian12
-rw-r--r--usr.bin/calendar/calendars/calendar.dutch79
-rw-r--r--usr.bin/calendar/calendars/calendar.french12
-rw-r--r--usr.bin/calendar/calendars/calendar.german12
-rw-r--r--usr.bin/calendar/calendars/calendar.history475
-rw-r--r--usr.bin/calendar/calendars/calendar.holiday563
-rw-r--r--usr.bin/calendar/calendars/calendar.hungarian12
-rw-r--r--usr.bin/calendar/calendars/calendar.judaic824
-rw-r--r--usr.bin/calendar/calendars/calendar.lotr48
-rw-r--r--usr.bin/calendar/calendars/calendar.music240
-rw-r--r--usr.bin/calendar/calendars/calendar.newzealand25
-rw-r--r--usr.bin/calendar/calendars/calendar.russian12
-rw-r--r--usr.bin/calendar/calendars/calendar.southafrica23
-rw-r--r--usr.bin/calendar/calendars/calendar.ukrainian12
-rw-r--r--usr.bin/calendar/calendars/calendar.usholiday42
-rw-r--r--usr.bin/calendar/calendars/calendar.world19
-rw-r--r--usr.bin/calendar/calendars/de_AT.ISO_8859-15/calendar.feiertag62
-rw-r--r--usr.bin/calendar/calendars/de_DE.ISO8859-1/calendar.all17
-rw-r--r--usr.bin/calendar/calendars/de_DE.ISO8859-1/calendar.feiertag56
-rw-r--r--usr.bin/calendar/calendars/de_DE.ISO8859-1/calendar.geschichte198
-rw-r--r--usr.bin/calendar/calendars/de_DE.ISO8859-1/calendar.kirche32
-rw-r--r--usr.bin/calendar/calendars/de_DE.ISO8859-1/calendar.literatur54
-rw-r--r--usr.bin/calendar/calendars/de_DE.ISO8859-1/calendar.musik66
-rw-r--r--usr.bin/calendar/calendars/de_DE.ISO8859-1/calendar.wissenschaft19
-rw-r--r--usr.bin/calendar/calendars/fr_FR.ISO8859-1/calendar.all14
-rw-r--r--usr.bin/calendar/calendars/fr_FR.ISO8859-1/calendar.fetes630
-rw-r--r--usr.bin/calendar/calendars/fr_FR.ISO8859-1/calendar.french12
-rw-r--r--usr.bin/calendar/calendars/fr_FR.ISO8859-1/calendar.jferies46
-rw-r--r--usr.bin/calendar/calendars/fr_FR.ISO8859-1/calendar.proverbes354
-rw-r--r--usr.bin/calendar/calendars/hr_HR.ISO8859-2/calendar.all12
-rw-r--r--usr.bin/calendar/calendars/hr_HR.ISO8859-2/calendar.praznici44
-rw-r--r--usr.bin/calendar/calendars/hu_HU.ISO8859-2/calendar.all13
-rw-r--r--usr.bin/calendar/calendars/hu_HU.ISO8859-2/calendar.nevnapok386
-rw-r--r--usr.bin/calendar/calendars/hu_HU.ISO8859-2/calendar.unnepek53
-rw-r--r--usr.bin/calendar/calendars/pt_BR.ISO8859-1/calendar.all15
-rw-r--r--usr.bin/calendar/calendars/pt_BR.ISO8859-1/calendar.commemorative191
-rw-r--r--usr.bin/calendar/calendars/pt_BR.ISO8859-1/calendar.holidays25
-rw-r--r--usr.bin/calendar/calendars/pt_BR.ISO8859-1/calendar.mcommemorative22
-rw-r--r--usr.bin/calendar/calendars/pt_BR.UTF-8/calendar.all16
-rw-r--r--usr.bin/calendar/calendars/pt_BR.UTF-8/calendar.commemorative189
-rw-r--r--usr.bin/calendar/calendars/pt_BR.UTF-8/calendar.holidays25
-rw-r--r--usr.bin/calendar/calendars/pt_BR.UTF-8/calendar.mcommemorative22
-rw-r--r--usr.bin/calendar/calendars/ru_RU.KOI8-R/calendar.all16
-rw-r--r--usr.bin/calendar/calendars/ru_RU.KOI8-R/calendar.common105
-rw-r--r--usr.bin/calendar/calendars/ru_RU.KOI8-R/calendar.holiday25
-rw-r--r--usr.bin/calendar/calendars/ru_RU.KOI8-R/calendar.military28
-rw-r--r--usr.bin/calendar/calendars/ru_RU.KOI8-R/calendar.orthodox36
-rw-r--r--usr.bin/calendar/calendars/ru_RU.KOI8-R/calendar.pagan42
-rw-r--r--usr.bin/calendar/calendars/ru_RU.UTF-8/calendar.all16
-rw-r--r--usr.bin/calendar/calendars/ru_RU.UTF-8/calendar.common105
-rw-r--r--usr.bin/calendar/calendars/ru_RU.UTF-8/calendar.holiday25
-rw-r--r--usr.bin/calendar/calendars/ru_RU.UTF-8/calendar.military28
-rw-r--r--usr.bin/calendar/calendars/ru_RU.UTF-8/calendar.orthodox36
-rw-r--r--usr.bin/calendar/calendars/ru_RU.UTF-8/calendar.pagan42
-rw-r--r--usr.bin/calendar/calendars/uk_UA.KOI8-U/calendar.all14
-rw-r--r--usr.bin/calendar/calendars/uk_UA.KOI8-U/calendar.holiday22
-rw-r--r--usr.bin/calendar/calendars/uk_UA.KOI8-U/calendar.misc18
-rw-r--r--usr.bin/calendar/calendars/uk_UA.KOI8-U/calendar.orthodox35
-rw-r--r--usr.bin/calendar/dates.c453
-rw-r--r--usr.bin/calendar/day.c109
-rw-r--r--usr.bin/calendar/events.c229
-rw-r--r--usr.bin/calendar/io.c502
-rw-r--r--usr.bin/calendar/locale.c168
-rw-r--r--usr.bin/calendar/ostern.c69
-rw-r--r--usr.bin/calendar/parsedata.c1118
-rw-r--r--usr.bin/calendar/paskha.c68
-rw-r--r--usr.bin/calendar/pathnames.h37
-rw-r--r--usr.bin/calendar/pom.c278
-rw-r--r--usr.bin/calendar/sunpos.c450
-rw-r--r--usr.bin/calendar/tests/Makefile40
-rw-r--r--usr.bin/calendar/tests/Makefile.depend11
-rw-r--r--usr.bin/calendar/tests/calendar.calibrate374
-rw-r--r--usr.bin/calendar/tests/legacy_test.sh6
-rw-r--r--usr.bin/calendar/tests/regress.a1.out4
-rw-r--r--usr.bin/calendar/tests/regress.a2.out4
-rw-r--r--usr.bin/calendar/tests/regress.a3.out4
-rw-r--r--usr.bin/calendar/tests/regress.a4.out4
-rw-r--r--usr.bin/calendar/tests/regress.a5.out4
-rw-r--r--usr.bin/calendar/tests/regress.b1.out4
-rw-r--r--usr.bin/calendar/tests/regress.b2.out4
-rw-r--r--usr.bin/calendar/tests/regress.b3.out4
-rw-r--r--usr.bin/calendar/tests/regress.b4.out4
-rw-r--r--usr.bin/calendar/tests/regress.b5.out4
-rw-r--r--usr.bin/calendar/tests/regress.s1.out4
-rw-r--r--usr.bin/calendar/tests/regress.s2.out2
-rw-r--r--usr.bin/calendar/tests/regress.s3.out2
-rw-r--r--usr.bin/calendar/tests/regress.s4.out2
-rw-r--r--usr.bin/calendar/tests/regress.sh45
-rw-r--r--usr.bin/calendar/tests/regress.w0-1.out1
-rw-r--r--usr.bin/calendar/tests/regress.w0-2.out1
-rw-r--r--usr.bin/calendar/tests/regress.w0-3.out1
-rw-r--r--usr.bin/calendar/tests/regress.w0-4.out1
-rw-r--r--usr.bin/calendar/tests/regress.w0-5.out1
-rw-r--r--usr.bin/calendar/tests/regress.w0-6.out1
-rw-r--r--usr.bin/calendar/tests/regress.w0-7.out1
-rw-r--r--usr.bin/calendar/tests/regress.wn-1.out1
-rw-r--r--usr.bin/calendar/tests/regress.wn-2.out2
-rw-r--r--usr.bin/calendar/tests/regress.wn-3.out3
-rw-r--r--usr.bin/calendar/tests/regress.wn-4.out4
-rw-r--r--usr.bin/calendar/tests/regress.wn-5.out5
-rw-r--r--usr.bin/calendar/tests/regress.wn-6.out6
-rw-r--r--usr.bin/calendar/tests/regress.wn-7.out7
-rw-r--r--usr.bin/leave/leave.12
-rwxr-xr-xusr.sbin/periodic/etc/daily/300.calendar29
-rw-r--r--usr.sbin/periodic/etc/daily/Makefile4
-rw-r--r--usr.sbin/periodic/periodic.conf3
125 files changed, 11134 insertions, 5 deletions
diff --git a/ObsoleteFiles.inc b/ObsoleteFiles.inc
index edf5bb2ab1ef..907dc5d5cbf8 100644
--- a/ObsoleteFiles.inc
+++ b/ObsoleteFiles.inc
@@ -36,11 +36,6 @@
# xargs -n1 | sort | uniq -d;
# done
-# 20200302: calendar(1) removed
-OLD_DIRS+=usr/share/calendar
-OLD_FILES+=usr/bin/calendar
-OLD_FILES+=usr/share/man/man1/calendar.1.gz
-
# 20200301: bktr removed
OLD_DIRS+=usr/include/dev/bktr
OLD_FILES+=usr/include/dev/bktr/ioctl_bktr.h
diff --git a/share/man/man5/periodic.conf.5 b/share/man/man5/periodic.conf.5
index 6ce19438f92b..962315ef5b49 100644
--- a/share/man/man5/periodic.conf.5
+++ b/share/man/man5/periodic.conf.5
@@ -273,6 +273,13 @@ Set to
if you want the
.Pa /etc/mail/aliases
file backed up and modifications to be displayed in your daily output.
+.It Va daily_calendar_enable
+.Pq Vt bool
+Set to
+.Dq Li YES
+if you want to run
+.Nm calendar Fl a
+daily.
.It Va daily_accounting_enable
.Pq Vt bool
Set to
@@ -963,6 +970,7 @@ is shared or distributed.
.El
.Sh SEE ALSO
.Xr apropos 1 ,
+.Xr calendar 1 ,
.Xr df 1 ,
.Xr diff 1 ,
.Xr gzip 1 ,
diff --git a/share/man/man5/src.conf.5 b/share/man/man5/src.conf.5
index 0cdd3747474d..f4206b5427b6 100644
--- a/share/man/man5/src.conf.5
+++ b/share/man/man5/src.conf.5
@@ -271,6 +271,9 @@ is set explicitly)
.El
.It Va WITHOUT_BZIP2_SUPPORT
Set to build some programs without optional bzip2 support.
+.It Va WITHOUT_CALENDAR
+Set to not build
+.Xr calendar 1 .
.It Va WITHOUT_CAPSICUM
Set to not build Capsicum support into system programs.
When set, it enforces these options:
diff --git a/share/man/man7/hier.7 b/share/man/man7/hier.7
index 29a3ebb018c4..4b297f5eb77a 100644
--- a/share/man/man7/hier.7
+++ b/share/man/man7/hier.7
@@ -442,6 +442,10 @@ system daemons & system utilities (executed by users)
architecture-independent files
.Pp
.Bl -tag -width Fl -compact
+.It Pa calendar/
+a variety of pre-fab calendar files;
+see
+.Xr calendar 1
.It Pa dict/
word lists;
see
diff --git a/tools/build/options/WITHOUT_CALENDAR b/tools/build/options/WITHOUT_CALENDAR
new file mode 100644
index 000000000000..6944e3fb6705
--- /dev/null
+++ b/tools/build/options/WITHOUT_CALENDAR
@@ -0,0 +1,3 @@
+.\" $FreeBSD$
+Set to not build
+.Xr calendar 1 .
diff --git a/tools/tools/nanobsd/dhcpd/common b/tools/tools/nanobsd/dhcpd/common
index 2d4f15bfa293..0c801318609e 100644
--- a/tools/tools/nanobsd/dhcpd/common
+++ b/tools/tools/nanobsd/dhcpd/common
@@ -104,6 +104,7 @@ WITHOUT_ACPI=true
WITHOUT_ATM=true
WITHOUT_AUDIT=true
WITHOUT_BLUETOOTH=true
+WITHOUT_CALENDAR=true
WITHOUT_DICT=true
WITHOUT_EXAMPLES=true
WITHOUT_GAMES=true
diff --git a/tools/tools/nanobsd/embedded/common b/tools/tools/nanobsd/embedded/common
index 470fb4341c3c..013495997554 100644
--- a/tools/tools/nanobsd/embedded/common
+++ b/tools/tools/nanobsd/embedded/common
@@ -135,6 +135,7 @@ WITHOUT_ACPI=true
WITHOUT_ATM=true
WITHOUT_AUDIT=true
WITHOUT_BLUETOOTH=true
+WITHOUT_CALENDAR=true
WITHOUT_DICT=true
WITHOUT_EXAMPLES=true
WITHOUT_GAMES=true
diff --git a/usr.bin/Makefile b/usr.bin/Makefile
index 93712eed4b18..cb166e99457e 100644
--- a/usr.bin/Makefile
+++ b/usr.bin/Makefile
@@ -195,6 +195,7 @@ SUBDIR.${MK_AT}+= at
SUBDIR.${MK_ATM}+= atm
SUBDIR.${MK_BLUETOOTH}+= bluetooth
SUBDIR.${MK_BSD_CPIO}+= cpio
+SUBDIR.${MK_CALENDAR}+= calendar
SUBDIR.${MK_CLANG}+= clang
SUBDIR.${MK_DIALOG}+= dpv
SUBDIR.${MK_EE}+= ee
diff --git a/usr.bin/calendar/Makefile b/usr.bin/calendar/Makefile
new file mode 100644
index 000000000000..56665231db4c
--- /dev/null
+++ b/usr.bin/calendar/Makefile
@@ -0,0 +1,117 @@
+# @(#)Makefile 8.1 (Berkeley) 6/6/93
+# $FreeBSD$
+
+.include <src.opts.mk>
+
+PROG= calendar
+SRCS= calendar.c locale.c events.c dates.c parsedata.c io.c day.c \
+ ostern.c paskha.c pom.c sunpos.c
+LIBADD= m util
+INTER= de_AT.ISO_8859-15 de_DE.ISO8859-1 fr_FR.ISO8859-1 \
+ hr_HR.ISO8859-2 hu_HU.ISO8859-2 pt_BR.ISO8859-1 \
+ pt_BR.UTF-8 ru_RU.KOI8-R ru_RU.UTF-8 uk_UA.KOI8-U
+DE_LINKS= de_DE.ISO8859-15
+FR_LINKS= fr_FR.ISO8859-15
+
+.if ${MK_ICONV} == "yes"
+CFLAGS+= -DWITH_ICONV
+.endif
+
+FILESGROUPS+= CALS
+CALS= calendars/calendar.all \
+ calendars/calendar.australia \
+ calendars/calendar.birthday \
+ calendars/calendar.brazilian \
+ calendars/calendar.christian \
+ calendars/calendar.computer \
+ calendars/calendar.croatian \
+ calendars/calendar.dutch \
+ calendars/calendar.freebsd \
+ calendars/calendar.french \
+ calendars/calendar.german \
+ calendars/calendar.history \
+ calendars/calendar.holiday \
+ calendars/calendar.hungarian \
+ calendars/calendar.judaic \
+ calendars/calendar.lotr \
+ calendars/calendar.music \
+ calendars/calendar.newzealand \
+ calendars/calendar.russian \
+ calendars/calendar.southafrica \
+ calendars/calendar.ukrainian \
+ calendars/calendar.usholiday \
+ calendars/calendar.world
+CALSDIR= ${SHAREDIR}/calendar
+
+CAL_de_AT.ISO_8859-15= calendar.feiertag
+
+CAL_de_DE.ISO8859-1= calendar.all \
+ calendar.feiertag \
+ calendar.geschichte \
+ calendar.kirche \
+ calendar.literatur \
+ calendar.musik \
+ calendar.wissenschaft
+
+CAL_fr_FR.ISO8859-1= calendar.all \
+ calendar.fetes \
+ calendar.french \
+ calendar.jferies \
+ calendar.proverbes
+
+CAL_hr_HR.ISO8859-2= calendar.all \
+ calendar.praznici
+
+CAL_hu_HU.ISO8859-2= calendar.all \
+ calendar.nevnapok \
+ calendar.unnepek
+
+CAL_pt_BR.ISO8859-1= calendar.all \
+ calendar.commemorative \
+ calendar.holidays \
+ calendar.mcommemorative
+
+CAL_pt_BR.UTF-8= calendar.all \
+ calendar.commemorative \
+ calendar.holidays \
+ calendar.mcommemorative
+
+CAL_ru_RU.KOI8-R= calendar.all \
+ calendar.common \
+ calendar.holiday \
+ calendar.military \
+ calendar.orthodox \
+ calendar.pagan
+
+CAL_ru_RU.UTF-8= calendar.all \
+ calendar.common \
+ calendar.holiday \
+ calendar.military \
+ calendar.orthodox \
+ calendar.pagan
+
+CAL_uk_UA.KOI8-U= calendar.all \
+ calendar.holiday \
+ calendar.misc \
+ calendar.orthodox
+
+.for lang in ${INTER}
+FILESGROUPS+= CALS_${lang}
+CALS_${lang}DIR= ${SHAREDIR}/calendar/${lang}
+.for file in ${CAL_${lang}}
+CALS_${lang}+= ${file:S@^@calendars/${lang}/@}
+.endfor
+.endfor
+
+
+.for link in ${DE_LINKS}
+SYMLINKS+= de_DE.ISO8859-1 ${SHAREDIR}/calendar/${link}
+.endfor
+.for link in ${FR_LINKS}
+SYMLINKS+= fr_FR.ISO8859-1 ${SHAREDIR}/calendar/${link}
+.endfor
+
+HAS_TESTS=
+SUBDIR.${MK_TESTS}+= tests
+
+.include <bsd.prog.mk>
diff --git a/usr.bin/calendar/Makefile.depend b/usr.bin/calendar/Makefile.depend
new file mode 100644
index 000000000000..905e67cc66c9
--- /dev/null
+++ b/usr.bin/calendar/Makefile.depend
@@ -0,0 +1,18 @@
+# $FreeBSD$
+# Autogenerated - do NOT edit!
+
+DIRDEPS = \
+ gnu/lib/csu \
+ include \
+ include/xlocale \
+ lib/${CSU_DIR} \
+ lib/libc \
+ lib/libcompiler_rt \
+ lib/msun \
+
+
+.include <dirdeps.mk>
+
+.if ${DEP_RELDIR} == ${_DEP_RELDIR}
+# local dependencies - needed for -jN in clean tree
+.endif
diff --git a/usr.bin/calendar/calendar.1 b/usr.bin/calendar/calendar.1
new file mode 100644
index 000000000000..f90903bc936f
--- /dev/null
+++ b/usr.bin/calendar/calendar.1
@@ -0,0 +1,333 @@
+.\" Copyright (c) 1989, 1990, 1993
+.\" 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. 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.
+.\"
+.\" @(#)calendar.1 8.1 (Berkeley) 6/29/93
+.\" $FreeBSD$
+.\"
+.Dd July 24, 2016
+.Dt CALENDAR 1
+.Os
+.Sh NAME
+.Nm calendar
+.Nd reminder service
+.Sh SYNOPSIS
+.Nm
+.Op Fl A Ar num
+.Op Fl a
+.Op Fl B Ar num
+.Op Fl D Ar moon|sun
+.Op Fl d
+.Op Fl F Ar friday
+.Op Fl f Ar calendarfile
+.Op Fl l Ar longitude
+.Oo
+.Bk -words
+.Fl t Ar dd Ns
+.Sm off
+.Op . Ar mm Op . Ar year
+.Sm on
+.Ek
+.Oc
+.Op Fl U Ar UTC-offset
+.Op Fl W Ar num
+.Sh DESCRIPTION
+The
+.Nm
+utility checks the current directory for a file named
+.Pa calendar
+and displays lines that fall into the specified date range.
+On the day before a weekend (normally Friday), events for the next
+three days are displayed.
+.Pp
+The following options are available:
+.Bl -tag -width Ds
+.It Fl A Ar num
+Print lines from today and the next
+.Ar num
+days (forward, future).
+.It Fl a
+Process the ``calendar'' files of all users and mail the results
+to them.
+This requires super-user privileges.
+.It Fl B Ar num
+Print lines from today and the previous
+.Ar num
+days (backward, past).
+.It Fl D Ar moon|sun
+Print UTC offset, longitude and moon or sun information.
+.It Fl d
+Debug option: print current date information.
+.It Fl F Ar friday
+Specify which day of the week is ``Friday'' (the day before the
+weekend begins).
+Default is 5.
+.It Fl f Pa calendarfile
+Use
+.Pa calendarfile
+as the default calendar file.
+.It Fl l Ar longitude
+Perform lunar and solar calculations from this longitude.
+If neither longitude nor UTC offset is specified, the calculations will
+be based on the difference between UTC time and localtime.
+If both are specified, UTC offset overrides longitude.
+.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.
+.It Fl U Ar UTC-offset
+Perform lunar and solar calculations from this UTC offset.
+If neither UTC offset nor longitude is specified, the calculations
+will be based on the difference between UTC time and localtime.
+If both are specified, UTC offset overrides longitude.
+.It Fl W Ar num
+Print lines from today and the next
+.Ar num
+days (forward, future).
+Ignore weekends when calculating the number of days.
+.El
+.Sh FILE FORMAT
+To handle calendars in your national code table you can specify
+.Dq LANG=<locale_name>
+in the calendar file as early as possible.
+.Pp
+To handle the local name of sequences, you can specify them as:
+.Dq SEQUENCE=<first> <second> <third> <fourth> <fifth> <last>
+in the calendar file as early as possible.
+.Pp
+The names of the following special days are recognized:
+.Bl -tag -width 123456789012345 -compact
+.It Easter
+Catholic Easter.
+.It Paskha
+Orthodox Easter.
+.It NewMoon
+The lunar New Moon.
+.It FullMoon
+The lunar Full Moon.
+.It MarEquinox
+The solar equinox in March.
+.It JunSolstice
+The solar solstice in June.
+.It SepEquinox
+The solar equinox in September.
+.It DecSolstice
+The solar solstice in December.
+.It ChineseNewYear
+The first day of the Chinese year.
+.El
+These names may be reassigned to their local names via an assignment
+like
+.Dq Easter=Pasen
+in the calendar file.
+.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 the proper locale is set, national month and weekday
+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.
+.Pp
+The names of the recognized special days may be followed by a
+positive or negative integer, like:
+.Dq Easter+3
+or
+.Dq Paskha-4 .
+.Pp
+Weekdays may be followed by ``-4'' ...\& ``+5'' (aliases for
+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 descriptions start after the first <tab> character in the line;
+if the line does not contain a <tab> character, it is not displayed.
+If the first character in the line is a <tab> character, it is treated as
+a continuation of the previous line.
+.Pp
+The
+.Nm
+file is preprocessed by a limited subset of
+.Xr cpp 1
+internally, allowing the inclusion of shared files such as
+lists of company holidays or meetings.
+This limited subset consists of \fB#include #ifndef #endif\fR and \fB#define\fR.
+If the shared file is not referenced by a full pathname,
+.Xr calendar 1
+searches in the current (or home) directory first, and then in the
+directory
+.Pa /usr/share/calendar .
+Empty lines and lines protected by the C commenting syntax
+.Pq Li /* ... */
+are ignored.
+.Pp
+Some possible calendar entries (<tab> characters highlighted by
+\fB\et\fR sequence)
+.Bd -unfilled -offset indent
+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.
+2010/4/15\fB\et\fR15 April 2010
+
+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
+.Bl -tag -width calendar.christian -compact
+.It Pa calendar
+file in current directory.
+.It Pa ~/.calendar
+.Pa calendar
+HOME directory.
+A chdir is done 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
+.Pp
+The following default calendar files are provided in
+.Pa /usr/share/calendar:
+.Pp
+.Bl -tag -width calendar.southafrica -compact
+.It Pa calendar.all
+File which includes all the default files.
+.It Pa calendar.australia
+Calendar of events in Australia.
+.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.croatian
+Calendar of events in Croatia.
+.It Pa calendar.dutch
+Calendar of events in the Netherlands.
+.It Pa calendar.freebsd
+Birthdays of
+.Fx
+committers.
+.It Pa calendar.french
+Calendar of events in France.
+.It Pa calendar.german
+Calendar of events in Germany.
+.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.
+The entries for this calendar have been obtained from the port
+deskutils/hebcal.
+.It Pa calendar.music
+Musical events, births, and deaths.
+Strongly oriented toward rock 'n' roll.
+.It Pa calendar.newzealand
+Calendar of events in New Zealand.
+.It Pa calendar.russian
+Russian calendar.
+.It Pa calendar.southafrica
+Calendar of events in South Africa.
+.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.world
+Includes all calendar files except for national files.
+.El
+.Sh COMPATIBILITY
+The
+.Nm
+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
+at the beginning of a line.
+.Sh SEE ALSO
+.Xr at 1 ,
+.Xr mail 1 ,
+.Xr cron 8
+.Sh HISTORY
+A
+.Nm
+command appeared in
+.At v7 .
+.Sh NOTES
+Chinese New Year is calculated at 120 degrees east of Greenwich,
+which roughly corresponds with the east coast of China.
+For people west of China, this might result that the start of Chinese
+New Year and the day of the related new moon might differ.
+.Pp
+The phases of the moon and the longitude of the sun are calculated
+against the local position which corresponds with 30 degrees times
+the time-difference towards Greenwich.
+.Pp
+The new and full moons are happening on the day indicated: They
+might happen in the time period in the early night or in the late
+evening.
+It does not indicate that they are starting in the night on that date.
+.Pp
+Because of minor differences between the output of the formulas
+used and other sources on the Internet, Druids and Werewolves should
+double-check the start and end time of solar and lunar events.
+.Sh BUGS
+The
+.Nm
+internal cpp does not correctly do #ifndef and will discard the rest
+of the file if a #ifndef is triggered.
+It also has a maximum of 50 include file and/or 100 #defines
+and only recognises #include, #define and
+#ifndef.
+.Pp
+There is no possibility to properly specify the local position
+needed for solar and lunar calculations.
diff --git a/usr.bin/calendar/calendar.c b/usr.bin/calendar/calendar.c
new file mode 100644
index 000000000000..a2d015fa791e
--- /dev/null
+++ b/usr.bin/calendar/calendar.c
@@ -0,0 +1,258 @@
+/*-
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ * 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. 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
+
+#if 0
+#ifndef lint
+static char sccsid[] = "@(#)calendar.c 8.3 (Berkeley) 3/25/94";
+#endif
+#endif
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/types.h>
+#include <err.h>
+#include <errno.h>
+#include <locale.h>
+#include <login_cap.h>
+#include <langinfo.h>
+#include <pwd.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <unistd.h>
+
+#include "calendar.h"
+
+#define UTCOFFSET_NOTSET 100 /* Expected between -24 and +24 */
+#define LONGITUDE_NOTSET 1000 /* Expected between -360 and +360 */
+
+struct passwd *pw;
+int doall = 0;
+int debug = 0;
+static char *DEBUG = NULL;
+static time_t f_time = 0;
+double UTCOffset = UTCOFFSET_NOTSET;
+int EastLongitude = LONGITUDE_NOTSET;
+#ifdef WITH_ICONV
+const char *outputEncoding = NULL;
+#endif
+
+static void usage(void) __dead2;
+
+int
+main(int argc, char *argv[])
+{
+ int f_dayAfter = 0; /* days after current date */
+ int f_dayBefore = 0; /* days before current date */
+ int Friday = 5; /* day before weekend */
+
+ int ch;
+ struct tm tp1, tp2;
+
+ (void)setlocale(LC_ALL, "");
+
+ while ((ch = getopt(argc, argv, "-A:aB:D:dF:f:l:t:U:W:?")) != -1)
+ switch (ch) {
+ case '-': /* backward contemptible */
+ case 'a':
+ if (getuid()) {
+ errno = EPERM;
+ err(1, NULL);
+ }
+ doall = 1;
+ break;
+
+ case 'W': /* we don't need no steenking Fridays */
+ Friday = -1;
+ /* FALLTHROUGH */
+
+ case 'A': /* days after current date */
+ f_dayAfter = atoi(optarg);
+ if (f_dayAfter < 0)
+ errx(1, "number of days must be positive");
+ break;
+
+ case 'B': /* days before current date */
+ f_dayBefore = atoi(optarg);
+ if (f_dayBefore < 0)
+ errx(1, "number of days must be positive");
+ break;
+
+ case 'D': /* debug output of sun and moon info */
+ DEBUG = optarg;
+ break;
+
+ case 'd': /* debug output of current date */
+ debug = 1;
+ break;
+
+ case 'F': /* Change the time: When does weekend start? */
+ Friday = atoi(optarg);
+ break;
+
+ case 'f': /* other calendar file */
+ calendarFile = optarg;
+ break;
+
+ case 'l': /* Change longitudal position */
+ EastLongitude = strtol(optarg, NULL, 10);
+ break;
+
+ case 't': /* other date, for tests */
+ f_time = Mktime(optarg);
+ break;
+
+ case 'U': /* Change UTC offset */
+ UTCOffset = strtod(optarg, NULL);
+ break;
+
+ case '?':
+ default:
+ usage();
+ }
+
+ argc -= optind;
+ argv += optind;
+
+ if (argc)
+ usage();
+
+ /* use current time */
+ if (f_time <= 0)
+ (void)time(&f_time);
+
+ /* if not set, determine where I could be */
+ {
+ if (UTCOffset == UTCOFFSET_NOTSET &&
+ EastLongitude == LONGITUDE_NOTSET) {
+ /* Calculate on difference between here and UTC */
+ time_t t;
+ struct tm tm;
+ long utcoffset, hh, mm, ss;
+ double uo;
+
+ time(&t);
+ localtime_r(&t, &tm);
+ utcoffset = tm.tm_gmtoff;
+ /* seconds -> hh:mm:ss */
+ hh = utcoffset / SECSPERHOUR;
+ utcoffset %= SECSPERHOUR;
+ mm = utcoffset / SECSPERMINUTE;
+ utcoffset %= SECSPERMINUTE;
+ ss = utcoffset;
+
+ /* hh:mm:ss -> hh.mmss */
+ uo = mm + (100.0 * (ss / 60.0));
+ uo /= 60.0 / 100.0;
+ uo = hh + uo / 100;
+
+ UTCOffset = uo;
+ EastLongitude = UTCOffset * 15;
+ } else if (UTCOffset == UTCOFFSET_NOTSET) {
+ /* Base on information given */
+ UTCOffset = EastLongitude / 15;
+ } else if (EastLongitude == LONGITUDE_NOTSET) {
+ /* Base on information given */
+ EastLongitude = UTCOffset * 15;
+ }
+ }
+
+ settimes(f_time, f_dayBefore, f_dayAfter, Friday, &tp1, &tp2);
+ generatedates(&tp1, &tp2);
+
+ /*
+ * FROM now on, we are working in UTC.
+ * This will only affect moon and sun related events anyway.
+ */
+ if (setenv("TZ", "UTC", 1) != 0)
+ errx(1, "setenv: %s", strerror(errno));
+ tzset();
+
+ if (debug)
+ dumpdates();
+
+ if (DEBUG != NULL) {
+ dodebug(DEBUG);
+ exit(0);
+ }
+
+ if (doall)
+ while ((pw = getpwent()) != NULL) {
+ pid_t pid;
+
+ if (chdir(pw->pw_dir) == -1)
+ continue;
+ pid = fork();
+ if (pid < 0)
+ err(1, "fork");
+ if (pid == 0) {
+ login_cap_t *lc;
+
+ lc = login_getpwclass(pw);
+ if (setusercontext(lc, pw, pw->pw_uid,
+ LOGIN_SETALL) != 0)
+ errx(1, "setusercontext");
+ cal();
+ exit(0);
+ }
+ }
+ else {
+#ifdef WITH_ICONV
+ /* Save the information about the encoding used in the terminal. */
+ outputEncoding = strdup(nl_langinfo(CODESET));
+ if (outputEncoding == NULL)
+ errx(1, "cannot allocate memory");
+#endif
+ cal();
+ }
+ exit(0);
+}
+
+
+static void __dead2
+usage(void)
+{
+
+ fprintf(stderr, "%s\n%s\n%s\n",
+ "usage: calendar [-A days] [-a] [-B days] [-D sun|moon] [-d]",
+ " [-F friday] [-f calendarfile] [-l longitude]",
+ " [-t dd[.mm[.year]]] [-U utcoffset] [-W days]"
+ );
+ exit(1);
+}
diff --git a/usr.bin/calendar/calendar.h b/usr.bin/calendar/calendar.h
new file mode 100644
index 000000000000..2604568352b5
--- /dev/null
+++ b/usr.bin/calendar/calendar.h
@@ -0,0 +1,206 @@
+/*-
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ * 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. 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.
+ *
+ * $FreeBSD$
+ */
+
+#include <sys/types.h>
+#include <sys/uio.h>
+
+#define SECSPERDAY (24 * 60 * 60)
+#define SECSPERHOUR (60 * 60)
+#define SECSPERMINUTE (60)
+#define MINSPERHOUR (60)
+#define HOURSPERDAY (24)
+#define FSECSPERDAY (24.0 * 60.0 * 60.0)
+#define FSECSPERHOUR (60.0 * 60.0)
+#define FSECSPERMINUTE (60.0)
+#define FMINSPERHOUR (60.0)
+#define FHOURSPERDAY (24.0)
+
+#define DAYSPERYEAR 365
+#define DAYSPERLEAPYEAR 366
+
+/* Not yet categorized */
+
+extern struct passwd *pw;
+extern int doall;
+extern time_t t1, t2;
+extern const char *calendarFile;
+extern int yrdays;
+extern struct fixs neaster, npaskha, ncny, nfullmoon, nnewmoon;
+extern struct fixs nmarequinox, nsepequinox, njunsolstice, ndecsolstice;
+extern double UTCOffset;
+extern int EastLongitude;
+#ifdef WITH_ICONV
+extern const char *outputEncoding;
+#endif
+
+#define isleap(y) ((((y) % 4) == 0 && ((y) % 100) != 0) || ((y) % 400) == 0)
+
+/* Flags to determine the returned values by determinestyle() in parsedata.c */
+#define F_NONE 0x00000
+#define F_MONTH 0x00001
+#define F_DAYOFWEEK 0x00002
+#define F_DAYOFMONTH 0x00004
+#define F_MODIFIERINDEX 0x00008
+#define F_MODIFIEROFFSET 0x00010
+#define F_SPECIALDAY 0x00020
+#define F_ALLMONTH 0x00040
+#define F_ALLDAY 0x00080
+#define F_VARIABLE 0x00100
+#define F_EASTER 0x00200
+#define F_CNY 0x00400
+#define F_PASKHA 0x00800
+#define F_NEWMOON 0x01000
+#define F_FULLMOON 0x02000
+#define F_MAREQUINOX 0x04000
+#define F_SEPEQUINOX 0x08000
+#define F_JUNSOLSTICE 0x10000
+#define F_DECSOLSTICE 0x20000
+#define F_YEAR 0x40000
+
+#define STRING_EASTER "Easter"
+#define STRING_PASKHA "Paskha"
+#define STRING_CNY "ChineseNewYear"
+#define STRING_NEWMOON "NewMoon"
+#define STRING_FULLMOON "FullMoon"
+#define STRING_MAREQUINOX "MarEquinox"
+#define STRING_SEPEQUINOX "SepEquinox"
+#define STRING_JUNSOLSTICE "JunSolstice"
+#define STRING_DECSOLSTICE "DecSolstice"
+
+#define MAXCOUNT 125 /* Random number of maximum number of
+ * repeats of an event. Should be 52
+ * (number of weeks per year), if you
+ * want to show two years then it
+ * should be 104. If you are seeing
+ * more than this you are using this
+ * program wrong.
+ */
+
+/*
+ * All the astronomical calculations are carried out for the meridian 120
+ * degrees east of Greenwich.
+ */
+#define UTCOFFSET_CNY 8.0
+
+extern int debug; /* show parsing of the input */
+extern int year1, year2;
+
+/* events.c */
+/*
+ * Event sorting related functions:
+ * - Use event_add() to create a new event
+ * - Use event_continue() to add more text to the last added event
+ * - Use event_print_all() to display them in time chronological order
+ */
+struct event *event_add(int, int, int, char *, int, char *, char *);
+void event_continue(struct event *events, char *txt);
+void event_print_all(FILE *fp);
+struct event {
+ int year;
+ int month;
+ int day;
+ int var;
+ char *date;
+ char *text;
+ char *extra;
+ struct event *next;
+};
+
+/* locale.c */
+
+struct fixs {
+ char *name;
+ size_t len;
+};
+
+extern const char *days[];
+extern const char *fdays[];
+extern const char *fmonths[];
+extern const char *months[];
+extern const char *sequences[];
+extern struct fixs fndays[8]; /* full national days names */
+extern struct fixs fnmonths[13]; /* full national months names */
+extern struct fixs ndays[8]; /* short national days names */
+extern struct fixs nmonths[13]; /* short national month names */
+extern struct fixs nsequences[10];
+
+void setnnames(void);
+void setnsequences(char *);
+
+/* day.c */
+extern const struct tm tm0;
+extern char dayname[];
+void settimes(time_t,int before, int after, int friday, struct tm *tp1, struct tm *tp2);
+time_t Mktime(char *);
+
+/* parsedata.c */
+int parsedaymonth(char *, int *, int *, int *, int *, char **);
+void dodebug(char *type);
+
+/* io.c */
+void cal(void);
+void closecal(FILE *);
+FILE *opencalin(void);
+FILE *opencalout(void);
+
+/* ostern.c / paskha.c */
+int paskha(int);
+int easter(int);
+int j2g(int);
+
+/* dates.c */
+extern int cumdaytab[][14];
+extern int monthdaytab[][14];
+extern int debug_remember;
+void generatedates(struct tm *tp1, struct tm *tp2);
+void dumpdates(void);
+int remember_ymd(int y, int m, int d);
+int remember_yd(int y, int d, int *rm, int *rd);
+int first_dayofweek_of_year(int y);
+int first_dayofweek_of_month(int y, int m);
+int walkthrough_dates(struct event **e);
+void addtodate(struct event *e, int year, int month, int day);
+
+/* pom.c */
+#define MAXMOONS 18
+void pom(int year, double UTCoffset, int *fms, int *nms);
+void fpom(int year, double utcoffset, double *ffms, double *fnms);
+
+/* sunpos.c */
+void equinoxsolstice(int year, double UTCoffset, int *equinoxdays, int *solsticedays);
+void fequinoxsolstice(int year, double UTCoffset, double *equinoxdays, double *solsticedays);
+int calculatesunlongitude30(int year, int degreeGMToffset, int *ichinesemonths);
+
+#ifdef WITH_ICONV
+void set_new_encoding(void);
+#endif
diff --git a/usr.bin/calendar/calendars/calendar.all b/usr.bin/calendar/calendars/calendar.all
new file mode 100644
index 000000000000..6ed1ccee6ea0
--- /dev/null
+++ b/usr.bin/calendar/calendars/calendar.all
@@ -0,0 +1,24 @@
+/*
+ * International and national calendar files
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _calendar_all_
+#define _calendar_all_
+
+#include <calendar.world>
+#include <calendar.australia>
+#include <calendar.brazilian>
+#include <calendar.croatian>
+#include <calendar.dutch>
+#include <calendar.french>
+#include <calendar.german>
+#include <calendar.hungarian>
+#include <calendar.newzealand>
+#include <calendar.russian>
+#include <calendar.southafrica>
+#include <calendar.ukrainian>
+#include <calendar.usholiday>
+
+#endif /* !_calendar_all_ */
diff --git a/usr.bin/calendar/calendars/calendar.australia b/usr.bin/calendar/calendars/calendar.australia
new file mode 100644
index 000000000000..d0865349f7b3
--- /dev/null
+++ b/usr.bin/calendar/calendars/calendar.australia
@@ -0,0 +1,72 @@
+/*
+ * Australian holidays
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _calendar_australia_
+#define _calendar_australia_
+
+LANG=en_AU.ISO8859-1
+
+/* Australia */
+Jan 26 Australia Day
+Apr/SunFirst Daylight Savings Time ends in ACT, NSW, SA, TAS and VIC.
+Apr 25 Anzac Day
+Jun/MonSecond Queen's Birthday Holiday (Australia, except WA)
+Oct/SunFirst Daylight Savings Time starts in ACT, NSW, SA and VIC.
+
+/* ACT, NSW, common */
+Mar/MonSecond Canberra Day (ACT)
+Sep/MonLast Family & Community Day (ACT)
+Aug/MonFirst Bank Holiday (ACT, NSW)
+Oct/MonFirst Labour Day (ACT, NSW, SA)
+
+/* Victoria */
+Mar/MonSecond Labour Day (VIC)
+Nov/TueFirst Melbourne Cup (VIC)
+
+/* Tasmania
+ * http://www.wst.tas.gov.au/employment_info/public_holidays/html/2010
+ */
+Feb/MonSecond Regatta Day (TAS)
+Feb/WedLast Launceston Cup (TAS)
+Mar/TueFirst King Island show (TAS)
+Mar/MonSecond Eight Hours Day (TAS)
+Oct 10 Launceston Show Day (TAS) /* Thursday preceding second Saturday in October */
+Oct 24 Hobart Show Day (TAS) /* Thursday preceding fourth Saturday in October */
+Nov/MonFirst Recreation Day (N TAS)
+
+/*
+Oct/SatSecond-2 Launceston Show Day (TAS) // Thursday preceding second Sat in October
+Oct/SatFourth-2 Hobart Show Day (TAS) // Thursday preceding fourth Sat in October
+May/ThuFirst+1 Agfest (Circular Head only) // Friday following the first Thursday in May
+Oct/SatFirst-1 Burnie Show // Friday preceding first Saturday in October
+Oct/SatThird-1 Flinders Island Show // Friday preceding third Saturday in October
+
+DEVONPORT CUP Wednesday not earlier than fifth and not later than eleventh day of January
+DEVONPORT SHOW Friday nearest last day in November, but not later than first day of December
+*/
+
+/* South Australia */
+May/MonThird Adelaide Cup (SA)
+Dec 26 Proclamation Day holiday (SA)
+
+/* Western Australia */
+Mar/MonFirst Labour Day (WA)
+Jun/MonFirst Foundation Day (WA)
+Sep 30 Queen's Birthday (WA)
+
+/* Northern Territory */
+May/MonFirst May Day (NT)
+Jul/FriFirst Alice Springs Show Day (NT)
+Jul/FriSecond Tennant Creek Show Day (NT)
+Jul/FriThird Katherine Show Day (NT)
+Jul/FriLast Darwin Show Day (NT)
+Aug/MonFirst Picnic Day (NT)
+
+/* Queensland */
+May/MonFirst Labour Day (QLD)
+Aug/WedSecond RNA Show Day (Brisbane metro) /* Second Last Wednesday */
+
+#endif
diff --git a/usr.bin/calendar/calendars/calendar.birthday b/usr.bin/calendar/calendars/calendar.birthday
new file mode 100644
index 000000000000..60b505656ceb
--- /dev/null
+++ b/usr.bin/calendar/calendars/calendar.birthday
@@ -0,0 +1,304 @@
+/*
+ * Birthday
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _calendar_birthday_
+#define _calendar_birthday_
+#undef unix
+
+01/01 J.D. Salinger born, 1919
+01/01 Paul Revere born in Boston, 1735
+01/02 Isaac Asimov born in Petrovichi, Russian SFSR, 1920
+01/04 George Washington Carver born in Missouri, 1864
+01/04 Jakob Grimm born, 1785
+01/04 Wilhelm Beer born, 1797, first astronomer to map Mars
+01/05 DeWitt B. Brace born, 1859, inventor of spectrophotometer
+01/10 Ethan Allen born, 1738
+01/11 Alexander Hamilton born in Nevis, British West Indies, 1757?
+01/12 "Long" John Baldry is born in London, 1941
+01/13 Horatio Alger born, 1834
+01/13 Sophie Tucker born, 1884
+01/13 Wilhelm Wien born, 1864, Nobel prize for blackbody radiation laws
+01/14 Albert Schweitzer born, 1875
+01/15 Martin Luther King, Jr. born
+01/17 Benjamin Franklin born in Boston, 1706
+01/19 Edgar Allan Poe born in Boston, 1809
+01/19 Robert Edward Lee born in Stratford Estate, Virginia, 1807
+01/20 George Burns born, 1898
+01/21 Lenin died, 1924
+01/21 Thomas Jonathan "Stonewall" Jackson born in Clarksburg, VA, 1824
+01/22 Sir Francis Bacon born, 1561
+01/23 Ernst Abbe born, 1840, formulated diffraction theory
+01/23 Humphrey Bogart born in New York City, 1899
+01/23 John Hancock born, 1737
+01/23 Joseph Hewes born, 1730
+01/23 Samuel Barber died, 1981
+01/24 John Belushi is born in Chicago, 1949
+01/25 Robert Burns born, 1759
+01/25 Virginia Woolf born, 1882
+01/25 W. Somerset Maugham born, 1874
+01/27 Samuel Gompers born, 1850
+01/30 Franklin Delano Roosevelt born in Hyde Park, New York, 1882
+01/31 Jackie Robinson born, 1919
+02/03 Gertrude Stein born, 1874
+02/04 Ken Thompson, creator of unix, born, 1943
+02/05 Alex Harvey (SAHB) is born in Glasgow, Scotland, 1935
+02/06 King George VI of UK dies; his daughter becomes Elizabeth II, 1952
+02/07 Sinclair Lewis born, 1885
+02/08 Friedleib F. Runge born, 1795, father of paper chromatography
+02/08 Jules Verne born in Nantes, France, 1828
+02/09 George Hartmann born, 1489, designed astrolabes, timepieces, etc.
+02/10 Charles Lamb born, 1775
+02/10 William Allen White born, 1868
+02/11 Thos. Edison born, 1847
+02/11 William Henry Fox Talbot (photographic pioneer) born, 1800
+02/12 Abraham Lincoln born, 1809
+02/12 Charles Darwin born in Shrewsbury, England, 1809
+02/15 Galileo Galilei born in Pisa, Italy, 1564
+02/15 Susan B. Anthony born, 1820
+02/16 Pierre Bouguer born, 1698, founder of photometry
+02/17 Federick Eugene Ives born, 1856, pioneer of halftone
+02/17 Marion Anderson born, 1902
+02/17 T. J. Watson, Sr. born, 1874
+02/18 Ernst Mach born, 1838, philosopher & optics pioneer
+02/19 Nicolas Copernicus born in Thorn, Poland, 1473
+02/20 Ludwig Boltzmann born, 1838, atomic physics pioneer
+02/21 Alexis De Rochon born, 1838, developed the spyglass
+02/22 George Washington born, 1732
+02/22 Pierre Jules Cesar Janssen born, 1838, found hydrogen in the sun
+02/23 W.E.B. DuBois born, 1868
+02/24 Winslow Homer born, 1836
+02/24 Steve Jobs born, 1955
+02/25 George Harrison born in Liverpool, England, 1943
+02/25 Renoir born, 1841
+02/26 Dominique Francois Jean Arago born, 1786;
+ observed "Poisson's spot" cf June 21
+02/28 Michel de Mantaigne born, 1533
+02/29 Herman Hollerith born, 1860
+03/01 David Niven born, 1910
+03/02 Dr. Seuss born, 1904
+03/04 Casimir Pulaski born, 1747
+03/05 John Belushi dies in Los Angeles, 1982
+03/07 Sir John Frederick William Herschel born, 1792, astronomer
+03/08 Alvan Clark born, 1804, astronomer & lens manufacturer
+03/08 Howard Aiken born, 1900
+03/11 Robert Treat Paine born, 1737
+03/11 Vannevar Bush born, 1890
+03/12 Gustav Robert Kirchhoff born, 1824, physicist
+03/14 Albert Einstein born, 1879
+03/14 Casey Jones born, 1864
+03/14 Giovanni Virginia Schiaparelli born, 1835, astronomer;
+ named Mars "canals"
+03/14 Jean Baptiste Joseph Fourier born, 1768, mathematician & physicist
+03/15 Andrew "Old Hickory" Jackson, 7th President of the United States,
+ born in Waxhaw, South Carolina, 1767
+03/15 J.J. Robert's Birthday in Liberia
+03/16 George Clymer born, 1739
+03/16 James Madison, 4th President of the United States, born in King George
+ County, Virginia, 1751
+03/21 NetBSD project born, 1993
+03/24 Harry Houdini born, 1874
+03/26 Benjamin Thompson born, 1753, Count Rumford; physicist
+03/26 David Packard died, 1996; age of 83
+03/27 Wilhelm Conrad Roentgen born, 1845, discoverer of X-rays
+03/28 Pierre Simon de Laplace born, 1749, mathematician & astronomer
+03/30 Francisco Jose de Goya born, 1746
+03/30 Sean O'Casey born, 1880
+03/30 Vincent Van Gogh born, 1853
+03/31 Rene Descartes born, 1596, mathematician & philosopher
+04/02 Hans Christian Andersen born, 1805, fairy tale author
+04/02 Pope John Paul II (Karol Wojtyla) died in Vatican, 2005
+04/03 Washington Irving born, 1783
+04/05 Thomas Hobbes born, 1588, philosopher
+04/08 Buddha born, 563 BC
+04/08 David Rittenhouse born, 1732, astronomer & mathematician
+04/09 Edward Muybridge born, 1830, motion-picture pioneer
+04/09 J. Presper Eckert born, 1919
+04/10 Commodore Matthew Calbraith Perry born, 1794
+04/10 William Booth born, 1829, founder of the Salvation Army
+04/13 Thomas Jefferson, 3rd President of the United States, born Shadwell
+ Plantation, Albemarle County, Virginia, 1743
+04/14 Christiaan Huygens born, 1629, physicist & astronomer;
+ discovered Saturn's rings
+04/15 Leonardo da Vinci born, 1452
+04/16 Charles (Charlie) Chaplin (Sir) born in London, 1889
+04/22 Kant born, 1724
+04/27 Louis Victor de Broglie born, 1774, physicist
+04/28 James Monroe, 5th President of the United States, born in Westmoreland
+ County, Viriginia, 1758
+04/29 Jules Henri Poincare born, 1854, founder of topology
+04/29 William Randolph Hearst born in San Francisco, 1863
+04/30 Karl Friedrich Gauss born, 1777, mathematician & astronomer
+05/01 Little Walter (Marion Walter Jacobs) is born in Alexandria,
+ Louisiana, 1930
+05/02 Dr. Benjamin Spock born, 1903
+05/04 Alice Liddell born, 1852, Alice's Adventures in Wonderland
+ & Through the Looking-Glass
+05/09 Pinza died, 1957
+05/10 Fred Astaire (Frederick Austerlitz) born in Omaha, Nebraska, 1899
+05/11 Johnny Appleseed born, 1768
+05/12 Florence Nightingale born in Florence, Italy, 1820
+05/13 Arthur S. Sullivan born, 1842
+05/15 Mike Oldfield is born in Essex, England, 1953
+05/18 Pope John Paul II (Karol Wojtyla) born in Wadowice, Poland, 1920
+05/19 Ho Chi Minh born, 1890
+05/21 Plato (Aristocles) born in Athens(?), 427BC
+05/27 Hubert H. Humphrey born, 1911
+05/28 Dionne quintuplets born, 1934
+05/29 Gilbert Keith Chesterton born, 1874
+05/29 John Fitzgerald Kennedy, 35th President of the United States, born in
+ Brookline, Massachusetts, 1917
+05/29 Patrick Henry born, 1736
+05/30 Mel (Melvin Jerome) Blanc born in San Francisco, 1908
+06/01 Brigham Young born, 1801
+06/01 Marilyn Monroe born, 1928
+06/02 Edward Elgar (Sir) born in Worcester, England, 1857
+06/03 Henry James born, 1811
+06/07 (Eugene Henri) Paul Gaugin born, 1848
+06/07 George Bryan "Beau" Brummel born, 1778
+06/07 Alan Mathison Turing died, 1954
+06/08 Frank Lloyd Wright born in Richland Center, Wisconsin, 1867
+06/13 Alexander the Great dies (323BC)
+06/15 Edvard Hagerup Grieg born in Bergen, Norway, 1843
+06/16 Hammurabi the Great dies, Babylon, 1686 BC
+06/18 M.C. Escher born, 1898
+06/19 FreeBSD project born, 1993
+06/22 Carl Hubbell born, 1903
+06/22 Meryl Streep born in Summit, New Jersey, 1949
+06/22 Konrad Zuse born in Berlin, 1919
+06/23 Alan Mathison Turing born, 1912
+06/25 Eric Arthur Blair (a.k.a. George Orwell) born, 1903
+06/27 Helen Keller born, 1880
+07/03 Franz Kafka born, 1883
+07/04 Nathaniel Hawthorne born in Salem, Massachusetts, 1804
+07/04 John Adams and Thomas Jefferson die on same day, 1826
+07/06 (Helen) Beatrix Potter born, 1866
+07/06 John Paul Jones born, 1747
+07/07 P.T. Barnum dies, 1891
+07/08 Count Ferdinand von Zeppelin born, 1838
+07/10 John Calvin born, 1509
+07/11 John Quincy Adams, 6th President of the United States, born in
+ Braintree, Massachusetts, 1767
+07/12 Henry David Thoreau born, 1817
+07/15 Clement Clarke Moore born, 1779, author of "A Visit from
+ Saint Nicholas"
+07/18 Brian Auger is born in London, 1939
+07/25 Steve Goodman is born in Chicago, 1948
+07/29 Mussolini born, 1883
+07/30 Emily Bronte born, 1818
+07/30 Henry Ford born, 1863
+08/01 Herman Melville born, 1819
+08/03 Lenny Bruce dies of a morphine overdose, 1966
+08/06 Jonathan B. Postel is born in Altadena, California, 1943
+08/08 Dustin Hoffman born in Los Angeles, 1937
+08/12 Thomas Mann's Death, 1955
+08/13 Alfred Hitchcock born, 1899
+08/13 Annie Oakley born, 1860
+08/13 Fidel Castro born, 1927
+08/17 Mae West born, 1892
+08/18 Meriwether Lewis born, 1774
+08/20 Leon Trotsky assassinated, 1940
+08/21 Christopher Robin Milne born, 1920
+08/21 Winnie-the-Pooh (Edward Bear) born (given to Christopher Robin
+ Milne), 1921
+08/23 Gene Kelly born, 1912
+08/27 Lyndon B. Johnson born, 1908
+08/29 Oliver Wendell Holmes born, 1809, physician & father of the jurist
+08/30 John W. Mauchly born, 1907
+09/05 King Louis XIV of France born, 1638
+09/05 Raquel Welch born, 1942
+09/06 Word is received that Perry has reached the North Pole and died, 1909
+09/07 James Fenimore Cooper born in Burlington, NJ, 1789
+09/07 Queen Elizabeth I of England born, 1533
+09/08 Richard ``the Lionheart'', king of England born in Oxford, 1157
+09/08 Peter Sellers born in Southsea, England, 1925
+09/09 Chinese Communist Party Chairman Mao Tse-Tung dies at age 82, 1976
+09/09 Dennis MacAlistair Ritchie, creator of C, born, 1941
+09/12 Jesse Owens born, 1913
+09/13 Walter Reed born, 1851
+09/15 Agatha Christie born in Torquay, England, 1890
+09/16 Allen Funt born in Brooklyn, NY, 1914
+09/18 Greta Garbo born, 1905
+09/18 Jimi Hendrix dies from an overdose, 1970
+09/20 Upton (Beall) Sinclair born, 1878
+09/21 H.G. (Herbert George) Wells born in Bromley, England, 1866
+09/21 Louis Joliet born, 1645
+09/22 President Garfield dies of wounds in Baltimore, 1881
+09/23 Augustus (Gaius Octavius) Caesar born in Rome, 63 BC
+09/23 Euripides born in Salamis, Greece, 480 BC
+09/24 F. Scott Fitzgerald born, 1896
+09/26 Johnny Appleseed born, 1774
+09/26 T.S. (Thomas Stearns) Eliot born in St. Louis, 1888
+09/27 Thomas Nast born, 1840
+09/28 Michelangelo Buonarroti born in Caprese, Italy, 1573
+09/28 Pompey (Gnaeus Pompeius Magnus) born in Rome, 106BC
+09/28 Seymour Cray born, 1925
+09/29 Gene Autry born, 1907
+10/01 Jimmy Carter, 39th President of United States, born in Plains, Georgia,
+ 1924
+10/02 Aristotle dies of indigestion, 322 BC
+10/02 Mohandas K. Gandhi born at Porbandar, Kathiawad, India, 1869
+10/04 John V. Atanasoff born, 1903
+10/05 Ray Kroc (founder of McDonald's) born, 1902
+10/05 Steve Jobs died at the age of 56, 2011
+10/12 Dennis MacAlistair Ritchie died at the age of 70, 2011
+10/13 Lenny Bruce is born in New York City, 1925
+10/13 Virgil (Publius Vergilius Maro) born near Mantua, Italy, 70 BC
+10/14 Dwight David Eisenhower, 34th President of the United States, born in
+ Denison, Texas, 1890
+10/14 William Penn born in London, 1644
+10/15 Pelham Grenville Wodehouse born, 1881
+10/16 Noah Webster born, 1758
+10/16 Oscar (Fingal O'Flahertie Wills) Wilde born in Dublin, 1854
+10/16 Dr. Jonathan B. Postel dies at age 55, 1998
+10/17 Richard Mentor Johnson born, 1780, 9th V.P. of U.S.
+10/21 Alfred Nobel born in Stockholm, 1833
+10/25 Pablo Picasso born in Malaga, Spain, 1881
+10/27 James Cook is born, 1728
+10/27 Theodore (Teddy) Roosevelt, 26th President of the United States, born
+ New York, New York, 1858
+10/27 Gerald M. Weinberg born, 1933
+10/30 John Adams, 2nd President of the United States, born Quincy,
+ Massachusetts 1735.
+10/31 Chiang Kai-Shek born, 1887
+10/31 Dale Evans born, 1912
+11/02 Daniel Boone born near Reading, PA, 1734
+11/04 King William III of Orange born, 1650
+11/05 Roy Rogers born, 1912
+11/09 Carl Sagan born, 1934
+11/10 Martin Luther born in Eisleben, Germany, 1483
+11/10 Soviet President Leonid Brezhnev dies at age 75, 1982
+11/11 Kurt Vonnegut, Jr, born in Indianapolis, 1922
+11/13 Robert Louis Stevenson born, 1850
+11/13 St. Augustine of Hippo born in Numidia, Algeria, 354
+11/18 Imogene Coca born, 1908
+11/18 William S. Gilbert born, 1836
+11/20 Robert Francis Kennedy (RFK) born in Boston, Massachusetts, 1925
+11/26 Charles Schulz born in Minneapolis, 1922
+11/26 Norbert Wiener born in Columbia, Missouri, 1894
+11/29 John Mayall is born in Cheshire, England, 1933
+11/30 Cleopatra died, 30 BC
+11/30 Mark Twain (Samuel Clemmens) born in Florida, Missouri, 1835
+12/01 Woody Allen (Allen Stuart Konigsberg) born in Brooklyn, NY, 1935
+12/04 Tommy Bolin dies of a heroin overdose in Miami, 1976
+12/05 Martin Van Buren, 8th President of the United States, born in
+ Kinderhook, New York, 1837
+12/05 Walt (Walter Elias) Disney born in Chicago, 1901
+12/08 Horace (Quintus Horatius Flaccus) born in Venosa (Italy), 65BC
+12/08 James (Grover) Thurber born in Columbus, Ohio, 1894
+12/10 Emily Dickenson born, 1830
+12/12 E.G. Robinson born, 1893
+12/14 George Washington dies, 1799
+12/17 William Safire (Safir) born, 1929
+12/18 Konrad Zuse died in Hünfeld, 1995
+12/20 Carl Sagan died, 1996
+12/21 Benjamin Disraeli born, 1804
+12/22 Giacomo Puccini born, 1858
+12/23 Joseph Smith born, 1805
+12/25 Isaac Newton (Sir) born in Grantham, England, 1642
+12/26 Chas. Babbage born, 1791
+12/28 John von Neumann born, 1903
+
+#endif /* !_calendar_birthday_ */
diff --git a/usr.bin/calendar/calendars/calendar.brazilian b/usr.bin/calendar/calendars/calendar.brazilian
new file mode 100644
index 000000000000..d847cb3f4034
--- /dev/null
+++ b/usr.bin/calendar/calendars/calendar.brazilian
@@ -0,0 +1,13 @@
+/*
+ * $FreeBSD$
+ *
+ * Brazilian calendar file(s), originally submitted by
+ * Renato Tambellini <rtsanch@gmail.com>
+ */
+
+#ifndef _calendar_brazilian_
+#define _calendar_brazilian_
+
+#include <pt_BR.ISO8859-1/calendar.all>
+
+#endif
diff --git a/usr.bin/calendar/calendars/calendar.christian b/usr.bin/calendar/calendars/calendar.christian
new file mode 100644
index 000000000000..f213594f84cc
--- /dev/null
+++ b/usr.bin/calendar/calendars/calendar.christian
@@ -0,0 +1,36 @@
+/*
+ * Christian
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _calendar_christian_
+#define _calendar_christian_
+
+01/01 Solemnity of Mary, Mother of God
+01/05 Last (twelfth) day of Christmastide
+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
+08/15 Assumption of the Blessed Virgin Mary
+10/18 Feast Day of St. Luke
+11/01 All Saints' Day
+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
+12/08 Feast of the Immaculate Conception
+12/24 Christmas Eve
+12/25 Christmastide begins: First day of Christmas
+12/26 Second day of Christmas (Boxing Day)
+
+#endif /* !_calendar_christian_ */
diff --git a/usr.bin/calendar/calendars/calendar.computer b/usr.bin/calendar/calendars/calendar.computer
new file mode 100644
index 000000000000..8d6176e25f38
--- /dev/null
+++ b/usr.bin/calendar/calendars/calendar.computer
@@ -0,0 +1,76 @@
+/*
+ * Computer
+ *
+ * $FreeBSD$
+ */
+
+#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
+01/08 American Telephone and Telegraph loses antitrust case, 1982
+01/08 Herman Hollerith patents first data processing computer, 1889
+01/08 Justice Dept. drops IBM suit, 1982
+01/10 First CDC 1604 delivered to Navy, 1960
+01/16 Set uid bit patent issued, to Dennis Ritchie, 1979
+01/17 Justice Dept. begins IBM anti-trust suit, 1969 (drops it, January 8, 1982)
+01/24 DG Nova introduced, 1969
+01/25 First U.S. meeting of ALGOL definition committee, 1958
+01/26 EDVAC demonstrated, 1952
+01/31 Hewlett-Packard founded, 1939
+02/11 Last day of JOSS service at RAND Corp., 1966
+02/14 First micro-on-a-chip patented (TI), 1978
+02/15 ENIAC demonstrated, 1946
+03/01 First NPL (later PL/I) report published, 1964
+03/04 First Cray-1 shipped to Los Alamos
+03/09 "GOTO considered harmful" (E.J. Dijkstra) published in CACM, 1968
+03/14 LISP introduced, 1960
+03/28 DEC announces PDP-11, 1970
+03/31 Eckert-Mauchly Computer Corp. founded, Phila, 1946
+04/01 Yourdon, Inc. founded, 1974 (It figures.)
+04/03 IBM 701 introduced, 1953
+04/04 Tandy Corp. acquires Radio Shack, 1963 (9 stores)
+04/07 IBM announces System/360, 1964
+04/09 ENIAC Project begun, 1943
+04/28 Zilog Z-80 introduced, 1976
+05/06 EDSAC demonstrated, 1949
+05/01 First BASIC program run at Dartmouth, 1964
+05/16 First report on SNOBOL distributed (within BTL), 1963
+05/19 UNIX is 10000 days old, 1997
+05/21 DEC announces PDP-8, 1965
+05/22 Ethernet first described, 1973
+05/27 First joint meeting of U.S. and European ALGOL definition cte., 1958
+05/28 First meeting of COBOL definition cte. (eventually CODASYL), 1959
+05/30 Colossus Mark II, 1944
+06/02 First issue of Computerworld, 1967
+06/07 Alan Mathison Turing died, 1954
+06/10 First Apple II shipped, 1977
+06/15 UNIVAC I delivered to the Census Bureau, 1951
+06/16 First publicized programming error at Census Bureau, 1951
+06/23 IBM unbundles software, 1969
+06/23 Alan Mathison Turing born, 1912
+06/30 First advanced degree on computer related topic: to H. Karamanian,
+ Temple Univ., Phila, 1948, for symbolic differentiation on the ENIAC
+07/08 Bell Telephone Co. formed (predecessor of AT&T), 1877
+07/08 CDC incorporated, 1957
+07/FriLast System Administrator Appreciation Day
+08/14 First Unix-based mallet created, 1954
+08/14 IBM PC announced, 1981
+08/22 CDC 6600 introduced, 1963
+08/23 DEC founded, 1957
+09/15 ACM founded, 1947
+09/20 Harlan Herrick runs first FORTRAN program, 1954
+10/02 First robotics-based CAM, 1939
+10/06 First GPSS manual published, 1961
+10/08 First VisiCalc prototype, 1978
+10/12 Univac gives contract for SIMULA compiler to Nygaard and Dahl, 1962
+10/14 British Computer Society founded, 1957
+10/15 First FORTRAN Programmer's Reference Manual published, 1956
+10/20 Zurich ALGOL report published, 1958
+10/25 DEC announces VAX-11/780, 1977
+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_ */
diff --git a/usr.bin/calendar/calendars/calendar.croatian b/usr.bin/calendar/calendars/calendar.croatian
new file mode 100644
index 000000000000..443122744d3f
--- /dev/null
+++ b/usr.bin/calendar/calendars/calendar.croatian
@@ -0,0 +1,12 @@
+/*
+ * Croatian calendar files
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _calendar_croatian_
+#define _calendar_croatian_
+
+#include <hr_HR.ISO8859-2/calendar.all>
+
+#endif /* !_calendar_croatian_ */
diff --git a/usr.bin/calendar/calendars/calendar.dutch b/usr.bin/calendar/calendars/calendar.dutch
new file mode 100644
index 000000000000..13a456b2ec48
--- /dev/null
+++ b/usr.bin/calendar/calendars/calendar.dutch
@@ -0,0 +1,79 @@
+/*
+ * $FreeBSD$
+ *
+ * Originally submitted by Edwin Groothuis <edwin@FreeBSD.org>
+ */
+
+LANG=nl_NL.ISO8859-15
+Easter=Pasen
+
+/*
+ * Feestdagen
+ */
+jan/01 Nieuwjaar
+jan/06 Driekoningen
+apr/01 1 april
+apr/27 Koningsdag
+mei/01 Dag van de Arbeid
+mei/04 Dodenherdenking
+mei/05 Bevrijdingsdag
+okt/04 Dierendag
+nov/01 Allerheiligen
+nov/02 Allerzielen
+nov/11 Sint Maarten
+nov/11 Elfde-van-de-elfde
+dec/05 Sinterklaasavond
+dec/15 Koninkrijksdag
+dec/24 Kerstavond
+dec/25 Eerste Kerstdag
+dec/26 Tweede Kerstdag
+dec/28 Feest der Onnozele Kinderen
+dec/31 Oudjaar
+
+/*
+ * Pasen gerelateerd
+ */
+Pasen-50 Carnaval
+Pasen-49 Carnaval
+Pasen-48 Carnaval
+Pasen-47 Carnaval (Vastenavond)
+Pasen-46 Aswoensdag
+Pasen-7 Palmzondag
+Pasen-3 Witte Donderdag
+Pasen-2 Goede Vrijdag
+Pasen-1 Stille Zaterdag
+Pasen Eerste Paasdag
+Pasen+1 Tweede Paasdag
+Pasen+39 Hemelvaartsdag
+Pasen+49 Eerste Pinksterdag
+Pasen+50 Tweede Pinksterdag
+Pasen+56 Trinitatis
+
+/*
+ * Misc
+ */
+mei/SunSecond Moederdag
+jun/SunThird Vaderdag
+sep/TueThird Prinsjesdag
+
+/*
+ * Het koningshuis
+ */
+jan/19 Prinses Margriet (1943)
+jan/31 Prinses Beatrix (1938)
+feb/17 Prins Willem III (1817 - 1890)
+feb/18 Prinses Christina (1947)
+apr/10 Prinses Ariane (2007)
+apr/19 Prins Hendrik (1876 - 1934)
+apr/27 Koning Willem-Alexander (1967)
+apr/30 Prinses Juliana (1909 - 2004)
+apr/30 Mr. Pieter van Vollenhoven (1939)
+mei/17 Koningin Maxima (1971)
+jun/26 Prinses Alexia (2005)
+jun/29 Prins Bernhard (1911 - 2004)
+aug/05 Prinses Irene (1939)
+aug/31 Prinses Wilhelmina (1880 - 1962)
+sep/06 Prins Claus (1925 - 2002)
+sep/25 Prins Johan Friso (1968 - 2013)
+okt/11 Prins Constantijn (1969)
+dec/07 Kroonprinses Catharina-Amalia (2003)
diff --git a/usr.bin/calendar/calendars/calendar.french b/usr.bin/calendar/calendars/calendar.french
new file mode 100644
index 000000000000..18b4d8ae8a94
--- /dev/null
+++ b/usr.bin/calendar/calendars/calendar.french
@@ -0,0 +1,12 @@
+/*
+ * French calendar file(s)
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _calendar_french_
+#define _calendar_french_
+
+#include <fr_FR.ISO8859-1/calendar.all>
+
+#endif /* !_calendar_french_ */
diff --git a/usr.bin/calendar/calendars/calendar.german b/usr.bin/calendar/calendars/calendar.german
new file mode 100644
index 000000000000..635aef1d5735
--- /dev/null
+++ b/usr.bin/calendar/calendars/calendar.german
@@ -0,0 +1,12 @@
+/*
+ * German calendar file(s)
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _calendar_german_
+#define _calendar_german_
+
+#include <de_DE.ISO8859-1/calendar.all>
+
+#endif /* !_calendar_german_ */
diff --git a/usr.bin/calendar/calendars/calendar.history b/usr.bin/calendar/calendars/calendar.history
new file mode 100644
index 000000000000..8493bd00d24b
--- /dev/null
+++ b/usr.bin/calendar/calendars/calendar.history
@@ -0,0 +1,475 @@
+/*
+ * History
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _calendar_history_
+#define _calendar_history_
+
+01/01 Anniversary of the Triumph of the Revolution in Cuba
+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)
+01/05 -50 degrees F, Strawberry UT, 1913
+01/05 The FCC hears the first demonstration of FM radio, 1940
+01/05 Twelfth night
+01/06 Millard Fillmore's birthday (let's party!)
+01/08 Battle of New Orleans
+01/09 Plough Monday
+01/10 First meeting of United Nations General Assembly in London, 1946
+01/10 Thomas Paine's Common Sense published, 1776
+01/11 Anniversary of the Peoples Republic of Albania
+01/11 De Hostos' Birthday in Puerto Rico
+01/11 Milk delivered in bottles for first time, 1878
+01/11 Prithvi Jayanti in Nepal
+01/11 Surgeon General condemned cigarettes, 1964
+01/11 The Whiskey-A-Go-Go opens on Sunset Boulevard in Los Angeles, 1963
+01/14 The first "Be-In" is held in Golden Gate Park, 1967
+01/16 Prohibition begins, 1920
+01/18 Grey whale migration, California
+01/20 St. Agnes Eve (Ah, bitter chill it was...)
+01/24 Eskimo Pie patented by Christian Nelson, 1922
+01/24 Gold discovered in California at Sutter's Mill, 1848
+01/26 Sydney, New South Wales settled, 1788
+01/27 Grissom, White and Chaffe burned to death in Apollo 1, 1967
+01/27 Vietnam War cease-fire signed, 1973
+01/28 First ski tow, Woodstock VT, 1914
+01/28 Space Shuttle Challenger (51-L) explodes 74 seconds after liftoff
+ killing Scobee, Smith, McNair, Resnick, Jarvis, Onizuka and McAuliffe,
+ 1986
+01/30 Mohandas Gandhi assassinated in New Delhi by Hindu fanatic, 1948
+01/30 Tet Offensive, 1968
+01/31 "Ham" the chimpanzee soars into space aboard Mercury-Redstone 2, 1961
+01/31 Explorer I launched, 1958. Van Allen Belt discovered
+01/31 Irving Langmuir, 1881, invented tungsten filament lamp
+02/01 First TV soap: Secret Storm, 1954
+02/01 Forces led by Khomeini take over Iran, 1979
+02/01 Space Shuttle Columbia (STS-107) disintegrates 15 minutes before landing
+ killing Husband, McCool, Chawla, Clark, Ramon, Brown, and Anderson, 2003
+02/04 Cybernet inaugurated, 1969
+02/04 Patricia Hearst kidnapped by Symbionese Liberation Army, 1974
+02/08 1963 Revolution Anniversary in Iraq
+02/09 -51 degrees F, Vanderbilt MI, 1934
+02/12 US President Abraham Lincoln's real birthday
+02/12 Santa Barbara oil leak, 1969
+02/14 Bombing of Dresden, 1945
+02/15 Chicago Seven convicted, 1970
+02/16 Nylon patented, 1937
+02/16 Stephen Decatur burns US frigate in Tripoli, 1804
+02/18 Pluto discovered by Clyde Tombaugh, Lowell Observatory, AZ, 1930
+02/19 US Marines land on Iwo Jima, 1945
+02/20 John Glenn orbits the Earth 3 times, 1962
+02/21 Battle of Verdun begins, 1916 1M casualties
+02/21 First telephone directory, New Haven, Connecticut, 1878
+02/21 Malcom X shot to death in Harlem, 1965
+02/23 Lt. Calley confesses, implicates Cpt. Medina, 1971
+02/24 Impeachment proceedings against Andrew Johnson begin, 1868
+02/28 The "French Connection" drug bust occurs in Marseilles, 1972
+02/29 French and Indian raid on Deerfield MA, 1704
+03/01 Sarah Goode, Sarah Osborne, and Tituba arrested for witchcraft
+ in Salem, Massachusetts, 1692
+03/02 Blackthorn winds (New England)
+03/04 First meeting of Congress, 1789, in N.Y.C.
+03/13 "Striptease" introduced, Paris, 1894
+03/14 Teddy Roosevelt excludes Japanese laborers from continental US, 1907
+03/15 Day of the 1848 revolution in Hungary
+03/15 Buzzards return to Hinckley OH
+03/15 France assumes protectorate over Vietnam, 1874
+03/15 Watts, Los Angeles, riots kill two, injure 25, 1966
+03/15 Ides of March. Gaius Julius Caesar assassinated by senators,
+ including adoptive son Marcus Junius Brutus Caepio, 44BC
+03/16 MyLai Massacre; 300 non-combatant villagers killed by US infantrymen
+03/16 Robert Goddard launches first liquid-fueled rocket, Auburn MA, 1926
+03/17 Vanguard I launched, 1958. Earth proved pear-shaped
+03/18 Aleksei Leonov performs first spacewalk, 1965
+03/19 Swallows return to Capistrano
+03/20 Radio Caroline, the original British pirate radio station, sinks, 1980
+03/24 Construction of New York subway system begins, 1900
+03/25 Triangle Shirt Waist Fire, 1911
+03/26 Popeye statue unveiled, Crystal City TX Spinach Festival, 1937
+03/27 Khrushchev becomes Premier of Soviet Union, 1958
+03/28 Three Mile Island releases radioactive gas, 1979
+03/29 Swedish settled Christiana (Wilmington) DE, 1638
+03/30 Alaska purchased from Russia for $7.2 million, 1867
+03/30 Five rings around Uranus discovered, 1977
+03/30 Pencil with eraser patented, 1858
+04/01 People of superb intelligence, savoir-faire, etc. born this day.
+04/04 Martin Luther King assassinated in Memphis, Tennessee, 1968
+04/04 NATO Established, 1949
+04/06 Joseph Smith founds Mormon Church, 1830
+04/07 Alewives run, Cape Cod
+04/08 Matthew Flinders and Nicolas Baudin meet in Encounter Bay, 1802
+04/09 Lee surrenders to Grant at Appomattox Courthouse, 1865
+04/12 Confederate troops fire first shots of Civil War at Ft Sumter, 1861
+04/12 Space Shuttle Columbia launched, 1981
+04/12 Yuri Gagarin becomes the first man in space, 1961
+04/13 Laotian New Year (3 days) in Laos
+04/14 US President Abraham Lincoln shot in Ford's Theatre by John Wilkes Booth, 1865
+04/14 Titanic hits iceberg and sinks, 1912
+04/15 US President Abraham Lincoln dies, 1865
+04/15 Ray Kroc opens first McDonalds in Des Plaines, IL, 1955
+04/17 Bay of Pigs invasion crushed by Castro forces, 1961
+04/18 Einstein's Death, 1955
+04/18 First Laundromat opens, Fort Worth Texas, 1934
+04/18 San Francisco earthquake, 1906
+04/19 Landing of the "33" in Uruguay
+04/19 Warsaw Ghetto uprising, 1943
+04/20 Supreme Court unanimously rules in favor of busing, 1971
+04/21 Lyrid meteor shower
+04/22 Vladimir Ilich Ulyanov, called Lenin, Russian political leader, born in Simbirsk, 1870
+04/23 Hank Aaron hits his first home run, 1954
+04/26 William Shakespeare baptized in Stratford-on-Avon, England, 1564,
+ birthdate unknown
+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/04 Four Kent State students are shot down by the National Guard, 1970
+05/05 John Scopes arrested for teaching evolution, Dayton, TN, 1925
+05/06 Hindenburg explodes and burns upon landing at Lakehurst, NJ, 1937
+05/07 Germany surrenders after WWII, 1945
+05/08 Beginning of ostrich mating season
+05/08 US institutes mining of Haiphong Harbor, 1972
+05/09 94 degrees, New York, 1979
+05/10 Germany invades Low Countries, 1940
+05/10 Nazi bookburning, 1933
+05/14 Beginning of Lewis and Clark Expedition, 1804
+05/14 Nation of Israel proclaimed, 1948
+05/15 Asylum for Inebriates founded, Binghamton NY, 1854
+05/17 24" rain in 11 hours, Pearl River, S. China, 1982
+05/17 Six SLA members killed in televised gun fight, 1974
+05/18 Battle of Las Piedras in Uruguay
+05/18 Napoleon crowned Emperor, 1804
+05/21 Battle of Iquique in Chile
+05/21 US explodes first hydrogen bomb, 1956
+05/22 US Civil War ends, 1865
+05/23 Israeli raid into Argentina to capture Adolf Eichmann, 1960
+05/23 Two Yetis sighted, Mt. Everest, 1953
+05/23 Federal Republic of Germany founded, 1949
+05/24 Battle of Pinchincha in Ecuador
+05/25 Oral Roberts sees 900 foot tall Jesus Christ, Tulsa OK, 1980
+05/25 Successful test of the limelight in Purfleet, England, 1830
+05/26 Congress sets first immigration quotas, 1924
+05/27 Golden Gate Bridge opens, 1937
+05/29 Edmund Hillary and Tenzing Norkay climb Mt. Everest, 1953
+05/29 First food stamps issued, 1961
+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 assassinated, 1968
+06/05 US leaves the Gold Standard, 1933
+06/06 First drive-in movie, 1933
+06/06 Normandy landing, 1944
+06/10 Death of Alexander the Great, 323 B.C.
+06/10 Denver police tear gas Jethro Tull and 2000 fans at Red Rocks, 1971
+06/11 Greeks seize Troy, 1184BC
+06/13 Pioneer flies past Neptune, and therefore out of the Solar System
+06/14 Sandpaper invented by I. Fischer, Jr., 1834
+06/15 Ben Franklin's kite experiment, 1752
+06/15 Magna Carta signed, 1215
+06/15 Series of photographs by Edward Muggeridge prove to Leland Stanford
+ that all the hooves of a horse are off the ground during the gallop,
+ 1878
+06/16 "The Blues Brothers" premieres in Chicago, 1980
+06/17 China explodes its first Hydrogen bomb, 1967
+06/17 Watergate Democratic National Committee break-in, 1972
+06/19 Julius and Ethel Rosenberg are executed in Sing-Sing prison, 1953
+06/19 Lizzie Bordon acquitted, 1893
+06/20 Victoria crowned, 1837
+06/21 Berlin airlift begins, 1948
+06/21 Sun rises over Heelstone at Stonehenge
+06/22 Civil rights workers disappear in Mississippi, 1964
+06/23 Slavery abolished in England, 1772
+06/24 Senate repeals Gulf of Tonkin resolution, 1970
+06/25 Custer's Last Stand at Little Big Horn, 1876
+06/25 North Korea invades South Korea, 1950
+06/26 Battle of Gettysburg, 1863
+06/26 St. Lawrence Seaway dedicated by Eisenhower & Queen Elizabeth II, 1959
+06/26 Toothbrush invented, 1498
+06/27 100 degrees, Fort Yukon, 1915
+06/27 Bill Graham closes the Fillmore East, 1971
+06/28 Supreme Court decides in favor of Allan Bakke, 1978
+06/30 "That" explosion in Siberia, 1908
+06/30 China and Soviet Union announce split over ideology, 1960
+07/01 Battle of Gettysburg begins, 1863
+07/03 Dog days begin
+07/04 Battles of Vicksburg and Gettysburg won by Union forces, 1863
+07/04 Cloudy, 76 degrees, Philadelphia PA, 1776
+07/04 New York abstains on Declaration of Independence vote, 1776
+07/04 Thoreau enters woods, 1845
+07/06 First `talkie' (talking motion picture) premiere in New York, 1928
+07/06 Lawrence of Arabia captures Aqaba, 1917
+07/07 First radio broadcast of "Dragnet", 1949
+07/07 Terrorists detonate four bombs on London public transport, 2005
+07/08 First public reading of the Declaration of Independence, 1776
+07/08 Liberty Bell cracks while being rung at funeral of John Marshall, 1835
+07/09 10-hour working day set by law, NH, 1847
+07/10 134 degrees in Death Valley, 1913
+07/12 Minimum wages established: 40 cents/hour, 1933
+07/13 Women first compete in Olympic games, 1908
+07/16 Detonation of the first atomic bomb at Alamagordo, NM, 1945
+07/17 Disneyland opens, 1955
+07/18 Ty Cobb gets 4000th base hit, 1927
+07/19 Five Massachusetts women executed for witchcraft, 1692
+07/20 Armstrong and Aldrin land on moon, 1969
+07/21 First Train Robbery, Jesse James gets $3000 near Adair, Iowa, 1873
+07/21 Vietnam divided at 17th parallel, 1954
+07/23 Ice cream cone introduced, St. Louis MO, 1904
+07/24 Scopes Monkey Trial, 1925
+07/30 "In God We Trust" made US motto, 1956
+07/31 Harry S. Truman dedicates N.Y. Int'l Airport @ Idlewild Field, 1948,
+ later JFK
+08/01 Lughnasa; Feast of the god Lugh, a 30 day Celtic feast centers on
+ this day
+08/03 Columbus sets sail for Cathay, 1492
+08/03 USS Nautilus crosses under north polar ice cap, 1958
+08/04 Axe murder of Andrew and Abbey Borden, 1892
+08/04 Bombing of N. Vietnam begins, 1964
+08/04 Britain declares war on Germany starting World War I, 1914
+08/06 Atomic bomb dropped on Hiroshima, 1945
+08/06 Caricom in Barbados
+08/06 Cy Young pitches first game, 1890
+08/08 Montenegro declares war on Germany, 1914
+08/08 Richard Nixon resigns the US presidency, 1974
+08/08 The Great Train Robbery -- $7,368,000, 1963
+08/09 Helter Skelter... the Charles Manson murders take place, 1969
+08/09 Persia defeats Spartan King Leonidas at Thermopylae, 480 BC
+08/09 US/Canada border defined in the Webster-Ashburton Treaty, 1842
+08/09 Atomic bomb dropped on Nagasaki, 1945
+08/09 Singapore secedes from Malaysia, 1965
+08/10 Chicago incorporated as a village of 300 people, 1833
+08/10 US and Panama agree to transfer the canal in the year 2000, 1977
+08/11 Dog days end
+08/11 France Ends War in Indochina, 1954
+08/11 Perseid meteor shower (look north; three days)
+08/12 First test flight of Space Shuttle "Enterprise" from 747, 1977
+08/12 Last US ground troops out of Vietnam, 1972
+08/13 Berlin wall erected, 1961
+08/13 Li'l Abner debut, 1934
+08/14 Social Security begins in US, 1935
+08/15 Gandhi's movement obtains independence for Pakistan and India, 1947
+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
+08/19 Air Force cargo plane snares payload from Discoverer 14 spy satellite,
+ marking start of practical military reconnaissance from space, 1960
+08/19 Gail Borden patents condensed milk, 1856
+08/22 Death of King Richard III, 1485, Last of the Plantagenets
+08/22 Joe Walker sets X-15 all time altitude mark (67 miles), 1963
+08/22 St. Columbia reports seeing monster in Loch Ness, 565
+08/23 Sacco and Vanzetti executed, 1927
+08/24 "Alice's Restaurant" premieres in New York and Los Angeles, 1969
+08/24 -126.9 F at Vostok, Antarctica, 1960
+08/24 British troops burn Washington, 1814
+08/25 Gen. De Gaulle leads French forces into Paris, 1944
+08/26 19th amendment of US constitution gives women the vote, 1920
+08/27 "Tarzan of the Apes" published, 1912
+08/27 Krakatoa, Java explodes with a force of 1,300 megatons, 1883
+08/28 Martin Luther King leads over 200,000 in civil rights rally in Washington, DC, 1963
+08/29 Star in Cygnus goes nova and becomes 4th brightest in sky, 1975;
+ Nova Cygni 1975.
+08/30 75 cents a pound tariff set on opium, 1842
+08/30 Japan Stationery Co. sells first felt-tipped pen, 1960
+08/30 St. Rose of Lima in Peru
+08/30 Washington-to-Moscow hot line connected, 1963
+08/31 269 people killed after Korean Airlines 747 shot down by USSR, 1983
+08/31 Mary Anne Nichols becomes Jack the Ripper's first victim, 1888
+08/31 Non-aggression pact signed by USSR and Afghanistan, 1926
+08/31 Federation of Malaya gains independence from Great Britain, 1957
+09/01 Bobby Fischer defeats Boris Spassky in World Chess Match, 1972
+09/01 Joshua A. Norton proclaims himself 'Emperor Norton I', 1859
+09/02 Great Britain adopts Gregorian Calendar, 1752
+09/02 Japan signs unconditional surrender on US battleship `Missouri', 1945
+09/03 Richard ``the Lionheart'' crowned king of England, 1189
+09/03 Anniversary of the Founding of the Republic in San Marino
+09/05 US President Kennedy orders resumption of underground nuclear tests, 1961
+09/05 The first Continental Congress was convened in Philadelphia, 1774
+09/06 149 Pilgrims set forth from England aboard the Mayflower, 1620
+09/06 First Star Trek episode (The Man Trap) aired 1966
+09/06 US President McKinley shot, 1901
+09/06 Somhlolo in Swaziland
+09/08 "Star Trek" debuts on NBC (1966)
+09/08 Jack the Ripper kills again, Annie Chapman is second victim, 1888
+09/08 US President Ford pardons Richard M. Nixon, 1974
+09/09 California becomes the 31st state of the USA, 1850
+09/09 United Colonies is renamed the United States, 1776
+09/10 Mountain Meadows Massacre. Mormons kill Gentile wagon train, 1857
+09/11 CIA-sponsored terrorists overthrow Chilean government, murder President Allende, 1973
+09/11 Terrorists destroy World Trade Center in New York, 2001
+09/12 German paratroopers rescue Mussolini from captivity in Rome, 1943
+09/12 Germany annexes Sudetenland, 1938
+09/13 58 °C (136.4 °F) measured at el Azizia, Libya, 1922
+09/13 British defeat the French at the Plains of Abraham, just outside the walls of Quebec City, 1759
+09/13 Building of Hadrian's Wall begun, 122
+09/13 Chiang Kai-Shek becomes president of China, 1943
+09/14 Benjamin Franklin is sent to France as an American minister, 1778
+09/14 Salem, Massachusetts, is founded, 1629
+09/14 The US Selective Service Act establishes the first peacetime draft, 1940
+09/15 Soviet Premier Nikita Khrushchev begins his 13 day tour of the US, 1959
+09/15 The US Foreign Affairs Dept. becomes the US State Department, 1789
+09/16 The village of Shawmut, Massachusetts, becomes the city of Boston, 1630
+09/16 Malaya, Sabah, Sarawak and Singapore unite to become Malaysia, 1963
+09/17 Battle of Antietam, 1862
+09/18 Victory of Uprona in Burundi
+09/19 New Zealand women get the right to vote, 1893
+09/20 Equal Rights Party nominates Belva Lockwood for US President, 1884
+09/20 First meeting of the American Association for the Advancement of
+ Science, 1848
+09/20 First meeting of the US National Research Council, 1916
+09/20 Magellan leaves Spain on the first Round the World passage, 1519
+09/20 The Roxy Theater opens in Hollywood, 1973
+09/22 US President Lincoln issues the Emancipation Proclamation, 1862
+09/22 Special prosecutor Leon Jeworski subpoenas US President Nixon, 1974
+09/22 The first Soviet atomic bomb explodes, 1949
+09/23 Philippine President Ferdinand Marcos declares martial law, 1972
+09/23 The New York Knickerbockers becomes the first US Baseball club, 1845
+09/23 US Vice President Nixon denies campaign fund fraud with his "Checkers" speech, 1952
+09/25 Sandra Day O'Connor becomes first woman on US Supreme Court, 1981
+09/27 The first passenger was hauled in a locomotive in England, 1825
+09/28 "Pilgrim's Progress" published, 1678
+09/28 A Greek soldier runs 26+ miles after the Persian defeat at Marathon,
+ 490BC
+09/30 Red Jack kills 2, Elizabeth Stride (#3) and Catherine Eddowes (#4),
+ 1888
+09/30 The first tooth is extracted under anesthesia in Charleston, Mass, 1846
+09/30 The verdicts of the Nuremberg trials are announced, 1946
+10/01 NASA officially begins operations, 1958
+10/02 Thurgood Marshall sworn as the first black Supreme Court Justice, 1967
+10/04 Crimean war begins, 1853
+10/04 First space vehicle, Sputnik I, launched, 1957
+10/06 Antioch College is the first public school to admit men and women, 1853
+10/06 Egyptian President Anwar es-Sadat is assassinated in Cairo, 1981
+10/06 Israel is attacked by the alliance of Egypt and Syria, 1973
+10/07 Foundation of the German Democratic Republic (GDR or DDR), 1949
+10/07 Georgia Tech. beats Cumberland Univ. 222-0, 1916
+10/07 Maryland Governor Marvin Mandel sent to prison on fraud charges, 1977
+10/07 Mother Teresa of Calcutta awarded the Nobel Peace Prize, 1979
+10/07 Police stop Wilbur Mills car, Fanne Fox jumps into water, 1974
+10/08 Great Chicago Fire, 1871
+10/09 First two-way telephone conversation, 1876
+10/10 Beginning of the Wars for Independence in Cuba
+10/10 Foundation of the Workers Party in North Korea
+10/10 Mercury at Superior Conjunction with Sun. Moves into night sky. (1984)
+10/10 Spiro T. Agnew resigns as Vice-President due to income tax fraud, 1973
+10/11 "Saturday Night Live" premiers on NBC-TV, 1975
+10/11 The Gang of Four are arrested in Peking, 1976
+10/11 The first steam powered ferry ran between New York and Hoboken, 1811
+10/11 The second Vatican Ecumenical Council opens in Rome, 1962
+10/11 First broadcast of Saturday Night Live, 1975
+10/12 Bahama Natives discover Columbus of Europe lost on their shores, 1492
+10/12 Khrushchev pounds his desk with shoe during a speech to the UN, 1960
+10/12 Man O'War's last race, 1920
+10/12 Native Americans discover Columbus of Europe lost on their shores, 1492
+10/13 Italy declares war on Germany, 1943
+10/13 US Navy born, 1775, authorized by the Second Continental Congress
+10/14 Battle of Hastings won by William the Conqueror and the Normans, 1066
+10/14 Chuck Yeager breaks sound barrier, 1947
+10/15 First draft card burned, 1965
+10/18 Boston Shoemakers form first US labor org., 1648
+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/20 OPEC embargo, 1973
+10/21 Edison makes the first practical incandescent lamp, 1879
+10/21 Guggenheim Museum opens, 1959
+10/23 Battle of Leyte Gulf begins, 1944
+10/23 Day of the 1956 revolution in Hungary
+10/23 Earth created at 6:30 AM, 4004BC.
+10/23 Swallows leave Capistrano
+10/25 The UN removes Taiwan and admits the People's Republic of China, 1971
+10/26 UN's World Health Organization declares smallpox eradicated, 1978
+10/27 New York's Boss Tweed is arrested on fraud charges, 1871
+10/27 The first New York Subway is opened, 1904
+10/28 Columbus discovers Cuba, 1492
+10/28 Constantine's army defeats forces of Maxentius at Mulvian Bridge, 312
+10/28 Harvard was founded in Massachusetts, 1636
+10/28 Statue of Liberty was dedicated on Bedloe's Island, 1886
+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 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 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/07 Abolitionist newspaperman Elijah P. Lovejoy murdered by mob, 1837
+11/07 Lewis and Clark Expedition in sight of the Pacific Ocean, 1805
+11/09 Blackout of New York, New England, and Eastern Canada, 1965
+11/09 Giant panda discovered (?!), China, 1927
+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 demonstrations near White House, 1917
+11/10 Cpt. Wirz, commandant of Andersonville Prison hanged, 1865
+11/10 Henry Stanley asks David Livingstone, "Dr. Livingstone, I presume?", 1871
+11/11 Washington becomes the 42nd state, 1889
+11/12 Dr. Sun Yat-sen's Birthday in Taiwan
+11/12 USA first exports oil to Europe, 1861
+11/14 Quarter Pounder price raised from $0.53 to $0.55 in violation of Nixon
+ price controls (but okayed by Price Commission after formal request
+ from McDonald's), 1971
+11/15 Niagara Falls power plant startup, 1896
+11/16 Opening of the Suez Canal, 1869
+11/16 Albert Hofmann synthesizes LSD in Switzerland, 1938
+11/17 46,000 meteoroids fall over AZ in 20 minutes, 1966
+11/17 Richard Nixon says "I am not a crook.", 1973
+11/18 First hydrogen bomb blasts Enewetok, 1952
+11/18 Local standard time zones established for US, 1883
+11/19 Gettysburg Address delivered, 1863
+11/21 Announcement of 18 1/2 minute gap on Watergate tape, 1973
+11/22 Kennedy shot in Dallas, Texas by Lee Harvey Oswald, 1963
+11/23 First broadcast of Dr. Who (longest running TV series), 1963
+11/24 Lee Harvey Oswald killed by Jack Ruby, 1963
+11/25 Alfred Nobel invents dynamite, 1867
+11/27 Alfred Nobel establishes Nobel Prize, 1895
+11/27 Friction match invented, England, 1826
+11/27 Hoosac Railroad Tunnel completed, 1873, in NW Massachusetts
+11/29 King Tut's tomb opened, 1922
+12/01 First national corn-husking championship, Alleman IA, 1924
+12/01 Martin Luther King Jr., leads black boycott of Montgomery buses, 1955
+12/01 Rosa Parks refuses to move to back of the bus (Montgomery, AL), 1953
+12/03 First neon light display, Paris, 1910
+12/03 First successful human heart transplant led by Dr. Barnard, 1967
+12/03 The Montreux Casino burns down during a Frank Zappa concert, 1971
+12/04 Washington takes leave of his officers at Fraunce's Tavern, NYC, 1783
+12/05 End of Prohibition, 1933 (at least the alcohol part)
+12/05 Phi Beta Kappa founded, 1776
+12/05 The Eighteenth Amendment repealed, ending Prohibition, 1933
+12/07 Japan bombs Pearl Harbor, 1941
+12/08 Japan enters Second World War with invasion of Pantai Sabak, Kelantan, 1941
+12/09 Ball-bearing roller skates patented, 1884
+12/10 Metric system established in France, 1799
+12/10 Nobel Peace Prize awarded each year
+12/12 First wireless message sent across Atlantic by Marconi, 1901
+12/13 Apollo 17 leaves the moon, with "last" men to walk on moon aboard, 1972
+12/13 Dartmouth College chartered, 1769
+12/13 Geminid meteor shower (look south)
+12/15 Argo Merchant oil spill, 1976
+12/15 Bill of Rights adopted, 1791
+12/15 James Naismith invents basketball, Canada, 1891
+12/15 Sitting Bull shot in head while submitting to arrest, 1890
+12/20 US buys ~1,000,000 sq. miles of Louisiana for ~$20/sq.mi.
+12/21 Phileas Fogg completes his trip around the world in less than 80 days
+12/21 Women gain the right to vote in South Australia, 1894
+12/21 Women gain the right to hold political office in South Australia, 1894
+12/24 KKK formed in Pulaski, Tenn, 1865
+12/26 DPMA founded, 1951
+12/27 APT report published, 1956
+12/27 Ether first used as anesthetic in childbirth, 1845
+12/28 Comet Kohoutek at perihelion, 1973
+12/28 Proclamation of the Province of South Australia, 1836
+12/29 Battle of Wounded knee, 1890
+12/30 First Los Angeles freeway dedicated, 1940
+12/31 St. Sylvester in Switzerland
+12/31 Winterland closes its doors, 1978
+
+#endif /* !_calendar_history_ */
diff --git a/usr.bin/calendar/calendars/calendar.holiday b/usr.bin/calendar/calendars/calendar.holiday
new file mode 100644
index 000000000000..a5e5dda4dfd4
--- /dev/null
+++ b/usr.bin/calendar/calendars/calendar.holiday
@@ -0,0 +1,563 @@
+/*
+ * Holiday
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _calendar_holiday_
+#define _calendar_holiday_
+
+01/01 Beginning of the Year in Japan
+01/01 Independence Day in Haiti and Sudan
+01/01 Universal Fraternity Day in Mozambique
+01/02 Ancestry Day in Haiti
+01/02 St. Berchtold's Day in Switzerland
+01/03 New Year's Holiday in Scotland
+01/03 Revolution Day in Upper Volta
+01/04 Independence Day in Burma
+01/04 Martyrs Day in Zaire
+01/06 Children's Day in Uruguay
+01/06 Three Kings' Day in Puerto Rico
+01/07 Christmas in Ethiopia
+01/07 Pioneer's Day in Liberia
+01/09 Day of the Martyrs in Panama
+01/11 Armed Forces Day in Liberia
+01/12 Zanzibar Revolution Day in Tanzania
+01/13 National Liberation Day in Togo
+01/15 Arbor Day in Jordan
+01/16 Martyrs Day in Benin
+01/18 Revolution Day in Tunisia
+01/19 Confederate Heroes Day in Texas
+01/19 Ethiopian Epiphany in Ethiopia
+01/19 Nameday of Archbishop Makarios in Cyprus
+01/20 Army Day in Mali
+01/20 National Heroes Day in Guinea-Bissau
+01/21 Our Lady of Altagracia in Dominican Republic
+01/23 Feast of St. Ildefonsus
+01/23 US National Handwriting Day
+01/24 Economic Liberation Day in Togo
+01/26 Republic Day in India
+01/MonSecond Adults Day in Japan
+01/MonThird Lee-Jackson Day in Virginia (3rd Monday)
+01/MonThird Robert E. Lee's Birthday in Alabama & Mississippi (3rd Monday)
+01/MonThird Martin Luther King Day in New York (3rd Monday)
+02/01 Chinese New Year Holiday (3 days) in Taiwan
+02/02 Candlemas
+02/04 Independence Commemoration Day in Sri Lanka
+02/05 Constitution Day in Mexico
+02/06 New Zealand Day
+02/07 Independence Day in Grenada
+02/09 St. Maron's Day in Lebanon
+02/10 Feast of St. Paul's Shipwreck, AD 60
+02/11 National Foundation Day in Japan
+02/12 Pyidaungsa Day in Burma
+02/16 Makha Bucha Day in Thailand
+02/18 Democracy Day in Nepal
+02/18 Independence Day in The Gambia
+02/23 Republic Day in Guyana
+02/24 Gregorian Calendar Day
+02/25 National Day in Kuwait
+02/27 Independence Day in Dominican Republic
+03/01 Samil Independence Movement Day in South Korea
+03/01 St. David's Day - Patron Saint of Wales
+03/02 Peasants Day in Burma
+03/02 Texas Independence day
+03/02 Victory of Adowa in Ethiopia
+03/03 Throne Day in Morocco
+03/03 Independence day (Treaty of San Stefano) in Bulgaria
+03/04 Vermont Admission Day (admitted as 14th US state in 1791)
+03/05 Independence Day in Equatorial Guinea
+03/06 Lantern Day, Bejing
+03/08 First Annual International Women's Day, 1909
+03/08 International Women's Day in former USSR
+03/08 Syrian National Day in Libyan Arab Republic
+03/08 Women's Day in Guinea-Bissau, Taiwan and Yemen Democratic Republic
+03/08 Youth Day in Zambia
+03/09 Decoration Day in Liberia
+03/09 Falgun Purnima Day in Nepal
+03/10 Labor Day in South Korea
+03/11 Johnny Appleseed Day; anniversary of the death of John Chapman
+03/12 Commonwealth Day in Swaziland
+03/12 Independence Day in Mauritius
+03/12 Moshoeshoe's Birthday in Lesotho
+03/12 Renovation Day in Gabon
+03/13 National Day in Grenada
+03/16 Black Press Day; first US Black newspaper founded in 1827
+03/17 Evacuation Day in Suffolk County, Massachusetts
+03/17 St. Patrick's Day - one of the Patron Saints of Ireland
+03/19 St. Joseph's Day, observed in Colombia, Costa Rica, Holy See,
+ Liechtenstein, San Marino, Spain, Venezuela
+03/19 Tree Planting Day in Lestho
+03/20 Independence Day in Tunisia
+03/20 Youth Day in Oklahoma
+03/20* Vernal Equinox in Japan
+03/21 Afghan New Year in Afghanistan
+03/21 Juarez' Birthday in Mexico
+03/21* Vernal Equinox in Japan
+03/22 Abolition Day in Puerto Rico
+03/23 Pakistan Day in Pakistan
+03/25 Greek Independence Day in Cyprus
+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/26 Independence Day in Bangladesh
+03/26 Prince Jonah Kuhio Kalanianaole Day in Hawaii
+03/27 Armed Forces Day in Burma
+03/29 Death of President Barthelemy Boganda in Central African Republic
+03/29 Memorial Day in Madagascar
+03/31 National Day in Malta
+03/MonLast Seward's Day in Alaska (last Monday)
+04/01 Youth Day in Benin
+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/06 Chakri Memorial Day in Thailand
+04/06 Victory Day in Ethiopia
+04/08 Fast and Prayer Day in Liberia
+04/09 Martyrs Day in Tunisia
+04/11 National Heroes Day in Costa Rica
+04/13 National Day in Chad
+04/13 Songkron Day in Thailand
+04/14 Day of the Americas in Honduras
+04/15 Bengali New Year in Bangladesh
+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/17 Burmese New Year in Burma
+04/18 Independence Day in Chile and Zimbabwe
+04/19 Declaration of Independence in Venezuela
+04/19 Republic Day in Sierra Leone
+04/21 San Jacinto Day in Texas
+04/21 Tiradentes in Brazil
+04/22 Arbor Day in Nebraska & Delaware
+04/22 Oklahoma Day in Oklahoma
+04/23 St. George's Day - Patron Saint of England
+04/24 Victory Day in Togo
+04/25 Anniversary of the Revolution in Portugal
+04/25 Anzac Day, observed in Australia, New Zealand, Tonga and Western Samoa
+04/25 Liberation Day in Italy
+04/25 National Flag Day in Swaziland
+04/26 Confederate Memorial Day in Florida & Georgia
+04/26 Union Day in Tanzania
+04/27 Independence Day in Togo
+04/27 King's Birthday in the Netherlands, the Netherlands Antilles
+04/29 Showa Day in Japan
+04/30 The Workers Day in Uruguay
+04/MonLast Arbor Day in Wyoming (last Monday)
+04/MonLast Confederate Memorial Day in Alabama & Mississippi (last Monday)
+04/MonThird Patriot's Day in Maine & Massachusetts (3rd Monday)
+05/01 Labor Day in many places in the USA
+05/01 May Day in many places
+05/01 US Law Day (decl. by Eisenhower)
+05/02 King's Birthday in Lesotho
+05/03 Constitution Memorial Day in Japan
+05/04 Greenery Day in Japan
+05/04 Rhode Island Independence Day
+05/05 Battle of Puebla in Mexico
+05/05 Children's Day in Japan and South Korea
+05/05 Coronation Day in Thailand
+05/05 Liberation Day in the Netherlands
+05/06 Bataan Day in Philippines
+05/06* Bank Holiday in UK
+05/07 May Day in United Kingdom
+05/08 Buddha's Birthday in South Korea
+05/08 Elections for the National Assembly in Philippines
+05/08 Truman Day in Missouri
+05/09 VE day, end of Second World War, celebrated in many countries
+05/10 Confederate Memorial Day in South Carolina
+05/10 Mothers Day in Guatemala
+05/11 Minnesota Day in Minnesota
+05/14 Anniversary of the Founding of Guinean Democratic Party in Guinea
+05/14 Buddhist Holiday (Waisak 2528) in Indonesia
+05/14 Independence Day (2 days) in Paraguay
+05/14 Unification Day in Liberia
+05/15 Kamuzu Day in Malawi
+05/15 Vesak Day, observed in Singapore and Malaysia
+05/15 Visakha Bucha Day in Thailand
+05/16 Discovery Day in Cayman Islands
+05/17 Constitution Day in Nauru and Norway
+05/18 Flag Day in Haiti
+05/18 Prayer Day in Denmark
+05/19 Youth and Sports Day in Turkey
+05/20 Mecklenburg Independence Day in North Carolina
+05/20 National Day in Cameroon
+05/20 Victoria Day in Canada
+05/22 National Heroes Day in Sri Lanka
+05/23 Commonwealth Day in Jamaica and Belize
+05/23 National Labor Day in Jamaica
+05/24 Bermuda Day in Bermuda
+05/24 Day of Slav Letters in Bulgaria
+05/25 African Freedom Day in Zimbabwe
+05/25 African Liberation Day in Chad, Mauritania and Zambia
+05/25 Anniversary of the Revolution of 1810 in Argentina
+05/25 Independence Day in Jordan
+05/25 Memorial Day in New Mexico & Puerto Rico
+05/25 Revolution in the Sudan in Libyan Arab Republic
+05/27 Afghanistan attains sovereignty, 1921
+05/27* Bank Holiday in UK
+05/28 Mothers Day in Central African Republic
+05/31 Pya Martyrs Day in Togo
+05/MonThird Memorial Day in Michigan (3rd Monday)
+06/01 Independence Days (3 days) in Western Samoa
+06/01 Madaraka Day in Kenya
+06/01 Victory Day in Tunisia
+06/02 Corpus Christi in Paraguay
+06/03 Confederate Memorial Day in Kentucky & Louisiana
+06/03 Labor Day in Bahamas
+06/03* Bank Holiday in Rep. of Ireland
+06/04 Emancipation Day in Tonga
+06/04 Queen's Birthday in New Zealand
+06/05 Constitution Day in Denmark
+06/05 Liberation Day in Seychelles
+06/06 His Majesty, Yang Di-Pertuan Agong's Birthday in Malaysia
+06/06 Memorial Day in South Korea
+06/09 Senior Citizen's Day in Oklahoma
+06/10 Camoes Day in Portugal
+06/11 King Kamehameha I Day in Hawaii
+06/11 Queen's Birthday
+06/12 Independence Day in Philippines
+06/12 Peace with Bolivia in Paraguay
+06/13 Corrective Movement in Yemen Arab Republic
+06/14 Flag Day, USA
+06/16 Bloomsday - Anniversary of Dublin events, 1904, in "Ulysses"
+06/17 Bunker Hill Day in Suffolk County, Massachusetts
+06/17 Independence Day in Iceland
+06/18 Evacuation Day in Egypt
+06/18 Queen's Birthday in Fiji
+06/19 Artigas Birthday in Uruguay
+06/19 Emancipation Day in Texas
+06/19 Labor Day in Trinidad and Tobago
+06/19 Revolution Day in Algeria
+06/20 Flag Day in Argentina
+06/20 West Virginia Day in West Virginia
+06/22 Corrective Movement in Yemen Democratic Republic
+06/22 Midsummer Eve in Finland, Sweden
+06/22 National Sovereignty Day in Haiti
+06/23 National Holiday in Luxembourg
+06/24 Battle of Carabobob in Venezuela
+06/24 Fisherman's Day in Madagascar, Mozambique and Somalia
+06/24 Kings Day in Spain
+06/24 Peasants Day in Peru
+06/24 St. Jean-Baptiste Day in Quebec
+06/28 Mothers Day in Central African Republic
+06/29 Independence Day in Seychelles
+06/30 Day of the Army in Guatemala
+06/MonFirst Jefferson Davis's Birthday in Alabama & Mississippi (1st Monday)
+06/MonFirst Jefferson Davis's Birthday in Florida, Georgia, & S. Carolina
+07/01 Canada Day
+07/01 Freedom Day in Suriname
+07/01 Independence Day in Burundi
+07/01 National Day in Rwanda
+07/01 Republic Day in Ghana
+07/01 Union of the Somalia Republic in Somalia
+07/02 National Day in Kiribati
+07/04 Caribbean Day in Guyana
+07/04 Constitution Day in Cayman Islands
+07/04 Family Day in Lesotho
+07/04 Heroes Day in Zambia
+07/04 Kadooment Day in Barbados
+07/04 Philippine-American Friendship Day in the Philippines
+07/04 Warriors Day (2 days) in Yugoslavia
+07/05 Day of Peace and Unity in Rwanda
+07/05 Independence Day in Algeria and Venezuela
+07/07 Anniversary of the P.U.N. in Equatorial Guinea
+07/07 National Day in Malawi
+07/07 Saba Saba Day in Tanzania
+07/09 Independence Day in Argentina
+07/10 Independence Day in Bahamas
+07/11 National Holiday in the Mongolian People's Republic
+07/12 Battle of Boyne celebrated in Northern Ireland
+07/13 Buddhist Lent in Thailand
+07/14 Anniversary of the Revolution in Iraq
+07/14 French National Festival
+07/14 National Holiday in Monaco
+07/15 St. Swithin's Day
+07/16 Presidents Day in Botswana
+07/17 Constitution Day in South Korea
+07/17 July Revolution in Iraq
+07/17 Munoz Rivera's Birthday (celebrated in Puerto Rico)
+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 King's Birthday in Swaziland
+07/22 National Day in Poland
+07/23 Anniversary of the Revolution in Egypt
+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 and Venezuela
+07/25 Constitution Day in Puerto Rico
+07/25 National Rebellion Day (3 days) in Cuba
+07/25 Republic Day in Tunisia
+07/25 St. James, Patron Saint in Spain
+07/26 Independence Day in Liberia
+07/26 National Day in Maldives
+07/27 Barbosa's Birthday (celebrated in Puerto Rico)
+07/28 Independence Days (2 days) in Peru
+07/29 Olsok Eve in Norway to commemorate Norway's Viking King St. Olav
+07/29 Rain Day in Waynesburg, PA
+07/31 Revolution Day in Congo
+07/MonThird Day of Sea in Japan
+08/01 Discovery Day in Trinidad and Tobago
+08/01 Emancipation Day in Granada
+08/01 Founding of Asuncion in Paraguay
+08/01 Freedom Day in Guyana
+08/01 National Day in Switzerland
+08/01 National Holidays (5 days) in El Salvador
+08/01 Parent's Day in Zaire
+08/02 Our Lady of Los Angeles in Costa Rica
+08/03 Independence Day in Jamaica and Niger
+08/03 Massacre of the Pidjiguiti in Guinea-Bissau
+08/03 Memorial Day of Archbishop Makarios in Cyprus
+08/04 Freedom Day in Guyana
+08/05* Bank Holiday in Scotland and Northern Ireland
+08/06 Bank Holiday in British Columbia, Fiji, Iceland, Ireland, Ontario
+08/06 Emancipation Day in Bahamas
+08/06 Independence Day in Bolivia
+08/07 Battle of Boyaca in Colombia
+08/09 National Day in Singapore
+08/10 Independence Day in Ecuador
+08/11 Heroes Day (2 days) in Zimbabwe
+08/11 Independence Day in Chad
+08/11 King Hussein's Accession to the Throne in Jordan
+08/12 Queen's Birthday in Thailand
+08/13 Proclamation of Independence in Central African Republic
+08/13 Women's Day in Tunisia
+08/14 Independence Day in Pakistan
+08/14 Waddi Dhahab in Morocco
+08/15 VJ Day, 1945
+08/15 Founding of Ascuncion in Paraguay
+08/15 Independence Day in India
+08/15 Liberation Day in South Korea
+08/15 National Day in Congo
+08/15 Santa Maria in Malta
+08/16 Bennington Battle Day in Vermont
+08/16 Independence Days (3 days) in Gabon
+08/16 Restoration Day in Dominican Republic
+08/17 Anniversary of the Death of General San Martin in Argentina
+08/17 Independence Day in Indonesia
+08/19 Independence Day in Afghanistan
+08/20 Constitution Day in Hungary
+08/24 National Flag Day in Liberia
+08/25 Constitution Day in Paraguay
+08/25 Independence Day in Uruguay
+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
+08/30 Huey P. Long Day in Louisiana
+08/30 Victory Day in Turkey
+08/31 Independence Day (Merdeka) in Malaysia
+08/31 Independence Day in Trinidad and Tobago
+08/31 Pashtunistan Day in Afghanistan
+08/FriThird Admission Day in Hawaii, 1959 (3rd Friday)
+09/01 Army Day in Chile
+09/03 Independence Day in Qatar
+09/03 Memorial Day in Tunisia
+09/06 Defense of Pakistan Day in Pakistan
+09/06 Unification of Bulgaria
+09/07 Independence Day in Brazil
+09/09 Admission Day in California
+09/09 National Day in North Korea
+09/10 Korean Thanksgiving Day (Chusuk) in South Korea
+09/10 Moon Festival in Taiwan
+09/10 National Day in Belize
+09/11 Anniversary of military coup in Chile
+09/11 Ethiopian New Year in Ethiopia
+09/11 National Holiday in Chile
+09/12 Amilcar Cabral's Birthday in Guinea-Bissau
+09/12 Defender's Day in Maryland
+09/12 Revolution Day in Ethiopia
+09/13 Barry Day commemorates the death of Commodore John Barry, USA
+09/14 Battle of San Jacinto in Nicaragua
+09/15 Foundation of Panama in Panama
+09/16 Cherokee Strip Day in Oklahoma
+09/16 Independence Days in Mexico and Papua New Guinea
+09/17 National Heroes Day in Angola
+09/18 Independence Day in Chile and Zimbabwe
+09/19 Army Day in Chile
+09/21 Independence Day in Belize
+09/22 Independence Day in Mali
+09/22 National Sovereignty Day in Haiti
+09/22* Autumnal Equinox in Japan
+09/23 Grito de Lares in Puerto Rico
+09/23* Autumnal Equinox in Japan
+09/24 Anniversary of the Third Republic in Ghana
+09/24 Independence Day in Guinea-Bissau
+09/24 National Day in Saudi Arabia
+09/24 Our Lady of Mercedes in Dominican Republic
+09/24 Republic Day in Trinidad and Tobago
+09/25 Army Day in Mozambique
+09/25 Referendum Day in Rwanda
+09/26 National Day in Maldives
+09/26 Revolution Anniversary Day in Yemen
+09/27 Feast of Finding the True Cross in Ethiopia
+09/28 Confucius' Day in Taiwan
+09/29 Michaelmas
+09/29 Battle of Boqueron in Paraguay
+09/30 Botswana Day in Botswana
+09/MonThird Respect for the Aged Day in Japan
+10/01 Armed Forces Day in South Korea
+10/01 Independence Day in Nigeria
+10/01 National Liberation Day (2 days) in China
+10/01 Public Holiday in Botswana
+10/02 Anniversary of Guinean Independence in Guinea
+10/03 Chung Yeung Festival in Hong Kong
+10/03 Francisco Morazan's Birthday in Honduras
+10/03 German Reunification Day
+10/03 National Foundation Day in South Korea
+10/03 U.N. Day in Barbados
+10/04 Independence Day in Lesotho
+10/05 Anniversary of Proclamation of the Republic in Portugal
+10/06 National Sports Day in Lesotho
+10/07 National Heroes Day in Jamaica
+10/08 Battle of Agamos in Peru
+10/08 Constitution Day in former USSR
+10/08 Thanksgiving Day in Canada
+10/08* Fiji Day
+10/09 Independence Day in Uganda
+10/09 Independence of Guayaquil in Ecuador
+10/09 Korean Alphabet Day in South Korea
+10/09 Leif Erikson Day commemorates the discovery of North America in AD 1000
+10/09 Republic Day in Khmer Republic
+10/10 National Day in Taiwan
+10/10 Oklahoma Historical Day in Oklahoma
+10/11 Day of the Revolution in Panama
+10/12 Day of the Race in Argentina
+10/12 Discovery Day in Bahamas
+10/12 National Day in Equatorial Guinea and Spain
+10/12 Our Lady Aparecida Day in Brazil
+10/12 Pan American Day in Belize
+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/16 National Boss Day, USA
+10/17 Dessaline's Death Anniversary in Haiti
+10/17 Heroes Day in Jamaica
+10/17 Mother's Day in Malawi
+10/20 Anniversary of the 1944 Revolution in Guatemala
+10/20 Kenyatta Day in Kenya
+10/21 Armed Forces Day in Honduras
+10/21 Revolution Days (2 days) in Somalia
+10/23 King Chulalongkorn Day in Thailand
+10/24 Independence Day in Zambia
+10/24 United Nations Day
+10/25 Taiwan Restoration Day in Taiwan
+10/25 St. Crispin's day, patron saint of shoemakers
+10/26 Agam Day in Nauru
+10/26 Armed Forces Day in Benin and Rwanda
+10/26 National Day in Austria
+10/28 National Holiday in Greece
+10/28 OHI Day in Cyprus
+10/28* Bank Holiday in Republic of Ireland
+10/29 Republic Day in Turkey
+10/31 All Hallows Eve ("Halloween")
+10/31 Nevada Day in Nevada
+10/MonFourth Labour Day in New Zealand
+10/MonSecond Health Sports Day in Japan
+11/01 All Saints Day
+11/01 Samhain; Beginning of the Celtic year and most important holiday.
+11/02 All Souls Day
+11/02 Memorial Day in Ecuador
+11/03 Culture Day in Japan
+11/03 Independence from Columbia in Panama
+11/03 Independence of Cuenca in Ecuador
+11/03 Thanksgiving Day in Liberia
+11/04 Flag Day in Panama
+11/04 Will Rogers Day, USA
+11/06 Green March Day in Morocco
+11/07 October Revolution Day in Hungary
+11/08 Her Majesty, the Queen's Birthday in Nepal
+11/10 King's Birthday in Bhutan
+11/11 Angola gains independence from Portugal, 1975
+11/11 Independence Day in Angola
+11/11 Independence of Cartagena in Colombia
+11/11 Remembrance Day in Canada
+11/11 Republic Day in Maldives
+11/14 King Hussein's Birthday in Jordan
+11/15 Dynasty Day in Belgium
+11/15 Proclamation of the Republic in Brazil
+11/15 Thatlouang Festival in Laos
+11/16 Oklahoma Heritage Week in Oklahoma
+11/17 Army Day in Zaire
+11/17 Corrective Movement in Syrian Arab Republic
+11/18 Battle of Viertieres in Haiti
+11/18 Independence Day in Morocco
+11/18 National Days (4 days) in Oman
+11/19 Anniversary of the 1968 Coup by the Army in Mali
+11/19 Discovery Day in Puerto Rico
+11/19 Feast Day of S.A.S. Prince Rainier in Monaco
+11/19 Garifuna Settlement in Belize
+11/20 Revolution Day in Mexico
+11/22 Anniversary of Portuguese Aggression in Guinea
+11/22 Independence Day in Lebanon
+11/23 Labor Thanksgiving Day in Japan
+11/24 Anniversary of the New Regime in Zaire
+11/25 Independence Day in Suriname
+11/28 Independence Day in Albania and Mauritania
+11/28 Independence from Spain in Panama
+11/28 Proclamation of the Republic in Chad
+11/29 Day of the Republic (2 days) in Yugoslavia
+11/29 Goodwill Day in Liberia
+11/29 Liberation Day in Albania
+11/29 National Day in Burma
+11/30 Independence Day in Barbados and Yemen Democratic Republic
+11/30 National Day in Benin
+11/30 National Heroes Day in Philippines
+11/30 St. Andrew's Day - Patron Saint of Scotland
+11/Wed+3 Day of Prayer and Repentance (Buss- und Bettag) in Federal Republic of Germany
+12/01 Anniversary of the Restoration of Independence in Portugal
+12/01 Union Day in Romania
+12/01 Independence Day in Central African Republic
+12/01 World AIDS Day
+12/02 National Holiday in United Arab Emirates
+12/03 National Holiday in Laos
+12/05 King's Birthday in Thailand
+12/06 Independence Day in Finland
+12/07 Delaware Day in Delaware
+12/07 Independence Day in Ivory Coast
+12/07 Independence Day in Panama
+12/08 Blessing of the Water in Uruguay
+12/08 Mother's Day in Panama
+12/08 Our Lady of the Cacupe in Paraguay
+12/09 Independence Day in Tanzania
+12/10 Foundation of Worker's Party in Angola
+12/10 Human Rights Day
+12/10 Thai Constitution Day in Thailand
+12/10 Wyoming Day in Wyoming
+12/11 Independence Day in Upper Volta
+12/12 Independence Day in Kenya
+12/13 Republic Day in Malta
+12/15 Statue Day in the Netherlands Antilles
+12/16 Constitution Day in Nepal
+12/16 National Day in Bahrain
+12/16 Victory Day in Bangladesh
+12/17 National Day in Bhutan
+12/18 Republic Day in Niger
+12/23 Emperor's Birthday in Japan
+12/23 Victory Day in Egypt
+12/25 Birthday of Quaid-i-Azam in Pakistan
+12/25 Children's Day in Congo
+12/26 Boxing Day
+12/26 Feast of Our Theotokos in Greece
+12/26 St. Stephen's Day
+12/26 Bank Holiday in Canada, Rep. of Ireland, and UK
+12/27 Bank Holiday in Cayman Islands
+12/27 Constitution Day in North Korea
+12/27 Public Holiday in Lesotho, Zimbabwe
+12/29 Civic Holidays (3 days) in Costa Rica
+12/29 His Majesty, the King's Birthday in Nepal
+12/30 Anniversary of the Democratic Republic of Madagascar in Madagascar
+12/31 Bank Holiday in El Salvador, Honduras, Pakistan
+12/31 Feed Yourself Day in Benin
+12/31 Proclamation of the Republic in Congo
+
+#endif /* !_calendar_holiday_ */
diff --git a/usr.bin/calendar/calendars/calendar.hungarian b/usr.bin/calendar/calendars/calendar.hungarian
new file mode 100644
index 000000000000..1b29dfaf2f46
--- /dev/null
+++ b/usr.bin/calendar/calendars/calendar.hungarian
@@ -0,0 +1,12 @@
+/*
+ * Hungarian calendar file(s)
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _calendar_hungarian_
+#define _calendar_hungarian_
+
+#include <hu_HU.ISO8859-2/calendar.all>
+
+#endif /* !_calendar_hungarian_ */
diff --git a/usr.bin/calendar/calendars/calendar.judaic b/usr.bin/calendar/calendars/calendar.judaic
new file mode 100644
index 000000000000..9b1b7bb0d413
--- /dev/null
+++ b/usr.bin/calendar/calendars/calendar.judaic
@@ -0,0 +1,824 @@
+/*
+ * Judaic Calendar.
+ *
+ * $FreeBSD$
+ *
+ */
+
+#ifndef _calendar_judaic_
+#define _calendar_judaic_
+
+/*
+ * The calendar below has been obtained from the port deskutils/hebcal
+ * for the year of 2018 to 2027 and for the city of New York.
+ */
+
+
+2018/1/17* Rosh Chodesh Sh'vat
+2018/1/31* Tu BiShvat
+2018/2/10* Shabbat Shekalim
+2018/2/15* Rosh Chodesh Adar
+2018/2/16* Rosh Chodesh Adar
+2018/2/24* Shabbat Zachor
+2018/2/28* Ta'anit Esther
+2018/2/28* Erev Purim
+2018/3/1* Purim
+2018/3/2* Shushan Purim
+2018/3/10* Shabbat Parah
+2018/3/17* Rosh Chodesh Nisan
+2018/3/17* Shabbat HaChodesh
+2018/3/24* Shabbat HaGadol
+2018/3/30* Ta'anit Bechorot
+2018/3/30* Erev Pesach
+2018/3/31* Pesach I
+2018/4/1* Pesach II
+2018/4/2* Pesach III (CH''M)
+2018/4/3* Pesach IV (CH''M)
+2018/4/4* Pesach V (CH''M)
+2018/4/5* Pesach VI (CH''M)
+2018/4/6* Pesach VII
+2018/4/7* Pesach VIII
+2018/4/12* Yom HaShoah
+2018/4/15* Rosh Chodesh Iyyar
+2018/4/16* Rosh Chodesh Iyyar
+2018/4/18* Yom HaZikaron
+2018/4/19* Yom HaAtzma'ut
+2018/4/29* Pesach Sheni
+2018/5/3* Lag BaOmer
+2018/5/13* Yom Yerushalayim
+2018/5/15* Rosh Chodesh Sivan
+2018/5/19* Erev Shavuot
+2018/5/20* Shavuot I
+2018/5/21* Shavuot II
+2018/6/13* Rosh Chodesh Tamuz
+2018/6/14* Rosh Chodesh Tamuz
+2018/7/1* Tzom Tammuz
+2018/7/13* Rosh Chodesh Av
+2018/7/21* Shabbat Chazon
+2018/7/21* Erev Tish'a B'Av
+2018/7/22* Tish'a B'Av
+2018/7/27* Tu B'Av
+2018/7/28* Shabbat Nachamu
+2018/8/11* Rosh Chodesh Elul
+2018/8/12* Rosh Chodesh Elul
+2018/9/1* Leil Selichot
+2018/9/9* Erev Rosh Hashana
+2018/9/10* Rosh Hashana 5779
+2018/9/11* Rosh Hashana II
+2018/9/12* Tzom Gedaliah
+2018/9/15* Shabbat Shuva
+2018/9/18* Erev Yom Kippur
+2018/9/19* Yom Kippur
+2018/9/23* Erev Sukkot
+2018/9/24* Sukkot I
+2018/9/25* Sukkot II
+2018/9/26* Sukkot III (CH''M)
+2018/9/27* Sukkot IV (CH''M)
+2018/9/28* Sukkot V (CH''M)
+2018/9/29* Sukkot VI (CH''M)
+2018/9/30* Sukkot VII (Hoshana Raba)
+2018/10/1* Shmini Atzeret
+2018/10/2* Simchat Torah
+2018/10/9* Rosh Chodesh Cheshvan
+2018/10/10* Rosh Chodesh Cheshvan
+2018/10/16* Yom HaAliyah
+2018/11/7* Sigd
+2018/11/8* Rosh Chodesh Kislev
+2018/11/9* Rosh Chodesh Kislev
+2018/12/2* Chanukah: 1 Candle
+2018/12/3* Chanukah: 2 Candles
+2018/12/4* Chanukah: 3 Candles
+2018/12/5* Chanukah: 4 Candles
+2018/12/6* Chanukah: 5 Candles
+2018/12/7* Chanukah: 6 Candles
+2018/12/8* Rosh Chodesh Tevet
+2018/12/8* Chanukah: 7 Candles
+2018/12/9* Rosh Chodesh Tevet
+2018/12/9* Chanukah: 8 Candles
+2018/12/10* Chanukah: 8th Day
+2018/12/18* Asara B'Tevet
+2019/1/7* Rosh Chodesh Sh'vat
+2019/1/21* Tu BiShvat
+2019/2/5* Rosh Chodesh Adar I
+2019/2/6* Rosh Chodesh Adar I
+2019/2/19* Purim Katan
+2019/3/2* Shabbat Shekalim
+2019/3/7* Rosh Chodesh Adar II
+2019/3/8* Rosh Chodesh Adar II
+2019/3/16* Shabbat Zachor
+2019/3/20* Ta'anit Esther
+2019/3/20* Erev Purim
+2019/3/21* Purim
+2019/3/22* Shushan Purim
+2019/3/30* Shabbat Parah
+2019/4/6* Rosh Chodesh Nisan
+2019/4/6* Shabbat HaChodesh
+2019/4/13* Shabbat HaGadol
+2019/4/19* Ta'anit Bechorot
+2019/4/19* Erev Pesach
+2019/4/20* Pesach I
+2019/4/21* Pesach II
+2019/4/22* Pesach III (CH''M)
+2019/4/23* Pesach IV (CH''M)
+2019/4/24* Pesach V (CH''M)
+2019/4/25* Pesach VI (CH''M)
+2019/4/26* Pesach VII
+2019/4/27* Pesach VIII
+2019/5/2* Yom HaShoah
+2019/5/5* Rosh Chodesh Iyyar
+2019/5/6* Rosh Chodesh Iyyar
+2019/5/8* Yom HaZikaron
+2019/5/9* Yom HaAtzma'ut
+2019/5/19* Pesach Sheni
+2019/5/23* Lag BaOmer
+2019/6/2* Yom Yerushalayim
+2019/6/4* Rosh Chodesh Sivan
+2019/6/8* Erev Shavuot
+2019/6/9* Shavuot I
+2019/6/10* Shavuot II
+2019/7/3* Rosh Chodesh Tamuz
+2019/7/4* Rosh Chodesh Tamuz
+2019/7/21* Tzom Tammuz
+2019/8/2* Rosh Chodesh Av
+2019/8/10* Shabbat Chazon
+2019/8/10* Erev Tish'a B'Av
+2019/8/11* Tish'a B'Av
+2019/8/16* Tu B'Av
+2019/8/17* Shabbat Nachamu
+2019/8/31* Rosh Chodesh Elul
+2019/9/1* Rosh Chodesh Elul
+2019/9/21* Leil Selichot
+2019/9/29* Erev Rosh Hashana
+2019/9/30* Rosh Hashana 5780
+2019/10/1* Rosh Hashana II
+2019/10/2* Tzom Gedaliah
+2019/10/5* Shabbat Shuva
+2019/10/8* Erev Yom Kippur
+2019/10/9* Yom Kippur
+2019/10/13* Erev Sukkot
+2019/10/14* Sukkot I
+2019/10/15* Sukkot II
+2019/10/16* Sukkot III (CH''M)
+2019/10/17* Sukkot IV (CH''M)
+2019/10/18* Sukkot V (CH''M)
+2019/10/19* Sukkot VI (CH''M)
+2019/10/20* Sukkot VII (Hoshana Raba)
+2019/10/21* Shmini Atzeret
+2019/10/22* Simchat Torah
+2019/10/29* Rosh Chodesh Cheshvan
+2019/10/30* Rosh Chodesh Cheshvan
+2019/11/5* Yom HaAliyah
+2019/11/27* Sigd
+2019/11/28* Rosh Chodesh Kislev
+2019/11/29* Rosh Chodesh Kislev
+2019/12/22* Chanukah: 1 Candle
+2019/12/23* Chanukah: 2 Candles
+2019/12/24* Chanukah: 3 Candles
+2019/12/25* Chanukah: 4 Candles
+2019/12/26* Chanukah: 5 Candles
+2019/12/27* Chanukah: 6 Candles
+2019/12/28* Rosh Chodesh Tevet
+2019/12/28* Chanukah: 7 Candles
+2019/12/29* Rosh Chodesh Tevet
+2019/12/29* Chanukah: 8 Candles
+2019/12/30* Chanukah: 8th Day
+2020/1/7* Asara B'Tevet
+2020/1/27* Rosh Chodesh Sh'vat
+2020/2/10* Tu BiShvat
+2020/2/22* Shabbat Shekalim
+2020/2/25* Rosh Chodesh Adar
+2020/2/26* Rosh Chodesh Adar
+2020/3/7* Shabbat Zachor
+2020/3/9* Ta'anit Esther
+2020/3/9* Erev Purim
+2020/3/10* Purim
+2020/3/11* Shushan Purim
+2020/3/14* Shabbat Parah
+2020/3/21* Shabbat HaChodesh
+2020/3/26* Rosh Chodesh Nisan
+2020/4/4* Shabbat HaGadol
+2020/4/8* Ta'anit Bechorot
+2020/4/8* Erev Pesach
+2020/4/9* Pesach I
+2020/4/10* Pesach II
+2020/4/11* Pesach III (CH''M)
+2020/4/12* Pesach IV (CH''M)
+2020/4/13* Pesach V (CH''M)
+2020/4/14* Pesach VI (CH''M)
+2020/4/15* Pesach VII
+2020/4/16* Pesach VIII
+2020/4/21* Yom HaShoah
+2020/4/24* Rosh Chodesh Iyyar
+2020/4/25* Rosh Chodesh Iyyar
+2020/4/28* Yom HaZikaron
+2020/4/29* Yom HaAtzma'ut
+2020/5/8* Pesach Sheni
+2020/5/12* Lag BaOmer
+2020/5/22* Yom Yerushalayim
+2020/5/24* Rosh Chodesh Sivan
+2020/5/28* Erev Shavuot
+2020/5/29* Shavuot I
+2020/5/30* Shavuot II
+2020/6/22* Rosh Chodesh Tamuz
+2020/6/23* Rosh Chodesh Tamuz
+2020/7/9* Tzom Tammuz
+2020/7/22* Rosh Chodesh Av
+2020/7/25* Shabbat Chazon
+2020/7/29* Erev Tish'a B'Av
+2020/7/30* Tish'a B'Av
+2020/8/1* Shabbat Nachamu
+2020/8/5* Tu B'Av
+2020/8/20* Rosh Chodesh Elul
+2020/8/21* Rosh Chodesh Elul
+2020/9/12* Leil Selichot
+2020/9/18* Erev Rosh Hashana
+2020/9/19* Rosh Hashana 5781
+2020/9/20* Rosh Hashana II
+2020/9/21* Tzom Gedaliah
+2020/9/26* Shabbat Shuva
+2020/9/27* Erev Yom Kippur
+2020/9/28* Yom Kippur
+2020/10/2* Erev Sukkot
+2020/10/3* Sukkot I
+2020/10/4* Sukkot II
+2020/10/5* Sukkot III (CH''M)
+2020/10/6* Sukkot IV (CH''M)
+2020/10/7* Sukkot V (CH''M)
+2020/10/8* Sukkot VI (CH''M)
+2020/10/9* Sukkot VII (Hoshana Raba)
+2020/10/10* Shmini Atzeret
+2020/10/11* Simchat Torah
+2020/10/18* Rosh Chodesh Cheshvan
+2020/10/19* Rosh Chodesh Cheshvan
+2020/10/25* Yom HaAliyah
+2020/11/16* Sigd
+2020/11/17* Rosh Chodesh Kislev
+2020/12/10* Chanukah: 1 Candle
+2020/12/11* Chanukah: 2 Candles
+2020/12/12* Chanukah: 3 Candles
+2020/12/13* Chanukah: 4 Candles
+2020/12/14* Chanukah: 5 Candles
+2020/12/15* Chanukah: 6 Candles
+2020/12/16* Rosh Chodesh Tevet
+2020/12/16* Chanukah: 7 Candles
+2020/12/17* Chanukah: 8 Candles
+2020/12/18* Chanukah: 8th Day
+2020/12/25* Asara B'Tevet
+2021/1/14* Rosh Chodesh Sh'vat
+2021/1/28* Tu BiShvat
+2021/2/12* Rosh Chodesh Adar
+2021/2/13* Rosh Chodesh Adar
+2021/2/13* Shabbat Shekalim
+2021/2/20* Shabbat Zachor
+2021/2/25* Ta'anit Esther
+2021/2/25* Erev Purim
+2021/2/26* Purim
+2021/2/28* Shushan Purim
+2021/3/6* Shabbat Parah
+2021/3/13* Shabbat HaChodesh
+2021/3/14* Rosh Chodesh Nisan
+2021/3/25* Ta'anit Bechorot
+2021/3/27* Shabbat HaGadol
+2021/3/27* Erev Pesach
+2021/3/28* Pesach I
+2021/3/29* Pesach II
+2021/3/30* Pesach III (CH''M)
+2021/3/31* Pesach IV (CH''M)
+2021/4/1* Pesach V (CH''M)
+2021/4/2* Pesach VI (CH''M)
+2021/4/3* Pesach VII
+2021/4/4* Pesach VIII
+2021/4/8* Yom HaShoah
+2021/4/12* Rosh Chodesh Iyyar
+2021/4/13* Rosh Chodesh Iyyar
+2021/4/14* Yom HaZikaron
+2021/4/15* Yom HaAtzma'ut
+2021/4/26* Pesach Sheni
+2021/4/30* Lag BaOmer
+2021/5/10* Yom Yerushalayim
+2021/5/12* Rosh Chodesh Sivan
+2021/5/16* Erev Shavuot
+2021/5/17* Shavuot I
+2021/5/18* Shavuot II
+2021/6/10* Rosh Chodesh Tamuz
+2021/6/11* Rosh Chodesh Tamuz
+2021/6/27* Tzom Tammuz
+2021/7/10* Rosh Chodesh Av
+2021/7/17* Shabbat Chazon
+2021/7/17* Erev Tish'a B'Av
+2021/7/18* Tish'a B'Av
+2021/7/24* Shabbat Nachamu
+2021/7/24* Tu B'Av
+2021/8/8* Rosh Chodesh Elul
+2021/8/9* Rosh Chodesh Elul
+2021/8/28* Leil Selichot
+2021/9/6* Erev Rosh Hashana
+2021/9/7* Rosh Hashana 5782
+2021/9/8* Rosh Hashana II
+2021/9/9* Tzom Gedaliah
+2021/9/11* Shabbat Shuva
+2021/9/15* Erev Yom Kippur
+2021/9/16* Yom Kippur
+2021/9/20* Erev Sukkot
+2021/9/21* Sukkot I
+2021/9/22* Sukkot II
+2021/9/23* Sukkot III (CH''M)
+2021/9/24* Sukkot IV (CH''M)
+2021/9/25* Sukkot V (CH''M)
+2021/9/26* Sukkot VI (CH''M)
+2021/9/27* Sukkot VII (Hoshana Raba)
+2021/9/28* Shmini Atzeret
+2021/9/29* Simchat Torah
+2021/10/6* Rosh Chodesh Cheshvan
+2021/10/7* Rosh Chodesh Cheshvan
+2021/10/13* Yom HaAliyah
+2021/11/4* Sigd
+2021/11/5* Rosh Chodesh Kislev
+2021/11/28* Chanukah: 1 Candle
+2021/11/29* Chanukah: 2 Candles
+2021/11/30* Chanukah: 3 Candles
+2021/12/1* Chanukah: 4 Candles
+2021/12/2* Chanukah: 5 Candles
+2021/12/3* Chanukah: 6 Candles
+2021/12/4* Rosh Chodesh Tevet
+2021/12/4* Chanukah: 7 Candles
+2021/12/5* Rosh Chodesh Tevet
+2021/12/5* Chanukah: 8 Candles
+2021/12/6* Chanukah: 8th Day
+2021/12/14* Asara B'Tevet
+2022/1/3* Rosh Chodesh Sh'vat
+2022/1/17* Tu BiShvat
+2022/2/1* Rosh Chodesh Adar I
+2022/2/2* Rosh Chodesh Adar I
+2022/2/15* Purim Katan
+2022/2/26* Shabbat Shekalim
+2022/3/3* Rosh Chodesh Adar II
+2022/3/4* Rosh Chodesh Adar II
+2022/3/12* Shabbat Zachor
+2022/3/16* Ta'anit Esther
+2022/3/16* Erev Purim
+2022/3/17* Purim
+2022/3/18* Shushan Purim
+2022/3/26* Shabbat Parah
+2022/4/2* Rosh Chodesh Nisan
+2022/4/2* Shabbat HaChodesh
+2022/4/9* Shabbat HaGadol
+2022/4/15* Ta'anit Bechorot
+2022/4/15* Erev Pesach
+2022/4/16* Pesach I
+2022/4/17* Pesach II
+2022/4/18* Pesach III (CH''M)
+2022/4/19* Pesach IV (CH''M)
+2022/4/20* Pesach V (CH''M)
+2022/4/21* Pesach VI (CH''M)
+2022/4/22* Pesach VII
+2022/4/23* Pesach VIII
+2022/4/28* Yom HaShoah
+2022/5/1* Rosh Chodesh Iyyar
+2022/5/2* Rosh Chodesh Iyyar
+2022/5/4* Yom HaZikaron
+2022/5/5* Yom HaAtzma'ut
+2022/5/15* Pesach Sheni
+2022/5/19* Lag BaOmer
+2022/5/29* Yom Yerushalayim
+2022/5/31* Rosh Chodesh Sivan
+2022/6/4* Erev Shavuot
+2022/6/5* Shavuot I
+2022/6/6* Shavuot II
+2022/6/29* Rosh Chodesh Tamuz
+2022/6/30* Rosh Chodesh Tamuz
+2022/7/17* Tzom Tammuz
+2022/7/29* Rosh Chodesh Av
+2022/8/6* Shabbat Chazon
+2022/8/6* Erev Tish'a B'Av
+2022/8/7* Tish'a B'Av
+2022/8/12* Tu B'Av
+2022/8/13* Shabbat Nachamu
+2022/8/27* Rosh Chodesh Elul
+2022/8/28* Rosh Chodesh Elul
+2022/9/17* Leil Selichot
+2022/9/25* Erev Rosh Hashana
+2022/9/26* Rosh Hashana 5783
+2022/9/27* Rosh Hashana II
+2022/9/28* Tzom Gedaliah
+2022/10/1* Shabbat Shuva
+2022/10/4* Erev Yom Kippur
+2022/10/5* Yom Kippur
+2022/10/9* Erev Sukkot
+2022/10/10* Sukkot I
+2022/10/11* Sukkot II
+2022/10/12* Sukkot III (CH''M)
+2022/10/13* Sukkot IV (CH''M)
+2022/10/14* Sukkot V (CH''M)
+2022/10/15* Sukkot VI (CH''M)
+2022/10/16* Sukkot VII (Hoshana Raba)
+2022/10/17* Shmini Atzeret
+2022/10/18* Simchat Torah
+2022/10/25* Rosh Chodesh Cheshvan
+2022/10/26* Rosh Chodesh Cheshvan
+2022/11/1* Yom HaAliyah
+2022/11/23* Sigd
+2022/11/24* Rosh Chodesh Kislev
+2022/11/25* Rosh Chodesh Kislev
+2022/12/18* Chanukah: 1 Candle
+2022/12/19* Chanukah: 2 Candles
+2022/12/20* Chanukah: 3 Candles
+2022/12/21* Chanukah: 4 Candles
+2022/12/22* Chanukah: 5 Candles
+2022/12/23* Chanukah: 6 Candles
+2022/12/24* Rosh Chodesh Tevet
+2022/12/24* Chanukah: 7 Candles
+2022/12/25* Rosh Chodesh Tevet
+2022/12/25* Chanukah: 8 Candles
+2022/12/26* Chanukah: 8th Day
+2023/1/3* Asara B'Tevet
+2023/1/23* Rosh Chodesh Sh'vat
+2023/2/6* Tu BiShvat
+2023/2/18* Shabbat Shekalim
+2023/2/21* Rosh Chodesh Adar
+2023/2/22* Rosh Chodesh Adar
+2023/3/4* Shabbat Zachor
+2023/3/6* Ta'anit Esther
+2023/3/6* Erev Purim
+2023/3/7* Purim
+2023/3/8* Shushan Purim
+2023/3/11* Shabbat Parah
+2023/3/18* Shabbat HaChodesh
+2023/3/23* Rosh Chodesh Nisan
+2023/4/1* Shabbat HaGadol
+2023/4/5* Ta'anit Bechorot
+2023/4/5* Erev Pesach
+2023/4/6* Pesach I
+2023/4/7* Pesach II
+2023/4/8* Pesach III (CH''M)
+2023/4/9* Pesach IV (CH''M)
+2023/4/10* Pesach V (CH''M)
+2023/4/11* Pesach VI (CH''M)
+2023/4/12* Pesach VII
+2023/4/13* Pesach VIII
+2023/4/18* Yom HaShoah
+2023/4/21* Rosh Chodesh Iyyar
+2023/4/22* Rosh Chodesh Iyyar
+2023/4/25* Yom HaZikaron
+2023/4/26* Yom HaAtzma'ut
+2023/5/5* Pesach Sheni
+2023/5/9* Lag BaOmer
+2023/5/19* Yom Yerushalayim
+2023/5/21* Rosh Chodesh Sivan
+2023/5/25* Erev Shavuot
+2023/5/26* Shavuot I
+2023/5/27* Shavuot II
+2023/6/19* Rosh Chodesh Tamuz
+2023/6/20* Rosh Chodesh Tamuz
+2023/7/6* Tzom Tammuz
+2023/7/19* Rosh Chodesh Av
+2023/7/22* Shabbat Chazon
+2023/7/26* Erev Tish'a B'Av
+2023/7/27* Tish'a B'Av
+2023/7/29* Shabbat Nachamu
+2023/8/2* Tu B'Av
+2023/8/17* Rosh Chodesh Elul
+2023/8/18* Rosh Chodesh Elul
+2023/9/9* Leil Selichot
+2023/9/15* Erev Rosh Hashana
+2023/9/16* Rosh Hashana 5784
+2023/9/17* Rosh Hashana II
+2023/9/18* Tzom Gedaliah
+2023/9/23* Shabbat Shuva
+2023/9/24* Erev Yom Kippur
+2023/9/25* Yom Kippur
+2023/9/29* Erev Sukkot
+2023/9/30* Sukkot I
+2023/10/1* Sukkot II
+2023/10/2* Sukkot III (CH''M)
+2023/10/3* Sukkot IV (CH''M)
+2023/10/4* Sukkot V (CH''M)
+2023/10/5* Sukkot VI (CH''M)
+2023/10/6* Sukkot VII (Hoshana Raba)
+2023/10/7* Shmini Atzeret
+2023/10/8* Simchat Torah
+2023/10/15* Rosh Chodesh Cheshvan
+2023/10/16* Rosh Chodesh Cheshvan
+2023/10/22* Yom HaAliyah
+2023/11/13* Sigd
+2023/11/14* Rosh Chodesh Kislev
+2023/12/7* Chanukah: 1 Candle
+2023/12/8* Chanukah: 2 Candles
+2023/12/9* Chanukah: 3 Candles
+2023/12/10* Chanukah: 4 Candles
+2023/12/11* Chanukah: 5 Candles
+2023/12/12* Chanukah: 6 Candles
+2023/12/13* Rosh Chodesh Tevet
+2023/12/13* Chanukah: 7 Candles
+2023/12/14* Chanukah: 8 Candles
+2023/12/15* Chanukah: 8th Day
+2023/12/22* Asara B'Tevet
+2024/1/11* Rosh Chodesh Sh'vat
+2024/1/25* Tu BiShvat
+2024/2/9* Rosh Chodesh Adar I
+2024/2/10* Rosh Chodesh Adar I
+2024/2/23* Purim Katan
+2024/3/9* Shabbat Shekalim
+2024/3/10* Rosh Chodesh Adar II
+2024/3/11* Rosh Chodesh Adar II
+2024/3/21* Ta'anit Esther
+2024/3/23* Shabbat Zachor
+2024/3/23* Erev Purim
+2024/3/24* Purim
+2024/3/25* Shushan Purim
+2024/3/30* Shabbat Parah
+2024/4/6* Shabbat HaChodesh
+2024/4/9* Rosh Chodesh Nisan
+2024/4/20* Shabbat HaGadol
+2024/4/22* Ta'anit Bechorot
+2024/4/22* Erev Pesach
+2024/4/23* Pesach I
+2024/4/24* Pesach II
+2024/4/25* Pesach III (CH''M)
+2024/4/26* Pesach IV (CH''M)
+2024/4/27* Pesach V (CH''M)
+2024/4/28* Pesach VI (CH''M)
+2024/4/29* Pesach VII
+2024/4/30* Pesach VIII
+2024/5/6* Yom HaShoah
+2024/5/8* Rosh Chodesh Iyyar
+2024/5/9* Rosh Chodesh Iyyar
+2024/5/13* Yom HaZikaron
+2024/5/14* Yom HaAtzma'ut
+2024/5/22* Pesach Sheni
+2024/5/26* Lag BaOmer
+2024/6/5* Yom Yerushalayim
+2024/6/7* Rosh Chodesh Sivan
+2024/6/11* Erev Shavuot
+2024/6/12* Shavuot I
+2024/6/13* Shavuot II
+2024/7/6* Rosh Chodesh Tamuz
+2024/7/7* Rosh Chodesh Tamuz
+2024/7/23* Tzom Tammuz
+2024/8/5* Rosh Chodesh Av
+2024/8/10* Shabbat Chazon
+2024/8/12* Erev Tish'a B'Av
+2024/8/13* Tish'a B'Av
+2024/8/17* Shabbat Nachamu
+2024/8/19* Tu B'Av
+2024/9/3* Rosh Chodesh Elul
+2024/9/4* Rosh Chodesh Elul
+2024/9/28* Leil Selichot
+2024/10/2* Erev Rosh Hashana
+2024/10/3* Rosh Hashana 5785
+2024/10/4* Rosh Hashana II
+2024/10/5* Shabbat Shuva
+2024/10/6* Tzom Gedaliah
+2024/10/11* Erev Yom Kippur
+2024/10/12* Yom Kippur
+2024/10/16* Erev Sukkot
+2024/10/17* Sukkot I
+2024/10/18* Sukkot II
+2024/10/19* Sukkot III (CH''M)
+2024/10/20* Sukkot IV (CH''M)
+2024/10/21* Sukkot V (CH''M)
+2024/10/22* Sukkot VI (CH''M)
+2024/10/23* Sukkot VII (Hoshana Raba)
+2024/10/24* Shmini Atzeret
+2024/10/25* Simchat Torah
+2024/11/1* Rosh Chodesh Cheshvan
+2024/11/2* Rosh Chodesh Cheshvan
+2024/11/8* Yom HaAliyah
+2024/11/30* Sigd
+2024/12/1* Rosh Chodesh Kislev
+2024/12/2* Rosh Chodesh Kislev
+2024/12/25* Chanukah: 1 Candle
+2024/12/26* Chanukah: 2 Candles
+2024/12/27* Chanukah: 3 Candles
+2024/12/28* Chanukah: 4 Candles
+2024/12/29* Chanukah: 5 Candles
+2024/12/30* Chanukah: 6 Candles
+2024/12/31* Rosh Chodesh Tevet
+2024/12/31* Chanukah: 7 Candles
+2025/1/1* Rosh Chodesh Tevet
+2025/1/1* Chanukah: 8 Candles
+2025/1/2* Chanukah: 8th Day
+2025/1/10* Asara B'Tevet
+2025/1/30* Rosh Chodesh Sh'vat
+2025/2/13* Tu BiShvat
+2025/2/28* Rosh Chodesh Adar
+2025/3/1* Rosh Chodesh Adar
+2025/3/1* Shabbat Shekalim
+2025/3/8* Shabbat Zachor
+2025/3/13* Ta'anit Esther
+2025/3/13* Erev Purim
+2025/3/14* Purim
+2025/3/16* Shushan Purim
+2025/3/22* Shabbat Parah
+2025/3/29* Shabbat HaChodesh
+2025/3/30* Rosh Chodesh Nisan
+2025/4/10* Ta'anit Bechorot
+2025/4/12* Shabbat HaGadol
+2025/4/12* Erev Pesach
+2025/4/13* Pesach I
+2025/4/14* Pesach II
+2025/4/15* Pesach III (CH''M)
+2025/4/16* Pesach IV (CH''M)
+2025/4/17* Pesach V (CH''M)
+2025/4/18* Pesach VI (CH''M)
+2025/4/19* Pesach VII
+2025/4/20* Pesach VIII
+2025/4/24* Yom HaShoah
+2025/4/28* Rosh Chodesh Iyyar
+2025/4/29* Rosh Chodesh Iyyar
+2025/4/30* Yom HaZikaron
+2025/5/1* Yom HaAtzma'ut
+2025/5/12* Pesach Sheni
+2025/5/16* Lag BaOmer
+2025/5/26* Yom Yerushalayim
+2025/5/28* Rosh Chodesh Sivan
+2025/6/1* Erev Shavuot
+2025/6/2* Shavuot I
+2025/6/3* Shavuot II
+2025/6/26* Rosh Chodesh Tamuz
+2025/6/27* Rosh Chodesh Tamuz
+2025/7/13* Tzom Tammuz
+2025/7/26* Rosh Chodesh Av
+2025/8/2* Shabbat Chazon
+2025/8/2* Erev Tish'a B'Av
+2025/8/3* Tish'a B'Av
+2025/8/9* Shabbat Nachamu
+2025/8/9* Tu B'Av
+2025/8/24* Rosh Chodesh Elul
+2025/8/25* Rosh Chodesh Elul
+2025/9/13* Leil Selichot
+2025/9/22* Erev Rosh Hashana
+2025/9/23* Rosh Hashana 5786
+2025/9/24* Rosh Hashana II
+2025/9/25* Tzom Gedaliah
+2025/9/27* Shabbat Shuva
+2025/10/1* Erev Yom Kippur
+2025/10/2* Yom Kippur
+2025/10/6* Erev Sukkot
+2025/10/7* Sukkot I
+2025/10/8* Sukkot II
+2025/10/9* Sukkot III (CH''M)
+2025/10/10* Sukkot IV (CH''M)
+2025/10/11* Sukkot V (CH''M)
+2025/10/12* Sukkot VI (CH''M)
+2025/10/13* Sukkot VII (Hoshana Raba)
+2025/10/14* Shmini Atzeret
+2025/10/15* Simchat Torah
+2025/10/22* Rosh Chodesh Cheshvan
+2025/10/23* Rosh Chodesh Cheshvan
+2025/10/29* Yom HaAliyah
+2025/11/20* Sigd
+2025/11/21* Rosh Chodesh Kislev
+2025/12/14* Chanukah: 1 Candle
+2025/12/15* Chanukah: 2 Candles
+2025/12/16* Chanukah: 3 Candles
+2025/12/17* Chanukah: 4 Candles
+2025/12/18* Chanukah: 5 Candles
+2025/12/19* Chanukah: 6 Candles
+2025/12/20* Rosh Chodesh Tevet
+2025/12/20* Chanukah: 7 Candles
+2025/12/21* Rosh Chodesh Tevet
+2025/12/21* Chanukah: 8 Candles
+2025/12/22* Chanukah: 8th Day
+2025/12/30* Asara B'Tevet
+2026/1/19* Rosh Chodesh Sh'vat
+2026/2/2* Tu BiShvat
+2026/2/14* Shabbat Shekalim
+2026/2/17* Rosh Chodesh Adar
+2026/2/18* Rosh Chodesh Adar
+2026/2/28* Shabbat Zachor
+2026/3/2* Ta'anit Esther
+2026/3/2* Erev Purim
+2026/3/3* Purim
+2026/3/4* Shushan Purim
+2026/3/7* Shabbat Parah
+2026/3/14* Shabbat HaChodesh
+2026/3/19* Rosh Chodesh Nisan
+2026/3/28* Shabbat HaGadol
+2026/4/1* Ta'anit Bechorot
+2026/4/1* Erev Pesach
+2026/4/2* Pesach I
+2026/4/3* Pesach II
+2026/4/4* Pesach III (CH''M)
+2026/4/5* Pesach IV (CH''M)
+2026/4/6* Pesach V (CH''M)
+2026/4/7* Pesach VI (CH''M)
+2026/4/8* Pesach VII
+2026/4/9* Pesach VIII
+2026/4/14* Yom HaShoah
+2026/4/17* Rosh Chodesh Iyyar
+2026/4/18* Rosh Chodesh Iyyar
+2026/4/21* Yom HaZikaron
+2026/4/22* Yom HaAtzma'ut
+2026/5/1* Pesach Sheni
+2026/5/5* Lag BaOmer
+2026/5/15* Yom Yerushalayim
+2026/5/17* Rosh Chodesh Sivan
+2026/5/21* Erev Shavuot
+2026/5/22* Shavuot I
+2026/5/23* Shavuot II
+2026/6/15* Rosh Chodesh Tamuz
+2026/6/16* Rosh Chodesh Tamuz
+2026/7/2* Tzom Tammuz
+2026/7/15* Rosh Chodesh Av
+2026/7/18* Shabbat Chazon
+2026/7/22* Erev Tish'a B'Av
+2026/7/23* Tish'a B'Av
+2026/7/25* Shabbat Nachamu
+2026/7/29* Tu B'Av
+2026/8/13* Rosh Chodesh Elul
+2026/8/14* Rosh Chodesh Elul
+2026/9/5* Leil Selichot
+2026/9/11* Erev Rosh Hashana
+2026/9/12* Rosh Hashana 5787
+2026/9/13* Rosh Hashana II
+2026/9/14* Tzom Gedaliah
+2026/9/19* Shabbat Shuva
+2026/9/20* Erev Yom Kippur
+2026/9/21* Yom Kippur
+2026/9/25* Erev Sukkot
+2026/9/26* Sukkot I
+2026/9/27* Sukkot II
+2026/9/28* Sukkot III (CH''M)
+2026/9/29* Sukkot IV (CH''M)
+2026/9/30* Sukkot V (CH''M)
+2026/10/1* Sukkot VI (CH''M)
+2026/10/2* Sukkot VII (Hoshana Raba)
+2026/10/3* Shmini Atzeret
+2026/10/4* Simchat Torah
+2026/10/11* Rosh Chodesh Cheshvan
+2026/10/12* Rosh Chodesh Cheshvan
+2026/10/18* Yom HaAliyah
+2026/11/9* Sigd
+2026/11/10* Rosh Chodesh Kislev
+2026/11/11* Rosh Chodesh Kislev
+2026/12/4* Chanukah: 1 Candle
+2026/12/5* Chanukah: 2 Candles
+2026/12/6* Chanukah: 3 Candles
+2026/12/7* Chanukah: 4 Candles
+2026/12/8* Chanukah: 5 Candles
+2026/12/9* Chanukah: 6 Candles
+2026/12/10* Rosh Chodesh Tevet
+2026/12/10* Chanukah: 7 Candles
+2026/12/11* Rosh Chodesh Tevet
+2026/12/11* Chanukah: 8 Candles
+2026/12/12* Chanukah: 8th Day
+2026/12/20* Asara B'Tevet
+2027/1/9* Rosh Chodesh Sh'vat
+2027/1/23* Tu BiShvat
+2027/2/7* Rosh Chodesh Adar I
+2027/2/8* Rosh Chodesh Adar I
+2027/2/21* Purim Katan
+2027/3/6* Shabbat Shekalim
+2027/3/9* Rosh Chodesh Adar II
+2027/3/10* Rosh Chodesh Adar II
+2027/3/20* Shabbat Zachor
+2027/3/22* Ta'anit Esther
+2027/3/22* Erev Purim
+2027/3/23* Purim
+2027/3/24* Shushan Purim
+2027/3/27* Shabbat Parah
+2027/4/3* Shabbat HaChodesh
+2027/4/8* Rosh Chodesh Nisan
+2027/4/17* Shabbat HaGadol
+2027/4/21* Ta'anit Bechorot
+2027/4/21* Erev Pesach
+2027/4/22* Pesach I
+2027/4/23* Pesach II
+2027/4/24* Pesach III (CH''M)
+2027/4/25* Pesach IV (CH''M)
+2027/4/26* Pesach V (CH''M)
+2027/4/27* Pesach VI (CH''M)
+2027/4/28* Pesach VII
+2027/4/29* Pesach VIII
+2027/5/4* Yom HaShoah
+2027/5/7* Rosh Chodesh Iyyar
+2027/5/8* Rosh Chodesh Iyyar
+2027/5/11* Yom HaZikaron
+2027/5/12* Yom HaAtzma'ut
+2027/5/21* Pesach Sheni
+2027/5/25* Lag BaOmer
+2027/6/4* Yom Yerushalayim
+2027/6/6* Rosh Chodesh Sivan
+2027/6/10* Erev Shavuot
+2027/6/11* Shavuot I
+2027/6/12* Shavuot II
+2027/7/5* Rosh Chodesh Tamuz
+2027/7/6* Rosh Chodesh Tamuz
+2027/7/22* Tzom Tammuz
+2027/8/4* Rosh Chodesh Av
+2027/8/7* Shabbat Chazon
+2027/8/11* Erev Tish'a B'Av
+2027/8/12* Tish'a B'Av
+2027/8/14* Shabbat Nachamu
+2027/8/18* Tu B'Av
+2027/9/2* Rosh Chodesh Elul
+2027/9/3* Rosh Chodesh Elul
+2027/9/25* Leil Selichot
+2027/10/1* Erev Rosh Hashana
+2027/10/2* Rosh Hashana 5788
+2027/10/3* Rosh Hashana II
+2027/10/4* Tzom Gedaliah
+
+
+#endif /* !_calendar_judaic_ */
diff --git a/usr.bin/calendar/calendars/calendar.lotr b/usr.bin/calendar/calendars/calendar.lotr
new file mode 100644
index 000000000000..2450e363400b
--- /dev/null
+++ b/usr.bin/calendar/calendars/calendar.lotr
@@ -0,0 +1,48 @@
+/*
+ * Lord Of The Rings
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _calendar_lotr_
+#define _calendar_lotr_
+
+01/05 Fellowship enters Moria
+01/09 Fellowship reaches Lorien
+01/17 Passing of Gandalf
+02/07 Fellowship leaves Lorien
+02/17 Death of Boromir
+02/20 Meriadoc & Pippin meet Treebeard
+02/22 Passing of King Ellesar
+02/24 Ents destroy Isengard
+02/26 Aragorn takes the Paths of the Dead
+03/05 Frodo & Samwise encounter Shelob
+03/08 Deaths of Denethor & Theoden
+03/18 Destruction of the Ring
+03/29 Flowering of the Mallorn
+04/04 Gandalf visits Bilbo
+04/17 An unexpected party
+04/23 Crowning of King Ellesar
+05/19 Arwen leaves Lorian to wed King Ellesar
+06/11 Sauron attacks Osgilliath
+06/13 Bilbo returns to Bag End
+06/23 Wedding of Ellesar & Arwen
+07/04 Gandalf imprisoned by Saruman
+07/24 The ring comes to Bilbo
+07/26 Bilbo rescued from Wargs by Eagles
+08/03 Funeral of King Theoden
+08/29 Saruman enters the Shire
+09/10 Gandalf escapes from Orthanc
+09/14 Frodo & Bilbo's birthday
+09/15 Black riders enter the Shire
+09/18 Frodo and company rescued by Bombadil
+09/28 Frodo wounded at Weathertop
+10/05 Frodo crosses bridge of Mitheithel
+10/16 Boromir reaches Rivendell
+10/17 Council of Elrond
+10/25 End of War of the Ring
+11/16 Bilbo reaches the Lonely Mountain
+12/05 Death of Smaug
+12/16 Fellowship begins Quest
+
+#endif /* !_calendar_lotr_ */
diff --git a/usr.bin/calendar/calendars/calendar.music b/usr.bin/calendar/calendars/calendar.music
new file mode 100644
index 000000000000..20e1915368d8
--- /dev/null
+++ b/usr.bin/calendar/calendars/calendar.music
@@ -0,0 +1,240 @@
+/*
+ * Music
+ *
+ * $FreeBSD$
+ */
+
+#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/08 Elvis Presley born, 1935
+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 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
+01/17 Led Zeppelin's first album is released, 1969
+01/19 Janis Joplin is born in Port Arthur, Texas, 1943
+01/22 Sam Cooke is born in Chicago, 1935
+01/24 Warren Zevon is born in Chicago, 1947
+01/25 Bob Dylan plays the second "Hurricane" benefit, in the Astrodome, 1978
+01/27 Bobby "Blue" Bland (Robert Calvin Bland) is born in Tennessee, 1930
+01/27 Wolfgang Amadeus Mozart is born in Salzburg, Austria, 1756
+01/28 Jimi Hendrix headlines Madison Square Garden, 1970
+01/30 Lightnin' Hopkins, the most-recorded blues artist ever, dies, 1982
+01/31 Franz Schubert is born in Lichtenthal, Vienna, Austria, 1797
+01/31 The Grateful Dead are busted in New Orleans, 1970
+02/01 RCA Victor unveils the 45 rpm record playing system, 1949
+02/02 Graham Nash is born in Lancashire, England, 1942
+02/03 Felix Mendelssohn Bartholdy is born in Hamburg, Germany, 1809
+02/03 The Day The Music Died; Buddy Holly, Richie Valens, and the Big
+ Bopper are killed in a plane crash outside Mason City, Iowa, 1959
+02/07 Beatles land at JFK airport to begin first U.S. tour, 1964
+02/07 Steven Stills makes the first digitally recorded rock album, 1979
+02/09 Carole King (Carole Klein) is born in Brooklyn, 1941
+02/12 The Beatles play Carnegie Hall in New York City, 1964
+02/13 Richard Wagner dies in Venice, Italy, 1883
+02/17 Jazz great Thelonius Monk dies in Englewood, New Jersey, 1982
+02/18 Yoko Ono Lennon is born in Tokyo, 1933
+02/19 Paul McCartney's "Give Ireland Back to the Irish" is banned in
+ Britain, 1972
+02/19 William "Smokey" Robinson is born in Detroit, 1940
+02/20 J. Geils (J. Geils Band) is born, 1946
+02/20 Yes sells out Madison Square Garden...without advertising, 1974
+02/23 George Friedrich Handel is born in Halle on the Saale, Germany, 1685
+02/23 Johnny Winter is born in Leland, Mississippi, 1944
+02/25 George Harrison born in Liverpool, England, 1943
+02/29 Jimmy Dorsey born, 1904
+03/01 Frederic Chopin is born in Zelazowa Wola, Warsaw, Poland, 1810
+03/01 Jim Morrison is busted for obscenity in Miami, 1969
+03/02 Blues guitarist Rory Gallagher is born in Ballyshannon, Ireland, 1949
+03/03 Buffalo Springfield is formed in Los Angeles, 1966
+03/04 Antonio Vivaldi born in Venice, Italy, 1678
+03/07 Last Gilbert & Sullivan opera produced, 1896
+03/08 Ron "Pigpen" McKernan (Grateful Dead) dies in California, 1973
+03/08 (Louis) Hector Berlioz dies in Paris, 1869
+03/09 Robin Trower is born in London, 1945
+03/13 The Allman Brothers record their live album at the Fillmore East, 1971
+03/15 Sly Stone born, 1944
+03/17 Paul Kantner (Jefferson Airplane) is born in San Francisco, 1942
+03/21 Johann Sebastian Bach is born in Eisenach, Germany, 1685
+03/22 Ten Years After plays their last concert, 1974
+03/25 Aretha Franklin is born in Detroit, 1943
+03/25 Bela Bartok is born in Nagyszentmiklos, Hungary, 1881
+03/26 Emerson, Lake, and Palmer record "Pictures at an Exhibition" live, 1971
+03/26 Ludwig van Beethoven dies in Vienna, Austria, 1827
+03/28 Sergej Rachmaninow dies in Beverley Hills, 1943
+03/29 Carl Orff dies in Munich, Germany, 1982
+03/29 Dr. Hook gets a group picture on the cover of "Rolling Stone", 1973
+03/30 Eric Clapton is born in Surrey, England, 1945
+03/31 Joseph Haydn is born in Rohrau, Austria, 1732
+04/01 Sergej Rachmaninow is born in Oneg, Russia, 1873
+04/02 Marvin Gaye is born in Washington, D.C., 1939
+04/04 Muddy Waters (McKinley Morganfield) is born in Rolling Fork,
+ Mississippi, 1915
+04/09 Paul Robeson born, 1898
+04/10 Paul McCartney announces that he's quitting the Beatles, 1970
+04/14 George Friedrich Handel dies in London, England, 1759
+04/14 Ritchie Blackmore (Deep Purple, Rainbow) is born, 1945
+04/18 Yes breaks up after 13 years, 1981
+04/25 Blues guitarist Albert King is born, 1925
+04/25 Ella Fitzgerald born, 1918
+04/26 Carol Burnett born in San Antonio, Texas, 1933
+04/29 "Hair" premiers on Broadway, 1968
+05/01 Kate Smith born, 1909
+05/01 Antonin Dvorak dies in Prague, 1904
+05/03 Bob Seger is born in Ann Arbor, Michigan, 1945
+05/07 Johannes Brahms is born in Hamburg, Germany, 1833
+05/07 Tchaikowsky born, 1840
+05/10 Dave Mason is born in Worcester, England, 1945
+05/11 Bob Marley dies in his sleep in Miami, 1981
+05/12 Pink Floyd performs the first quadrophonic concert, 1977
+05/18 Gustav Mahler dies in Vienna, Austria, 1911
+05/18 Rick Wakeman is born in West London, England, 1949
+05/19 Pete Townshend is born in London, 1945
+05/20 The Jimi Hendrix Experience is signed by Reprise Records, 1967
+05/22 Richard Wagner is born in Leipzig, Germany, 1813
+05/23 Blues great Elmore James dies, 1963
+05/24 Bob Dylan (Robert Zimmerman) is born in Duluth, 1941
+05/26 Al Jolson born, 1886
+05/31 Joseph Haydn dies in Vienna, Austria, 1809
+05/31 The Who perform the loudest concert ever -- 76,000 watts of PA, 1976
+06/01 The Beatles release "Sgt. Pepper", 1967
+06/03 Georges Bizet dies in Bougival, Paris, France, 1875
+06/05 Carl Maria von Weber dies in London, England, 1826
+06/06 "Rock Around The Clock" makes Billboard's #1 slot, 1955
+06/06 Dee Dee Ramone dies, 2002
+06/07 Blind Faith debuts in concert at London's Hyde Park, 1969
+06/08 Robert Schumann is born in Zwickau, Germany, 1810
+06/09 Les Paul (Lester Polfus) is born in Waukesha, Wisconsin, 1923
+06/10 Howlin' Wolf (Chester Burnett) is born in West Point, Mississippi, 1910
+06/10 Judy Garland born, 1922
+06/11 Richard Strauss is born in Munich, Germany, 1864
+06/15 Edvard Grieg is born in Bergen, Norway, 1843
+06/15 Harry Nilsson is born in Brooklyn, 1941
+06/16 The Monterey Pop festival opens, 1967
+06/18 Paul McCartney born in Liverpool, England, 1942
+06/21 Columbia records announces the first mass production of LP's, 1948
+06/22 Todd Rundgren is born in Upper Darby, Pennsylvania, 1948
+06/24 Jeff Beck is born in Surrey, England, 1944
+06/27 John Entwistle dies in Las Vegas, 2002
+07/02 Felix Pappalardi and Leslie West form Mountain, 1969
+07/03 Jim Morrison dies in Paris, 1971
+07/06 The Jefferson Airplane is formed in San Francisco, 1965
+07/07 Gustav Mahler is born in Kalischt, Bohemia, 1860
+07/07 Ringo Starr (Richard Starkey) born in Liverpool, England, 1940
+07/10 Carl Orff is born in Munich, Germany, 1895
+07/12 Chicago DJ Steve Dahl holds "Disco Demolition" at Kamisky Park, 1979
+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 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
+07/26 Mick Jagger is born in Kent, England, 1943
+07/28 Antonio Vivaldi dies in Vienna, 1741
+07/28 Johann Sebastian Bach dies in Leipzig, 1750
+07/28 The Watkins Glen "Summer Jam" opens, 1973
+07/29 Robert Schumann dies in Endenich, Bonn, Germany, 1856
+08/01 The Concert for Bangla Desh takes place at Madison Square Garden, 1971
+08/04 John Lennon points out that "the Beatles are more popular than Jesus", 1966
+08/10 Ian Anderson (Jethro Tull) is born in Edinburgh, Scotland, 1947
+08/13 Dan Fogelberg is born in Peoria, Illinois, 1951
+08/15 Beatles replace drummer Pete Best with Richard Starkey, 1962
+08/15 The Beatles play Shea Stadium in New York, 1965
+08/15 Woodstock Festival, Max Yasgur's farm, 1969
+08/16 Elvis Presley dies, 1977
+08/16 Madonna Louise Ciccone born in Bay City, Michigan, 1958
+08/21 Joe Strummer (The Clash), born John Mellor in Ankara, Turkey, 1952
+08/23 Keith Moon is born in London, England, 1946
+08/26 Jimi Hendrix gives his last performance at the Isle of Wight, 1970
+08/26 Jimi Hendrix's Electric Ladyland Studios opens in New York, 1970
+09/04 Edvard Grieg dies in Bergen, Norway, 1907
+09/07 Keith Moon (The Who) dies in London of a drug overdose, 1978
+09/07 Warren Zevon dies in Los Angeles of lung cancer (mesothelioma), 2003
+09/08 Antonin Dvorak born in Nelahozeves, Bohemia, 1841
+09/08 Richard Strauss dies in Garmisch-Partenkirchen, Germany, 1949
+09/08 Ron "Pigpen" McKernan (Grateful Dead) is born in San Bruno, California, 1945
+09/14 Francis Scott Key writes words to "Star Spangled Banner", 1814
+09/16 B.B. King is born in Itta Bena, Mississippi, 1925
+09/18 Dee Dee Ramone (Douglas Colvin) born in Fort Lee, Virginia, 1952
+09/19 Simon & Garfunkel reunite to play New York's Central Park, 1981
+09/20 Jim Croce dies in a plane crash, 1973
+09/23 "Paul is dead" rumors sweep the country, 1969
+09/23 Bruce "The Boss" Springsteen is born in Freehold, New Jersey, 1949
+09/25 John Bonham (Led Zeppelin) dies of alcohol poisoning, 1980
+09/26 Bela Bartok dies in New York, 1945
+09/26 George Gershwin is born in Brooklyn, NY, 1898
+10/04 Janis Joplin dies of a heroin overdose in Hollywood, 1970
+10/05 Steve Miller is born in Dallas, 1943
+10/07 First Bandstand (later, American Bandstand) broadcast, 1957
+10/09 John Entwistle is born in London, England, 1944
+10/09 John Lennon born in Liverpool, England, 1940
+10/10 John Prine is born in Maywood, Illinois, 1946
+10/12 Ray Conniff dies after falling down and hitting his head, 2002
+10/12 The Jimi Hendrix Experience is formed in London, 1966
+10/16 Bob Weir (Grateful Dead) is born in San Francisco, 1947
+10/17 "Hair" opens at New York's Public Theater, 1967
+10/17 Frederic Chopin dies in Paris, France, 1849
+10/18 Chuck Berry is born in St. Louis, Missouri, 1926
+10/20 Three members of Lynyrd Skynyrd die in a plane crash, 1977
+10/21 Jesus Christ Super Star debuted on Broadway, 1971
+10/22 Franz Liszt born, 1811
+10/22 Pau (Pablo) Casals dies in Puerto Rico, 1973
+10/25 Georges Bizet is born in Paris, France, 1838
+10/25 Jon Anderson (Yes) is born in Lancashire, England, 1944
+10/25 The Rolling Stones appear on The Ed Sullivan Show, 1964
+10/29 Duane Allman dies in motorcycle crash near Macon, Georgia, 1971
+10/30 Grace Slick is born in Chicago, 1939
+11/02 Jimi Hendrix's "Electric Ladyland" enters US charts at #1, 1968
+11/02 Keith Emerson is born, 1944
+11/03 James Taylor and Carly Simon are married in Manhattan, 1972
+11/04 Felix Mendelssohn Bartholdy dies in Leipzig, Germany, 1847
+11/06 Ray Conniff born in Attleboro, Massachusetts, 1916
+11/07 Joni Mitchell (Roberta Joan Anderson) is born in Alberta, Canada, 1943
+11/08 Patti Page born, 1927
+11/09 The first issue of "Rolling Stone" is published, 1967
+11/10 Greg Lake is born in Bournemouth, England, 1948
+11/12 Neil Young is born in Toronto, 1945
+11/13 Paul Simon born, 1942
+11/16 Bill Ham first demonstrates his psychedelic "Light Show", 1965
+11/18 Carl Maria von Weber is born in Eutin, Germany, 1786
+11/19 Franz Schubert dies in Vienna, Austria, 1828
+11/20 Duane Allman is born in Nashville, Tennessee, 1946
+11/20 Joe Walsh is born in Cleveland, 1947
+11/22 Saint Cecilia's day (patron saint of music)
+11/24 Scott Joplin born, 1868
+11/25 "The Last Waltz" concert is played by The Band at Winterland, 1976
+11/25 Johann Strauss, Jr., writes `On the Beautiful Blue Danube', 1867
+11/26 Cream performs their farewell concert at Royal Albert Hall, 1968
+11/26 Paul Hindemith is born in Hanau, Germany, 1895
+11/27 Jimi Hendrix (Johnny Allen Hendrix) is born in Seattle, 1942
+11/29 George Harrison dies at 13:20 in Los Angeles, California, 2001
+12/04 Frank Zappa dies in his Laurel Canyon home shortly before 18:00, 1993
+12/05 Wolfgang Amadeus Mozart dies in Vienna, Austria, 1791
+12/06 First sound recording made by Thomas Edison, 1877
+12/06 The Rolling Stones play Altamont Speedway near San Francisco, 1969
+12/07 Harry Chapin is born in New York City, 1942
+12/08 Jim Morrison is born in Melbourne, Florida, 1943
+12/08 John Lennon is shot and killed in New York City, 1980
+12/09 The Who's "Tommy" premieres in London, 1973
+12/11 (Louis) Hector Berlioz born in La-Côte-Saint-André, 1803
+12/13 Ted Nugent, the motor city madman, born in Detroit, 1949
+12/15 Thomas Edison receives patent on the phonograph, 1877
+12/16 Don McLean's "American Pie" is released, 1971
+12/17 Ludwig van Beethoven is christened in Bonn, 1770
+12/21 Frank Zappa is born in Baltimore, 1940
+12/23 First G&S collaboration, Thespis, 1871
+12/23 Joe Strummer (born John Mellor) dies in Broomfield, England, 2002
+12/28 Edgar Winter is born in Beaumont, Texas, 1946
+12/28 Paul Hindemith dies in Frankfurt/Main, Germany, 1963
+12/29 Pau (Pablo) Casals born in Vendrell, 1876
+12/31 Jimi Hendrix introduces the Band of Gypsies at the Fillmore East, 1969
+
+#endif /* !_calendar_music_ */
diff --git a/usr.bin/calendar/calendars/calendar.newzealand b/usr.bin/calendar/calendars/calendar.newzealand
new file mode 100644
index 000000000000..be069df8dfea
--- /dev/null
+++ b/usr.bin/calendar/calendars/calendar.newzealand
@@ -0,0 +1,25 @@
+/*
+ * New Zealand holidays
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _calendar_newzealand_
+#define _calendar_newzealand_
+
+Jan 02 New Year Holiday (NZ)
+Jan 14 Anniversary Day (Southland)
+Jan 21 Anniversary Day (Wellington)
+Jan 28 Anniversary Day (Auckland)
+Feb 06 Waitangi Day (NZ)
+Mar 11 Anniversary Day (Taranaki)
+Mar 25 Anniversary Day (Otago)
+Jun 03 Queen's Birthday (NZ)
+Sep 23 Anniversary Day (South Canterbury)
+Oct 25 Anniversary Day (Hawke's Bay)
+Oct 28 Labour Day (NZ)
+Nov 04 Anniversary Day (Marlborough)
+Nov 15 Anniversary Day (Canterbury)
+Dec 02 Anniversary Day (Chatham Islands)
+
+#endif
diff --git a/usr.bin/calendar/calendars/calendar.russian b/usr.bin/calendar/calendars/calendar.russian
new file mode 100644
index 000000000000..07018766a832
--- /dev/null
+++ b/usr.bin/calendar/calendars/calendar.russian
@@ -0,0 +1,12 @@
+/*
+ * Russian calendar files
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _calendar_russian_
+#define _calendar_russian_
+
+#include <ru_RU.KOI8-R/calendar.all>
+
+#endif /* !_calendar_russian_ */
diff --git a/usr.bin/calendar/calendars/calendar.southafrica b/usr.bin/calendar/calendars/calendar.southafrica
new file mode 100644
index 000000000000..ae683b0bd358
--- /dev/null
+++ b/usr.bin/calendar/calendars/calendar.southafrica
@@ -0,0 +1,23 @@
+/*
+ * South African holidays
+ * Note: The Public Holidays Act (Act No 36 of 1994) determines whenever
+ * any public holiday falls on a Sunday, the Monday following on it shall
+ * be an unnamed public holiday in addition to the named holiday the day
+ * before. This file format is not complex enough to reflect this, but
+ * if it ever is, the change should be made.
+ * $FreeBSD$
+ */
+
+#ifndef _calendar_southafrica_
+#define _calendar_southafrica_
+
+03/01 Human Rights Day in South Africa
+04/27 Freedom Day in South Africa
+05/01 Workers Day in South Africa
+06/16 Youth Day in South Africa
+08/09 National Women's Day in South Africa
+09/24 Heritage Day in South Africa
+12/16 Day of Reconciliation in South Africa
+12/26 Day of Goodwill in South Africa
+
+#endif
diff --git a/usr.bin/calendar/calendars/calendar.ukrainian b/usr.bin/calendar/calendars/calendar.ukrainian
new file mode 100644
index 000000000000..3cff8c5a6072
--- /dev/null
+++ b/usr.bin/calendar/calendars/calendar.ukrainian
@@ -0,0 +1,12 @@
+/*
+ * Ukrainian calendar files
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _calendar_ukrainian_
+#define _calendar_ukrainian_
+
+#include <uk_UA.KOI8-U/calendar.all>
+
+#endif /* !_calendar_ukrainian_ */
diff --git a/usr.bin/calendar/calendars/calendar.usholiday b/usr.bin/calendar/calendars/calendar.usholiday
new file mode 100644
index 000000000000..8ae0bc019dff
--- /dev/null
+++ b/usr.bin/calendar/calendars/calendar.usholiday
@@ -0,0 +1,42 @@
+/*
+ * USA holiday
+ *
+ * $FreeBSD$
+ */
+
+#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/MonThird President's Day (3rd Monday of February)
+03/05 Mother-in-Law Day, USA
+03/SunSecond Daylight Savings Time begins in USA; clocks move forward (2nd Sunday of March)
+03/17 St. Patrick's Day
+03/20* Vernal Equinox
+04/01 April Fool's Day
+04/15 Income Tax Day, USA.
+04/28* Arbor Day, USA (varies from state to state)
+05/SunSecond Mother's Day (2nd Sunday of May)
+05/SatThird Armed Forces in USA Day (3rd Saturday of May)
+05/MonLast Memorial Day in USA (Last Monday of May)
+06/SunThird Father's Day (3rd Sunday of June)
+06/21* Summer Solstice
+07/04 US Independence Day
+09/MonFirst Labor Day in USA (1st Monday of September)
+09/SunSecond Grandparent's Day in USA (2nd Sunday of September; varies from state to state)
+09/22* Autumnal Equinox
+10/MonSecond Columbus Day in USA (2nd Monday of October)
+10/31 All Hallows Eve (Halloween)
+11/05* Election Day in USA (1st Tuesday after 1st Monday for even years)
+11/SunFirst Daylight Savings Time ends in USA; clocks move back (1st Sunday of November)
+11/11 Veterans' Day
+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_ */
diff --git a/usr.bin/calendar/calendars/calendar.world b/usr.bin/calendar/calendars/calendar.world
new file mode 100644
index 000000000000..2b65f1af748f
--- /dev/null
+++ b/usr.bin/calendar/calendars/calendar.world
@@ -0,0 +1,19 @@
+/*
+ * World wide calendar files, except national calendars
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _calendar_world_
+#define _calendar_world_
+
+#include <calendar.birthday>
+#include <calendar.christian>
+#include <calendar.computer>
+#include <calendar.history>
+#include <calendar.lotr>
+#include <calendar.holiday>
+#include <calendar.judaic>
+#include <calendar.music>
+
+#endif /* !_calendar_world_ */
diff --git a/usr.bin/calendar/calendars/de_AT.ISO_8859-15/calendar.feiertag b/usr.bin/calendar/calendars/de_AT.ISO_8859-15/calendar.feiertag
new file mode 100644
index 000000000000..fe998f592ae9
--- /dev/null
+++ b/usr.bin/calendar/calendars/de_AT.ISO_8859-15/calendar.feiertag
@@ -0,0 +1,62 @@
+/*
+ * Feiertage
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _de_AT_ISO8859_15_feiertag_
+#define _de_AT_ISO8859_15_feiertag_
+
+LANG=de_AT.ISO8859-15
+
+/* arbeitsfreie staatliche Feiertage */
+01/01 Neujahr
+05/01 Staatsfeiertag
+10/26 Nationalfeiertag
+
+/* christliche Feiertage, meist irgendwo arbeitsfrei */
+01/06 Heilige 3 Könige
+Easter-2 Karfreitag
+Easter Ostersonntag
+Easter+1 Ostermontag
+Easter+49 Pfingstsonntag
+Easter+50 Pfingstmontag
+Easter+39 Christi Himmelfahrt
+Easter+60 Fronleichnam
+
+08/15 Mariä Himmelfahrt
+
+11/01 Allerheiligen
+11/02 Allerseelen
+
+12/08 Mariä Empfängnis
+12/24 Heiligabend
+12/25 Weihnachten
+12/26 Stephanstag
+12/31 Silvester
+
+/* Gedenktage - nicht arbeitsfreie Feiertage */
+02/14 Valentinstag
+Easter-46 Aschermittwoch
+Easter-7 Palmsonntag
+Nov Sun+3 Totensonntag
+Nov Sun+4 1. Advent
+Dec Sun+1 2. Advent
+12/06 Nikolaus
+Dec Sun+2 3. Advent
+Dec Sun+3 4. Advent
+
+/* Jahreszeiten */
+03/20* Frühlingsanfang
+06/21* Sommeranfang
+09/23* 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_AT_ISO8859_15_feiertag_ */
diff --git a/usr.bin/calendar/calendars/de_DE.ISO8859-1/calendar.all b/usr.bin/calendar/calendars/de_DE.ISO8859-1/calendar.all
new file mode 100644
index 000000000000..f2a33cc563b2
--- /dev/null
+++ b/usr.bin/calendar/calendars/de_DE.ISO8859-1/calendar.all
@@ -0,0 +1,17 @@
+/*
+ * deutscher Kalender
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _de_DE_ISO8859_1_all_
+#define _de_DE_ISO8859_1_all_
+
+#include <de_DE.ISO8859-1/calendar.feiertag>
+#include <de_DE.ISO8859-1/calendar.geschichte>
+#include <de_DE.ISO8859-1/calendar.kirche>
+#include <de_DE.ISO8859-1/calendar.literatur>
+#include <de_DE.ISO8859-1/calendar.musik>
+#include <de_DE.ISO8859-1/calendar.wissenschaft>
+
+#endif /* !_de_DE.ISO8859-1_all_ */
diff --git a/usr.bin/calendar/calendars/de_DE.ISO8859-1/calendar.feiertag b/usr.bin/calendar/calendars/de_DE.ISO8859-1/calendar.feiertag
new file mode 100644
index 000000000000..f966c0d085be
--- /dev/null
+++ b/usr.bin/calendar/calendars/de_DE.ISO8859-1/calendar.feiertag
@@ -0,0 +1,56 @@
+/*
+ * Feiertage
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _de_DE_ISO8859_1_feiertag_
+#define _de_DE_ISO8859_1_feiertag_
+
+LANG=de_DE.ISO8859-1
+
+/* arbeitsfreie staatliche Feiertage */
+01/01 Neujahr
+05/01 Maifeiertag
+10/03 Tag der deutschen Einheit
+
+/* christliche Feiertage, meist irgendwo arbeitsfrei */
+Easter-2 Karfreitag
+Easter Ostersonntag
+Easter+1 Ostermontag
+Easter+49 Pfingstsonntag
+Easter+50 Pfingstmontag
+Easter+39 Christi Himmelfahrt
+Easter+60 Fronleichnam
+
+08/08 Friedensfest (Augsburg)
+08/15 Mariä Himmelfahrt
+
+10/31 Reformationstag
+11/01 Allerheiligen
+11/02 Allerseelen
+11/Wed+4 Buß- und Bettag
+
+12/24 Heiligabend
+12/25 Erster Weihnachtstag
+12/26 Zweiter Weihnachtstag
+12/31 Silvester
+
+/* Gedenktage - nicht arbeitsfreie Feiertage :-( */
+06/17 Arbeiteraufstand am 17. Juni 1953
+01/27 Gedenktag für die Opfer des Nationalsozialismus
+
+/* Jahreszeiten */
+03/20* Frühlingsanfang
+06/21* Sommeranfang
+09/23* 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_ISO8859_1_feiertag_ */
diff --git a/usr.bin/calendar/calendars/de_DE.ISO8859-1/calendar.geschichte b/usr.bin/calendar/calendars/de_DE.ISO8859-1/calendar.geschichte
new file mode 100644
index 000000000000..684f2af91ca6
--- /dev/null
+++ b/usr.bin/calendar/calendars/de_DE.ISO8859-1/calendar.geschichte
@@ -0,0 +1,198 @@
+/*
+ * deutsche Geschichte
+ *
+ *
+ * Die Angaben wurden überwiegend entnommen aus dem Buch:
+ *
+ * Fragen an die deutsche 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: Questions on German history
+ *
+ * ISBN 3-924521-59-X
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _de_DE_ISO8859_1_geschichte_
+#define _de_DE_ISO8859_1_geschichte_
+
+LANG=de_DE.ISO8859-1
+
+/* 1800-1933 */
+07/11 Gründung des 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ßischen 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 Gesetzbuch 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ßbritanniens 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, 1917
+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 und 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 Deutschlands aus dem Völkerbund, 1933
+03/16 Wiedereinführung der allgemeinen Wehrpflicht in Deutschland, 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 deutsche 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ßbritanniens und Frankreichs an Deutschland, 1939
+04/09 Deutsche Besetzung Dänemarks, Invasion in Norwegen, 1940
+05/10 Deutscher Angriff auf Belgien, die Niederlande, Luxemburg
+ und Frankreich, 1940
+06/22 Deutscher 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 sowjetischen Truppen
+ bei Torgau an der Elbe, 1945
+05/08 Bedingungslose Kapitulation von Deutschland, 1945
+07/01 Rückzug britischer und amerikanischer Truppen aus Sachsen, Thüringen und
+ Mecklenburg, Einmarsch westlicher Truppen in Berlin, 1945
+07/17 Potsdamer Konferenz, 1945
+09/01 Deutscher Ü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 Aufstand im Warschauer Ghetto, 1943
+12/07 Japan bombardiert Pearl Harbor, 1941
+
+/* Deutschland nach dem 2. Weltkrieg */
+04/11 Attentat auf Dutschke, Studentenunruhen, 1968
+04/26 GAU in Tschernobyl, 1986
+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, 1949
+05/23 Wahl von Richard von Weizsä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 Wirtschafts- 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, 1973
+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 und 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 Bebel 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 :-), 1990
+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_ISO8859_1_geschichte_ */
diff --git a/usr.bin/calendar/calendars/de_DE.ISO8859-1/calendar.kirche b/usr.bin/calendar/calendars/de_DE.ISO8859-1/calendar.kirche
new file mode 100644
index 000000000000..02640b115bfb
--- /dev/null
+++ b/usr.bin/calendar/calendars/de_DE.ISO8859-1/calendar.kirche
@@ -0,0 +1,32 @@
+/*
+ * Kirche in Deutschland
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _de_DE_ISO8859_1_kirche_
+#define _de_DE_ISO8859_1_kirche_
+
+LANG=de_DE.ISO8859-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_ISO8859_1_kirche_ */
diff --git a/usr.bin/calendar/calendars/de_DE.ISO8859-1/calendar.literatur b/usr.bin/calendar/calendars/de_DE.ISO8859-1/calendar.literatur
new file mode 100644
index 000000000000..bfa33e66168e
--- /dev/null
+++ b/usr.bin/calendar/calendars/de_DE.ISO8859-1/calendar.literatur
@@ -0,0 +1,54 @@
+/*
+ * Literatur
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _de_DE_ISO8859_1_literatur_
+#define _de_DE_ISO8859_1_literatur_
+
+LANG=de_DE.ISO8859-1
+
+/* Schriftsteller
+
+ Fontane
+ Goethe
+ Grass
+ Hegel
+ Heine
+ Schiller
+ */
+
+01/04 Jakob Grimm geboren, 1785
+01/18 Arno Schmidt in Hamburg geboren, 1914
+02/09 Thomas Bernhard in Heerlen geboren, 1931
+02/12 Immanuel Kant in Königsberg gestorben, 1804
+02/12 Thomas Bernhard in Gmunden gestorben, 1989
+02/17 Heinrich Heine in Paris gestorben, 1856
+03/22 Johann Wolfgang von Goethe in Weimar gestorben, 1832
+04/22 Kant geboren, 1724
+05/09 Friedrich von Schiller in Weimar gestorben, 1805
+06/03 Arno Schmidt in Celle gestorben, 1979
+06/03 Franz Kafka in Prag gestorben, 1924
+06/06 Thomas Mann in Lübeck geboren, 1875
+07/03 Franz Kafka geboren, 1883
+08/12 Thomas Mann gestorben, 1955
+08/27 Georg Wilhelm Friedrich Hegel in Stuttgart geboren, 1770
+08/28 Johann Wolfgang von Goethe in Frankfurt am Main geboren, 1749
+09/20 Theodor Fontane in Berlin gestorben, 1898
+10/16 Günter Grass in Danzig geboren, 1927
+11/10 Friedrich von Schiller in Marbach geboren, 1759
+11/14 Georg Wilhelm Friedrich Hegel in Berlin gestorben, 1831
+12/13 Heinrich Heine in Düsseldorf geboren, 1797
+12/30 Theodor Fontane in Neuruppin geboren, 1819
+
+
+/* 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_ISO8859_1_literatur_ */
diff --git a/usr.bin/calendar/calendars/de_DE.ISO8859-1/calendar.musik b/usr.bin/calendar/calendars/de_DE.ISO8859-1/calendar.musik
new file mode 100644
index 000000000000..318969cfe87c
--- /dev/null
+++ b/usr.bin/calendar/calendars/de_DE.ISO8859-1/calendar.musik
@@ -0,0 +1,66 @@
+/*
+ * Musik
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _de_DE_ISO8859_1_musik_
+#define _de_DE_ISO8859_1_musik_
+
+LANG=de_DE.ISO8859-1
+
+/* Barock */
+02/23 Georg Friedrich Händel in Halle an der Saale geboren, 1685
+03/14 Georg Philipp Telemann in Magdeburg geboren, 1681
+03/21 Johann Sebastian Bach in Eisenach geboren, 1685
+04/14 Georg Friedrich Händel in London gestorben, 1759
+06/25 Georg Philipp Telemann in Hamburg gestorben, 1767
+07/17 Diderich Buxtehude in Lübeck gestorben, 1707
+07/28 Johann Sebastian Bach in Leipzig gestorben, 1750
+
+/* Klassik */
+01/27 Wolfgang Amadeus Mozart in Salzburg geboren, 1756
+01/31 Franz Schubert in Lichtenthal bei Wien geboren, 1797
+02/03 Felix Mendelssohn Bartholdy in Hamburg geboren, 1809
+02/13 Richard Wagner in Venedig gestorben, 1883
+03/01 Frederic Chopin in Zelazowa-Wola bei Warschau geboren, 1810
+03/08 (Louis) Hector Berlioz in Paris gestorben, 1869
+03/25 Bela Bartok in Nagyszentmiklos geboren, 1881
+03/26 Ludwig van Beethoven in Wien gestorben, 1827
+03/28 Sergej Rachmaninow in Beverley Hills gestorben, 1943
+03/29 Carl Orff in München gestorben, 1982
+03/31 Joseph Haydn in Rohrau geboren, 1732
+04/01 Sergej Rachmaninow in Oneg geboren, 1873
+04/03 Johannes Brahms in Wien gestorben, 1897
+05/07 Johannes Brahms in Hamburg geboren, 1833
+05/18 Gustav Mahler in Wien gestorben, 1911
+05/22 Richard Wagner in Leipzig geboren, 1813
+05/31 Joseph Haydn in Wien gestorben, 1809
+06/03 Georges Bizet in Bougival bei Paris gestorben, 1875
+06/05 Carl Maria von Weber in London gestorben, 1826
+06/08 Robert Schumann in Zwickau geboren, 1810
+06/11 Richard Strauss in München geboren, 1864
+06/15 Edvard Grieg in Bergen geboren, 1843
+07/07 Gustav Mahler in Kalischt geboren, 1860
+07/10 Carl Orff in München geboren, 1895
+07/29 Robert Schumann in Endenich bei Bonn gestorben, 1856
+07/31 Franz Liszt in Bayreuth gestorben, 1886
+09/04 Edvard Grieg in Bergen gestorben, 1907
+09/08 Richard Strauss in Garmisch-Partenkirchen gestorben, 1949
+09/26 Bela Bartok in New York gestorben, 1945
+10/17 Frederic Chopin in Paris gestorben, 1849
+10/22 Franz Liszt in Raiding (Ungarn) geboren, 1811
+10/25 Georges Bizet in Paris geboren, 1838
+11/04 Felix Mendelssohn Bartholdy in Leipzig gestorben, 1847
+11/18 Carl Maria von Weber in Eutin geboren, 1786
+11/19 Franz Schubert in Wien gestorben, 1828
+11/26 Paul Hindemith in Hanau geboren, 1895
+12/05 Wolfgang Amadeus Mozart in Wien gestorben, 1791
+12/11 (Louis) Hector Berlioz in La-Côte-Saint-André geboren, 1803
+12/17 Ludwig van Beethoven in Bonn getauft, 1770
+12/28 Paul Hindemith in Frankfurt am Main gestorben, 1963
+
+/* Pop */
+09/18 Jimi Hendrix in Paris gestorben, 1970
+
+#endif /* !_de_DE_ISO8859_1_musik_ */
diff --git a/usr.bin/calendar/calendars/de_DE.ISO8859-1/calendar.wissenschaft b/usr.bin/calendar/calendars/de_DE.ISO8859-1/calendar.wissenschaft
new file mode 100644
index 000000000000..2c7639217df5
--- /dev/null
+++ b/usr.bin/calendar/calendars/de_DE.ISO8859-1/calendar.wissenschaft
@@ -0,0 +1,19 @@
+/*
+ * Wissenschaft
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _de_DE_ISO8859_1_wissenschaft_
+#define _de_DE_ISO8859_1_wissenschaft_
+
+LANG=de_DE.ISO8859-1
+
+04/12 Erster Mann im All, Juri Gagarin, 1961
+04/18 Einstein gestorben, 1955
+06/22 Konrad Zuse geboren in Berlin, 1919
+10/04 Sputnik 1, erster Satellit im Weltraum, 1957
+12/18 Konrad Zuse gestorben in Hünfeld, 1995
+
+
+#endif /* ! _de_DE_ISO8859_1_wissenschaft_ */
diff --git a/usr.bin/calendar/calendars/fr_FR.ISO8859-1/calendar.all b/usr.bin/calendar/calendars/fr_FR.ISO8859-1/calendar.all
new file mode 100644
index 000000000000..785512e543d3
--- /dev/null
+++ b/usr.bin/calendar/calendars/fr_FR.ISO8859-1/calendar.all
@@ -0,0 +1,14 @@
+/*
+ * Calendrier français
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _fr_FR_ISO8859_1_all_
+#define _fr_FR_ISO8859_1_all_
+
+#include <fr_FR.ISO8859-1/calendar.jferies>
+#include <fr_FR.ISO8859-1/calendar.fetes>
+#include <fr_FR.ISO8859-1/calendar.proverbes>
+
+#endif /* !_fr_FR.ISO8859-1_all_ */
diff --git a/usr.bin/calendar/calendars/fr_FR.ISO8859-1/calendar.fetes b/usr.bin/calendar/calendars/fr_FR.ISO8859-1/calendar.fetes
new file mode 100644
index 000000000000..d80a8757409e
--- /dev/null
+++ b/usr.bin/calendar/calendars/fr_FR.ISO8859-1/calendar.fetes
@@ -0,0 +1,630 @@
+/*
+ * Fêtes à souhaiter
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _fr_FR_ISO8859_1_fetes_
+#define _fr_FR_ISO8859_1_fetes_
+
+LANG=fr_FR.ISO8859-1
+
+/*
+ * N.B.: ceci n'est pas un calendrier liturgique !
+ * Il a seulement été réalisé pour me faire payer à boire
+ * par mes collègues de travail ; on n'y trouve donc que
+ * des prénoms seuls.
+ *
+ * Par ex. « St Antoine de Padoue » se retrouve abrégé en
+ * Antoine, et si Antoine est fêté plusieurs jours par an,
+ * tant mieux pour lui, c'est voulu.
+ */
+
+01/01 Aujourd'hui, c'est la St(e) Almaque.
+01/01 N'oubliez pas les Télémaque !
+01/02 Bonne fête aux Basile !
+01/02 Aujourd'hui, c'est la St(e) Vassili.
+01/02 N'oubliez pas les Grégoire !
+01/03 Bonne fête aux Geneviève !
+01/03 Aujourd'hui, c'est la St(e) Ginette.
+01/04 N'oubliez pas les Odilon !
+01/04 Bonne fête aux Angèle !
+01/04 Aujourd'hui, c'est la St(e) Robert.
+01/05 N'oubliez pas les Édouard !
+01/05 Bonne fête aux Gerlac !
+01/06 Aujourd'hui, c'est la St(e) Mélaine.
+01/06 N'oubliez pas les André !
+01/07 Galette des rois
+01/07 Aujourd'hui, c'est la St(e) Raymond.
+01/07 N'oubliez pas les Raymonde !
+01/07 Bonne fête aux Virginie !
+01/08 Aujourd'hui, c'est la St(e) Lucien.
+01/08 N'oubliez pas les Lucienne !
+01/08 Bonne fête aux Peggy !
+01/08 Aujourd'hui, c'est la St(e) Gudule.
+01/09 N'oubliez pas les Adrien !
+01/09 Bonne fête aux Alix !
+01/10 Aujourd'hui, c'est la St(e) Guillaume.
+01/10 N'oubliez pas les Guillemette !
+01/11 Bonne fête aux Paulin !
+01/11 Aujourd'hui, c'est la St(e) Pauline.
+01/12 N'oubliez pas les Tatiana !
+01/12 Bonne fête aux Alfred !
+01/12 Aujourd'hui, c'est la St(e) Ailred (Aelred, Eilred, Elred).
+01/13 N'oubliez pas les Vivant !
+01/13 Bonne fête aux Vivence !
+01/13 Aujourd'hui, c'est la St(e) Hilaire.
+01/13 N'oubliez pas les Yvette !
+01/14 Bonne fête aux Nina !
+01/14 Aujourd'hui, c'est la St(e) Séraphin.
+01/15 N'oubliez pas les Rémi !
+01/16 Bonne fête aux Marcel !
+01/16 Aujourd'hui, c'est la St(e) Marcelle.
+01/16 N'oubliez pas les Marceau !
+01/16 Bonne fête aux Honorat !
+01/17 Aujourd'hui, c'est la St(e) Roseline.
+01/17 N'oubliez pas les Antoine !
+01/17 Bonne fête aux Anthony !
+01/18 Aujourd'hui, c'est la St(e) Prisca.
+01/18 N'oubliez pas les Libert !
+01/19 Bonne fête aux Marius !
+01/19 Aujourd'hui, c'est la St(e) Canut.
+01/20 N'oubliez pas les Fabienne !
+01/20 Bonne fête aux Sébastien !
+01/20 Aujourd'hui, c'est la St(e) Bastien.
+01/21 N'oubliez pas les Agnès !
+01/21 Bonne fête aux Fructueux !
+01/21 Aujourd'hui, c'est la St(e) Augure.
+01/21 N'oubliez pas les Euloge !
+01/21 Bonne fête aux Avit !
+01/22 Aujourd'hui, c'est la St(e) Vincent.
+01/22 N'oubliez pas les Blésille !
+01/23 Bonne fête aux Barnard !
+01/24 Aujourd'hui, c'est la St(e) François.
+01/25 N'oubliez pas les Morgane !
+01/26 Bonne fête aux Paule !
+01/26 Aujourd'hui, c'est la St(e) Timothée.
+01/26 N'oubliez pas les Tite !
+01/27 Bonne fête aux Angèle !
+01/28 Aujourd'hui, c'est la St(e) Thomas.
+01/29 N'oubliez pas les Gildas !
+01/29 Bonne fête aux Sulpice !
+01/30 Aujourd'hui, c'est la St(e) Martine.
+01/31 N'oubliez pas les Marcelle !
+01/31 Bonne fête aux Jean !
+02/01 Aujourd'hui, c'est la St(e) Ella.
+02/01 N'oubliez pas les Viridiane !
+02/02 Bonne fête aux Théophane !
+02/03 Aujourd'hui, c'est la St(e) Blaise.
+02/03 N'oubliez pas les Anschaire !
+02/04 Bonne fête aux Véronique !
+02/04 Aujourd'hui, c'est la St(e) Jeanne.
+02/04 N'oubliez pas les Gilbert !
+02/05 Bonne fête aux Agathe !
+02/06 Aujourd'hui, c'est la St(e) Gaston.
+02/06 N'oubliez pas les Armand !
+02/07 Bonne fête aux Eugénie !
+02/07 Aujourd'hui, c'est la St(e) Partène.
+02/08 N'oubliez pas les Jacqueline !
+02/08 Bonne fête aux Jérôme !
+02/09 Aujourd'hui, c'est la St(e) Apolline.
+02/09 N'oubliez pas les Appollonie !
+02/10 Bonne fête aux Arnaud !
+02/10 Aujourd'hui, c'est la St(e) Scholastique.
+02/11 N'oubliez pas les Séverin !
+02/11 Bonne fête aux Séverine !
+02/12 Aujourd'hui, c'est la St(e) Félix.
+02/12 N'oubliez pas les Eulalie !
+02/13 Bonne fête aux Béatrice !
+02/13 Aujourd'hui, c'est la St(e) Polyeucte.
+02/14 N'oubliez pas les Valentin !
+02/14 Bonne fête aux Méthode !
+02/14 Aujourd'hui, c'est la St(e) Cyrille.
+02/15 N'oubliez pas les Claude !
+02/15 Bonne fête aux Georgette !
+02/16 Aujourd'hui, c'est la St(e) Julienne.
+02/17 N'oubliez pas les Alexis !
+02/18 Bonne fête aux Bernadette et aux Nadine !
+02/19 Aujourd'hui, c'est la St(e) Gabin.
+02/20 N'oubliez pas les Aimée !
+02/20 Bonne fête aux Aimé !
+02/20 Aujourd'hui, c'est la St(e) Amata.
+02/21 N'oubliez pas les Pierre-Damien !
+02/22 Bonne fête aux Isabelle !
+02/23 Aujourd'hui, c'est la St(e) Lazare.
+02/23 N'oubliez pas les Polycarpe !
+02/24 Bonne fête aux Modeste !
+02/25 Aujourd'hui, c'est la St(e) Roméo.
+02/25 N'oubliez pas les Avertan !
+02/26 Bonne fête aux Nestor !
+02/27 Aujourd'hui, c'est la St(e) Honorine.
+02/27 N'oubliez pas les Gabriel !
+02/28 Bonne fête aux Romain !
+02/28 Aujourd'hui, c'est la St(e) Lupicin.
+02/29 N'oubliez pas les Auguste !
+03/01 Bonne fête aux Aubin !
+03/01 Aujourd'hui, c'est la St(e) Albin.
+03/02 N'oubliez pas les Charles !
+03/03 Bonne fête aux Guénolé (Gwénolé) !
+03/04 Aujourd'hui, c'est la St(e) Casimir.
+03/05 N'oubliez pas les Olive !
+03/05 Bonne fête aux Olivia !
+03/06 Aujourd'hui, c'est la St(e) Colette.
+03/06 N'oubliez pas les Nicole !
+03/07 Bonne fête aux Félicité !
+03/07 Aujourd'hui, c'est la St(e) Félicie.
+03/07 N'oubliez pas les Perpétue !
+03/08 Bonne fête aux Jean !
+03/09 Aujourd'hui, c'est la St(e) Françoise.
+03/10 N'oubliez pas les Vivien !
+03/10 Bonne fête aux Dominique !
+03/11 Aujourd'hui, c'est la St(e) Rosine.
+03/12 N'oubliez pas les Justine !
+03/12 Bonne fête aux Maximilien !
+03/13 Aujourd'hui, c'est la St(e) Rodrigue.
+03/13 N'oubliez pas les Salomon !
+03/13 Bonne fête aux Euphrasie !
+03/14 Aujourd'hui, c'est la St(e) Mathilde.
+03/15 N'oubliez pas les Louise !
+03/16 Bonne fête aux Bénédicte !
+03/16 Aujourd'hui, c'est la St(e) Benoîte.
+03/16 N'oubliez pas les Julien !
+03/17 C'est la St Patrick !
+03/17 Aujourd'hui, c'est la St(e) Patrice.
+03/18 N'oubliez pas les Cyrille !
+03/19 Bonne fête aux Joseph !
+03/20 Aujourd'hui, c'est la St(e) Herbert.
+03/20 N'oubliez pas les Wulfran !
+03/21 Bonne fête aux Clémence !
+03/22 Aujourd'hui, c'est la St(e) Léa.
+03/23 N'oubliez pas les Victorien !
+03/23 Bonne fête aux Turibio !
+03/24 Aujourd'hui, c'est la St(e) Catherine.
+03/24 N'oubliez pas les Karine !
+03/26 Bonne fête aux Lara !
+03/26 Aujourd'hui, c'est la St(e) Ludger.
+03/26 N'oubliez pas les Larissa !
+03/27 Bonne fête aux Habib !
+03/28 Aujourd'hui, c'est la St(e) Gontran.
+03/29 N'oubliez pas les Gwladys !
+03/29 Bonne fête aux Eustase !
+03/30 Aujourd'hui, c'est la St(e) Amédée.
+03/31 N'oubliez pas les Benjamin !
+03/31 Bonne fête aux Benjamine !
+04/01 Votre fichier calendar est corrompu.
+04/01 N'oubliez pas les Hugues !
+04/02 Bonne fête aux Sandrine !
+04/03 Aujourd'hui, c'est la St(e) Richard.
+04/04 N'oubliez pas les Isidore !
+04/04 Bonne fête aux Benoît !
+04/05 Aujourd'hui, c'est la St(e) Irène.
+04/05 N'oubliez pas les Vincent !
+04/06 Bonne fête aux Marcellin !
+04/06 Aujourd'hui, c'est la St(e) Célestin.
+04/06 N'oubliez pas les Guillaume !
+04/07 Bonne fête aux Jean-Baptiste !
+04/07 Aujourd'hui, c'est la St(e) Julienne.
+04/08 N'oubliez pas les Perpet !
+04/08 Bonne fête aux Perpetuus !
+04/09 Aujourd'hui, c'est la St(e) Gautier.
+04/09 N'oubliez pas les Jean !
+04/10 Bonne fête aux Fulbert !
+04/10 Aujourd'hui, c'est la St(e) Michel.
+04/11 N'oubliez pas les Stanislas !
+04/11 Bonne fête aux Gemma !
+04/11 Aujourd'hui, c'est la St(e) Léon.
+04/12 N'oubliez pas les Jules !
+04/12 Bonne fête aux Sabas !
+04/13 Aujourd'hui, c'est la St(e) Ida.
+04/13 N'oubliez pas les Herménégilde !
+04/14 Bonne fête aux Maxime !
+04/14 Aujourd'hui, c'est la St(e) Lydwine.
+04/14 N'oubliez pas les Bénézet !
+04/15 Bonne fête aux Pierre !
+04/16 Aujourd'hui, c'est la St(e) Benoît.
+04/17 N'oubliez pas les Anicet !
+04/17 Bonne fête aux Kateri !
+04/18 Aujourd'hui, c'est la St(e) Parfait.
+04/19 N'oubliez pas les Emma !
+04/19 Bonne fête aux Elphège !
+04/20 Aujourd'hui, c'est la St(e) Odette.
+04/20 N'oubliez pas les Agnès !
+04/21 Bonne fête aux Anselme !
+04/22 Aujourd'hui, c'est la St(e) Alexandre.
+04/22 N'oubliez pas les Soter !
+04/22 Bonne fête aux Caïus !
+04/22 Aujourd'hui, c'est la St(e) Léonide.
+04/23 N'oubliez pas les Georges !
+04/23 Bonne fête aux Pierre !
+04/24 Aujourd'hui, c'est la St(e) Fidèle.
+04/24 N'oubliez pas les Marie-Euphrasie !
+04/25 Bonne fête aux Marc !
+04/26 Aujourd'hui, c'est la St(e) Alida.
+04/27 N'oubliez pas les Zita !
+04/27 Bonne fête aux Pierre !
+04/28 Aujourd'hui, c'est la St(e) Valérie.
+04/28 N'oubliez pas les Louis-Marie !
+04/28 Bonne fête aux Paul !
+04/29 Aujourd'hui, c'est la St(e) Joseph-Benoît.
+04/29 N'oubliez pas les Hugues !
+04/30 Bonne fête aux Robert !
+04/30 Aujourd'hui, c'est la St(e) Catherine.
+05/02 N'oubliez pas les Boris !
+05/03 Bonne fête aux Jacques !
+05/03 Aujourd'hui, c'est la St(e) Philippe.
+05/04 N'oubliez pas les Sylvain !
+05/05 Bonne fête aux Judith !
+05/06 Aujourd'hui, c'est la St(e) Prudence.
+05/07 N'oubliez pas les Gisèle !
+05/09 Bonne fête aux Pacôme !
+05/10 Aujourd'hui, c'est la St(e) Solange.
+05/11 N'oubliez pas les Estelle !
+05/12 Bonne fête aux Achille !
+05/14 Aujourd'hui, c'est la St(e) Matthias.
+05/15 N'oubliez pas les Denise !
+05/16 Bonne fête aux Honoré !
+05/17 Aujourd'hui, c'est la St(e) Pascal.
+05/18 N'oubliez pas les Éric !
+05/19 Bonne fête aux Yves !
+05/19 Aujourd'hui, c'est la St(e) Yvonne.
+05/20 N'oubliez pas les Bernardin !
+05/21 Bonne fête aux Constantin !
+05/22 Aujourd'hui, c'est la St(e) Émile.
+05/23 N'oubliez pas les Didier !
+05/24 Bonne fête aux Donatien !
+05/25 Aujourd'hui, c'est la St(e) Sophie.
+05/26 N'oubliez pas les Bérenger !
+05/28 Bonne fête aux Germain !
+05/29 Aujourd'hui, c'est la St(e) Aymard.
+05/30 N'oubliez pas les Ferdinand !
+06/01 Bonne fête aux Justin !
+06/02 Aujourd'hui, c'est la St(e) Blandine.
+06/03 N'oubliez pas les Kévin !
+06/04 Bonne fête aux Clotilde !
+06/05 Aujourd'hui, c'est la St(e) Igor.
+06/06 N'oubliez pas les Norbert !
+06/07 Bonne fête aux Gilbert !
+06/08 Aujourd'hui, c'est la St(e) Médard.
+06/09 N'oubliez pas les Diane !
+06/11 Bonne fête aux Barnabé !
+06/11 Aujourd'hui, c'est la St(e) Yolande.
+06/12 N'oubliez pas les Guy !
+06/13 Bonne fête aux Antoine !
+06/14 Aujourd'hui, c'est la St(e) Élisée.
+06/15 N'oubliez pas les Germaine !
+06/16 Bonne fête aux Jean-François !
+06/17 Aujourd'hui, c'est la St(e) Hervé.
+06/18 N'oubliez pas les Léonce !
+06/19 Bonne fête aux Romuald !
+06/20 Aujourd'hui, c'est la St(e) Silvère.
+06/21 N'oubliez pas les Rodolphe !
+06/22 Bonne fête aux Alban !
+06/23 Aujourd'hui, c'est la St(e) Audrey.
+06/24 N'oubliez pas les Jean-Baptiste !
+06/25 Bonne fête aux Prosper !
+06/26 Aujourd'hui, c'est la St(e) Anthelme.
+06/27 N'oubliez pas les Fernand !
+06/28 Bonne fête aux Irénée !
+06/29 Aujourd'hui, c'est la St(e) Paul.
+06/29 N'oubliez pas les Pierre !
+06/30 Bonne fête aux Martial !
+07/01 Aujourd'hui, c'est la St(e) Thierry.
+07/02 N'oubliez pas les Martinien !
+07/03 Bonne fête aux Thomas !
+07/04 Aujourd'hui, c'est la St(e) Florent.
+07/05 N'oubliez pas les Antoine !
+07/06 Bonne fête aux Mariette !
+07/07 Aujourd'hui, c'est la St(e) Raoul.
+07/08 N'oubliez pas les Thibaut !
+07/09 Bonne fête aux Amandine !
+07/10 Aujourd'hui, c'est la St(e) Ulrich.
+07/11 N'oubliez pas les Benoît !
+07/12 Bonne fête aux Olivier !
+07/13 Aujourd'hui, c'est la St(e) Henri.
+07/13 N'oubliez pas les Joël !
+07/14 Bonne fête aux Camille !
+07/15 Aujourd'hui, c'est la St(e) Donald.
+07/17 N'oubliez pas les Caroline !
+07/17 Bonne fête aux Charlotte !
+07/18 Aujourd'hui, c'est la St(e) Frédéric.
+07/19 N'oubliez pas les Arsène !
+07/20 Bonne fête aux Marina !
+07/21 Aujourd'hui, c'est la St(e) Victor.
+07/22 N'oubliez pas les Marie-Madeleine !
+07/23 Bonne fête aux Brigitte !
+07/24 Aujourd'hui, c'est la St(e) Christine.
+07/25 N'oubliez pas les Jacques !
+07/26 Bonne fête aux Anne !
+07/26 Aujourd'hui, c'est la St(e) Joachim.
+07/27 N'oubliez pas les Nathalie !
+07/28 Bonne fête aux Samson !
+07/29 Aujourd'hui, c'est la St(e) Marthe.
+07/30 N'oubliez pas les Juliette !
+07/31 Bonne fête aux Ignace !
+08/01 Aujourd'hui, c'est la St(e) Alphonse.
+08/01 N'oubliez pas les Pierre !
+08/02 Bonne fête aux Julien !
+08/03 Aujourd'hui, c'est la St(e) Lydie.
+08/03 N'oubliez pas les Pierre-Julien !
+08/04 Bonne fête aux Jean-Marie !
+08/04 Aujourd'hui, c'est la St(e) Dominique.
+08/05 N'oubliez pas les Abel !
+08/05 Bonne fête aux Oswald !
+08/07 Aujourd'hui, c'est la St(e) Gaëtan.
+08/08 N'oubliez pas les Dominique !
+08/08 Bonne fête aux Cyriaque !
+08/09 Aujourd'hui, c'est la St(e) Amour.
+08/10 N'oubliez pas les Laurent !
+08/11 Bonne fête aux Claire !
+08/11 Aujourd'hui, c'est la St(e) Philomène.
+08/12 N'oubliez pas les Clarisse !
+08/13 Bonne fête aux Hyppolite !
+08/13 Aujourd'hui, c'est la St(e) Radegonde.
+08/14 N'oubliez pas les Évrard !
+08/14 Bonne fête aux Maximilien !
+08/15 Aujourd'hui, c'est la St(e) Marie.
+08/16 N'oubliez pas les Armel !
+08/16 Bonne fête aux Roch !
+08/17 Aujourd'hui, c'est la St(e) Hyacinthe.
+08/18 N'oubliez pas les Hélène !
+08/19 Bonne fête aux Jean-Eudes !
+08/19 Aujourd'hui, c'est la St(e) Louis.
+08/20 N'oubliez pas les Bernard !
+08/21 Bonne fête aux Christophe !
+08/21 Aujourd'hui, c'est la St(e) Jeanne.
+08/22 N'oubliez pas les Fabrice !
+08/22 Bonne fête aux Symphorien !
+08/23 Aujourd'hui, c'est la St(e) Rose.
+08/23 N'oubliez pas les Philippe !
+08/24 Bonne fête aux Barthélémy !
+08/25 Aujourd'hui, c'est la St(e) Louis.
+08/26 N'oubliez pas les Natacha !
+08/26 Bonne fête aux Zéphirin !
+08/26 Aujourd'hui, c'est la St(e) Eulade.
+08/27 N'oubliez pas les Edwige !
+08/27 Bonne fête aux Monique et aux Joseph !
+08/28 Aujourd'hui, c'est la St(e) Augustin.
+08/29 N'oubliez pas les Sabine !
+08/30 Bonne fête aux Fiacre !
+08/30 Aujourd'hui, c'est la St(e) Rose.
+08/31 N'oubliez pas les Aristide !
+08/31 Bonne fête aux Raymond !
+09/01 Aujourd'hui, c'est la St(e) Gilles.
+09/02 N'oubliez pas les Ingrid !
+09/03 Bonne fête aux Grégoire !
+09/04 Aujourd'hui, c'est la St(e) Rosalie.
+09/05 N'oubliez pas les Raïssa !
+09/06 Bonne fête aux Bertrand !
+09/07 Aujourd'hui, c'est la St(e) Reine.
+09/09 N'oubliez pas les Alain !
+09/10 Bonne fête aux Inès !
+09/11 Aujourd'hui, c'est la St(e) Adelphe.
+09/12 N'oubliez pas les Apollinaire !
+09/13 Bonne fête aux Aimé !
+09/15 Aujourd'hui, c'est la St(e) Roland.
+09/16 N'oubliez pas les Édith !
+09/17 Bonne fête aux Renaud !
+09/18 Aujourd'hui, c'est la St(e) Nadège.
+09/19 N'oubliez pas les Émilie !
+09/20 Bonne fête aux Davy !
+09/21 Aujourd'hui, c'est la St(e) Matthieu.
+09/22 N'oubliez pas les Maurice !
+09/23 Bonne fête aux Constant !
+09/24 Aujourd'hui, c'est la St(e) Thècle.
+09/25 N'oubliez pas les Hermann !
+09/26 Bonne fête aux Côme !
+09/26 Aujourd'hui, c'est la St(e) Damien.
+09/27 N'oubliez pas les Vincent !
+09/28 Bonne fête aux Venceslas !
+09/29 Aujourd'hui, c'est la St(e) Michel.
+09/29 N'oubliez pas les Raphaël !
+09/30 Bonne fête aux Jérôme !
+10/01 Aujourd'hui, c'est la St(e) Thérèse.
+10/02 N'oubliez pas les Léger !
+10/03 Bonne fête aux Gérard !
+10/04 Aujourd'hui, c'est la St(e) François.
+10/05 N'oubliez pas les Placide !
+10/05 Bonne fête aux Fleur !
+10/05 Aujourd'hui, c'est la St(e) Flore.
+10/05 N'oubliez pas les Pâquerette !
+10/05 Bonne fête aux Violette !
+10/05 Aujourd'hui, c'est la St(e) Pervenche.
+10/05 N'oubliez pas les Anémone !
+10/05 Bonne fête aux Bluette !
+10/05 Aujourd'hui, c'est la St(e) Capucine.
+10/05 N'oubliez pas les Dahlia !
+10/05 Bonne fête aux Myrtille !
+10/05 Aujourd'hui, c'est la St(e) Hortense.
+10/05 N'oubliez pas les Violaine !
+10/05 Bonne fête aux Anne-Aymone !
+10/05 Aujourd'hui, c'est la St(e) Dalie.
+10/06 N'oubliez pas les Bruno !
+10/06 Bonne fête aux Foy !
+10/07 Aujourd'hui, c'est la St(e) Serge.
+10/08 N'oubliez pas les Pélagie !
+10/26 Bonne fête aux Démétrius !
+10/09 Aujourd'hui, c'est la St(e) Denis.
+10/09 N'oubliez pas les Denys !
+10/10 Bonne fête aux Ghislain !
+10/10 Aujourd'hui, c'est la St(e) Ghislaine.
+10/10 N'oubliez pas les Guislain !
+10/10 Bonne fête aux Guislaine !
+10/11 Aujourd'hui, c'est la St(e) Firmin.
+10/11 N'oubliez pas les Gausbert !
+10/12 Bonne fête aux Wilfried !
+10/12 Aujourd'hui, c'est la St(e) Séraphin.
+10/13 N'oubliez pas les Géraud !
+10/14 Bonne fête aux Juste !
+10/14 Aujourd'hui, c'est la St(e) Calliste.
+10/15 N'oubliez pas les Thérèse !
+10/16 Bonne fête aux Edwige !
+10/16 Aujourd'hui, c'est la St(e) Marie-Marguerite.
+10/17 N'oubliez pas les Baudoin !
+10/17 Bonne fête aux Ignace !
+10/18 Aujourd'hui, c'est la St(e) Luc.
+10/19 N'oubliez pas les René !
+10/20 Bonne fête aux Adeline !
+10/20 Aujourd'hui, c'est la St(e) Aline.
+10/20 N'oubliez pas les Line !
+10/21 Bonne fête aux Céline !
+10/21 Aujourd'hui, c'est la St(e) Hilarion.
+10/22 N'oubliez pas les Élodie !
+10/22 Bonne fête aux Nunillon !
+10/22 Aujourd'hui, c'est la St(e) Salomé.
+10/23 N'oubliez pas les Jean !
+10/24 Bonne fête aux Florentin !
+10/25 Aujourd'hui, c'est la St(e) Crépin.
+10/25 N'oubliez pas les Crépinien !
+10/25 Bonne fête aux Chrysanthe !
+10/25 Aujourd'hui, c'est la St(e) Darie.
+10/25 N'oubliez pas les Enguerran !
+10/26 Bonne fête aux Dimitri !
+10/26 Aujourd'hui, c'est la St(e) Évariste.
+10/27 N'oubliez pas les Émeline !
+10/27 Bonne fête aux Didier !
+10/27 Aujourd'hui, c'est la St(e) Frumence.
+10/28 N'oubliez pas les Jude !
+10/28 Bonne fête aux Judas !
+10/28 Aujourd'hui, c'est la St(e) Thaddée.
+10/28 N'oubliez pas les Simon !
+10/28 Bonne fête aux Simone (Simonne) !
+10/29 Aujourd'hui, c'est la St(e) Narcisse.
+10/30 N'oubliez pas les Bienvenue !
+10/30 Bonne fête aux Dorothée !
+10/31 Aujourd'hui, c'est la St(e) Quentin.
+10/31 N'oubliez pas les Alphonse !
+10/31 Bonne fête aux Wolfgang !
+11/03 Aujourd'hui, c'est la St(e) Hubert.
+11/04 N'oubliez pas les Charles !
+11/04 Bonne fête aux Amans !
+11/05 Aujourd'hui, c'est la St(e) Sylvie.
+11/05 N'oubliez pas les Sylvette !
+11/05 Bonne fête aux Sylviane !
+11/05 Aujourd'hui, c'est la St(e) Zacharie.
+11/05 N'oubliez pas les Élisabeth !
+11/06 Bonne fête aux Bertille !
+11/06 Aujourd'hui, c'est la St(e) Léonard.
+11/06 N'oubliez pas les Winnoc !
+11/07 Bonne fête aux Carine !
+11/07 Aujourd'hui, c'est la St(e) Karine.
+11/07 N'oubliez pas les Ernest !
+11/07 Bonne fête aux Ernst !
+11/07 Aujourd'hui, c'est la St(e) Willibrord.
+11/08 N'oubliez pas les Geoffroy !
+11/09 Bonne fête aux Théodore !
+11/10 Aujourd'hui, c'est la St(e) Léon.
+11/10 N'oubliez pas les Léontine !
+11/10 Bonne fête aux Lionel !
+11/11 Aujourd'hui, c'est la St(e) Martin.
+11/12 N'oubliez pas les Christian !
+11/12 Bonne fête aux Josaphat !
+11/13 Aujourd'hui, c'est la St(e) Brice.
+11/13 N'oubliez pas les Diégo !
+11/13 Bonne fête aux Didace !
+11/14 Aujourd'hui, c'est la St(e) Sidoine.
+11/14 N'oubliez pas les Sidonie !
+11/14 Bonne fête aux Sérapion !
+11/15 Aujourd'hui, c'est la St(e) Albert.
+11/16 N'oubliez pas les Marguerite !
+11/16 Bonne fête aux Gertrude !
+11/17 Aujourd'hui, c'est la St(e) Élisabeth.
+11/17 N'oubliez pas les Élise !
+11/17 Bonne fête aux Lise !
+11/18 Aujourd'hui, c'est la St(e) Aude.
+11/19 N'oubliez pas les Tanguy !
+11/19 Bonne fête aux Tanneguy !
+11/19 Aujourd'hui, c'est la St(e) Mechtilde.
+11/19 N'oubliez pas les Mathilde !
+11/19 Bonne fête aux Patrocle !
+11/20 Aujourd'hui, c'est la St(e) Edmond.
+11/20 N'oubliez pas les Octave !
+11/20 Bonne fête aux Adventor !
+11/20 Aujourd'hui, c'est la St(e) Solutor.
+11/20 N'oubliez pas les Ambroise !
+11/20 Bonne fête aux Rutus !
+11/22 Aujourd'hui, c'est la St(e) Cécile.
+11/22 N'oubliez pas les Célia !
+11/23 Bonne fête aux Clément !
+11/23 Aujourd'hui, c'est la St(e) Clémentine.
+11/23 N'oubliez pas les Colomban !
+11/24 Bonne fête aux Augusta !
+11/24 Aujourd'hui, c'est la St(e) Flora.
+11/25 N'oubliez pas les Catherine !
+11/24 Bonne fête aux Maria !
+11/26 Aujourd'hui, c'est la St(e) Delphine.
+11/26 N'oubliez pas les Elzéar !
+11/27 Bonne fête aux Séverin !
+11/27 Aujourd'hui, c'est la St(e) Séverine.
+11/27 N'oubliez pas les Maxime !
+11/28 Bonne fête aux Jacques !
+11/29 Aujourd'hui, c'est la St(e) Saturnin.
+11/29 N'oubliez pas les Sernin (Cernin) !
+11/29 Bonne fête aux Savourin !
+11/29 Aujourd'hui, c'est la St(e) Sornin.
+11/30 N'oubliez pas les André !
+11/30 Bonne fête aux Andréa !
+12/01 Aujourd'hui, c'est la St(e) Florence.
+12/01 N'oubliez pas les Éloi !
+12/01 Bonne fête aux Airy !
+12/02 Aujourd'hui, c'est la St(e) Viviane.
+12/03 N'oubliez pas les François-Xavier !
+12/03 Bonne fête aux Xavier !
+12/03 Aujourd'hui, c'est la St(e) Eugène.
+12/04 N'oubliez pas les Barbara !
+12/04 Bonne fête aux Barbe !
+12/05 Aujourd'hui, c'est la St(e) Gérald.
+12/05 N'oubliez pas les Géraldine !
+12/05 Bonne fête aux Géraud !
+12/05 Aujourd'hui, c'est la St(e) Sabas.
+12/06 N'oubliez pas les Nicolas !
+12/07 Bonne fête aux Ambroise !
+12/09 Aujourd'hui, c'est la St(e) Pierre.
+12/10 N'oubliez pas les Romaric !
+12/10 Bonne fête aux Eulalie !
+12/10 Aujourd'hui, c'est la St(e) Melchaide.
+12/10 N'oubliez pas les Miltiade !
+12/11 Bonne fête aux Daniel !
+12/11 Aujourd'hui, c'est la St(e) Damase.
+12/12 N'oubliez pas les Chantal !
+12/13 Bonne fête aux Lucie !
+12/13 Aujourd'hui, c'est la St(e) Rolande.
+12/13 N'oubliez pas les Aurore !
+12/14 Bonne fête aux Odile !
+12/15 Aujourd'hui, c'est la St(e) Ninon.
+12/15 N'oubliez pas les Nina !
+12/15 Bonne fête aux Christiane !
+12/15 Aujourd'hui, c'est la St(e) Christina.
+12/16 N'oubliez pas les Alice !
+12/16 Bonne fête aux Adélaïde !
+12/16 Aujourd'hui, c'est la St(e) Évrard.
+12/16 N'oubliez pas les Éberhard !
+12/17 Bonne fête aux Gaël !
+12/17 Aujourd'hui, c'est la St(e) Lazare.
+12/17 N'oubliez pas les Olympe !
+12/17 Bonne fête aux Olympias !
+12/17 Aujourd'hui, c'est la St(e) Judicaël.
+12/18 N'oubliez pas les Gatien !
+12/18 Bonne fête aux Winebald !
+12/19 Aujourd'hui, c'est la St(e) Urbain.
+12/20 N'oubliez pas les Abraham !
+12/20 Bonne fête aux Théophile !
+12/21 Aujourd'hui, c'est la St(e) Pierre.
+12/22 N'oubliez pas les Françoise-Xavière !
+12/22 Bonne fête aux Flavien !
+12/23 Aujourd'hui, c'est la St(e) Armand.
+12/24 N'oubliez pas les Adèle !
+12/24 Bonne fête aux Charbel !
+12/25 Aujourd'hui, c'est la St(e) Emmanuel.
+12/25 N'oubliez pas les Emmanuelle !
+12/25 Bonne fête aux Noël !
+12/26 Aujourd'hui, c'est la St(e) Étienne.
+12/26 N'oubliez pas les Stéphane !
+12/26 Bonne fête aux Stéphanie !
+12/27 Aujourd'hui, c'est la St(e) Jean.
+12/27 N'oubliez pas les Yann !
+12/28 Bonne fête aux Innocents !
+12/29 Aujourd'hui, c'est la St(e) David.
+12/30 N'oubliez pas les Roger !
+12/31 Bonne fête aux Sylvestre !
+
+#endif /*! _fr_FR_ISO8859_1_fetes */
diff --git a/usr.bin/calendar/calendars/fr_FR.ISO8859-1/calendar.french b/usr.bin/calendar/calendars/fr_FR.ISO8859-1/calendar.french
new file mode 100644
index 000000000000..18b4d8ae8a94
--- /dev/null
+++ b/usr.bin/calendar/calendars/fr_FR.ISO8859-1/calendar.french
@@ -0,0 +1,12 @@
+/*
+ * French calendar file(s)
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _calendar_french_
+#define _calendar_french_
+
+#include <fr_FR.ISO8859-1/calendar.all>
+
+#endif /* !_calendar_french_ */
diff --git a/usr.bin/calendar/calendars/fr_FR.ISO8859-1/calendar.jferies b/usr.bin/calendar/calendars/fr_FR.ISO8859-1/calendar.jferies
new file mode 100644
index 000000000000..48867ac42dc1
--- /dev/null
+++ b/usr.bin/calendar/calendars/fr_FR.ISO8859-1/calendar.jferies
@@ -0,0 +1,46 @@
+/*
+ * Jours fériés
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _fr_FR_ISO8859_1_jferies_
+#define _fr_FR_ISO8859_1_jferies_
+
+LANG=fr_FR.ISO8859-1
+
+/* Jours chômés */
+01/01 Nouvel an
+05/01 Fête du travail
+05/08 Armistice 1945
+07/14 Fête nationale française
+11/11 Armistice 1918
+
+/* Jours fériés religieux */
+Easter Pâques
+Easter+1 Lundi de Pâques
+Easter+39 Ascension
+Easter+49 Pentecôte
+Easter+50 Lundi de Pentecôte
+08/15 Assomption
+11/01 Toussaint
+12/25 Noël
+
+/* Les dates suivantes ne sont malheureusement pas fériées... */
+
+/* Saisons */
+03/21* Printemps
+06/21* Été
+09/21* Automne
+12/21* Hiver
+
+/* Changements d'heure */
+03/SundayLast Passage à l'heure d'été
+10/SundayLast Passage à l'heure d'hiver
+
+/* Divers */
+/* BUG : si Penteco^te = 05/SunLast, fe^te des me`res repousse'e d'une semaine */
+05/SundayLast Fêtes des mères
+June Sun+3 Fêtes des pères
+
+#endif /*! _fr_FR_ISO8859_1_jferies_ */
diff --git a/usr.bin/calendar/calendars/fr_FR.ISO8859-1/calendar.proverbes b/usr.bin/calendar/calendars/fr_FR.ISO8859-1/calendar.proverbes
new file mode 100644
index 000000000000..5a9f0eaf13aa
--- /dev/null
+++ b/usr.bin/calendar/calendars/fr_FR.ISO8859-1/calendar.proverbes
@@ -0,0 +1,354 @@
+/*
+ * Proverbes liés au calendrier
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _fr_FR_ISO8859_1_proverbes_
+#define _fr_FR_ISO8859_1_proverbes_
+
+LANG=fr_FR.ISO8859-1
+
+/* Janvier */
+01/01 Calme et claire nuit de l'an
+ À bonne année donne l'élan.
+01/02 Janvier d'eau chiche
+ Fait le paysan riche.
+01/04 Un mois de janvier sans gelée
+ N'amène jamais une bonne année.
+01/06 Pluie aux Rois,
+ Blé jusqu'au toit.
+01/08 Janvier sec et sage
+ Est un bon présage.
+01/09 Saint Julien brise la glace ;
+ S'il ne la brise, c'est qu'il l'embrasse.
+01/10 Beau temps à la saint Guillaume
+ Donne plus de blé que de chaume.
+01/13 Soleil au jour de saint Hilaire,
+ Fends du bois pour ton hiver.
+01/14 Pingouin dans les champs,
+ Hiver méchant.
+01/15 S'il gèle à la saint Maur,
+ La moitié de l'hiver est dehors.
+01/18 À la saint Pierre,
+ L'hiver s'en va ou se resserre.
+01/20 S'il gèle à la saint Sébastien,
+ L'hiver s'en va ou revient.
+01/22 Pour saint Vincent,
+ L'hiver perd ses dents
+ Ou les retrouve pour longtemps.
+01/24 S'il tonne en janvier,
+ Monte les barriques au grenier.
+01/25 Le jour de saint Paul,
+ L'hiver se rompt le col.
+01/31 Janvier fait le péché,
+ Mars en est accusé.
+
+/* Février */
+02/01 À la saint Ignace,
+ L'eau est de glace.
+02/02 Chandeleur claire, hiver derrière ;
+ Chandeleur trouble, hiver redouble.
+02/03 À la saint Blaise,
+ L'hiver s'apaise,
+ Mais s'il redouble et s'il reprend,
+ Longtemps après on s'en ressent.
+02/05 Pour la sainte Agathe, sème ton oignon,
+ Fût-il dans la glace, il deviendra bon.
+02/09 À la sainte Apolline
+ Bien souvent l'hiver nous quitte.
+02/12 Si le soleil rit à la sainte Eulalie,
+ Pommes et cidre à la folie.
+02/14 À la saint Valentin,
+ Tous les vents sont marins.
+02/16 Pluie de février
+ À la terre vaut du fumier.
+02/18 Février trop doux,
+ Printemps en courroux.
+02/20 La neige de février
+ Brûle le blé.
+02/22 Neige à la sainte Isabelle
+ Fait la fleur plus belle.
+02/24 Saint Mathias
+ Casse la glace ;
+ S'il n'y en a pas,
+ Il en fera.
+02/27 Gelée de la sainte Honorine
+ Rend toute la vallée chagrine.
+02/28 Fleur de février
+ Va mal au pommier.
+
+/* Mars */
+03/01 Taille à la saint Aubin
+ Donnera de gros raisins.
+03/02 Quand mars mouillera,
+ Bien du vin tu auras.
+03/03 Soit au début, soit à la fin,
+ Mars nous montre son venin.
+03/06 À la sainte Colette
+ Commence à chanter l'alouette.
+03/08 Quand en mars il tonne,
+ L'année sera bonne.
+03/10 Mars venteux,
+ Vergers pommeux.
+03/12 À la saint Grégoire,
+ Il faut tailler la vigne pour boire.
+03/13 Poussière de mars
+ Est poussière d'or...
+03/15 Pluie de mars grandit l'herbette
+ Et souvent annonce disette.
+03/17 S'il fait doux à la saint Patrice,
+ De leurs trous sortent les écrevisses.
+03/19 Pour saint Joseph,
+ L'hirondelle va et vient.
+03/21 S'il pleut à la saint Benoît,
+ Il pleut trente-sept jours plus trois.
+03/23 Quand à glace il gèle à la saint Victorien,
+ En pêches et en abricots il n'y a rien.
+03/25 Quand fleurs en mars il y aura,
+ Guère de fruits ne mangeras.
+03/28 À la saint Gontran, si la température est belle,
+ Arrivent les premières hirondelles.
+03/30 Quand mars se déguise en été,
+ Avril prend ses habits fourrés.
+03/31 À la saint Benjamin,
+ Le mauvais temps prend fin.
+
+/* Mobiles */
+Easter-7 Le propre jour des Rameaux
+ Sème oignons et poireaux.
+Easter-3 La gelée du jeudi saint
+ Gèle le sarrasin.
+Easter-2 Gelée du vendredi saint
+ Gèle le pain et le vin.
+Easter S'il pleut à Pâques,
+ Il pleut pendant quarante jours.
+Easter Pâques en mars,
+ Pestes, guerres ou famines.
+Easter+36 Haricots de rogations
+ Rendent à foison.
+Easter+37 Belles rogations,
+ Belles moissons.
+Easter+39 S'il pleut à l'Ascension,
+ Tout va en perdition.
+Easter+49 La Pentecôte
+ Donne les fruits, ou les ôte.
+Easter+56 S'il pleut à la Trinité,
+ Il pleut tous les jours de l'année.
+
+/* Avril */
+04/01 Avril entrant,
+ Coucou chantant,
+ Sonnailles tintant.
+04/05 Avril fait la fleur,
+ Mai en a l'honneur.
+04/10 Il n'est point d'avril si beau
+ Qu'il n'ait de neige à son chapeau.
+04/15 En avril, ne te découvre pas d'un fil ;
+ En mai, fais ce qu'il te plaît ;
+ En juin, de trois habits n'en garde qu'un.
+04/17 Orage en avril,
+ Prépare tes barrils.
+04/19 À la sainte Léonide
+ Chaque blé pousse rapide.
+04/22 Pluie à la sainte Opportune,
+ Ni cerises ni prunes.
+04/23 À la saint Georges,
+ Sème ton orge,
+ À la saint Marc,
+ Il est trop tard.
+04/25 À la saint Marc, s'il tombe de l'eau,
+ Il n'y aura pas de fruits à couteau.
+04/28 Avril pluvieux et mai venteux
+ Ne rendent pas le paysan disetteux.
+04/30 La pluie à la saint Robert
+ De bon vin emplira ton verre.
+
+/* Mai */
+05/03 Les trois saints au sang de navet,
+ Pancrace, Mamert et Servais,
+ Sont bien nommés les saints de glace,
+ Mamert, Servais et Pancrace.
+05/15 À la sainte Denise,
+ Le froid n'en fait plus à sa guise.
+05/16 À la saint Honoré,
+ S'il fait gelée,
+ Le vin diminue de moitié.
+05/18 Bon fermier à sainte Juliette
+ Doit vendre ses poulettes.
+05/22 Beau temps à la sainte Émilie
+ Donne du fruit à la folie.
+05/23 Qui sème haricots à la saint Didier
+ Les arrachera à poignées.
+
+/* Juin */
+06/08 S'il pleut à la saint Médard,
+ Il pleut quarante jours plus tard,
+ À moins que saint Barnabé
+ Ne vienne l'arrêter.
+06/11 À la saint Barnabé,
+ Fauche ton pré.
+06/16 Si le jour de saint Fargeau
+ La lune se fait dans l'eau,
+ Le reste du mois est beau.
+06/19 S'il pleut à la saint Gervais,
+ Il pleut quarante jours après.
+06/20 Pluie d'orage à la saint Sylvère,
+ C'est beaucoup de vin dans le verre.
+06/24 S'il pleut à la saint Jean,
+ Guère de vin ni de pain.
+06/25 Après la saint Jean, si le coucou chante,
+ L'année sera rude et méchante.
+06/29 S'il pleut la veille de la saint Pierre,
+ La vigne est réduite du tiers.
+
+/* Juillet */
+07/02 S'il pleut à la Visitation,
+ Pluie à discrétion.
+07/03 À la saint Anatole,
+ Confiture dans la casserole.
+07/06 Juillet sans orage,
+ Famine au village.
+07/10 Petite pluie de juillet ensoleillé
+ Emplit caves et greniers.
+07/13 Quand reviendra la saint Henri,
+ Tu planteras ton céleri.
+07/16 Qui veut des beaux navets
+ Les sème en juillet.
+07/20 À la sainte Marguerite, pluie
+ Jamais au paysan ne souris ;
+ Mais pluie à la sainte Anne,
+ Pour lui c'est de la manne.
+07/21 S'il pleut à la saint Victor,
+ La récolte n'est pas d'or.
+07/22 S'il pleut à la sainte Madeleine,
+ Il pleuvra durant six semaines.
+07/25 Si saint jacques est serein,
+ L'hiver sera dû et serein.
+07/26 Pour la sainte Anne, s'il pleut,
+ Trente jours seront pluvieux.
+
+/* Août */
+August Sun+2 En août et vendanges, il n'y a ni fêtes ni dimanches.
+08/02 S'il pleut au mois d'août,
+ Les truffes sont au bout.
+08/04 Août donne goût.
+08/06 Soleil rouge en août,
+ C'est de la pluie partout.
+08/10 Qui sème à la saint Laurent
+ Y perd la graine et puis le temps.
+08/13 S'il pleut à la sainte Radegonde,
+ Misère abonde sur le monde.
+08/15 Pluie de l'Assomption,
+ Huit jours de mouillon.
+08/16 De saint Roch la grande chaleur
+ Prépare du vin la couleur.
+08/18 Temps trop beau en août
+ Annonce hiver en courroux.
+08/20 Brumes d'août font passer les châtaignes.
+08/22 Jamais d'août la sécheresse
+ N'amènera la richesse.
+08/24 À la saint Barthélémy,
+ Paie to dû.
+08/28 Fine pluie à la saint Augustin,
+ C'est comme s'il pleuvait du vin.
+08/29 Quand les hirondelles voient la saint Michel,
+ L'hiver ne vient qu'à Noël.
+
+/* Septembre */
+09/01 Pluie de la saint Gilles ruine les glands.
+09/05 Septembre humide,
+ Pas de tonneau vide.
+09/11 Tu peux semer sans crainte
+ Quand arrive la saint Hyacinthe.
+09/15 La rosée de saint Albin
+ est, dit-on, rosée de vin.
+09/19 Qui sème à la saint Janvier
+ De l'an récolte le premier.
+09/21 Si Matthieu pleure au lieu de rire,
+ Le vin en vinaigre vire.
+09/22 Semis de saint Maurice,
+ Récolte à ton caprice.
+09/23 Septembre se nomme
+ Le mai de l'automne.
+09/25 À la saint Firmin
+ L'hiver est en chemin.
+09/29 Pluie de saint Michel sans orage
+ D'un hiver doux est le présage.
+09/30 À la saint Jérôme,
+ Hoche tes pommes.
+
+/* Octobre */
+10/02 À la saint Léger,
+ Faut s'purger !
+10/04 Sème à la saint François,
+ Ton blé aura plus de poids.
+10/09 Beau temps à la saint Denis,
+ Hiver pourri.
+10/13 En octobre, qui ne fume rien
+ Ne récolte rien.
+10/16 Coupe ton chou à la saint Gall,
+ En hiver c'est un régal.
+10/18 À la saint Luc, sème dru,
+ Ou ne sème plus.
+10/23 Gelée d'octobre
+ Rend le vigneron sobre.
+10/25 Pour saint Crépin, mort aux mouches.
+10/28 À la sainte Simone,
+ Il faut avoir rentré ses pommes.
+10/31 Quand octobre prend sa fin,
+ Dans la cave est le vin.
+
+/* Novembre */
+11/01 À la Toussaint commence l'été de la saint Martin.
+11/02 Telle Toussaint, tel Noël,
+ Et Pâques pareil.
+11/04 À la saint Charles,
+ La gelée parle.
+11/08 En novembre, s'il tonne,
+ L'année sera bonne.
+11/11 Si l'hiver va droit son chemin,
+ Vous l'aurez à la saint Martin,
+ Mais s'il trouve quelque encombrée,
+ Vous l'aurez à la saint André.
+11/11 Tue ton cochon à la saint Martin
+ Et invite ton voisin.
+11/19 Sainte Élisabeth nous montre quel bonhomme sera l'hiver.
+11/22 Pour sainte Cécile,
+ Chaque haricot en fait mille.
+11/23 Quand l'hiver vient doucement,
+ Il est là à la saint Clément.
+11/25 Sainte Catherine, toute fille veut la fêter,
+ Mais aucune ne veut la coiffer.
+11/25 Quand sainte Catherine au ciel fait la moue,
+ Il faut patauger longtemps dans la boue.
+11/30 Quand l'hiver n'est pas pressé,
+ Il arrive à la saint André.
+
+/* Décembre */
+12/SundayFirst Tel avent,
+ Tel printemps.
+12/06 Neige de saint Nicolas
+ Donne froid pour trois mois.
+12/07 À la saint Ambroise,
+ Du froid pour huit jours.
+12/10 À la sainte Julie,
+ Le soleil ne quitte pas son lit.
+12/13 À la sainte Luce,
+ Le jour croît du saut d'une puce.
+12/16 Décembre de froid trop chiche
+ Ne fait pas le paysan riche.
+12/21 S'il gèle à la saint Thomas,
+ Il gèlera encore trois mois.
+12/23 Le tonnerre en décembre
+ Annonce pour l'an qui vient
+ Aux bêtes et aux gens
+ Abondance de biens.
+12/25 Noël au balcon,
+ Pâques au tison.
+12/26 À la saint Étienne,
+ Chacun trouve la sienne.
+12/28 Les jours entre Noël et les Rois
+ Indiquent le temps des douze mois.
+
+#endif /*! _fr_FR_ISO8859_1_proverbes_ */
diff --git a/usr.bin/calendar/calendars/hr_HR.ISO8859-2/calendar.all b/usr.bin/calendar/calendars/hr_HR.ISO8859-2/calendar.all
new file mode 100644
index 000000000000..8c4591092d01
--- /dev/null
+++ b/usr.bin/calendar/calendars/hr_HR.ISO8859-2/calendar.all
@@ -0,0 +1,12 @@
+/*
+ * hrvatski calendar
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _hr_HR_ISO8859_2_all_
+#define _hr_HR_ISO8859_2_all_
+
+#include <hr_HR.ISO8859-2/calendar.praznici>
+
+#endif /* !_hr_HR_ISO8859_2_all_ */
diff --git a/usr.bin/calendar/calendars/hr_HR.ISO8859-2/calendar.praznici b/usr.bin/calendar/calendars/hr_HR.ISO8859-2/calendar.praznici
new file mode 100644
index 000000000000..491ec6a4f3f3
--- /dev/null
+++ b/usr.bin/calendar/calendars/hr_HR.ISO8859-2/calendar.praznici
@@ -0,0 +1,44 @@
+/*
+ * hrvatski praznici
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _hr_HR_ISO8859_2_praznici_
+#define _hr_HR_ISO8859_2_praznici_
+
+LANG=hr_HR.ISO8859-2
+
+/* dr¾avni praznici */
+01/01 Nova godina
+01/06 Bogojavljenje ili Sveta tri kralja
+Easter Uskrs
+Easter+1 Uskrsni ponedjeljak
+05/01 Praznik rada
+Easter+60 Tijelovo
+06/22 Dan antifa¹istièke borbe
+06/25 Dan dr¾avnosti
+08/05 Dan pobjede i domovinske zahvalnosti i Dan hrvatskih branitelja
+08/15 Velika Gospa
+10/08 Dan neovisnosti
+11/01 Svi sveti
+12/25 Bo¾iæ
+12/26 Sveti Stjepan
+
+/* katolièki blagdani */
+Easter-2 Veliki petak
+Easter+39 Uza¹a¹æe
+Easter+49 Duhovi
+Easter+50 Duhovni ponedjeljak
+
+/* godi¹nja doba */
+03/21* Poèetak proljeæa
+06/21* Poèetak ljeta
+09/23* Poèetak jeseni
+12/21* Poèetak zime
+
+/* ljetno vrijeme */
+03/NedjeljaLast Poèetak ljetnog vremena
+10/NedjeljaLast Kraj ljetnog vremena
+
+#endif /* !_hr_HR_ISO8859_2_praznici_ */
diff --git a/usr.bin/calendar/calendars/hu_HU.ISO8859-2/calendar.all b/usr.bin/calendar/calendars/hu_HU.ISO8859-2/calendar.all
new file mode 100644
index 000000000000..5084dc7295b6
--- /dev/null
+++ b/usr.bin/calendar/calendars/hu_HU.ISO8859-2/calendar.all
@@ -0,0 +1,13 @@
+/*
+ * Magyar kalendárium
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _hu_HU_ISO8859_2_all_
+#define _hu_HU_ISO8859_2_all_
+
+#include <hu_HU.ISO8859-2/calendar.unnepek>
+#include <hu_HU.ISO8859-2/calendar.nevnapok>
+
+#endif /* !_hu_HU.ISO8859-2_all_ */
diff --git a/usr.bin/calendar/calendars/hu_HU.ISO8859-2/calendar.nevnapok b/usr.bin/calendar/calendars/hu_HU.ISO8859-2/calendar.nevnapok
new file mode 100644
index 000000000000..f85c0840d910
--- /dev/null
+++ b/usr.bin/calendar/calendars/hu_HU.ISO8859-2/calendar.nevnapok
@@ -0,0 +1,386 @@
+/*
+ * Névnapok
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _hu_HU_ISO8859_2_nevnapok_
+#define _hu_HU_ISO8859_2_nevnapok_
+
+LANG=hu_HU.ISO8859-2
+
+/*
+ * N.B.: A névnapok Magyarországon a szentek napjai alapján szerepelnek
+ * a naptárban. Néhány név többször is szerepel, de mindenki
+ * csak egyszer tart névnapot egy évben. A választott nap
+ * ebben az esetben a hagyományokon és az illetõn múlik.
+ *
+ */
+
+01/01 Fruzsina
+01/02 Ábel, Gergely
+01/03 Genovéva, Benjámin
+01/04 Titusz, Leona
+01/05 Simon
+01/06 Boldizsár, Menyhárt
+01/07 Attila, Ramóna
+01/08 Gyöngyvér
+01/09 Marcell
+01/10 Melánia
+01/11 Ágota, Baltazár
+01/12 Ernõ, Cézár
+01/13 Veronika
+01/14 Bódog, Félix
+01/15 Lóránt, Loránd
+01/16 Gusztáv
+01/17 Antal, Antónia
+01/18 Piroska
+01/19 Sára, Márió
+01/20 Fábián, Sebestyén
+01/21 Ágnes
+01/22 Vince, Artúr
+01/23 Zelma, Rajmund
+01/24 Timót, Xénia
+01/25 Pál
+01/26 Vanda, Paula
+01/27 Angelika, Angéla
+01/28 Károly, Karola
+01/29 Adél
+01/30 Gerda, Martina
+01/31 Marcella
+02/01 Ignác
+02/02 Karolina, Aida
+02/03 Balázs
+02/04 Ráhel, Csenge
+02/05 Ágota, Ingrid
+02/06 Dóra, Dorottya
+02/07 Rómeó, Tódor
+02/08 Aranka
+02/09 Abigél, Alex
+02/10 Elvira
+02/11 Bertold, Marietta
+02/12 Lívia, Lídia
+02/13 Ella, Linda
+02/14 Bálint, Valentin
+02/15 Kolos
+02/16 Julianna, Lilla
+02/17 Donát
+02/18 Bernadett
+02/19 Zsuzsanna
+02/20 Aladár, Álmos
+02/21 Eleonóra
+02/22 Gerzson
+02/23 Alfréd
+02/24 Mátyás
+02/25 Géza
+02/26 Edina
+02/27 Ákos, Bátor
+02/28 Elemér
+03/01 Albin
+03/02 Lujza
+03/03 Kornélia
+03/04 Kázmér
+03/05 Adorján, Adrián
+03/06 Leonóra, Inez
+03/07 Tamás
+03/08 Zoltán
+03/09 Franciska, Fanni
+03/10 Ildikó
+03/11 Szilárd
+03/12 Gergely
+03/13 Krisztián, Ajtony
+03/14 Matild
+03/15 Kristóf
+03/16 Henrietta
+03/17 Gertrúd, Patrik
+03/18 Sándor, Ede
+03/19 József, Bánk
+03/20 Klaudia
+03/21 Benedek
+03/22 Beáta, Izolda
+03/23 Emõke
+03/24 Gábor, Karina
+03/25 Irén, Irisz
+03/26 Emánuel
+03/27 Hajnalka
+03/28 Gedeon, Johanna
+03/29 Aguszta
+03/30 Zalán
+03/31 Árpád
+04/01 Hugó
+04/02 Áron
+04/03 Buda, Richárd
+04/04 Izidor
+04/05 Vince
+04/06 Vilmos, Bíborka
+04/07 Herman
+04/08 Dénes
+04/09 Erhard
+04/10 Zsolt
+04/11 Leó, Szaniszló
+04/12 Gyula
+04/13 Ida
+04/14 Tibor
+04/15 Anasztázia, Tas
+04/16 Csongor
+04/17 Rudolf
+04/18 Andrea, Ilma
+04/19 Emma
+04/20 Tivadar
+04/21 Konrád
+04/22 Csilla, Noémi
+04/23 Béla
+04/24 György
+04/25 Márk
+04/26 Ervin
+04/27 Zita
+04/28 Valéria
+04/29 Péter
+04/30 Katalin, Kitti
+05/01 Fülöp, Jakab
+05/02 Zsigmond
+05/03 Tímea, Irma
+05/04 Mónika, Flórián
+05/05 Györgyi
+05/06 Ivett, Frida
+05/07 Gizella
+05/08 Mihály
+05/09 Gergely
+05/10 Ármin, Pálma
+05/11 Ferenc
+05/12 Pongrác
+05/13 Szervác, Imola
+05/14 Bonifác
+05/15 Zsófia, Szonja
+05/16 Mózes, Botond
+05/17 Paszkál
+05/18 Erik, Alexandra
+05/19 Ivó, Milán
+05/20 Bernát, Felícia
+05/21 Konstantin
+05/22 Júlia, Rita
+05/23 Dezsõ
+05/24 Eszter, Eliza
+05/25 Orbán
+05/26 Fülöp, Evelin
+05/27 Hella
+05/28 Emil, Csanád
+05/29 Magdolna
+05/30 Janka, Zsanett
+05/31 Angéla, Petronella
+06/01 Tünde
+06/02 Kármen, Anita
+06/03 Klotild
+06/04 Bulcsú
+06/05 Fatime
+06/06 Norbert, Cintia
+06/07 Róbert
+06/08 Medárd
+06/09 Félix
+06/10 Margit, Gitta, Gréta
+06/11 Barnabás
+06/12 Villõ
+06/13 Antal, Anett
+06/14 Vazul
+06/15 Jolán, Vid
+06/16 Jusztin
+06/17 Laura, Alida
+06/18 Arnold, Levente
+06/19 Gyárfás
+06/20 Rafael
+06/21 Alajos, Leila
+06/22 Paulina
+06/23 Zoltán, Szidonia
+06/24 Iván
+06/25 Vilmos, Viola
+06/26 János, Pál
+06/27 László
+06/28 Levente, Irén
+06/29 Péter, Pál
+06/30 Pál
+07/01 Annamária, Tihamér
+07/02 Ottó
+07/03 Kornél, Soma
+07/04 Ulrik
+07/05 Emese, Sarolta
+07/06 Csaba
+07/07 Apollónia
+07/08 Ellák
+07/09 Lukrécia
+07/10 Amália
+07/11 Nóra, Lili
+07/12 Izabella, Dalma
+07/13 Jenõ
+07/14 Örs, Stella
+07/15 Henrik, Roland
+07/16 Valter
+07/17 Endre, Elek
+07/18 Frigyes
+07/19 Emília
+07/20 Illés
+07/21 Daniella, Dániel
+07/22 Magdolna
+07/23 Lenke
+07/24 Kinga, Kincsõ
+07/25 Kristóf, Jakab
+07/26 Anna, Anikó
+07/27 Olga, Liliána
+07/28 Szabolcs
+07/29 Márta, Flóra
+07/30 Judit, Xénia
+07/31 Oszkár
+08/01 Boglárka
+08/02 Lehel
+08/03 Hermina
+08/04 Domonkos, Dominika
+08/05 Krisztina
+08/06 Berta, Bettina
+08/07 Ibolya
+08/08 László
+08/09 Emõd
+08/10 Lõrinc
+08/11 Zsuzsanna, Tiborc
+08/12 Klára
+08/13 Ipoly
+08/14 Marcell
+08/15 Mária
+08/16 Ábrahám
+08/17 Jácint
+08/18 Ilona
+08/19 Huba
+08/20 István
+08/21 Sámuel, Hajna
+08/22 Menyhért, Mirjam
+08/23 Bence
+08/24 Bertalan
+08/25 Lajos, Patrícia
+08/26 Izsó
+08/27 Gáspár
+08/28 Ágoston
+08/29 Beatrix, Erna
+08/30 Rózsa
+08/31 Erika, Bella
+09/01 Egyed, Egon
+09/02 Rebeka, Dorina
+09/03 Hilda
+09/04 Rozália
+09/05 Viktor, Lõrinc
+09/06 Zakariás
+09/07 Regina
+09/08 Mária, Adrienn
+09/09 Ádám
+09/10 Nikolett, Hunor
+09/11 Teodóra
+09/12 Mária
+09/13 Kornél
+09/14 Szeréna, Roxána
+09/15 Enikõ, Melitta
+09/16 Edit
+09/17 Zsófia
+09/18 Diána
+09/19 Vilhelmina
+09/20 Friderika
+09/21 Máté, Mirella
+09/22 Móric
+09/23 Tekla
+09/24 Gellért, Mercédesz
+09/25 Eufrozina, Kende
+09/26 Jusztina
+09/27 Adalbert
+09/28 Vencel
+09/29 Mihály
+09/30 Jeromos
+10/01 Malvin
+10/02 Petra
+10/03 Helga
+10/04 Ferenc
+10/05 Aurél
+10/06 Brúnó, Renáta
+10/07 Amália
+10/08 Koppány
+10/09 Dénes
+10/10 Gedeon
+10/11 Brigitta
+10/12 Miksa
+10/13 Kálmán, Ede
+10/14 Helén
+10/15 Teréz
+10/16 Gál
+10/17 Hedvig
+10/18 Lukács
+10/19 Nándor
+10/20 Vendel
+10/21 Orsolya
+10/22 Elõd
+10/23 Gyöngyi
+10/24 Salamon
+10/25 Blanka, Bianka
+10/26 Dömötör
+10/27 Szabina
+10/28 Simon, Szimonetta
+10/29 Nárcisz
+10/30 Alfonz
+10/31 Farkas
+11/01 Marianna
+11/02 Achilles
+11/03 Gyõzõ
+11/04 Károly
+11/05 Imre
+11/06 Lénárd
+11/07 Rezsõ
+11/08 Zsombor
+11/09 Tivadar
+11/10 Réka
+11/11 Márton
+11/12 Jónás, Renátó
+11/13 Szilvia
+11/14 Aliz
+11/15 Albert, Lipót
+11/16 Ödön
+11/17 Hortenzia, Gergõ
+11/18 Jenõ
+11/19 Erzsébet
+11/20 Jolán
+11/21 Olivér
+11/22 Cecília
+11/23 Kelemen, Klementina
+11/24 Emma
+11/25 Katalin
+11/26 Virág
+11/27 Virgil
+11/28 Stefánia
+11/29 Taksony
+11/30 András, Andor
+12/01 Elza
+12/02 Melinda, Vivien
+12/03 Ferenc, Olívia
+12/04 Borbála, Barbara
+12/05 Vilma
+12/06 Miklós
+12/07 Ambrus
+12/08 Mária
+12/09 Natália
+12/10 Judit
+12/11 Árpád
+12/12 Gabriella
+12/13 Luca, Otília
+12/14 Szilárda
+12/15 Valér
+12/16 Etelka, Aletta
+12/17 Lázár, Olimpia
+12/18 Auguszta
+12/19 Viola
+12/20 Teofil
+12/21 Tamás
+12/22 Zénó
+12/23 Viktória
+12/24 Ádám, Éva
+12/25 Eugénia
+12/26 István
+12/27 János
+12/28 Kamilla
+12/29 Tamás, Tamara
+12/30 Dávid
+12/31 Szilveszter
+
+#endif /*! _hu_HU_ISO8859_2_nevnapok_ */
diff --git a/usr.bin/calendar/calendars/hu_HU.ISO8859-2/calendar.unnepek b/usr.bin/calendar/calendars/hu_HU.ISO8859-2/calendar.unnepek
new file mode 100644
index 000000000000..dab8ead76abf
--- /dev/null
+++ b/usr.bin/calendar/calendars/hu_HU.ISO8859-2/calendar.unnepek
@@ -0,0 +1,53 @@
+/*
+ * Ünnepnapok
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _hu_HU_ISO8859_2_unnepek_
+#define _hu_HU_ISO8859_2_unnepek_
+
+LANG=hu_HU.ISO8859-2
+
+/* Munkaszüneti napok */
+01/01 Újév
+03/15 1848-as szabadságharc és forradalom ünnepe
+05/01 Munka ünnepe
+10/23 1956-os forradalom ünnepe
+
+/* Vallási munkaszüneti napok */
+Easter Húsvét
+Easter+1 Húsvét hétfõ
+Easter+42 Virágvasárnap
+Easter+49 Pünkösd
+Easter+50 Pünkösd hétfõ
+08/20 Szent István nap, Államalapítás ünnepe
+11/01 Halottak napja
+12/25 Karácsony elsõ napja
+12/26 Karácsony második napja
+
+/* Az itt következõ dátumok nem munkaszüneti napok csak ünnepnapok */
+
+/* Csillagászati évszakok */
+03/21* Tavaszi napéjegyenlõség
+06/21* Nyári napforduló
+09/21* Õszi napéjegyenlõség
+12/21* Téli napforduló
+
+/* Téli és nyári idõszámítás közötti váltás */
+03/SundayLast Váltás a nyári idõszámításra
+10/SundayLast Váltás a téli idõszámításra
+
+/* Egyéb vallási ünnepek amelyek nem munkaszüneti napok */
+Easter-2 Nagy péntek ("a harangok Romába mennek")
+
+/* Egyéb ünnepnapok és emléknapok*/
+02/14 Valentin nap - a szerelmesek ünnepe
+03/08 Nõ nap - egy-egy szál virág a nõknek
+May Sun+2 Anyák napja
+10/06 Az 1848-as aradi vértanuk napja
+12/06 Mikulás napja - gyerekek csokit kapnak
+12/24 Karácsony elõestéje
+12/31 Szilveszter napja
+
+#endif /*! _hu_HU_ISO8859_2_unnepek_ */
diff --git a/usr.bin/calendar/calendars/pt_BR.ISO8859-1/calendar.all b/usr.bin/calendar/calendars/pt_BR.ISO8859-1/calendar.all
new file mode 100644
index 000000000000..cdffa483ddf4
--- /dev/null
+++ b/usr.bin/calendar/calendars/pt_BR.ISO8859-1/calendar.all
@@ -0,0 +1,15 @@
+/*
+ * $FreeBSD$
+ *
+ * Brazilian calendar originally submitted by
+ * Renato Tambellini <rtsanch@gmail.com>
+ */
+
+#ifndef _pt_BR_ISO8859_1_all_
+#define _pt_BR_ISO8859_1_all_
+
+#include <pt_BR.ISO8859-1/calendar.holidays>
+#include <pt_BR.ISO8859-1/calendar.commemorative>
+#include <pt_BR.ISO8859-1/calendar.mcommemorative>
+
+#endif /* !_pt_BR.ISO8859_1_all_ */
diff --git a/usr.bin/calendar/calendars/pt_BR.ISO8859-1/calendar.commemorative b/usr.bin/calendar/calendars/pt_BR.ISO8859-1/calendar.commemorative
new file mode 100644
index 000000000000..9be5debaec37
--- /dev/null
+++ b/usr.bin/calendar/calendars/pt_BR.ISO8859-1/calendar.commemorative
@@ -0,0 +1,191 @@
+/*
+ * $FreeBSD$
+ *
+ * Originally submitted by Renato Tambellini <rtsanch@gmail.com>
+ *
+ * Brazilian commemorative days
+ *
+ * http://www.ibge.gov.br/ibgeteen/datas/home.html
+ */
+
+#ifndef _pt_BR_ISO8859_1_commemorative_
+#define _pt_BR_ISO8859_1_commemorative_
+
+LANG=pt_BR.ISO8859-1
+
+01/06 Dia nacional do fotógrafo
+01/06 Dia da gratidão
+01/07 Dia da liberdade de culto
+01/09 Dia do Fico
+01/12 Aniversário de Belém
+01/20 Dia do farmacêutico
+01/20 Dia nacional do fusca
+01/21 Dia mundial da religião
+01/24 Dia da Previdência Social
+01/25 Dia do carteiro
+01/25 Aniversário da cidade de São Paulo
+01/28 Aniversário da abertura dos portos no Brasil, em 1808
+01/30 Dia da saudade
+02/01 Dia do publicitário
+02/04 Aniversário de Macapá
+02/07 Dia do gráfico
+02/16 Dia do repórter
+02/19 Dia do esportista
+03/01 Aniversário da cidade do Rio de Janeiro
+03/02 Dia do turismo
+03/05 Dia do filatelista brasileiro
+03/07 Dia do fuzileiro naval
+03/08 Dia internacional da mulher
+03/10 Dia do telefone
+03/12 Aniversário de Recife
+03/12 Dia do bibliotecário
+03/14 Dia nacional da poesia
+03/15 Dia da escola
+03/15 Dia mundial do consumidor
+03/17 Aniversário de Aracaju
+03/21 Dia da eliminação da discriminação racial
+03/22 Dia mundial da água
+03/23 Aniversário de Florianópolis
+03/23 Dia do meteorologista
+03/26 Aniversário de Porto Alegre
+03/27 Dia do circo
+03/27 Dia do teatro
+03/28 Dia do revisor e do diagramador
+03/29 Aniversário de Curitiba
+03/31 Aniversário do golpe militar
+04/01 Dia da mentira
+04/02 Dia internacional do livro para crianças
+04/07 Dia mundial da saúde
+04/07 Dia do jornalismo
+04/08 Dia mundial de combate ao câncer
+04/08 Dia da natação
+04/08 Aniversário de Cuiabá
+04/12 Aniversário de Fortaleza
+04/13 Dia dos jovens
+04/14 Dia internacional do café
+04/15 Dia mundial do desenhista
+04/15 Dia da conservação do solo
+04/19 Dia do índio
+04/20 Dia do diplomata
+04/21 Aniversário de Brasília
+04/21 Dia do metalúrgico
+04/22 Dia do descobrimento do Brasil
+04/22 Dia do planeta Terra
+04/22 Dia da Força Aérea Brasileira
+04/23 Dia mundial do escoteiro
+04/25 Dia do contabilista
+04/27 Dia da empregada doméstica
+04/28 Dia da educação
+04/30 Dia do ferroviário
+05/05 Dia do cartógrafo
+05/08 Dia do artista plástico
+05/08 Dia internacional da Cruz Vermelha
+05/12 Dia mundial do enfermeiro
+05/13 Dia da abolição da escravatura
+05/13 Dia do automóvel
+05/15 Dia do assistente social
+05/16 Dia do gari
+05/17 Dia internacional das telecomunicações
+05/18 Dia mundial dos museus
+05/20 Aniversário de Palmas
+05/21 Dia da Língua Nacional
+05/22 Dia do apicultor
+05/24 Dia do vestibulando
+05/25 Dia da indústria
+05/27 Dia do profissional liberal
+05/29 Dia do estatístico
+05/29 Dia do geógrafo
+05/30 Dia do geólogo
+06/01 Dia da imprensa
+06/04 Dia internacional das crianças vítimas de agressão
+06/05 Dia mundial do meio ambiente e da ecologia
+06/09 Dia do porteiro
+06/10 Dia da Língua Portuguesa
+06/11 Dia da Marinha do Brasil
+06/12 Dia dos namorados
+06/15 Dia do paleontólogo
+06/18 Dia do químico
+06/19 Dia do migrante
+06/21 Dia da música
+06/22 Dia do aeroviário
+06/25 Dia do imigrante
+06/26 Dia internacional do combate às drogas
+06/26 Dia do metrologista
+06/29 Dia da telefonista
+06/29 Dia do pescador
+07/01 Dia da vacina BCG
+07/02 Dia do bombeiro
+07/09 Aniversário de Boa Vista
+07/11 Dia mundial da população
+07/12 Dia do engenheiro florestal
+07/13 Dia mundial do rock
+07/17 Dia de proteção às florestas
+07/19 Dia do futebol
+07/20 Chegada do homem à Lua
+07/20 Dia da amizade
+07/25 Dia do escritor
+07/27 Dia nacional da prevenção de acidentes de trabalho
+07/28 Dia do agricultor
+08/11 Dia do advogado
+08/11 Dia da televisão
+08/13 Dia do economista
+08/15 Dia da informática
+08/16 Aniversário de Teresina
+08/21 Dia da habitação
+08/22 Dia do folclore
+08/25 Dia do soldado
+08/26 Aniversário de Campo Grande
+08/27 Dia do psicólogo
+08/31 Dia do nutricionista
+09/03 Dia do biólogo
+09/08 Dia mundial da alfabetização
+09/08 Aniversário de Vitória
+09/08 Aniversário de São Luís
+09/09 Dia do administrador
+09/09 Dia do médico veterinário
+09/16 Dia internacional para preservação da camada de ozônio
+09/18 Dia dos símbolos nacionais
+09/21 Dia do idoso
+09/21 Dia da árvore
+09/25 Dia do rádio
+09/25 Dia nacional do trânsito
+09/30 Dia da secretária
+10/04 Dia dos animais
+10/05 Dia da promulgação da atual Constituição brasileira
+10/11 Dia nacional da pessoa portadora de deficiência física
+10/12 Dia da criança
+10/12 Dia do descobrimento da América
+10/12 Dia do agrônomo
+10/13 Dia do fisioterapeuta
+10/14 Dia da pecuária
+10/15 Dia do professor
+10/16 Dia mundial da alimentação
+10/18 Dia do médico
+10/23 Dia do aviador
+10/24 Dia da ONU
+10/25 Dia da democracia
+10/25 Dia do dentista
+10/28 Dia do funcionário público
+10/29 Dia nacional do livro
+10/30 Dia do comércio
+10/31 Dia das bruxas
+11/05 Dia do cinema brasileiro
+11/19 Dia da bandeira
+11/20 Dia nacional da consciência negra
+11/30 Dia do teólogo
+11/30 Dia da reforma agrária
+12/01 Dia mundial de luta contra a AIDS
+12/02 Dia da astronomia
+12/03 Dia internacional das pessoas portadoras de deficiência
+12/04 Dia do orientador educacional
+12/05 Aniversário de Maceió
+12/05 Dia internacional do voluntário
+12/08 Dia da família
+12/09 Dia do fonoaudiólogo
+12/10 Dia da declaração dos direitos do homem
+12/11 Dia do engenheiro
+12/11 Dia do arquiteto
+12/12 Aniversário de Belo Horizonte
+12/28 Aniversário de Rio Branco
+
+#endif
diff --git a/usr.bin/calendar/calendars/pt_BR.ISO8859-1/calendar.holidays b/usr.bin/calendar/calendars/pt_BR.ISO8859-1/calendar.holidays
new file mode 100644
index 000000000000..caf1139e4116
--- /dev/null
+++ b/usr.bin/calendar/calendars/pt_BR.ISO8859-1/calendar.holidays
@@ -0,0 +1,25 @@
+/*
+ * $FreeBSD$
+ *
+ * Originally submitted by Renato Tambellini <rtsanch@gmail.com>
+ *
+ * Brazilian holidays
+ *
+ * Federal laws 662/1949, 6.802/1980, 9.093/1995 and 10.607/2002.
+ */
+
+#ifndef _pt_BR_ISO8859_1_holidays_
+#define _pt_BR_ISO8859_1_holidays_
+
+LANG=pt_BR.ISO8859-1
+
+01/01 Dia da confraternização universal e da paz
+04/21 Dia do Tiradentes
+05/01 Dia do trabalho
+09/07 Dia da independência do Brasil
+10/12 Dia da Nossa Senhora Aparecida
+11/02 Dia de Finados
+11/15 Dia da proclamação da República
+12/25 Natal
+
+#endif
diff --git a/usr.bin/calendar/calendars/pt_BR.ISO8859-1/calendar.mcommemorative b/usr.bin/calendar/calendars/pt_BR.ISO8859-1/calendar.mcommemorative
new file mode 100644
index 000000000000..1a113f8f986a
--- /dev/null
+++ b/usr.bin/calendar/calendars/pt_BR.ISO8859-1/calendar.mcommemorative
@@ -0,0 +1,22 @@
+/*
+ * $FreeBSD$
+ *
+ * Originally submitted by Renato Tambellini <rtsanch@gmail.com>
+ *
+ * Brazilian mobile commemorative days
+ *
+ * http://www.novomilenio.inf.br/porto/mapas/nmcalenp.htm
+ */
+
+#ifndef _pt_BR_ISO8859_1_mcommemorative_
+#define _pt_BR_ISO8859_1_mcommemorative_
+
+LANG=pt_BR.ISO8859-1
+
+Easter-47 Carnaval
+Easter-7 Domingo de Ramos
+Easter-2 Sexta-feira Santa
+Easter Páscoa
+Easter+60 Corpus Christi
+
+#endif
diff --git a/usr.bin/calendar/calendars/pt_BR.UTF-8/calendar.all b/usr.bin/calendar/calendars/pt_BR.UTF-8/calendar.all
new file mode 100644
index 000000000000..25db5e13a1f1
--- /dev/null
+++ b/usr.bin/calendar/calendars/pt_BR.UTF-8/calendar.all
@@ -0,0 +1,16 @@
+/*
+ * $FreeBSD$
+ *
+ * Originally submitted by Renato Tambellini <rtsanch@gmail.com>
+ *
+ * Brazilian calendar
+ */
+
+#ifndef _pt_BR_UTF_8_all_
+#define _pt_BR_UTF_8_all_
+
+#include <pt_BR.UTF-8/calendar.holidays>
+#include <pt_BR.UTF-8/calendar.commemorative>
+#include <pt_BR.UTF-8/calendar.mcommemorative>
+
+#endif /* !_pt_BR.UTF_8_all_ */
diff --git a/usr.bin/calendar/calendars/pt_BR.UTF-8/calendar.commemorative b/usr.bin/calendar/calendars/pt_BR.UTF-8/calendar.commemorative
new file mode 100644
index 000000000000..3f5df5221c02
--- /dev/null
+++ b/usr.bin/calendar/calendars/pt_BR.UTF-8/calendar.commemorative
@@ -0,0 +1,189 @@
+/*
+ * $FreeBSD$
+ *
+ * Originally submitted by Renato Tambellini <rtsanch@gmail.com>
+ *
+ * Brazilian commemorative days
+ */
+
+#ifndef _pt_BR_UTF_8_commemorative_
+#define _pt_BR_UTF_8_commemorative_
+
+LANG=pt_BR.UTF-8
+
+01/06 Dia nacional do fotógrafo
+01/06 Dia da gratidão
+01/07 Dia da liberdade de culto
+01/09 Dia do Fico
+01/12 Aniversário de Belém
+01/20 Dia do farmacêutico
+01/20 Dia nacional do fusca
+01/21 Dia mundial da religião
+01/24 Dia da Previdência Social
+01/25 Dia do carteiro
+01/25 Aniversário da cidade de São Paulo
+01/28 Aniversário da abertura dos portos no Brasil, em 1808
+01/30 Dia da saudade
+02/01 Dia do publicitário
+02/04 Aniversário de Macapá
+02/07 Dia do gráfico
+02/16 Dia do repórter
+02/19 Dia do esportista
+03/01 Aniversário da cidade do Rio de Janeiro
+03/02 Dia do turismo
+03/05 Dia do filatelista brasileiro
+03/07 Dia do fuzileiro naval
+03/08 Dia internacional da mulher
+03/10 Dia do telefone
+03/12 Aniversário de Recife
+03/12 Dia do bibliotecário
+03/14 Dia nacional da poesia
+03/15 Dia da escola
+03/15 Dia mundial do consumidor
+03/17 Aniversário de Aracaju
+03/21 Dia da eliminação da discriminação racial
+03/22 Dia mundial da água
+03/23 Aniversário de Florianópolis
+03/23 Dia do meteorologista
+03/26 Aniversário de Porto Alegre
+03/27 Dia do circo
+03/27 Dia do teatro
+03/28 Dia do revisor e do diagramador
+03/29 Aniversário de Curitiba
+03/31 Aniversário do golpe militar
+04/01 Dia da mentira
+04/02 Dia internacional do livro para crianças
+04/07 Dia mundial da saúde
+04/07 Dia do jornalismo
+04/08 Dia mundial de combate ao câncer
+04/08 Dia da natação
+04/08 Aniversário de Cuiabá
+04/12 Aniversário de Fortaleza
+04/13 Dia dos jovens
+04/14 Dia internacional do café
+04/15 Dia mundial do desenhista
+04/15 Dia da conservação do solo
+04/19 Dia do índio
+04/20 Dia do diplomata
+04/21 Aniversário de Brasília
+04/21 Dia do metalúrgico
+04/22 Dia do descobrimento do Brasil
+04/22 Dia do planeta Terra
+04/22 Dia da Força Aérea Brasileira
+04/23 Dia mundial do escoteiro
+04/25 Dia do contabilista
+04/27 Dia da empregada doméstica
+04/28 Dia da educação
+04/30 Dia do ferroviário
+05/05 Dia do cartógrafo
+05/08 Dia do artista plástico
+05/08 Dia internacional da Cruz Vermelha
+05/12 Dia mundial do enfermeiro
+05/13 Dia da abolição da escravatura
+05/13 Dia do automóvel
+05/15 Dia do assistente social
+05/16 Dia do gari
+05/17 Dia internacional das telecomunicações
+05/18 Dia mundial dos museus
+05/20 Aniversário de Palmas
+05/21 Dia da Língua Nacional
+05/22 Dia do apicultor
+05/24 Dia do vestibulando
+05/25 Dia da indústria
+05/27 Dia do profissional liberal
+05/29 Dia do estatístico
+05/29 Dia do geógrafo
+05/30 Dia do geólogo
+06/01 Dia da imprensa
+06/04 Dia internacional das crianças vítimas de agressão
+06/05 Dia mundial do meio ambiente e da ecologia
+06/09 Dia do porteiro
+06/10 Dia da Língua Portuguesa
+06/11 Dia da Marinha do Brasil
+06/12 Dia dos namorados
+06/15 Dia do paleontólogo
+06/18 Dia do químico
+06/19 Dia do migrante
+06/21 Dia da música
+06/22 Dia do aeroviário
+06/25 Dia do imigrante
+06/26 Dia internacional do combate às drogas
+06/26 Dia do metrologista
+06/29 Dia da telefonista
+06/29 Dia do pescador
+07/01 Dia da vacina BCG
+07/02 Dia do bombeiro
+07/09 Aniversário de Boa Vista
+07/11 Dia mundial da população
+07/12 Dia do engenheiro florestal
+07/13 Dia mundial do rock
+07/17 Dia de proteção às florestas
+07/19 Dia do futebol
+07/20 Chegada do homem à Lua
+07/20 Dia da amizade
+07/25 Dia do escritor
+07/27 Dia nacional da prevenção de acidentes de trabalho
+07/28 Dia do agricultor
+08/11 Dia do advogado
+08/11 Dia da televisão
+08/13 Dia do economista
+08/15 Dia da informática
+08/16 Aniversário de Teresina
+08/21 Dia da habitação
+08/22 Dia do folclore
+08/25 Dia do soldado
+08/26 Aniversário de Campo Grande
+08/27 Dia do psicólogo
+08/31 Dia do nutricionista
+09/03 Dia do biólogo
+09/08 Dia mundial da alfabetização
+09/08 Aniversário de Vitória
+09/08 Aniversário de São Luís
+09/09 Dia do administrador
+09/09 Dia do médico veterinário
+09/16 Dia internacional para preservação da camada de ozônio
+09/18 Dia dos símbolos nacionais
+09/21 Dia do idoso
+09/21 Dia da árvore
+09/25 Dia do rádio
+09/25 Dia nacional do trânsito
+09/30 Dia da secretária
+10/04 Dia dos animais
+10/05 Dia da promulgação da atual Constituição brasileira
+10/11 Dia nacional da pessoa portadora de deficiência física
+10/12 Dia da criança
+10/12 Dia do descobrimento da América
+10/12 Dia do agrônomo
+10/13 Dia do fisioterapeuta
+10/14 Dia da pecuária
+10/15 Dia do professor
+10/16 Dia mundial da alimentação
+10/18 Dia do médico
+10/23 Dia do aviador
+10/24 Dia da ONU
+10/25 Dia da democracia
+10/25 Dia do dentista
+10/28 Dia do funcionário público
+10/29 Dia nacional do livro
+10/30 Dia do comércio
+10/31 Dia das bruxas
+11/05 Dia do cinema brasileiro
+11/19 Dia da bandeira
+11/20 Dia nacional da consciência negra
+11/30 Dia do teólogo
+11/30 Dia da reforma agrária
+12/01 Dia mundial de luta contra a AIDS
+12/02 Dia da astronomia
+12/03 Dia internacional das pessoas portadoras de deficiência
+12/04 Dia do orientador educacional
+12/05 Aniversário de Maceió
+12/05 Dia internacional do voluntário
+12/08 Dia da família
+12/09 Dia do fonoaudiólogo
+12/10 Dia da declaração dos direitos do homem
+12/11 Dia do engenheiro
+12/11 Dia do arquiteto
+12/12 Aniversário de Belo Horizonte
+12/28 Aniversário de Rio Branco
+
+#endif
diff --git a/usr.bin/calendar/calendars/pt_BR.UTF-8/calendar.holidays b/usr.bin/calendar/calendars/pt_BR.UTF-8/calendar.holidays
new file mode 100644
index 000000000000..7df0c3418f4c
--- /dev/null
+++ b/usr.bin/calendar/calendars/pt_BR.UTF-8/calendar.holidays
@@ -0,0 +1,25 @@
+/*
+ * $FreeBSD$
+ *
+ * Originally submitted by Renato Tambellini <rtsanch@gmail.com>
+ *
+ * Brazilian holidays
+ *
+ * Federal laws 662/1949, 6.802/1980, 9.093/1995 and 10.607/2002.
+ */
+
+#ifndef _pt_BR_UTF_8_holidays_
+#define _pt_BR_UTF_8_holidays_
+
+LANG=pt_BR.UTF-8
+
+01/01 Dia da confraternização universal e da paz
+04/21 Dia do Tiradentes
+05/01 Dia do trabalho
+09/07 Dia da independência do Brasil
+10/12 Dia da Nossa Senhora Aparecida
+11/02 Dia de Finados
+11/15 Dia da proclamação da República
+12/25 Natal
+
+#endif
diff --git a/usr.bin/calendar/calendars/pt_BR.UTF-8/calendar.mcommemorative b/usr.bin/calendar/calendars/pt_BR.UTF-8/calendar.mcommemorative
new file mode 100644
index 000000000000..b3eb7325f61d
--- /dev/null
+++ b/usr.bin/calendar/calendars/pt_BR.UTF-8/calendar.mcommemorative
@@ -0,0 +1,22 @@
+/*
+ * $FreeBSD$
+ *
+ * Originally submitted by Renato Tambellini <rtsanch@gmail.com>
+ *
+ * Brazilian mobile commemorative days
+ *
+ * http://www.novomilenio.inf.br/porto/mapas/nmcalenp.htm
+ */
+
+#ifndef _pt_BR_UTF_8_mcommemorative_
+#define _pt_BR_UTF_8_mcommemorative_
+
+LANG=pt_BR.UTF-8
+
+Easter-47 Carnaval
+Easter-7 Domingo de Ramos
+Easter-2 Sexta-feira Santa
+Easter Páscoa
+Easter+60 Corpus Christi
+
+#endif
diff --git a/usr.bin/calendar/calendars/ru_RU.KOI8-R/calendar.all b/usr.bin/calendar/calendars/ru_RU.KOI8-R/calendar.all
new file mode 100644
index 000000000000..c7d1cfadb586
--- /dev/null
+++ b/usr.bin/calendar/calendars/ru_RU.KOI8-R/calendar.all
@@ -0,0 +1,16 @@
+/*
+ * òÕÓÓËÉÊ ËÁÌÅÎÄÁÒØ
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _ru_RU_KOI8_R_all_
+#define _ru_RU_KOI8_R_all_
+
+#include <ru_RU.KOI8-R/calendar.common>
+#include <ru_RU.KOI8-R/calendar.holiday>
+#include <ru_RU.KOI8-R/calendar.military>
+#include <ru_RU.KOI8-R/calendar.orthodox>
+#include <ru_RU.KOI8-R/calendar.pagan>
+
+#endif /* !_ru_RU_KOI8_R_all_ */
diff --git a/usr.bin/calendar/calendars/ru_RU.KOI8-R/calendar.common b/usr.bin/calendar/calendars/ru_RU.KOI8-R/calendar.common
new file mode 100644
index 000000000000..dc0ddd0293d2
--- /dev/null
+++ b/usr.bin/calendar/calendars/ru_RU.KOI8-R/calendar.common
@@ -0,0 +1,105 @@
+/*
+ * òÏÓÓÉÊÓËÉÅ ÐÒÁÚÄÎÉËÉ
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _ru_RU_KOI8_R_common_
+#define _ru_RU_KOI8_R_common_
+
+LANG=ru_RU.KOI8-R
+
+12 ÑÎ×. äÅÎØ ÒÁÂÏÔÎÉËÁ ÐÒÏËÕÒÁÔÕÒÙ
+13 ÑÎ×. äÅÎØ ÒÏÓÓÉÊÓËÏÊ ÐÅÞÁÔÉ
+14 ÑÎ×. óÔÁÒÙÊ îÏ×ÙÊ ÇÏÄ
+21 ÑÎ×. äÅÎØ ÉÎÖÅÎÅÒÎÙÈ ×ÏÊÓË
+25 ÑÎ×. ôÁÔØÑÎÉÎ ÄÅÎØ. óÔÕÄÅÎÞÅÓËÉÊ ÐÒÁÚÄÎÉË
+ 8 ÆÅ×Ò. äÅÎØ ÒÏÓÓÉÊÓËÏÊ ÎÁÕËÉ
+10 ÆÅ×Ò. äÅÎØ ÄÉÐÌÏÍÁÔÉÞÅÓËÏÇÏ ÒÁÂÏÔÎÉËÁ
+ 1 ÍÁÒÔÁ ÷ÓÅÍÉÒÎÙÊ ÄÅÎØ ÇÒÁÖÄÁÎÓËÏÊ ÏÂÏÒÏÎÙ
+03/SunSecond äÅÎØ ÒÁÂÏÔÎÉËÏ× ÇÅÏÄÅÚÉÉ É ËÁÒÔÏÇÒÁÆÉÉ
+11 ÍÁÒÔÁ äÅÎØ ÒÁÂÏÔÎÉËÁ ÏÒÇÁÎÏ× ÎÁÒËÏËÏÎÔÒÏÌÑ
+18 ÍÁÒÔÁ äÅÎØ ÎÁÌÏÇÏ×ÏÊ ÐÏÌÉÃÉÉ
+03/SunThird äÅÎØ ÒÁÂÏÔÎÉËÏ× ÔÏÒÇÏ×ÌÉ, ÂÙÔÏ×ÏÇÏ ÏÂÓÌÕÖÉ×ÁÎÉÑ ÎÁÓÅÌÅÎÉÑ É ÖÉÌÉÝÎÏ-ËÏÍÍÕÎÁÌØÎÏÇÏ ÈÏÚÑÊÓÔ×Á
+27 ÍÁÒÔÁ íÅÖÄÕÎÁÒÏÄÎÙÊ ÄÅÎØ ÔÅÁÔÒÁ
+27 ÍÁÒÔÁ äÅÎØ ×ÎÕÔÒÅÎÎÉÈ ×ÏÊÓË
+ 1 ÁÐÒ. äÅÎØ ÓÍÅÈÁ
+ 2 ÁÐÒ. äÅÎØ ÅÄÉÎÅÎÉÑ ÎÁÒÏÄÏ×
+04/SunFirst äÅÎØ ÇÅÏÌÏÇÁ
+12 ÁÐÒ. äÅÎØ ËÏÓÍÏÎÁ×ÔÉËÉ
+04/SunSecond äÅÎØ ×ÏÊÓË ÐÒÏÔÉ×Ï×ÏÚÄÕÛÎÏÊ ÏÂÏÒÏÎÙ
+26 ÁÐÒ. äÅÎØ ÐÁÍÑÔÉ ÐÏÇÉÂÛÉÈ × ÒÁÄÉÁÃÉÏÎÎÙÈ Á×ÁÒÉÑÈ É ËÁÔÁÓÔÒÏÆÁÈ
+30 ÁÐÒ. äÅÎØ ÐÏÖÁÒÎÏÊ ÏÈÒÁÎÙ
+ 7 ÍÁÑ äÅÎØ ÒÁÄÉÏ
+17 ÍÁÑ íÅÖÄÕÎÁÒÏÄÎÙÊ ÄÅÎØ ÔÅÌÅËÏÍÍÕÎÉËÁÃÉÊ
+18 ÍÁÑ íÅÖÄÕÎÁÒÏÄÎÙÊ ÄÅÎØ ÍÕÚÅÅ×
+24 ÍÁÑ äÅÎØ ÓÌÁ×ÑÎÓËÏÊ ÐÉÓØÍÅÎÎÏÓÔÉ É ËÕÌØÔÕÒÙ
+26 ÍÁÑ äÅÎØ ÒÏÓÓÉÊÓËÏÇÏ ÐÒÅÄÐÒÉÎÉÍÁÔÅÌØÓÔ×Á
+27 ÍÁÑ ïÂÝÅÒÏÓÓÉÊÓËÉÊ ÄÅÎØ ÂÉÂÌÉÏÔÅË
+28 ÍÁÑ äÅÎØ ÐÏÇÒÁÎÉÞÎÉËÁ
+30 ÍÁÑ äÅÎØ ÐÏÖÁÒÎÏÊ ÏÈÒÁÎÙ
+31 ÍÁÑ äÅÎØ òÏÓÓÉÊÓËÏÊ áÄ×ÏËÁÔÕÒÙ
+05/SunLast äÅÎØ ÈÉÍÉËÁ
+ 1 ÉÀÎÑ äÅÎØ ÚÁÝÉÔÙ ÄÅÔÅÊ
+ 5 ÉÀÎÑ äÅÎØ ÜËÏÌÏÇÁ
+ 6 ÉÀÎÑ ðÕÛËÉÎÓËÉÊ ÄÅÎØ
+ 8 ÉÀÎÑ äÅÎØ ÓÏÃÉÁÌØÎÏÇÏ ÒÁÂÏÔÎÉËÁ
+06/SunSecond äÅÎØ ÒÁÂÏÔÎÉËÏ× ÌÅÇËÏÊ ÐÒÏÍÙÛÌÅÎÎÏÓÔÉ
+06/SunThird äÅÎØ ÍÅÄÉÃÉÎÓËÏÇÏ ÒÁÂÏÔÎÉËÁ
+22 ÉÀÎÑ äÅÎØ ÐÁÍÑÔÉ É ÓËÏÒÂÉ (îÁÞÁÌÏ ÷ÅÌÉËÏÊ ïÔÅÞÅÓÔ×ÅÎÎÏÊ ÷ÏÊÎÙ, 1941 ÇÏÄ)
+27 ÉÀÎÑ äÅÎØ ÍÏÌÏÄÅÖÉ
+29 ÉÀÎÑ äÅÎØ ÐÁÒÔÉÚÁÎ É ÐÏÄÐÏÌØÝÉËÏ×
+06/SatLast äÅÎØ ÉÚÏÂÒÅÔÁÔÅÌÑ É ÒÁÃÉÏÎÁÌÉÚÁÔÏÒÁ
+07/SunFirst äÅÎØ ÒÁÂÏÔÎÉËÏ× ÍÏÒÓËÏÇÏ É ÒÅÞÎÏÇÏ ÆÌÏÔÁ
+07/SunSecond äÅÎØ ÒÙÂÁËÁ
+07/SunSecond äÅÎØ ÒÏÓÓÉÊÓËÏÊ ÐÏÞÔÙ
+07/SunThird äÅÎØ ÍÅÔÁÌÌÕÒÇÁ
+07/SunLast äÅÎØ ÷ÏÅÎÎÏ-íÏÒÓËÏÇÏ æÌÏÔÁ
+28 ÉÀÌÑ äÅÎØ ËÒÅÝÅÎÉÑ òÕÓÉ
+ 6 Á×Ç. äÅÎØ ÖÅÌÅÚÎÏÄÏÒÏÖÎÙÈ ×ÏÊÓË
+08/SunFirst äÅÎØ ÖÅÌÅÚÎÏÄÏÒÏÖÎÉËÁ
+12 Á×Ç. äÅÎØ ×ÏÅÎÎÏ-×ÏÚÄÕÛÎÙÈ ÓÉÌ
+08/SunSecond äÅÎØ ÓÔÒÏÉÔÅÌÑ
+08/SunThird äÅÎØ ÷ÏÚÄÕÛÎÏÇÏ æÌÏÔÁ
+22 Á×Ç. äÅÎØ ÇÏÓÕÄÁÒÓÔ×ÅÎÎÏÇÏ ÆÌÁÇÁ
+27 Á×Ç. äÅÎØ ËÉÎÏ
+08/SunLast äÅÎØ ÛÁÈÔÅÒÁ
+ 1 ÓÅÎÔ. äÅÎØ ÚÎÁÎÉÊ
+ 2 ÓÅÎÔ. äÅÎØ ÒÏÓÓÉÊÓËÏÊ Ç×ÁÒÄÉÉ
+ 3 ÓÅÎÔ. äÅÎØ ÓÏÌÉÄÁÒÎÏÓÔÉ × ÂÏÒØÂÅ Ó ÔÅÒÒÏÒÉÚÍÏÍ
+ 4 ÓÅÎÔ. äÅÎØ ÓÐÅÃÉÁÌÉÓÔÁ ÐÏ ÑÄÅÒÎÏÍÕ ÏÂÅÓÐÅÞÅÎÉÀ
+09/SunFirst äÅÎØ ÒÁÂÏÔÎÉËÏ× ÎÅÆÔÑÎÏÊ É ÇÁÚÏ×ÏÊ ÐÒÏÍÙÛÌÅÎÎÏÓÔÉ
+09/SunSecond äÅÎØ ÔÁÎËÉÓÔÁ
+09/SunThird äÅÎØ ÒÁÂÏÔÎÉËÏ× ÌÅÓÁ
+28 ÓÅÎÔ. äÅÎØ ÒÁÂÏÔÎÉËÁ ÁÔÏÍÎÏÊ ÐÒÏÍÙÛÌÅÎÎÏÓÔÉ
+09/SunLast äÅÎØ ÍÁÛÉÎÏÓÔÒÏÉÔÅÌÑ
+ 1 ÏËÔ. äÅÎØ ÐÏÖÉÌÙÈ ÌÀÄÅÊ
+ 1 ÏËÔ. äÅÎØ ÓÕÈÏÐÕÔÎÙÈ ×ÏÊÓË
+ 4 ÏËÔ. äÅÎØ ËÏÓÍÉÞÅÓËÉÈ ×ÏÊÓË
+ 5 ÏËÔ. äÅÎØ ÕÞÉÔÅÌÑ
+14 ÏËÔ. íÅÖÄÕÎÁÒÏÄÎÙÊ ÄÅÎØ ÓÔÁÎÄÁÒÔÉÚÁÃÉÉ
+10/SunSecond äÅÎØ ÒÁÂÏÔÎÉËÏ× ÓÅÌØÓËÏÇÏ ÈÏÚÑÊÓÔ×Á É ÐÅÒÅÒÁÂÁÔÙ×ÁÀÝÅÊ ÐÒÏÍÙÛÌÅÎÎÏÓÔÉ
+10/SunThird äÅÎØ ÒÁÂÏÔÎÉËÏ× ÄÏÒÏÖÎÏÇÏ ÈÏÚÑÊÓÔ×Á
+24 ÏËÔ. íÅÖÄÕÎÁÒÏÄÎÙÊ ÄÅÎØ ïïî
+25 ÏËÔ. äÅÎØ ÔÁÍÏÖÅÎÎÉËÁ
+30 ÏËÔ. äÅÎØ ÐÁÍÑÔÉ ÖÅÒÔ× ÐÏÌÉÔÉÞÅÓËÉÈ ÒÅÐÒÅÓÓÉÊ
+10/SunLast äÅÎØ ÒÁÂÏÔÎÉËÏ× Á×ÔÏÍÏÂÉÌØÎÏÇÏ ÔÒÁÎÓÐÏÒÔÁ
+ 7 ÎÏÑÂ. äÅÎØ ÏËÔÑÂÒØÓËÏÊ ÒÅ×ÏÌÀÃÉÉ 1917 ÇÏÄÁ
+ 9 ÎÏÑÂ. ÷ÓÅÍÉÒÎÙÊ ÄÅÎØ ËÁÞÅÓÔ×Á
+10 ÎÏÑÂ. äÅÎØ ÍÉÌÉÃÉÉ
+16 ÎÏÑÂ. äÅÎØ ÍÏÒÓËÏÊ ÐÅÈÏÔÙ
+17 ÎÏÑÂ. íÅÖÄÕÎÁÒÏÄÎÙÊ ÄÅÎØ ÓÔÕÄÅÎÔÏ×
+19 ÎÏÑÂ. äÅÎØ ÒÁËÅÔÎÙÈ ×ÏÊÓË É ÁÒÔÉÌÌÅÒÉÉ
+21 ÎÏÑÂ. äÅÎØ ÒÁÂÏÔÎÉËÏ× ÎÁÌÏÇÏ×ÙÈ ÏÒÇÁÎÏ×
+26 ÎÏÑÂ. ÷ÓÅÍÉÒÎÙÊ ÄÅÎØ ÉÎÆÏÒÍÁÃÉÉ
+11/SunLast äÅÎØ ÍÁÔÅÒÉ
+ 1 ÄÅË. ÷ÓÅÍÉÒÎÙÊ ÄÅÎØ ÂÏÒØÂÙ ÓÏ óðéäÏÍ
+ 3 ÄÅË. äÅÎØ ÀÒÉÓÔÁ
+ 9 ÄÅË. äÅÎØ çÅÒÏÅ× ïÔÅÞÅÓÔ×Á
+12 ÄÅË. äÅÎØ ëÏÎÓÔÉÔÕÃÉÉ
+17 ÄÅË. äÅÎØ ÒÁËÅÔÎÙÈ ×ÏÊÓË ÓÔÒÁÔÅÇÉÞÅÓËÏÇÏ ÎÁÚÎÁÞÅÎÉÑ
+20 ÄÅË. äÅÎØ ÒÁÂÏÔÎÉËÁ ÏÒÇÁÎÏ× ÂÅÚÏÐÁÓÎÏÓÔÉ
+22 ÄÅË. äÅÎØ ÜÎÅÒÇÅÔÉËÁ
+27 ÄÅË. äÅÎØ ÓÐÁÓÁÔÅÌÑ
+
+#endif /* !_ru_RU_KOI8_R_common_ */
diff --git a/usr.bin/calendar/calendars/ru_RU.KOI8-R/calendar.holiday b/usr.bin/calendar/calendars/ru_RU.KOI8-R/calendar.holiday
new file mode 100644
index 000000000000..1d0595b9ca19
--- /dev/null
+++ b/usr.bin/calendar/calendars/ru_RU.KOI8-R/calendar.holiday
@@ -0,0 +1,25 @@
+/*
+ * òÏÓÓÉÊÓËÉÅ ÐÒÁÚÄÎÉËÉ (ÎÅÒÁÂÏÞÉÅ "ËÒÁÓÎÙÅ" ÄÎÉ)
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _ru_RU_KOI8_R_holiday_
+#define _ru_RU_KOI8_R_holiday_
+
+LANG=ru_RU.KOI8-R
+
+ 1 ÑÎ×. îÏ×ÙÊ ÇÏÄ
+ 2 ÑÎ×. îÏ×ÏÇÏÄÎÉÅ ËÁÎÉËÕÌÙ
+ 3 ÑÎ×. îÏ×ÏÇÏÄÎÉÅ ËÁÎÉËÕÌÙ
+ 4 ÑÎ×. îÏ×ÏÇÏÄÎÉÅ ËÁÎÉËÕÌÙ
+ 5 ÑÎ×. îÏ×ÏÇÏÄÎÉÅ ËÁÎÉËÕÌÙ
+ 7 ÑÎ×. òÏÖÄÅÓÔ×Ï èÒÉÓÔÏ×Ï
+23 ÆÅ×Ò. äÅÎØ ÚÁÝÉÔÎÉËÁ ïÔÅÞÅÓÔ×Á
+ 8 ÍÁÒÔÁ íÅÖÄÕÎÁÒÏÄÎÙÊ ÖÅÎÓËÉÊ ÄÅÎØ
+ 1 ÍÁÑ ðÒÁÚÄÎÉË ÷ÅÓÎÙ É ôÒÕÄÁ
+ 9 ÍÁÑ äÅÎØ ðÏÂÅÄÙ
+12 ÉÀÎÑ äÅÎØ òÏÓÓÉÉ
+ 4 ÎÏÑÂ. äÅÎØ ÎÁÒÏÄÎÏÇÏ ÅÄÉÎÓÔ×Á
+
+#endif /* !_ru_RU_KOI8_R_holiday_ */
diff --git a/usr.bin/calendar/calendars/ru_RU.KOI8-R/calendar.military b/usr.bin/calendar/calendars/ru_RU.KOI8-R/calendar.military
new file mode 100644
index 000000000000..ae5f18ddcdea
--- /dev/null
+++ b/usr.bin/calendar/calendars/ru_RU.KOI8-R/calendar.military
@@ -0,0 +1,28 @@
+/*
+ * äÎÉ ×ÏÉÎÓËÏÊ ÓÌÁ×Ù òÏÓÓÉÉ
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _ru_RU_KOI8_R_military_
+#define _ru_RU_KOI8_R_military_
+
+LANG=ru_RU.KOI8-R
+
+27 ÑÎ×. äÅÎØ ÓÎÑÔÉÑ ÂÌÏËÁÄÙ ÇÏÒÏÄÁ ìÅÎÉÎÇÒÁÄÁ (1944 ÇÏÄ)
+ 2 ÆÅ×Ò. äÅÎØ ÒÁÚÇÒÏÍÁ ÓÏ×ÅÔÓËÉÍÉ ×ÏÊÓËÁÍÉ ÎÅÍÅÃËÏ-ÆÁÛÉÓÔÓËÉÈ ×ÏÊÓË × óÔÁÌÉÎÇÒÁÄÓËÏÊ ÂÉÔ×Å (1943 ÇÏÄ)
+23 ÆÅ×Ò. äÅÎØ ÐÏÂÅÄÙ ëÒÁÓÎÏÊ áÒÍÉÉ ÎÁÄ ËÁÊÚÅÒÏ×ÓËÉÍÉ ×ÏÊÓËÁÍÉ çÅÒÍÁÎÉÉ (1918 ÇÏÄ)
+18 ÁÐÒ. äÅÎØ ÐÏÂÅÄÙ ÒÕÓÓËÉÈ ×ÏÉÎÏ× ËÎÑÚÑ áÌÅËÓÁÎÄÒÁ îÅ×ÓËÏÇÏ ÎÁÄ ÎÅÍÅÃËÉÍÉ ÒÙÃÁÒÑÍÉ ÎÁ þÕÄÓËÏÍ ÏÚÅÒÅ (ìÅÄÏ×ÏÅ ÐÏÂÏÉÝÅ, 1242 ÇÏÄ)
+10 ÉÀÌÑ äÅÎØ ÐÏÂÅÄÙ ÒÕÓÓËÏÊ ÁÒÍÉÉ ÐÏÄ ËÏÍÁÎÄÏ×ÁÎÉÅÍ ðÅÔÒÁ ðÅÒ×ÏÇÏ ÎÁÄ Û×ÅÄÁÍÉ × ðÏÌÔÁ×ÓËÏÍ ÓÒÁÖÅÎÉÉ (1709 ÇÏÄ)
+ 9 Á×Ç. äÅÎØ ÐÅÒ×ÏÊ × ÒÏÓÓÉÊÓËÏÊ ÉÓÔÏÒÉÉ ÍÏÒÓËÏÊ ÐÏÂÅÄÙ ÒÕÓÓËÏÇÏ ÆÌÏÔÁ ÐÏÄ ËÏÍÁÎÄÏ×ÁÎÉÅÍ ðÅÔÒÁ ðÅÒ×ÏÇÏ ÎÁÄ Û×ÅÄÁÍÉ Õ ÍÙÓÁ çÁÎÇÕÔ (1714 ÇÏÄ)
+23 Á×Ç. äÅÎØ ÒÁÚÇÒÏÍÁ ÓÏ×ÅÔÓËÉÍÉ ×ÏÊÓËÁÍÉ ÎÅÍÅÃËÏ-ÆÁÛÉÓÔÓËÉÈ ×ÏÊÓË × ëÕÒÓËÏÊ ÂÉÔ×Å (1943 ÇÏÄ)
+ 2 ÓÅÎÔ. äÅÎØ ÏËÏÎÞÁÎÉÑ ÷ÔÏÒÏÊ ÍÉÒÏ×ÏÊ ×ÏÊÎÙ (1945 ÇÏÄ)
+ 8 ÓÅÎÔ. äÅÎØ âÏÒÏÄÉÎÓËÏÇÏ ÓÒÁÖÅÎÉÑ ÒÕÓÓËÏÊ ÁÒÍÉÉ ÐÏÄ ËÏÍÁÎÄÏ×ÁÎÉÅÍ í.é. ëÕÔÕÚÏ×Á Ó ÆÒÁÎÃÕÚÓËÏÊ ÁÒÍÉÅÊ (1812 ÇÏÄ)
+11 ÓÅÎÔ. äÅÎØ ÐÏÂÅÄÙ ÒÕÓÓËÏÊ ÜÓËÁÄÒÙ ÐÏÄ ËÏÍÁÎÄÏ×ÁÎÉÅÍ æ.æ. õÛÁËÏ×Á ÎÁÄ ÔÕÒÅÃËÏÊ ÜÓËÁÄÒÏÊ Õ ÍÙÓÁ ôÅÎÄÒÁ (1790 ÇÏÄ)
+21 ÓÅÎÔ. äÅÎØ ÐÏÂÅÄÙ ÒÕÓÓËÉÈ ÐÏÌËÏ× ×Ï ÇÌÁ×Å Ó ×ÅÌÉËÉÍ ËÎÑÚÅÍ äÍÉÔÒÉÅÍ äÏÎÓËÉÍ ÎÁÄ ÍÏÎÇÏÌÏ-ÔÁÔÁÒÓËÉÍÉ ×ÏÊÓËÁÍÉ × ëÕÌÉËÏ×ÓËÏÊ ÂÉÔ×Å (1380 ÇÏÄ)
+ 4 ÎÏÑÂ. äÅÎØ ÏÓ×ÏÂÏÖÄÅÎÉÑ íÏÓË×Ù ÓÉÌÁÍÉ ÎÁÒÏÄÎÏÇÏ ÏÐÏÌÞÅÎÉÑ ÐÏÄ ÒÕËÏ×ÏÄÓÔ×ÏÍ ëÕÚØÍÙ íÉÎÉÎÁ É äÍÉÔÒÉÑ ðÏÖÁÒÓËÏÇÏ ÏÔ ÐÏÌØÓËÉÈ ÉÎÔÅÒ×ÅÎÔÏ× (1612 ÇÏÄ)
+ 1 ÄÅË. äÅÎØ ÐÏÂÅÄÙ ÒÕÓÓËÏÊ ÜÓËÁÄÒÙ ÐÏÄ ËÏÍÁÎÄÏ×ÁÎÉÅÍ ð.ó. îÁÈÉÍÏ×Á ÎÁÄ ÔÕÒÅÃËÏÊ ÜÓËÁÄÒÏÊ Õ ÍÙÓÁ óÉÎÏÐ (1853 ÇÏÄ)
+ 5 ÄÅË. äÅÎØ ÎÁÞÁÌÁ ËÏÎÔÒÎÁÓÔÕÐÌÅÎÉÑ ÓÏ×ÅÔÓËÉÈ ×ÏÊÓË ÐÒÏÔÉ× ÎÅÍÅÃËÏ-ÆÁÛÉÓÔÓËÉÈ ×ÏÊÓË × ÂÉÔ×Å ÐÏÄ íÏÓË×ÏÊ (1941 ÇÏÄ)
+24 ÄÅË. äÅÎØ ×ÚÑÔÉÑ ÔÕÒÅÃËÏÊ ËÒÅÐÏÓÔÉ éÚÍÁÉÌ ÒÕÓÓËÉÍÉ ×ÏÊÓËÁÍÉ ÐÏÄ ËÏÍÁÎÄÏ×ÁÎÉÅÍ á.÷. óÕ×ÏÒÏ×Á (1790 ÇÏÄ)
+
+#endif /* !_ru_RU_KOI8_R_military_ */
diff --git a/usr.bin/calendar/calendars/ru_RU.KOI8-R/calendar.orthodox b/usr.bin/calendar/calendars/ru_RU.KOI8-R/calendar.orthodox
new file mode 100644
index 000000000000..10292ed268b4
--- /dev/null
+++ b/usr.bin/calendar/calendars/ru_RU.KOI8-R/calendar.orthodox
@@ -0,0 +1,36 @@
+/*
+ * ðÒÁ×ÏÓÌÁ×ÎÙÅ ÐÒÁÚÄÎÉËÉ
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _ru_RU_KOI8_R_orthodox_
+#define _ru_RU_KOI8_R_orthodox_
+
+LANG=ru_RU.KOI8-R
+Paskha=ðÁÓÈÁ
+
+21 ÓÅÎÔ. òÏÖÄÅÓÔ×Ï ðÒÅÓ×ÑÔÏÊ âÏÇÏÒÏÄÉÃÙ
+27 ÓÅÎÔ. ÷ÏÚÄ×ÉÖÅÎÉÅ ëÒÅÓÔÁ çÏÓÐÏÄÎÑ
+14 ÏËÔ. ðÏËÒÏ× ðÒÅÓ×ÑÔÏÊ âÏÇÏÒÏÄÉÃÙ
+ 4 ÄÅË. ÷×ÅÄÅÎÉÅ ×Ï ÈÒÁÍ ðÒÅÓ×ÑÔÏÊ âÏÇÏÒÏÄÉÃÙ
+ 7 ÑÎ×. òÏÖÄÅÓÔ×Ï èÒÉÓÔÏ×Ï
+14 ÑÎ×. ïÂÒÅÚÁÎÉÅ çÏÓÐÏÄÎÅ
+19 ÑÎ×. âÏÇÏÑ×ÌÅÎÉÅ ÉÌÉ ëÒÅÝÅÎÉÅ çÏÓÐÏÄÎÅ
+15 ÆÅ×Ò. óÒÅÔÅÎÉÅ çÏÓÐÏÄÎÅ
+ðÁÓÈÁ-48 ÷ÅÌÉËÉÊ ðÏÓÔ
+ðÁÓÈÁ-7 ÷ÈÏÄ çÏÓÐÏÄÅÎØ × éÅÒÕÓÁÌÉÍ. ÷ÅÒÂÎÏÅ ÷ÏÓËÒÅÓÅÎØÅ
+ðÁÓÈÁ-3 ÷ÅÌÉËÉÊ þÅÔ×ÅÒÇ
+ðÁÓÈÁ-2 óÔÒÁÓÔÎÁÑ ðÑÔÎÉÃÁ
+ðÁÓÈÁ ÷ÏÓËÒÅÓÅÎÉÅ èÒÉÓÔÏ×Ï
+ðÁÓÈÁ+39 ÷ÏÚÎÅÓÅÎÉÅ
+ðÁÓÈÁ+49 äÅÎØ ó×ÑÔÏÊ ôÒÏÉÃÙ. ðÑÔÉÄÅÓÑÔÎÉÃÁ
+ 7 ÁÐÒ. âÌÁÇÏ×ÅÝÅÎÉÅ ðÒÅÓ×ÑÔÏÊ âÏÇÏÒÏÄÉÃÙ
+ 7 ÉÀÌÑ òÏÖÄÅÓÔ×Ï éÏÁÎÎÁ ðÒÅÄÔÅÞÉ
+12 ÉÀÌÑ äÅÎØ Ó×ÑÔÙÈ ÐÅÒ×Ï×ÅÒÈÏ×ÎÙÈ ÁÐÏÓÔÏÌÏ× ðÅÔÒÁ É ðÁ×ÌÁ
+19 Á×Ç. ðÒÅÏÂÒÁÖÅÎÉÅ çÏÓÐÏÄÎÅ
+28 Á×Ç. õÓÐÅÎÉÅ ðÒÅÓ×ÑÔÏÊ âÏÇÏÒÏÄÉÃÙ
+11 ÓÅÎÔ. õÓÅËÎÏ×ÅÎÉÅ ÇÌÁ×Ù éÏÁÎÎÁ ðÒÅÄÔÅÞÉ
+
+#endif /* !_ru_RU_KOI8_R_orthodox_ */
+
diff --git a/usr.bin/calendar/calendars/ru_RU.KOI8-R/calendar.pagan b/usr.bin/calendar/calendars/ru_RU.KOI8-R/calendar.pagan
new file mode 100644
index 000000000000..7cdd1a6048e6
--- /dev/null
+++ b/usr.bin/calendar/calendars/ru_RU.KOI8-R/calendar.pagan
@@ -0,0 +1,42 @@
+/*
+ * ñÚÙÞÅÓËÉÅ ÐÒÁÚÄÎÉËÉ
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _ru_RU_KOI8_R_pagan_
+#define _ru_RU_KOI8_R_pagan_
+
+LANG=ru_RU.KOI8-R
+Paskha=ðÁÓÈÁ
+
+21 ÄÅË.* úÉÍÎÅÅ ÓÏÌÎÃÅÓÔÏÑÎÉÅ
+25 ÄÅË. ëÏÌÑÄÁ (ÓÄ×ÉÎÕÔÏÅ ÚÉÍÎÅÅ ÓÏÌÎÃÅÓÔÏÑÎÉÅ)
+ 6 ÑÎ×. äÅÎØ ëÁÝÅÑ É ÷ÅÌÅÓÁ
+24 ÆÅ×Ò. äÅÎØ ÷ÅÌÅÓÁ
+29 ÆÅ×Ò. äÅÎØ ëÁÝÅÑ
+ 1 ÍÁÒÔÁ äÅÎØ íÁÒÅÎÙ
+14 ÍÁÒÔÁ îÏ×ÙÊ çÏÄ, ï×ÓÅÎØ ÍÁÌÙÊ
+ðÁÓÈÁ-55 íÁÓÌÅÎÉÃÁ
+ðÁÓÈÁ+7 ëÒÁÓÎÁÑ çÏÒËÁ
+ðÁÓÈÁ+16 òÁÄÕÎÉÃÁ
+20 ÍÁÒÔÁ* ÷ÅÓÅÎÎÅÅ ÒÁ×ÎÏÄÅÎÓÔ×ÉÅ
+ 7 ÁÐÒ. äÅÎØ íÁÒÅÎÙ (ÓÄ×ÉÎÕÔÏÅ ×ÅÓÅÎÎÅÅ ÒÁ×ÎÏÄÅÎÓÔ×ÉÅ)
+ 6 ÍÁÑ äÅÎØ äÁÖØÂÏÇÁ, ï×ÓÅÎØ ÂÏÌØÛÏÊ
+22 ÍÁÑ ñÒÉÌÉÎ äÅÎØ
+15 ÉÀÎÑ äÅÎØ ôÒÉÇÌÁ×Á
+21 ÉÀÎÑ* ìÅÔÎÅÅ ÓÏÌÎÃÅÓÔÏÑÎÉÅ
+ 1 ÉÀÌÑ òÕÓÁÌØÎÁÑ îÅÄÅÌÑ
+ 7 ÉÀÌÑ ëÕÐÁÌÁ (ÓÄ×ÉÎÕÔÏÅ ÌÅÔÎÅÅ ÓÏÌÎÃÅÓÔÏÑÎÉÅ)
+27 ÉÀÌÑ ïÔÂÏÒ ÖÅÒÔ× ðÅÒÕÎÕ, ÒÕÓÁÌÉÉ
+ 2 Á×Ç. ðÅÒÕÎÏ× äÅÎØ
+21 Á×Ç. äÅÎØ óÔÒÉÂÏÇÁ
+28 Á×Ç. õÓÐÅÎÉÅ úÌÁÔÏÇÏÒËÉ
+14 ÓÅÎÔ. äÅÎØ ÷ÏÌÈÁ úÍÅÅ×ÉÞÁ
+22 ÓÅÎÔ.* ðÏ×ÏÒÏÔ Ë ÚÉÍÅ (ÏÓÅÎÎÅÅ ÒÁ×ÎÏÄÅÎÓÔ×ÉÅ)
+10 ÎÏÑÂ. äÅÎØ íÁËÏÛÉ
+21 ÎÏÑÂ. äÅÎØ ó×ÁÒÏÇÁ É óÅÍÁÒÇÌÁ
+ 9 ÄÅË. äÅÎØ äÁÖØÂÏÇÁ É íÁÒÅÎÙ
+
+#endif /* !_ru_RU_KOI8_R_pagan_ */
+
diff --git a/usr.bin/calendar/calendars/ru_RU.UTF-8/calendar.all b/usr.bin/calendar/calendars/ru_RU.UTF-8/calendar.all
new file mode 100644
index 000000000000..038bfb0f09d7
--- /dev/null
+++ b/usr.bin/calendar/calendars/ru_RU.UTF-8/calendar.all
@@ -0,0 +1,16 @@
+/*
+ * РуÑÑкий календарь
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _ru_RU_UTF_8_all_
+#define _ru_RU_UTF_8_all_
+
+#include <ru_RU.UTF-8/calendar.common>
+#include <ru_RU.UTF-8/calendar.holiday>
+#include <ru_RU.UTF-8/calendar.military>
+#include <ru_RU.UTF-8/calendar.orthodox>
+#include <ru_RU.UTF-8/calendar.pagan>
+
+#endif /* !_ru_RU_UTF_8_all_ */
diff --git a/usr.bin/calendar/calendars/ru_RU.UTF-8/calendar.common b/usr.bin/calendar/calendars/ru_RU.UTF-8/calendar.common
new file mode 100644
index 000000000000..8c062862e7f8
--- /dev/null
+++ b/usr.bin/calendar/calendars/ru_RU.UTF-8/calendar.common
@@ -0,0 +1,105 @@
+/*
+ * РоÑÑийÑкие праздники
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _ru_RU_UTF_8_common_
+#define _ru_RU_UTF_8_common_
+
+LANG=ru_RU.UTF-8
+
+12 Ñнв. День работника прокуратуры
+13 Ñнв. День роÑÑийÑкой печати
+14 Ñнв. Старый Ðовый год
+21 Ñнв. День инженерных войÑк
+25 Ñнв. ТатьÑнин день. СтуденчеÑкий праздник
+ 8 февр. День роÑÑийÑкой науки
+10 февр. День дипломатичеÑкого работника
+ 1 марта Ð’Ñемирный день гражданÑкой обороны
+03/SunSecond День работников геодезии и картографии
+11 марта День работника органов наркоконтролÑ
+18 марта День налоговой полиции
+03/SunThird День работников торговли, бытового обÑÐ»ÑƒÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð½Ð°ÑÐµÐ»ÐµÐ½Ð¸Ñ Ð¸ жилищно-коммунального хозÑйÑтва
+27 марта Международный день театра
+27 марта День внутренних войÑк
+ 1 апр. День Ñмеха
+ 2 апр. День ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð½Ð°Ñ€Ð¾Ð´Ð¾Ð²
+04/SunFirst День геолога
+12 апр. День коÑмонавтики
+04/SunSecond День войÑк противовоздушной обороны
+26 апр. День памÑти погибших в радиационных авариÑÑ… и катаÑтрофах
+30 апр. День пожарной охраны
+ 7 Ð¼Ð°Ñ Ð”ÐµÐ½ÑŒ радио
+17 Ð¼Ð°Ñ ÐœÐµÐ¶Ð´ÑƒÐ½Ð°Ñ€Ð¾Ð´Ð½Ñ‹Ð¹ день телекоммуникаций
+18 Ð¼Ð°Ñ ÐœÐµÐ¶Ð´ÑƒÐ½Ð°Ñ€Ð¾Ð´Ð½Ñ‹Ð¹ день музеев
+24 Ð¼Ð°Ñ Ð”ÐµÐ½ÑŒ ÑлавÑнÑкой пиÑьменноÑти и культуры
+26 Ð¼Ð°Ñ Ð”ÐµÐ½ÑŒ роÑÑийÑкого предпринимательÑтва
+27 Ð¼Ð°Ñ ÐžÐ±Ñ‰ÐµÑ€Ð¾ÑÑийÑкий день библиотек
+28 Ð¼Ð°Ñ Ð”ÐµÐ½ÑŒ пограничника
+30 Ð¼Ð°Ñ Ð”ÐµÐ½ÑŒ пожарной охраны
+31 Ð¼Ð°Ñ Ð”ÐµÐ½ÑŒ РоÑÑийÑкой Ðдвокатуры
+05/SunLast День химика
+ 1 Ð¸ÑŽÐ½Ñ Ð”ÐµÐ½ÑŒ защиты детей
+ 5 Ð¸ÑŽÐ½Ñ Ð”ÐµÐ½ÑŒ Ñколога
+ 6 Ð¸ÑŽÐ½Ñ ÐŸÑƒÑˆÐºÐ¸Ð½Ñкий день
+ 8 Ð¸ÑŽÐ½Ñ Ð”ÐµÐ½ÑŒ Ñоциального работника
+06/SunSecond День работников легкой промышленноÑти
+06/SunThird День медицинÑкого работника
+22 Ð¸ÑŽÐ½Ñ Ð”ÐµÐ½ÑŒ памÑти и Ñкорби (Ðачало Великой ОтечеÑтвенной Войны, 1941 год)
+27 Ð¸ÑŽÐ½Ñ Ð”ÐµÐ½ÑŒ молодежи
+29 Ð¸ÑŽÐ½Ñ Ð”ÐµÐ½ÑŒ партизан и подпольщиков
+06/SatLast День Ð¸Ð·Ð¾Ð±Ñ€ÐµÑ‚Ð°Ñ‚ÐµÐ»Ñ Ð¸ рационализатора
+07/SunFirst День работников морÑкого и речного флота
+07/SunSecond День рыбака
+07/SunSecond День роÑÑийÑкой почты
+07/SunThird День металлурга
+07/SunLast День Военно-МорÑкого Флота
+28 Ð¸ÑŽÐ»Ñ Ð”ÐµÐ½ÑŒ ÐºÑ€ÐµÑ‰ÐµÐ½Ð¸Ñ Ð ÑƒÑи
+ 6 авг. День железнодорожных войÑк
+08/SunFirst День железнодорожника
+12 авг. День военно-воздушных Ñил
+08/SunSecond День ÑтроителÑ
+08/SunThird День Воздушного Флота
+22 авг. День гоÑударÑтвенного флага
+27 авг. День кино
+08/SunLast День шахтера
+ 1 Ñент. День знаний
+ 2 Ñент. День роÑÑийÑкой гвардии
+ 3 Ñент. День ÑолидарноÑти в борьбе Ñ Ñ‚ÐµÑ€Ñ€Ð¾Ñ€Ð¸Ð·Ð¼Ð¾Ð¼
+ 4 Ñент. День ÑпециалиÑта по Ñдерному обеÑпечению
+09/SunFirst День работников нефтÑной и газовой промышленноÑти
+09/SunSecond День танкиÑта
+09/SunThird День работников леÑа
+28 Ñент. День работника атомной промышленноÑти
+09/SunLast День машиноÑтроителÑ
+ 1 окт. День пожилых людей
+ 1 окт. День Ñухопутных войÑк
+ 4 окт. День коÑмичеÑких войÑк
+ 5 окт. День учителÑ
+14 окт. Международный день Ñтандартизации
+10/SunSecond День работников ÑельÑкого хозÑйÑтва и перерабатывающей промышленноÑти
+10/SunThird День работников дорожного хозÑйÑтва
+24 окт. Международный день ООÐ
+25 окт. День таможенника
+30 окт. День памÑти жертв политичеÑких репреÑÑий
+10/SunLast День работников автомобильного транÑпорта
+ 7 ноÑб. День октÑбрьÑкой революции 1917 года
+ 9 ноÑб. Ð’Ñемирный день качеÑтва
+10 ноÑб. День милиции
+16 ноÑб. День морÑкой пехоты
+17 ноÑб. Международный день Ñтудентов
+19 ноÑб. День ракетных войÑк и артиллерии
+21 ноÑб. День работников налоговых органов
+26 ноÑб. Ð’Ñемирный день информации
+11/SunLast День матери
+ 1 дек. Ð’Ñемирный день борьбы Ñо СПИДом
+ 3 дек. День юриÑта
+ 9 дек. День Героев ОтечеÑтва
+12 дек. День КонÑтитуции
+17 дек. День ракетных войÑк ÑтратегичеÑкого назначениÑ
+20 дек. День работника органов безопаÑноÑти
+22 дек. День Ñнергетика
+27 дек. День ÑпаÑателÑ
+
+#endif /* !_ru_RU_UTF_8_common_ */
diff --git a/usr.bin/calendar/calendars/ru_RU.UTF-8/calendar.holiday b/usr.bin/calendar/calendars/ru_RU.UTF-8/calendar.holiday
new file mode 100644
index 000000000000..875eec924f18
--- /dev/null
+++ b/usr.bin/calendar/calendars/ru_RU.UTF-8/calendar.holiday
@@ -0,0 +1,25 @@
+/*
+ * РоÑÑийÑкие праздники (нерабочие "краÑные" дни)
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _ru_RU_UTF_8_holiday_
+#define _ru_RU_UTF_8_holiday_
+
+LANG=ru_RU.UTF-8
+
+ 1 Ñнв. Ðовый год
+ 2 Ñнв. Ðовогодние каникулы
+ 3 Ñнв. Ðовогодние каникулы
+ 4 Ñнв. Ðовогодние каникулы
+ 5 Ñнв. Ðовогодние каникулы
+ 7 Ñнв. РождеÑтво ХриÑтово
+23 февр. День защитника ОтечеÑтва
+ 8 марта Международный женÑкий день
+ 1 Ð¼Ð°Ñ ÐŸÑ€Ð°Ð·Ð´Ð½Ð¸Ðº ВеÑны и Труда
+ 9 Ð¼Ð°Ñ Ð”ÐµÐ½ÑŒ Победы
+12 Ð¸ÑŽÐ½Ñ Ð”ÐµÐ½ÑŒ РоÑÑии
+ 4 ноÑб. День народного единÑтва
+
+#endif /* !_ru_RU_UTF_8_holiday_ */
diff --git a/usr.bin/calendar/calendars/ru_RU.UTF-8/calendar.military b/usr.bin/calendar/calendars/ru_RU.UTF-8/calendar.military
new file mode 100644
index 000000000000..57ed6f9b7628
--- /dev/null
+++ b/usr.bin/calendar/calendars/ru_RU.UTF-8/calendar.military
@@ -0,0 +1,28 @@
+/*
+ * Дни воинÑкой Ñлавы РоÑÑии
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _ru_RU_UTF_8_military_
+#define _ru_RU_UTF_8_military_
+
+LANG=ru_RU.UTF-8
+
+27 Ñнв. День ÑнÑÑ‚Ð¸Ñ Ð±Ð»Ð¾ÐºÐ°Ð´Ñ‹ города Ленинграда (1944 год)
+ 2 февр. День разгрома ÑоветÑкими войÑками немецко-фашиÑÑ‚Ñких войÑк в СталинградÑкой битве (1943 год)
+23 февр. День победы КраÑной Ðрмии над кайзеровÑкими войÑками Германии (1918 год)
+18 апр. День победы руÑÑких воинов кнÑÐ·Ñ ÐлекÑандра ÐевÑкого над немецкими рыцарÑми на ЧудÑком озере (Ледовое побоище, 1242 год)
+10 Ð¸ÑŽÐ»Ñ Ð”ÐµÐ½ÑŒ победы руÑÑкой армии под командованием Петра Первого над шведами в ПолтавÑком Ñражении (1709 год)
+ 9 авг. День первой в роÑÑийÑкой иÑтории морÑкой победы руÑÑкого флота под командованием Петра Первого над шведами у мыÑа Гангут (1714 год)
+23 авг. День разгрома ÑоветÑкими войÑками немецко-фашиÑÑ‚Ñких войÑк в КурÑкой битве (1943 год)
+ 2 Ñент. День Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ Ð’Ñ‚Ð¾Ñ€Ð¾Ð¹ мировой войны (1945 год)
+ 8 Ñент. День БородинÑкого ÑÑ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ñ€ÑƒÑÑкой армии под командованием Ðœ.И. Кутузова Ñ Ñ„Ñ€Ð°Ð½Ñ†ÑƒÐ·Ñкой армией (1812 год)
+11 Ñент. День победы руÑÑкой ÑÑкадры под командованием Ф.Ф. Ушакова над турецкой ÑÑкадрой у мыÑа Тендра (1790 год)
+21 Ñент. День победы руÑÑких полков во главе Ñ Ð²ÐµÐ»Ð¸ÐºÐ¸Ð¼ кнÑзем Дмитрием ДонÑким над монголо-татарÑкими войÑками в КуликовÑкой битве (1380 год)
+ 4 ноÑб. День оÑÐ²Ð¾Ð±Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ ÐœÐ¾Ñквы Ñилами народного Ð¾Ð¿Ð¾Ð»Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð´ руководÑтвом Кузьмы Минина и Ð”Ð¼Ð¸Ñ‚Ñ€Ð¸Ñ ÐŸÐ¾Ð¶Ð°Ñ€Ñкого от польÑких интервентов (1612 год)
+ 1 дек. День победы руÑÑкой ÑÑкадры под командованием П.С. Ðахимова над турецкой ÑÑкадрой у мыÑа Синоп (1853 год)
+ 5 дек. День начала контрнаÑÑ‚ÑƒÐ¿Ð»ÐµÐ½Ð¸Ñ ÑоветÑких войÑк против немецко-фашиÑÑ‚Ñких войÑк в битве под МоÑквой (1941 год)
+24 дек. День взÑÑ‚Ð¸Ñ Ñ‚ÑƒÑ€ÐµÑ†ÐºÐ¾Ð¹ крепоÑти Измаил руÑÑкими войÑками под командованием Ð.Ð’. Суворова (1790 год)
+
+#endif /* !_ru_RU_UTF_8_military_ */
diff --git a/usr.bin/calendar/calendars/ru_RU.UTF-8/calendar.orthodox b/usr.bin/calendar/calendars/ru_RU.UTF-8/calendar.orthodox
new file mode 100644
index 000000000000..575a36c3e088
--- /dev/null
+++ b/usr.bin/calendar/calendars/ru_RU.UTF-8/calendar.orthodox
@@ -0,0 +1,36 @@
+/*
+ * ПравоÑлавные праздники
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _ru_RU_UTF_8_orthodox_
+#define _ru_RU_UTF_8_orthodox_
+
+LANG=ru_RU.UTF-8
+Paskha=ПаÑха
+
+21 Ñент. РождеÑтво ПреÑвÑтой Богородицы
+27 Ñент. Воздвижение КреÑта ГоÑподнÑ
+14 окт. Покров ПреÑвÑтой Богородицы
+ 4 дек. Введение во храм ПреÑвÑтой Богородицы
+ 7 Ñнв. РождеÑтво ХриÑтово
+14 Ñнв. Обрезание ГоÑподне
+19 Ñнв. БогоÑвление или Крещение ГоÑподне
+15 февр. Сретение ГоÑподне
+ПаÑха-48 Великий ПоÑÑ‚
+ПаÑха-7 Вход ГоÑподень в ИеруÑалим. Вербное ВоÑкреÑенье
+ПаÑха-3 Великий Четверг
+ПаÑха-2 СтраÑÑ‚Ð½Ð°Ñ ÐŸÑтница
+ПаÑха ВоÑкреÑение ХриÑтово
+ПаÑха+39 ВознеÑение
+ПаÑха+49 День СвÑтой Троицы. ПÑтидеÑÑтница
+ 7 апр. Благовещение ПреÑвÑтой Богородицы
+ 7 Ð¸ÑŽÐ»Ñ Ð Ð¾Ð¶Ð´ÐµÑтво Иоанна Предтечи
+12 Ð¸ÑŽÐ»Ñ Ð”ÐµÐ½ÑŒ ÑвÑÑ‚Ñ‹Ñ… первоверховных апоÑтолов Петра и Павла
+19 авг. Преображение ГоÑподне
+28 авг. УÑпение ПреÑвÑтой Богородицы
+11 Ñент. УÑекновение главы Иоанна Предтечи
+
+#endif /* !_ru_RU_UTF_8_orthodox_ */
+
diff --git a/usr.bin/calendar/calendars/ru_RU.UTF-8/calendar.pagan b/usr.bin/calendar/calendars/ru_RU.UTF-8/calendar.pagan
new file mode 100644
index 000000000000..5074f95fcbcf
--- /dev/null
+++ b/usr.bin/calendar/calendars/ru_RU.UTF-8/calendar.pagan
@@ -0,0 +1,42 @@
+/*
+ * ЯзычеÑкие праздники
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _ru_RU_UTF_8_pagan_
+#define _ru_RU_UTF_8_pagan_
+
+LANG=ru_RU.UTF-8
+Paskha=ПаÑха
+
+21 дек.* Зимнее ÑолнцеÑтоÑние
+25 дек. КолÑда (Ñдвинутое зимнее ÑолнцеÑтоÑние)
+ 6 Ñнв. День ÐšÐ°Ñ‰ÐµÑ Ð¸ ВелеÑа
+24 февр. День ВелеÑа
+29 февр. День КащеÑ
+ 1 марта День Марены
+14 марта Ðовый Год, ОвÑень малый
+ПаÑха-55 МаÑленица
+ПаÑха+7 КраÑÐ½Ð°Ñ Ð“Ð¾Ñ€ÐºÐ°
+ПаÑха+16 Радуница
+20 марта* ВеÑеннее равноденÑтвие
+ 7 апр. День Марены (Ñдвинутое веÑеннее равноденÑтвие)
+ 6 Ð¼Ð°Ñ Ð”ÐµÐ½ÑŒ Дажьбога, ОвÑень большой
+22 Ð¼Ð°Ñ Ð¯Ñ€Ð¸Ð»Ð¸Ð½ День
+15 Ð¸ÑŽÐ½Ñ Ð”ÐµÐ½ÑŒ Триглава
+21 июнÑ* Летнее ÑолнцеÑтоÑние
+ 1 Ð¸ÑŽÐ»Ñ Ð ÑƒÑÐ°Ð»ÑŒÐ½Ð°Ñ ÐеделÑ
+ 7 Ð¸ÑŽÐ»Ñ ÐšÑƒÐ¿Ð°Ð»Ð° (Ñдвинутое летнее ÑолнцеÑтоÑние)
+27 Ð¸ÑŽÐ»Ñ ÐžÑ‚Ð±Ð¾Ñ€ жертв Перуну, руÑалии
+ 2 авг. Перунов День
+21 авг. День Стрибога
+28 авг. УÑпение Златогорки
+14 Ñент. День Волха Змеевича
+22 Ñент.* Поворот к зиме (оÑеннее равноденÑтвие)
+10 ноÑб. День Макоши
+21 ноÑб. День Сварога и Семаргла
+ 9 дек. День Дажьбога и Марены
+
+#endif /* !_ru_RU_UTF_8_pagan_ */
+
diff --git a/usr.bin/calendar/calendars/uk_UA.KOI8-U/calendar.all b/usr.bin/calendar/calendars/uk_UA.KOI8-U/calendar.all
new file mode 100644
index 000000000000..1dfa26220475
--- /dev/null
+++ b/usr.bin/calendar/calendars/uk_UA.KOI8-U/calendar.all
@@ -0,0 +1,14 @@
+/*
+ * õËÒÁ§ÎÓØËÉÊ ËÁÌÅÎÄÁÒ
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _uk_UA_KOI8_U_all_
+#define _uk_UA_KOI8_U_all_
+
+#include <uk_UA.KOI8-U/calendar.holiday>
+#include <uk_UA.KOI8-U/calendar.orthodox>
+#include <uk_UA.KOI8-U/calendar.misc>
+
+#endif /* !_uk_UA_KOI8_U_all_ */
diff --git a/usr.bin/calendar/calendars/uk_UA.KOI8-U/calendar.holiday b/usr.bin/calendar/calendars/uk_UA.KOI8-U/calendar.holiday
new file mode 100644
index 000000000000..08559d89bc2d
--- /dev/null
+++ b/usr.bin/calendar/calendars/uk_UA.KOI8-U/calendar.holiday
@@ -0,0 +1,22 @@
+/*
+ * õËÒÁ§ÎÓØ˦ ÄÅÒÖÁ×Φ Ó×ÑÔÁ
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _uk_UA_KOI8_U_holiday_
+#define _uk_UA_KOI8_U_holiday_
+
+LANG=uk_UA.KOI8-U
+Paskha=÷ÅÌÉËÄÅÎØ
+
+ó¦Þ 01 îÏ×ÉÊ ò¦Ë
+ó¦Þ 07 ò¦ÚÄ×Ï èÒÉÓÔÏ×Å
+âÅÒ 08 8 âÅÒÅÚÎÑ - í¦ÖÎÁÒÏÄÎÉÊ ö¦ÎÏÞÉÊ äÅÎØ
+ôÒÁ 01 1 ôÒÁ×ÎÑ - äÅÎØ ðÒÁæ
+ôÒÁ 09 äÅÎØ ðÅÒÅÍÏÇÉ
+÷ÅÌÉËÄÅÎØ+49 ôÒ¦ÊÃÑ
+þÅÒ 28 äÅÎØ ëÏÎÓÔÉÔÕæ§ õËÒÁ§ÎÉ
+óÅÒ 24 äÅÎØ îÅÚÁÌÅÖÎÏÓÔ¦ õËÒÁ§ÎÉ
+
+#endif /* !_uk_UA_KOI8_U_holiday_ */
diff --git a/usr.bin/calendar/calendars/uk_UA.KOI8-U/calendar.misc b/usr.bin/calendar/calendars/uk_UA.KOI8-U/calendar.misc
new file mode 100644
index 000000000000..b49769d104ac
--- /dev/null
+++ b/usr.bin/calendar/calendars/uk_UA.KOI8-U/calendar.misc
@@ -0,0 +1,18 @@
+/*
+ * ¶ÎÛ¦ æËÁצ ÄÁÔÉ
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _uk_UA_KOI8_U_misc_
+#define _uk_UA_KOI8_U_misc_
+
+LANG=uk_UA.KOI8-U
+
+/* ðÏÓÔÁÎÏ×Á ëÁ¦ÎÅÔÕ í¦Î¦ÓÔÒ¦× õËÒÁ§ÎÉ ×¦Ä 13 ÔÒÁ×ÎÑ 1996 Ò. N 509
+ * "ðÒÏ ÐÏÒÑÄÏË ÏÂÞÉÓÌÅÎÎÑ ÞÁÓÕ ÎÁ ÔÅÒÉÔÏÒ¦§ õËÒÁ§ÎÉ"
+ */
+âÅÒ îÄ-1 ðÅÒÅÈ¦Ä ÎÁ ̦ÔÎ¦Ê ÞÁÓ (ÏÓÔÁÎÎÑ ÎÅĦÌÑ ÂÅÒÅÚÎÑ)
+öÏ× îÄ-1 ðÅÒÅÈ¦Ä ÎÁ ÚÉÍÏ×ÉÊ ÞÁÓ (ÏÓÔÁÎÎÑ ÎÅĦÌÑ ÖÏ×ÔÎÑ)
+
+#endif /* !_uk_UA_KOI8_U_misc_ */
diff --git a/usr.bin/calendar/calendars/uk_UA.KOI8-U/calendar.orthodox b/usr.bin/calendar/calendars/uk_UA.KOI8-U/calendar.orthodox
new file mode 100644
index 000000000000..797c8c184f10
--- /dev/null
+++ b/usr.bin/calendar/calendars/uk_UA.KOI8-U/calendar.orthodox
@@ -0,0 +1,35 @@
+/*
+ * ðÒÁ×ÏÓÌÁ×Φ Ó×ÑÔÁ
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _uk_UA_KOI8_U_orthodox_
+#define _uk_UA_KOI8_U_orthodox_
+
+LANG=uk_UA.KOI8-U
+Paskha=÷ÅÌÉËÄÅÎØ
+
+ 7 ó¦Þ ò¦ÚÄ×Ï èÒÉÓÔÏ×Å
+19 ó¦Þ âÏÇÏÑ×ÌÅÎÎÑ ÁÂÏ èÒÅÝÅÎÎÑ çÏÓÐÏÄΤ
+15 ìÀÔ óÔÒ¦ÔÅÎÎÑ çÏÓÐÏÄΤ
+÷ÅÌÉËÄÅÎØ-46 ÷ÅÌÉËÉÊ ð¦ÓÔ
+÷ÅÌÉËÄÅÎØ-7 ÷ÅÒÂÎÁ îÅĦÌÑ
+÷ÅÌÉËÄÅÎØ-3 ÷ÅÌÉËÉÊ þÅÔ×ÅÒ
+÷ÅÌÉËÄÅÎØ-2 óÔÒÁÓÎÁ ð'ÑÔÎÉÃÑ
+÷ÅÌÉËÄÅÎØ ÷ÏÓËÒÅÓ¦ÎÎÑ èÒÉÓÔÏ×Å
+÷ÅÌÉËÄÅÎØ+39 ÷ÏÚÎÅÓ¦ÎÎÑ çÏÓÐÏÄΤ
+÷ÅÌÉËÄÅÎØ+49 äÅÎØ ó×ÑÔϧ ôÒ¦Êæ, ð'ÑÔÉÄÅÓÑÔÎÉÃÑ
+÷ÅÌÉËÄÅÎØ+60 ó×ÑÔÏ Ô¦ÌÁ èÒÉÓÔÏ×ÏÇÏ
+ 7 ëצ âÌÁÇÏצÝÅÎÎÑ ðÒÅÓ×ÑÔϧ ä¦×É íÁÒ¦§
+ 7 ìÉÐ ò¦ÚÄ×Ï Ó×ÑÔÏÇÏ ¶×ÁÎÁ èÒÅÓÔÉÔÅÌÑ
+12 ìÉÐ ó×ÑÔÉÈ ÷ÅÒÈÏ×ÎÉÈ ÁÐÏÓÔÏÌ¦× ðÅÔÒÁ ¦ ðÁ×ÌÁ
+19 óÅÒ ðÒÅÏÂÒÁÖÅÎÎÑ çÏÓÐÏÄΤ
+28 óÅÒ õÓÐÅÎÎÑ ðÒÅÓ×ÑÔϧ âÏÇÏÒÏÄÉæ
+11 ÷ÅÒ õÓ¦ËÎÏ×ÅÎÎÑ ÞÅÓÎϧ ÇÏÌÏ×É Ó×ÑÔÏÇÏ ¶×ÁÎÁ èÒÅÓÔÉÔÅÌÑ
+21 ÷ÅÒ ò¦ÚÄ×Ï ðÒÅÓ×ÑÔϧ âÏÇÏÒÏÄÉæ
+27 ÷ÅÒ ÷ÏÚÄ×ÉÖÅÎÎÑ þÅÓÎÏÇÏ èÒÅÓÔÁ
+14 öÏ× ðÏËÒÏ×Á ðÒÅÓ×ÑÔϧ âÏÇÏÒÏÄÉæ
+ 4 çÒÕ ÷×ÅÄÅÎÎÑ ÄÏ ÈÒÁÍÕ ðÒÅÓ×ÑÔϧ âÏÇÏÒÏÄÉæ
+
+#endif /* !_uk_UA_KOI8_U_orthodox_ */
diff --git a/usr.bin/calendar/dates.c b/usr.bin/calendar/dates.c
new file mode 100644
index 000000000000..e30e86485a60
--- /dev/null
+++ b/usr.bin/calendar/dates.c
@@ -0,0 +1,453 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ *
+ * Copyright (c) 1992-2009 Edwin Groothuis <edwin@FreeBSD.org>.
+ * 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.
+ *
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <err.h>
+#include <time.h>
+
+#include "calendar.h"
+
+struct cal_year {
+ int year; /* 19xx, 20xx, 21xx */
+ int easter; /* Julian day */
+ int paskha; /* Julian day */
+ int cny; /* Julian day */
+ int firstdayofweek; /* 0 .. 6 */
+ struct cal_month *months;
+ struct cal_year *nextyear;
+};
+
+struct cal_month {
+ int month; /* 01 .. 12 */
+ int firstdayjulian; /* 000 .. 366 */
+ int firstdayofweek; /* 0 .. 6 */
+ struct cal_year *year; /* points back */
+ struct cal_day *days;
+ struct cal_month *nextmonth;
+};
+
+struct cal_day {
+ int dayofmonth; /* 01 .. 31 */
+ int julianday; /* 000 .. 366 */
+ int dayofweek; /* 0 .. 6 */
+ struct cal_day *nextday;
+ struct cal_month *month; /* points back */
+ struct cal_year *year; /* points back */
+ struct event *events;
+};
+
+int debug_remember = 0;
+static struct cal_year *hyear = NULL;
+
+/* 1-based month, 0-based days, cumulative */
+int cumdaytab[][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},
+};
+/* 1-based month, individual */
+static int *monthdays;
+int monthdaytab[][14] = {
+ {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 30},
+ {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 30},
+};
+
+static struct cal_day * find_day(int yy, int mm, int dd);
+
+static void
+createdate(int y, int m, int d)
+{
+ struct cal_year *py, *pyp;
+ struct cal_month *pm, *pmp;
+ struct cal_day *pd, *pdp;
+ int *cumday;
+
+ pyp = NULL;
+ py = hyear;
+ while (py != NULL) {
+ if (py->year == y + 1900)
+ break;
+ pyp = py;
+ py = py->nextyear;
+ }
+
+ if (py == NULL) {
+ struct tm td;
+ time_t t;
+ py = (struct cal_year *)calloc(1, sizeof(struct cal_year));
+ py->year = y + 1900;
+ py->easter = easter(y);
+ py->paskha = paskha(y);
+
+ td = tm0;
+ td.tm_year = y;
+ td.tm_mday = 1;
+ t = mktime(&td);
+ localtime_r(&t, &td);
+ py->firstdayofweek = td.tm_wday;
+
+ if (pyp != NULL)
+ pyp->nextyear = py;
+ }
+ if (pyp == NULL) {
+ /* The very very very first one */
+ hyear = py;
+ }
+
+ pmp = NULL;
+ pm = py->months;
+ while (pm != NULL) {
+ if (pm->month == m)
+ break;
+ pmp = pm;
+ pm = pm->nextmonth;
+ }
+
+ if (pm == NULL) {
+ pm = (struct cal_month *)calloc(1, sizeof(struct cal_month));
+ pm->year = py;
+ pm->month = m;
+ cumday = cumdaytab[isleap(y)];
+ pm->firstdayjulian = cumday[m] + 2;
+ pm->firstdayofweek =
+ (py->firstdayofweek + pm->firstdayjulian -1) % 7;
+ if (pmp != NULL)
+ pmp->nextmonth = pm;
+ }
+ if (pmp == NULL)
+ py->months = pm;
+
+ pdp = NULL;
+ pd = pm->days;
+ while (pd != NULL) {
+ pdp = pd;
+ pd = pd->nextday;
+ }
+
+ if (pd == NULL) { /* Always true */
+ pd = (struct cal_day *)calloc(1, sizeof(struct cal_day));
+ pd->month = pm;
+ pd->year = py;
+ pd->dayofmonth = d;
+ pd->julianday = pm->firstdayjulian + d - 1;
+ pd->dayofweek = (pm->firstdayofweek + d - 1) % 7;
+ if (pdp != NULL)
+ pdp->nextday = pd;
+ }
+ if (pdp == NULL)
+ pm->days = pd;
+}
+
+void
+generatedates(struct tm *tp1, struct tm *tp2)
+{
+ int y1, m1, d1;
+ int y2, m2, d2;
+ int y, m, d;
+
+ y1 = tp1->tm_year;
+ m1 = tp1->tm_mon + 1;
+ d1 = tp1->tm_mday;
+ y2 = tp2->tm_year;
+ m2 = tp2->tm_mon + 1;
+ d2 = tp2->tm_mday;
+
+ if (y1 == y2) {
+ if (m1 == m2) {
+ /* Same year, same month. Easy! */
+ for (d = d1; d <= d2; d++)
+ createdate(y1, m1, d);
+ return;
+ }
+ /*
+ * Same year, different month.
+ * - Take the leftover days from m1
+ * - Take all days from <m1 .. m2>
+ * - Take the first days from m2
+ */
+ monthdays = monthdaytab[isleap(y1)];
+ for (d = d1; d <= monthdays[m1]; d++)
+ createdate(y1, m1, d);
+ for (m = m1 + 1; m < m2; m++)
+ for (d = 1; d <= monthdays[m]; d++)
+ createdate(y1, m, d);
+ for (d = 1; d <= d2; d++)
+ createdate(y1, m2, d);
+ return;
+ }
+ /*
+ * Different year, different month.
+ * - Take the leftover days from y1-m1
+ * - Take all days from y1-<m1 .. 12]
+ * - Take all days from <y1 .. y2>
+ * - Take all days from y2-[1 .. m2>
+ * - Take the first days of y2-m2
+ */
+ monthdays = monthdaytab[isleap(y1)];
+ for (d = d1; d <= monthdays[m1]; d++)
+ createdate(y1, m1, d);
+ for (m = m1 + 1; m <= 12; m++)
+ for (d = 1; d <= monthdays[m]; d++)
+ createdate(y1, m, d);
+ for (y = y1 + 1; y < y2; y++) {
+ monthdays = monthdaytab[isleap(y)];
+ for (m = 1; m <= 12; m++)
+ for (d = 1; d <= monthdays[m]; d++)
+ createdate(y, m, d);
+ }
+ monthdays = monthdaytab[isleap(y2)];
+ for (m = 1; m < m2; m++)
+ for (d = 1; d <= monthdays[m]; d++)
+ createdate(y2, m, d);
+ for (d = 1; d <= d2; d++)
+ createdate(y2, m2, d);
+}
+
+void
+dumpdates(void)
+{
+ struct cal_year *y;
+ struct cal_month *m;
+ struct cal_day *d;
+
+ y = hyear;
+ while (y != NULL) {
+ printf("%-5d (wday:%d)\n", y->year, y->firstdayofweek);
+ m = y->months;
+ while (m != NULL) {
+ printf("-- %-5d (julian:%d, dow:%d)\n", m->month,
+ m->firstdayjulian, m->firstdayofweek);
+ d = m->days;
+ while (d != NULL) {
+ printf(" -- %-5d (julian:%d, dow:%d)\n",
+ d->dayofmonth, d->julianday, d->dayofweek);
+ d = d->nextday;
+ }
+ m = m->nextmonth;
+ }
+ y = y->nextyear;
+ }
+}
+
+int
+remember_ymd(int yy, int mm, int dd)
+{
+ struct cal_year *y;
+ struct cal_month *m;
+ struct cal_day *d;
+
+ if (debug_remember)
+ printf("remember_ymd: %d - %d - %d\n", yy, mm, dd);
+
+ y = hyear;
+ while (y != NULL) {
+ if (y->year != yy) {
+ y = y->nextyear;
+ continue;
+ }
+ m = y->months;
+ while (m != NULL) {
+ if (m->month != mm) {
+ m = m->nextmonth;
+ continue;
+ }
+ d = m->days;
+ while (d != NULL) {
+ if (d->dayofmonth == dd)
+ return (1);
+ d = d->nextday;
+ continue;
+ }
+ return (0);
+ }
+ return (0);
+ }
+ return (0);
+}
+
+int
+remember_yd(int yy, int dd, int *rm, int *rd)
+{
+ struct cal_year *y;
+ struct cal_month *m;
+ struct cal_day *d;
+
+ if (debug_remember)
+ printf("remember_yd: %d - %d\n", yy, dd);
+
+ y = hyear;
+ while (y != NULL) {
+ if (y->year != yy) {
+ y = y->nextyear;
+ continue;
+ }
+ m = y->months;
+ while (m != NULL) {
+ d = m->days;
+ while (d != NULL) {
+ if (d->julianday == dd) {
+ *rm = m->month;
+ *rd = d->dayofmonth;
+ return (1);
+ }
+ d = d->nextday;
+ }
+ m = m->nextmonth;
+ }
+ return (0);
+ }
+ return (0);
+}
+
+int
+first_dayofweek_of_year(int yy)
+{
+ struct cal_year *y;
+
+ y = hyear;
+ while (y != NULL) {
+ if (y->year == yy)
+ return (y->firstdayofweek);
+ y = y->nextyear;
+ }
+
+ /* Should not happen */
+ return (-1);
+}
+
+int
+first_dayofweek_of_month(int yy, int mm)
+{
+ struct cal_year *y;
+ struct cal_month *m;
+
+ y = hyear;
+ while (y != NULL) {
+ if (y->year != yy) {
+ y = y->nextyear;
+ continue;
+ }
+ m = y->months;
+ while (m != NULL) {
+ if (m->month == mm)
+ return (m->firstdayofweek);
+ m = m->nextmonth;
+ }
+ /* No data for this month */
+ return (-1);
+ }
+
+ /* No data for this year. Error? */
+ return (-1);
+}
+
+int
+walkthrough_dates(struct event **e)
+{
+ static struct cal_year *y = NULL;
+ static struct cal_month *m = NULL;
+ static struct cal_day *d = NULL;
+
+ if (y == NULL) {
+ y = hyear;
+ m = y->months;
+ d = m->days;
+ *e = d->events;
+ return (1);
+ }
+ if (d->nextday != NULL) {
+ d = d->nextday;
+ *e = d->events;
+ return (1);
+ }
+ if (m->nextmonth != NULL) {
+ m = m->nextmonth;
+ d = m->days;
+ *e = d->events;
+ return (1);
+ }
+ if (y->nextyear != NULL) {
+ y = y->nextyear;
+ m = y->months;
+ d = m->days;
+ *e = d->events;
+ return (1);
+ }
+
+ return (0);
+}
+
+static struct cal_day *
+find_day(int yy, int mm, int dd)
+{
+ struct cal_year *y;
+ struct cal_month *m;
+ struct cal_day *d;
+
+ if (debug_remember)
+ printf("remember_ymd: %d - %d - %d\n", yy, mm, dd);
+
+ y = hyear;
+ while (y != NULL) {
+ if (y->year != yy) {
+ y = y->nextyear;
+ continue;
+ }
+ m = y->months;
+ while (m != NULL) {
+ if (m->month != mm) {
+ m = m->nextmonth;
+ continue;
+ }
+ d = m->days;
+ while (d != NULL) {
+ if (d->dayofmonth == dd)
+ return (d);
+ d = d->nextday;
+ continue;
+ }
+ return (NULL);
+ }
+ return (NULL);
+ }
+ return (NULL);
+}
+
+void
+addtodate(struct event *e, int year, int month, int day)
+{
+ struct cal_day *d;
+
+ d = find_day(year, month, day);
+ e->next = d->events;
+ d->events = e;
+}
diff --git a/usr.bin/calendar/day.c b/usr.bin/calendar/day.c
new file mode 100644
index 000000000000..84562ccd9b30
--- /dev/null
+++ b/usr.bin/calendar/day.c
@@ -0,0 +1,109 @@
+/*-
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ * 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. 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.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <err.h>
+#include <locale.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+
+#include "calendar.h"
+
+static time_t time1, time2;
+const struct tm tm0;
+char dayname[100];
+int year1, year2;
+
+
+void
+settimes(time_t now, int before, int after, int friday, struct tm *tp1, struct tm *tp2)
+{
+ struct tm tp;
+
+ localtime_r(&now, &tp);
+
+ /* Friday displays Monday's events */
+ if (after == 0 && before == 0 && friday != -1)
+ after = tp.tm_wday == friday ? 3 : 1;
+
+ time1 = now - SECSPERDAY * before;
+ localtime_r(&time1, tp1);
+ year1 = 1900 + tp1->tm_year;
+ time2 = now + SECSPERDAY * after;
+ localtime_r(&time2, tp2);
+ year2 = 1900 + tp2->tm_year;
+
+ strftime(dayname, sizeof(dayname) - 1, "%A, %d %B %Y", tp1);
+
+ setnnames();
+}
+
+/* convert Day[/Month][/Year] into unix time (since 1970)
+ * Day: two digits, Month: two digits, Year: digits
+ */
+time_t
+Mktime(char *dp)
+{
+ time_t t;
+ int d, m, y;
+ struct tm tm, tp;
+
+ (void)time(&t);
+ localtime_r(&t, &tp);
+
+ tm = tm0;
+ tm.tm_mday = tp.tm_mday;
+ tm.tm_mon = tp.tm_mon;
+ tm.tm_year = tp.tm_year;
+
+ switch (sscanf(dp, "%d.%d.%d", &d, &m, &y)) {
+ case 3:
+ if (y > 1900)
+ y -= 1900;
+ tm.tm_year = y;
+ /* FALLTHROUGH */
+ case 2:
+ tm.tm_mon = m - 1;
+ /* FALLTHROUGH */
+ case 1:
+ tm.tm_mday = d;
+ }
+
+#ifdef DEBUG
+ fprintf(stderr, "Mktime: %d %d %s\n",
+ (int)mktime(&tm), (int)t, asctime(&tm));
+#endif
+ return (mktime(&tm));
+}
diff --git a/usr.bin/calendar/events.c b/usr.bin/calendar/events.c
new file mode 100644
index 000000000000..84f8f2b41a8b
--- /dev/null
+++ b/usr.bin/calendar/events.c
@@ -0,0 +1,229 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ *
+ * Copyright (c) 1992-2009 Edwin Groothuis <edwin@FreeBSD.org>.
+ * 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.
+ *
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/time.h>
+#include <err.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#ifdef WITH_ICONV
+#include <iconv.h>
+#include <errno.h>
+#include <langinfo.h>
+
+static iconv_t conv = (iconv_t)-1;
+static char *currentEncoding = NULL;
+
+#endif
+
+#include "pathnames.h"
+#include "calendar.h"
+
+#ifdef WITH_ICONV
+void
+set_new_encoding(void)
+{
+ const char *newenc;
+
+ newenc = nl_langinfo(CODESET);
+ if (currentEncoding == NULL) {
+ currentEncoding = strdup(newenc);
+ if (currentEncoding == NULL)
+ errx(1, "set_new_encoding: cannot allocate memory");
+ return;
+ }
+ if (strcmp(currentEncoding, newenc) == 0)
+ return;
+ free(currentEncoding);
+ currentEncoding = strdup(newenc);
+ if (currentEncoding == NULL)
+ errx(1, "set_new_encoding: cannot allocate memory");
+ if (conv != (iconv_t) -1) {
+ iconv_close(conv);
+ conv = (iconv_t) -1;
+ }
+}
+#endif
+
+static char *
+convert(char *input)
+{
+ char *output;
+#ifdef WITH_ICONV
+ size_t inleft, outleft, converted = 0;
+ char *outbuf, *tmp;
+ char *inbuf;
+ size_t outlen;
+
+ if (currentEncoding == NULL) {
+ output = strdup(input);
+ if (output == NULL)
+ errx(1, "convert: cannot allocate memory");
+ return (output);
+ }
+ if (conv == (iconv_t)-1) {
+ conv = iconv_open(outputEncoding, currentEncoding);
+ if (conv == (iconv_t)-1) {
+ if (errno == EINVAL)
+ errx(1, "Conversion is not supported");
+ else
+ err(1, "Initialization failure");
+ }
+ }
+
+ inleft = strlen(input);
+ inbuf = input;
+
+ outlen = inleft;
+ if ((output = malloc(outlen + 1)) == NULL)
+ errx(1, "convert: cannot allocate memory");
+
+ for (;;) {
+ errno = 0;
+ outbuf = output + converted;
+ outleft = outlen - converted;
+
+ converted = iconv(conv, (char **) &inbuf, &inleft, &outbuf, &outleft);
+ if (converted != (size_t) -1 || errno == EINVAL) {
+ /* finished or invalid multibyte, so truncate and ignore */
+ break;
+ }
+
+ if (errno != E2BIG) {
+ free(output);
+ err(1, "convert");
+ }
+
+ converted = outbuf - output;
+ outlen += inleft * 2;
+
+ if ((tmp = realloc(output, outlen + 1)) == NULL) {
+ free(output);
+ errx(1, "convert: cannot allocate memory");
+ }
+
+ output = tmp;
+ outbuf = output + converted;
+ }
+
+ /* flush the iconv conversion */
+ iconv(conv, NULL, NULL, &outbuf, &outleft);
+
+ /* null terminate the string */
+ *outbuf = '\0';
+#else
+ output = strdup(input);
+ if (output == NULL)
+ errx(1, "convert: cannot allocate memory");
+#endif
+
+ return (output);
+}
+
+struct event *
+event_add(int year, int month, int day, char *date, int var, char *txt,
+ char *extra)
+{
+ struct event *e;
+
+ /*
+ * Creating a new event:
+ * - Create a new event
+ * - Copy the machine readable day and month
+ * - Copy the human readable and language specific date
+ * - Copy the text of the event
+ */
+ e = (struct event *)calloc(1, sizeof(struct event));
+ if (e == NULL)
+ errx(1, "event_add: cannot allocate memory");
+ e->month = month;
+ e->day = day;
+ e->var = var;
+ e->date = convert(date);
+ if (e->date == NULL)
+ errx(1, "event_add: cannot allocate memory");
+ e->text = convert(txt);
+ if (e->text == NULL)
+ errx(1, "event_add: cannot allocate memory");
+ e->extra = NULL;
+ if (extra != NULL && extra[0] != '\0')
+ e->extra = convert(extra);
+ addtodate(e, year, month, day);
+ return (e);
+}
+
+void
+event_continue(struct event *e, char *txt)
+{
+ char *oldtext, *text;
+
+ text = convert(txt);
+ oldtext = e->text;
+ if (oldtext == NULL)
+ errx(1, "event_continue: cannot allocate memory");
+
+ asprintf(&e->text, "%s\n%s", oldtext, text);
+ if (e->text == NULL)
+ errx(1, "event_continue: cannot allocate memory");
+ free(oldtext);
+ free(text);
+
+ return;
+}
+
+void
+event_print_all(FILE *fp)
+{
+ struct event *e;
+
+ while (walkthrough_dates(&e) != 0) {
+#ifdef DEBUG
+ fprintf(stderr, "event_print_allmonth: %d, day: %d\n",
+ month, day);
+#endif
+
+ /*
+ * Go through all events and print the text of the matching
+ * dates
+ */
+ while (e != NULL) {
+ (void)fprintf(fp, "%s%c%s%s%s%s\n", e->date,
+ e->var ? '*' : ' ', e->text,
+ e->extra != NULL ? " (" : "",
+ e->extra != NULL ? e->extra : "",
+ e->extra != NULL ? ")" : ""
+ );
+
+ e = e->next;
+ }
+ }
+}
diff --git a/usr.bin/calendar/io.c b/usr.bin/calendar/io.c
new file mode 100644
index 000000000000..f363289878b9
--- /dev/null
+++ b/usr.bin/calendar/io.c
@@ -0,0 +1,502 @@
+/*-
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ * 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. 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
+
+#if 0
+#ifndef lint
+static char sccsid[] = "@(#)calendar.c 8.3 (Berkeley) 3/25/94";
+#endif
+#endif
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/stat.h>
+#include <sys/wait.h>
+#include <ctype.h>
+#include <err.h>
+#include <errno.h>
+#include <langinfo.h>
+#include <locale.h>
+#include <pwd.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stringlist.h>
+#include <time.h>
+#include <unistd.h>
+
+#include "pathnames.h"
+#include "calendar.h"
+
+enum {
+ T_OK = 0,
+ T_ERR,
+ T_PROCESS,
+};
+
+const char *calendarFile = "calendar"; /* default calendar file */
+static const char *calendarHomes[] = {".calendar", _PATH_INCLUDE}; /* HOME */
+static const char *calendarNoMail = "nomail";/* don't sent mail if file exist */
+
+static char path[MAXPATHLEN];
+
+struct fixs neaster, npaskha, ncny, nfullmoon, nnewmoon;
+struct fixs nmarequinox, nsepequinox, njunsolstice, ndecsolstice;
+
+static int cal_parse(FILE *in, FILE *out);
+
+static StringList *definitions = NULL;
+static struct event *events[MAXCOUNT];
+static char *extradata[MAXCOUNT];
+
+static void
+trimlr(char **buf)
+{
+ char *walk = *buf;
+ char *last;
+
+ while (isspace(*walk))
+ walk++;
+ if (*walk != '\0') {
+ last = walk + strlen(walk) - 1;
+ while (last > walk && isspace(*last))
+ last--;
+ *(last+1) = 0;
+ }
+
+ *buf = walk;
+}
+
+static FILE *
+cal_fopen(const char *file)
+{
+ FILE *fp;
+ char *home = getenv("HOME");
+ unsigned int i;
+
+ if (home == NULL || *home == '\0') {
+ warnx("Cannot get home directory");
+ return (NULL);
+ }
+
+ if (chdir(home) != 0) {
+ warnx("Cannot enter home directory");
+ return (NULL);
+ }
+
+ for (i = 0; i < nitems(calendarHomes); i++) {
+ if (chdir(calendarHomes[i]) != 0)
+ continue;
+
+ if ((fp = fopen(file, "r")) != NULL)
+ return (fp);
+ }
+
+ warnx("can't open calendar file \"%s\"", file);
+
+ return (NULL);
+}
+
+static int
+token(char *line, FILE *out, bool *skip)
+{
+ char *walk, c, a;
+
+ if (strncmp(line, "endif", 5) == 0) {
+ *skip = false;
+ return (T_OK);
+ }
+
+ if (*skip)
+ return (T_OK);
+
+ if (strncmp(line, "include", 7) == 0) {
+ walk = line + 7;
+
+ trimlr(&walk);
+
+ if (*walk == '\0') {
+ warnx("Expecting arguments after #include");
+ return (T_ERR);
+ }
+
+ if (*walk != '<' && *walk != '\"') {
+ warnx("Excecting '<' or '\"' after #include");
+ return (T_ERR);
+ }
+
+ a = *walk;
+ walk++;
+ c = walk[strlen(walk) - 1];
+
+ switch(c) {
+ case '>':
+ if (a != '<') {
+ warnx("Unterminated include expecting '\"'");
+ return (T_ERR);
+ }
+ break;
+ case '\"':
+ if (a != '\"') {
+ warnx("Unterminated include expecting '>'");
+ return (T_ERR);
+ }
+ break;
+ default:
+ warnx("Unterminated include expecting '%c'",
+ a == '<' ? '>' : '\"' );
+ return (T_ERR);
+ }
+ walk[strlen(walk) - 1] = '\0';
+
+ if (cal_parse(cal_fopen(walk), out))
+ return (T_ERR);
+
+ return (T_OK);
+ }
+
+ if (strncmp(line, "define", 6) == 0) {
+ if (definitions == NULL)
+ definitions = sl_init();
+ walk = line + 6;
+ trimlr(&walk);
+
+ if (*walk == '\0') {
+ warnx("Expecting arguments after #define");
+ return (T_ERR);
+ }
+
+ sl_add(definitions, strdup(walk));
+ return (T_OK);
+ }
+
+ if (strncmp(line, "ifndef", 6) == 0) {
+ walk = line + 6;
+ trimlr(&walk);
+
+ if (*walk == '\0') {
+ warnx("Expecting arguments after #ifndef");
+ return (T_ERR);
+ }
+
+ if (definitions != NULL && sl_find(definitions, walk) != NULL)
+ *skip = true;
+
+ return (T_OK);
+ }
+
+ return (T_PROCESS);
+
+}
+
+#define REPLACE(string, slen, struct_) \
+ if (strncasecmp(buf, (string), (slen)) == 0 && buf[(slen)]) { \
+ if (struct_.name != NULL) \
+ free(struct_.name); \
+ if ((struct_.name = strdup(buf + (slen))) == NULL) \
+ errx(1, "cannot allocate memory"); \
+ struct_.len = strlen(buf + (slen)); \
+ continue; \
+ }
+static int
+cal_parse(FILE *in, FILE *out)
+{
+ char *line = NULL;
+ char *buf;
+ size_t linecap = 0;
+ ssize_t linelen;
+ ssize_t l;
+ static int d_first = -1;
+ static int count = 0;
+ int i;
+ int month[MAXCOUNT];
+ int day[MAXCOUNT];
+ int year[MAXCOUNT];
+ bool skip = false;
+ char dbuf[80];
+ char *pp, p;
+ struct tm tm;
+ int flags;
+
+ /* Unused */
+ tm.tm_sec = 0;
+ tm.tm_min = 0;
+ tm.tm_hour = 0;
+ tm.tm_wday = 0;
+
+ if (in == NULL)
+ return (1);
+
+ while ((linelen = getline(&line, &linecap, in)) > 0) {
+ if (*line == '#') {
+ switch (token(line+1, out, &skip)) {
+ case T_ERR:
+ free(line);
+ return (1);
+ case T_OK:
+ continue;
+ case T_PROCESS:
+ break;
+ default:
+ break;
+ }
+ }
+
+ if (skip)
+ continue;
+
+ buf = line;
+ for (l = linelen;
+ l > 0 && isspace((unsigned char)buf[l - 1]);
+ l--)
+ ;
+ buf[l] = '\0';
+ if (buf[0] == '\0')
+ continue;
+
+ /*
+ * Setting LANG in user's calendar was an old workaround
+ * for 'calendar -a' being run with C locale to properly
+ * print user's calendars in their native languages.
+ * Now that 'calendar -a' does fork with setusercontext(),
+ * and does not run iconv(), this variable has little use.
+ */
+ if (strncmp(buf, "LANG=", 5) == 0) {
+ (void)setlocale(LC_ALL, buf + 5);
+ d_first = (*nl_langinfo(D_MD_ORDER) == 'd');
+#ifdef WITH_ICONV
+ if (!doall)
+ set_new_encoding();
+#endif
+ setnnames();
+ continue;
+ }
+ /* Parse special definitions: Easter, Paskha etc */
+ REPLACE("Easter=", 7, neaster);
+ REPLACE("Paskha=", 7, npaskha);
+ REPLACE("ChineseNewYear=", 15, ncny);
+ REPLACE("NewMoon=", 8, nnewmoon);
+ REPLACE("FullMoon=", 9, nfullmoon);
+ REPLACE("MarEquinox=", 11, nmarequinox);
+ REPLACE("SepEquinox=", 11, nsepequinox);
+ REPLACE("JunSolstice=", 12, njunsolstice);
+ REPLACE("DecSolstice=", 12, ndecsolstice);
+ if (strncmp(buf, "SEQUENCE=", 9) == 0) {
+ setnsequences(buf + 9);
+ continue;
+ }
+
+ /*
+ * If the line starts with a tab, the data has to be
+ * added to the previous line
+ */
+ if (buf[0] == '\t') {
+ for (i = 0; i < count; i++)
+ event_continue(events[i], buf);
+ continue;
+ }
+
+ /* Get rid of leading spaces (non-standard) */
+ while (isspace((unsigned char)buf[0]))
+ memcpy(buf, buf + 1, strlen(buf));
+
+ /* No tab in the line, then not a valid line */
+ if ((pp = strchr(buf, '\t')) == NULL)
+ continue;
+
+ /* Trim spaces in front of the tab */
+ while (isspace((unsigned char)pp[-1]))
+ pp--;
+
+ p = *pp;
+ *pp = '\0';
+ if ((count = parsedaymonth(buf, year, month, day, &flags,
+ extradata)) == 0)
+ continue;
+ *pp = p;
+ if (count < 0) {
+ /* Show error status based on return value */
+ if (debug)
+ fprintf(stderr, "Ignored: %s\n", buf);
+ if (count == -1)
+ continue;
+ count = -count + 1;
+ }
+
+ /* Find the last tab */
+ while (pp[1] == '\t')
+ pp++;
+
+ if (d_first < 0)
+ d_first = (*nl_langinfo(D_MD_ORDER) == 'd');
+
+ for (i = 0; i < count; i++) {
+ tm.tm_mon = month[i] - 1;
+ tm.tm_mday = day[i];
+ tm.tm_year = year[i] - 1900;
+ (void)strftime(dbuf, sizeof(dbuf),
+ d_first ? "%e %b" : "%b %e", &tm);
+ if (debug)
+ fprintf(stderr, "got %s\n", pp);
+ events[i] = event_add(year[i], month[i], day[i], dbuf,
+ ((flags &= F_VARIABLE) != 0) ? 1 : 0, pp,
+ extradata[i]);
+ }
+ }
+
+ free(line);
+ fclose(in);
+
+ return (0);
+}
+
+void
+cal(void)
+{
+ FILE *fpin;
+ FILE *fpout;
+ int i;
+
+ for (i = 0; i < MAXCOUNT; i++)
+ extradata[i] = (char *)calloc(1, 20);
+
+
+ if ((fpin = opencalin()) == NULL)
+ return;
+
+ if ((fpout = opencalout()) == NULL) {
+ fclose(fpin);
+ return;
+ }
+
+ if (cal_parse(fpin, fpout))
+ return;
+
+ event_print_all(fpout);
+ closecal(fpout);
+}
+
+FILE *
+opencalin(void)
+{
+ struct stat sbuf;
+ FILE *fpin;
+
+ /* open up calendar file */
+ if ((fpin = fopen(calendarFile, "r")) == NULL) {
+ if (doall) {
+ if (chdir(calendarHomes[0]) != 0)
+ return (NULL);
+ if (stat(calendarNoMail, &sbuf) == 0)
+ return (NULL);
+ if ((fpin = fopen(calendarFile, "r")) == NULL)
+ return (NULL);
+ } else {
+ fpin = cal_fopen(calendarFile);
+ }
+ }
+ return (fpin);
+}
+
+FILE *
+opencalout(void)
+{
+ int fd;
+
+ /* 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 */
+ snprintf(path, sizeof(path), "%s/_calXXXXXX", _PATH_TMP);
+ if ((fd = mkstemp(path)) < 0)
+ return (NULL);
+ return (fdopen(fd, "w+"));
+}
+
+void
+closecal(FILE *fp)
+{
+ struct stat sbuf;
+ int nread, pdes[2], status;
+ char buf[1024];
+
+ if (!doall)
+ return;
+
+ rewind(fp);
+ if (fstat(fileno(fp), &sbuf) || !sbuf.st_size)
+ goto done;
+ if (pipe(pdes) < 0)
+ goto done;
+ switch (fork()) {
+ 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]);
+ execl(_PATH_SENDMAIL, "sendmail", "-i", "-t", "-F",
+ "\"Reminder Service\"", (char *)NULL);
+ warn(_PATH_SENDMAIL);
+ _exit(1);
+ }
+ /* parent -- write to pipe input */
+ (void)close(pdes[0]);
+
+ write(pdes[1], "From: \"Reminder Service\" <", 26);
+ write(pdes[1], pw->pw_name, strlen(pw->pw_name));
+ write(pdes[1], ">\nTo: <", 7);
+ write(pdes[1], pw->pw_name, strlen(pw->pw_name));
+ write(pdes[1], ">\nSubject: ", 11);
+ write(pdes[1], dayname, strlen(dayname));
+ write(pdes[1], "'s Calendar\nPrecedence: bulk\n\n", 30);
+
+ 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);
+}
diff --git a/usr.bin/calendar/locale.c b/usr.bin/calendar/locale.c
new file mode 100644
index 000000000000..34f0f98ca87b
--- /dev/null
+++ b/usr.bin/calendar/locale.c
@@ -0,0 +1,168 @@
+/*-
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ * 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. 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.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <ctype.h>
+#include <err.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+
+#include "calendar.h"
+
+const char *fdays[] = {
+ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday",
+ "Saturday", NULL,
+};
+
+const char *days[] = {
+ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", NULL,
+};
+
+const char *fmonths[] = {
+ "January", "February", "March", "April", "May", "June", "Juli",
+ "August", "September", "October", "November", "December", NULL,
+};
+
+const char *months[] = {
+ "Jan", "Feb", "Mar", "Apr", "May", "Jun",
+ "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", NULL,
+};
+
+const char *sequences[] = {
+ "First", "Second", "Third", "Fourth", "Fifth", "Last"
+};
+
+struct fixs fndays[8]; /* full national days names */
+struct fixs ndays[8]; /* short national days names */
+struct fixs fnmonths[13]; /* full national months names */
+struct fixs nmonths[13]; /* short national month names */
+struct fixs nsequences[10]; /* national sequence names */
+
+
+void
+setnnames(void)
+{
+ char buf[80];
+ int i, l;
+ struct tm tm;
+
+ memset(&tm, 0, sizeof(struct tm));
+ for (i = 0; i < 7; i++) {
+ tm.tm_wday = i;
+ strftime(buf, sizeof(buf), "%a", &tm);
+ for (l = strlen(buf);
+ l > 0 && isspace((unsigned char)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((unsigned char)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);
+ }
+
+ memset(&tm, 0, sizeof(struct tm));
+ for (i = 0; i < 12; i++) {
+ tm.tm_mon = i;
+ strftime(buf, sizeof(buf), "%b", &tm);
+ for (l = strlen(buf);
+ l > 0 && isspace((unsigned char)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((unsigned char)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
+setnsequences(char *seq)
+{
+ int i;
+ char *p;
+
+ p = seq;
+ for (i = 0; i < 5; i++) {
+ nsequences[i].name = p;
+ if ((p = strchr(p, ' ')) == NULL) {
+ /* Oh oh there is something wrong. Erase! Erase! */
+ for (i = 0; i < 5; i++) {
+ nsequences[i].name = NULL;
+ nsequences[i].len = 0;
+ }
+ return;
+ }
+ *p = '\0';
+ p++;
+ }
+ nsequences[i].name = p;
+
+ for (i = 0; i < 5; i++) {
+ nsequences[i].name = strdup(nsequences[i].name);
+ nsequences[i].len = nsequences[i + 1].name - nsequences[i].name;
+ }
+ nsequences[i].name = strdup(nsequences[i].name);
+ nsequences[i].len = strlen(nsequences[i].name);
+
+ return;
+}
diff --git a/usr.bin/calendar/ostern.c b/usr.bin/calendar/ostern.c
new file mode 100644
index 000000000000..53a5a894d480
--- /dev/null
+++ b/usr.bin/calendar/ostern.c
@@ -0,0 +1,69 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ *
+ * 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.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "calendar.h"
+
+/* return year day for Easter */
+
+/*
+ * This code is based on the Calendar FAQ's code for how to calculate
+ * easter is. This is the Gregorian calendar version. They refer to
+ * the Algorithm of Oudin in the "Explanatory Supplement to the
+ * Astronomical Almanac".
+ */
+
+int
+easter(int year) /* 0 ... abcd, NOT since 1900 */
+{
+ int G, /* Golden number - 1 */
+ C, /* Century */
+ H, /* 23 - epact % 30 */
+ I, /* days from 21 March to Paschal full moon */
+ J, /* weekday of full moon */
+ L; /* days from 21 March to Sunday on of before full moon */
+
+ G = year % 19;
+ C = year / 100;
+ H = (C - C / 4 - (8 * C + 13) / 25 + 19 * G + 15) % 30;
+ I = H - (H / 28) * (1 - (H / 28) * (29 / (H + 1)) * ((21 - G) / 11));
+ J = (year + year / 4 + I + 2 - C + C / 4) % 7;
+
+ L = I - J;
+
+ if (isleap(year))
+ return 31 + 29 + 21 + L + 7;
+ else
+ return 31 + 28 + 21 + L + 7;
+}
diff --git a/usr.bin/calendar/parsedata.c b/usr.bin/calendar/parsedata.c
new file mode 100644
index 000000000000..32f0cb8f6f6a
--- /dev/null
+++ b/usr.bin/calendar/parsedata.c
@@ -0,0 +1,1118 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ *
+ * Copyright (c) 1992-2009 Edwin Groothuis <edwin@FreeBSD.org>.
+ * 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.
+ *
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <ctype.h>
+#include <math.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <err.h>
+
+#include "calendar.h"
+
+static char *showflags(int flags);
+static int isonlydigits(char *s, int nostar);
+static const char *getmonthname(int i);
+static int checkmonth(char *s, size_t *len, size_t *offset, const char **month);
+static const char *getdayofweekname(int i);
+static int checkdayofweek(char *s, size_t *len, size_t *offset, const char **dow);
+static int indextooffset(char *s);
+static int parseoffset(char *s);
+static char *floattoday(int year, double f);
+static char *floattotime(double f);
+static int wdayom (int day, int offset, int month, int year);
+
+/*
+ * Expected styles:
+ *
+ * Date ::= Month . ' ' . DayOfMonth |
+ * Month . ' ' . DayOfWeek . ModifierIndex |
+ * Month . '/' . DayOfMonth |
+ * Month . '/' . DayOfWeek . ModifierIndex |
+ * DayOfMonth . ' ' . Month |
+ * DayOfMonth . '/' . Month |
+ * DayOfWeek . ModifierIndex . ' ' .Month |
+ * DayOfWeek . ModifierIndex . '/' .Month |
+ * DayOfWeek . ModifierIndex |
+ * SpecialDay . ModifierOffset
+ *
+ * Month ::= MonthName | MonthNumber | '*'
+ * MonthNumber ::= '0' ... '9' | '00' ... '09' | '10' ... '12'
+ * MonthName ::= MonthNameShort | MonthNameLong
+ * MonthNameLong ::= 'January' ... 'December'
+ * MonthNameShort ::= 'Jan' ... 'Dec' | 'Jan.' ... 'Dec.'
+ *
+ * DayOfWeek ::= DayOfWeekShort | DayOfWeekLong
+ * DayOfWeekShort ::= 'Mon' .. 'Sun'
+ * DayOfWeekLong ::= 'Monday' .. 'Sunday'
+ * DayOfMonth ::= '0' ... '9' | '00' ... '09' | '10' ... '29' |
+ * '30' ... '31' | '*'
+ *
+ * ModifierOffset ::= '' | '+' . ModifierNumber | '-' . ModifierNumber
+ * ModifierNumber ::= '0' ... '9' | '00' ... '99' | '000' ... '299' |
+ * '300' ... '359' | '360' ... '365'
+ * ModifierIndex ::= 'Second' | 'Third' | 'Fourth' | 'Fifth' |
+ * 'First' | 'Last'
+ *
+ * SpecialDay ::= 'Easter' | 'Paskha' | 'ChineseNewYear'
+ *
+ */
+static int
+determinestyle(char *date, int *flags,
+ char *month, int *imonth, char *dayofmonth, int *idayofmonth,
+ char *dayofweek, int *idayofweek, char *modifieroffset,
+ char *modifierindex, char *specialday, char *year, int *iyear)
+{
+ char *p, *p1, *p2, *py;
+ const char *dow, *pmonth;
+ char pold;
+ size_t len, offset;
+
+ *flags = F_NONE;
+ *month = '\0';
+ *imonth = 0;
+ *year = '\0';
+ *iyear = 0;
+ *dayofmonth = '\0';
+ *idayofmonth = 0;
+ *dayofweek = '\0';
+ *idayofweek = 0;
+ *modifieroffset = '\0';
+ *modifierindex = '\0';
+ *specialday = '\0';
+
+#define CHECKSPECIAL(s1, s2, lens2, type) \
+ if (s2 != NULL && strncmp(s1, s2, lens2) == 0) { \
+ *flags |= F_SPECIALDAY; \
+ *flags |= type; \
+ *flags |= F_VARIABLE; \
+ if (strlen(s1) == lens2) { \
+ strcpy(specialday, s1); \
+ return (1); \
+ } \
+ strncpy(specialday, s1, lens2); \
+ specialday[lens2] = '\0'; \
+ strcpy(modifieroffset, s1 + lens2); \
+ *flags |= F_MODIFIEROFFSET; \
+ return (1); \
+ }
+
+ if ((p = strchr(date, ' ')) == NULL) {
+ if ((p = strchr(date, '/')) == NULL) {
+ CHECKSPECIAL(date, STRING_CNY, strlen(STRING_CNY),
+ F_CNY);
+ CHECKSPECIAL(date, ncny.name, ncny.len, F_CNY);
+ CHECKSPECIAL(date, STRING_NEWMOON,
+ strlen(STRING_NEWMOON), F_NEWMOON);
+ CHECKSPECIAL(date, nnewmoon.name, nnewmoon.len,
+ F_NEWMOON);
+ CHECKSPECIAL(date, STRING_FULLMOON,
+ strlen(STRING_FULLMOON), F_FULLMOON);
+ CHECKSPECIAL(date, nfullmoon.name, nfullmoon.len,
+ F_FULLMOON);
+ CHECKSPECIAL(date, STRING_PASKHA,
+ strlen(STRING_PASKHA), F_PASKHA);
+ CHECKSPECIAL(date, npaskha.name, npaskha.len, F_PASKHA);
+ CHECKSPECIAL(date, STRING_EASTER,
+ strlen(STRING_EASTER), F_EASTER);
+ CHECKSPECIAL(date, neaster.name, neaster.len, F_EASTER);
+ CHECKSPECIAL(date, STRING_MAREQUINOX,
+ strlen(STRING_MAREQUINOX), F_MAREQUINOX);
+ CHECKSPECIAL(date, nmarequinox.name, nmarequinox.len,
+ F_SEPEQUINOX);
+ CHECKSPECIAL(date, STRING_SEPEQUINOX,
+ strlen(STRING_SEPEQUINOX), F_SEPEQUINOX);
+ CHECKSPECIAL(date, nsepequinox.name, nsepequinox.len,
+ F_SEPEQUINOX);
+ CHECKSPECIAL(date, STRING_JUNSOLSTICE,
+ strlen(STRING_JUNSOLSTICE), F_JUNSOLSTICE);
+ CHECKSPECIAL(date, njunsolstice.name, njunsolstice.len,
+ F_JUNSOLSTICE);
+ CHECKSPECIAL(date, STRING_DECSOLSTICE,
+ strlen(STRING_DECSOLSTICE), F_DECSOLSTICE);
+ CHECKSPECIAL(date, ndecsolstice.name, ndecsolstice.len,
+ F_DECSOLSTICE);
+ if (checkdayofweek(date, &len, &offset, &dow) != 0) {
+ *flags |= F_DAYOFWEEK;
+ *flags |= F_VARIABLE;
+ *idayofweek = offset;
+ if (strlen(date) == len) {
+ strcpy(dayofweek, date);
+ return (1);
+ }
+ strncpy(dayofweek, date, len);
+ dayofweek[len] = '\0';
+ strcpy(modifierindex, date + len);
+ *flags |= F_MODIFIERINDEX;
+ return (1);
+ }
+ if (isonlydigits(date, 1)) {
+ /* Assume month number only */
+ *flags |= F_MONTH;
+ *imonth = (int)strtol(date, (char **)NULL, 10);
+ strcpy(month, getmonthname(*imonth));
+ return(1);
+ }
+ return (0);
+ }
+ }
+
+ /*
+ * After this, leave by goto-ing to "allfine" or "fail" to restore the
+ * original data in `date'.
+ */
+ pold = *p;
+ *p = 0;
+ p1 = date;
+ p2 = p + 1;
+ /* Now p2 points to the next field and p1 to the first field */
+
+ if ((py = strchr(p2, '/')) != NULL) {
+ /* We have a year in the string. Now this is getting tricky */
+ strcpy(year, p1);
+ *iyear = (int)strtol(year, NULL, 10);
+ p1 = p2;
+ p2 = py + 1;
+ *py = 0;
+ *flags |= F_YEAR;
+ }
+
+ /* Check if there is a month-string in the date */
+ if ((checkmonth(p1, &len, &offset, &pmonth) != 0)
+ || (checkmonth(p2, &len, &offset, &pmonth) != 0 && (p2 = p1))) {
+ /* p2 is the non-month part */
+ *flags |= F_MONTH;
+ *imonth = offset;
+
+ strcpy(month, getmonthname(offset));
+ if (isonlydigits(p2, 1)) {
+ strcpy(dayofmonth, p2);
+ *idayofmonth = (int)strtol(p2, (char **)NULL, 10);
+ *flags |= F_DAYOFMONTH;
+ goto allfine;
+ }
+ if (strcmp(p2, "*") == 0) {
+ *flags |= F_ALLDAY;
+ goto allfine;
+ }
+
+ if (checkdayofweek(p2, &len, &offset, &dow) != 0) {
+ *flags |= F_DAYOFWEEK;
+ *flags |= F_VARIABLE;
+ *idayofweek = offset;
+ strcpy(dayofweek, getdayofweekname(offset));
+ if (strlen(p2) == len)
+ goto allfine;
+ strcpy(modifierindex, p2 + len);
+ *flags |= F_MODIFIERINDEX;
+ goto allfine;
+ }
+ goto fail;
+ }
+
+ /* Check if there is an every-day or every-month in the string */
+ if ((strcmp(p1, "*") == 0 && isonlydigits(p2, 1))
+ || (strcmp(p2, "*") == 0 && isonlydigits(p1, 1) && (p2 = p1))) {
+ int d;
+
+ *flags |= F_ALLMONTH;
+ *flags |= F_DAYOFMONTH;
+ d = (int)strtol(p2, (char **)NULL, 10);
+ *idayofmonth = d;
+ sprintf(dayofmonth, "%d", d);
+ goto allfine;
+ }
+
+ /* Month as a number, then a weekday */
+ if (isonlydigits(p1, 1)
+ && checkdayofweek(p2, &len, &offset, &dow) != 0) {
+ int d;
+
+ *flags |= F_MONTH;
+ *flags |= F_DAYOFWEEK;
+ *flags |= F_VARIABLE;
+
+ *idayofweek = offset;
+ d = (int)strtol(p1, (char **)NULL, 10);
+ *imonth = d;
+ strcpy(month, getmonthname(d));
+
+ strcpy(dayofweek, getdayofweekname(offset));
+ if (strlen(p2) == len)
+ goto allfine;
+ strcpy(modifierindex, p2 + len);
+ *flags |= F_MODIFIERINDEX;
+ goto allfine;
+ }
+
+ /* If both the month and date are specified as numbers */
+ if (isonlydigits(p1, 1) && isonlydigits(p2, 0)) {
+ /* Now who wants to be this ambiguous? :-( */
+ int m, d;
+
+ if (strchr(p2, '*') != NULL)
+ *flags |= F_VARIABLE;
+
+ m = (int)strtol(p1, (char **)NULL, 10);
+ d = (int)strtol(p2, (char **)NULL, 10);
+
+ *flags |= F_MONTH;
+ *flags |= F_DAYOFMONTH;
+
+ if (m > 12) {
+ *imonth = d;
+ *idayofmonth = m;
+ strcpy(month, getmonthname(d));
+ sprintf(dayofmonth, "%d", m);
+ } else {
+ *imonth = m;
+ *idayofmonth = d;
+ strcpy(month, getmonthname(m));
+ sprintf(dayofmonth, "%d", d);
+ }
+ goto allfine;
+ }
+
+ /* FALLTHROUGH */
+fail:
+ *p = pold;
+ return (0);
+allfine:
+ *p = pold;
+ return (1);
+
+}
+
+void
+remember(int *rememberindex, int *y, int *m, int *d, char **ed, int yy, int mm,
+ int dd, char *extra);
+void
+remember(int *rememberindex, int *y, int *m, int *d, char **ed, int yy, int mm,
+ int dd, char *extra)
+{
+ static int warned = 0;
+
+ if (*rememberindex >= MAXCOUNT - 1) {
+ if (warned == 0)
+ warnx("Index > %d, ignored", MAXCOUNT);
+ warned++;
+ return;
+ }
+ y[*rememberindex] = yy;
+ m[*rememberindex] = mm;
+ d[*rememberindex] = dd;
+ if (extra != NULL)
+ strcpy(ed[*rememberindex], extra);
+ else
+ ed[*rememberindex][0] = '\0';
+ *rememberindex += 1;
+}
+
+static void
+debug_determinestyle(int dateonly, char *date, int flags, char *month,
+ int imonth, char *dayofmonth, int idayofmonth, char *dayofweek,
+ int idayofweek, char *modifieroffset, char *modifierindex, char *specialday,
+ char *year, int iyear)
+{
+
+ if (dateonly != 0) {
+ printf("-------\ndate: |%s|\n", date);
+ if (dateonly == 1)
+ return;
+ }
+ printf("flags: %x - %s\n", flags, showflags(flags));
+ if (modifieroffset[0] != '\0')
+ printf("modifieroffset: |%s|\n", modifieroffset);
+ if (modifierindex[0] != '\0')
+ printf("modifierindex: |%s|\n", modifierindex);
+ if (year[0] != '\0')
+ printf("year: |%s| (%d)\n", year, iyear);
+ if (month[0] != '\0')
+ printf("month: |%s| (%d)\n", month, imonth);
+ if (dayofmonth[0] != '\0')
+ printf("dayofmonth: |%s| (%d)\n", dayofmonth, idayofmonth);
+ if (dayofweek[0] != '\0')
+ printf("dayofweek: |%s| (%d)\n", dayofweek, idayofweek);
+ if (specialday[0] != '\0')
+ printf("specialday: |%s|\n", specialday);
+}
+
+static struct yearinfo {
+ int year;
+ int ieaster, ipaskha, firstcnyday;
+ double ffullmoon[MAXMOONS], fnewmoon[MAXMOONS];
+ double ffullmooncny[MAXMOONS], fnewmooncny[MAXMOONS];
+ int ichinesemonths[MAXMOONS];
+ double equinoxdays[2], solsticedays[2];
+ int *monthdays;
+ struct yearinfo *next;
+} *years, *yearinfo;
+
+/*
+ * Calculate dates with offset from weekdays, like Thurs-3, Wed+2, etc.
+ * day is the day of the week,
+ * offset the ordinal number of the weekday in the month.
+ */
+static int
+wdayom (int day, int offset, int month, int year)
+{
+/* Weekday of first day in month */
+ int wday1; /* first day of month */
+/* Weekday of last day in month */
+ int wdayn;
+ int d;
+
+ wday1 = first_dayofweek_of_month(year, month);
+ if (wday1 < 0) /* not set */
+ return (wday1);
+ /*
+ * Date of zeroth or first of our weekday in month, depending on the
+ * relationship with the first of the month. The range is -6:6.
+ */
+ d = (day - wday1 + 1) % 7;
+ /*
+ * Which way are we counting? Offset 0 is invalid, abs (offset) > 5 is
+ * meaningless, but that's OK. Offset 5 may or may not be meaningless,
+ * so there's no point in complaining for complaining's sake.
+ */
+ if (offset < 0) { /* back from end of month */
+ /* FIXME */
+ wdayn = d;
+ while (wdayn <= yearinfo->monthdays[month])
+ wdayn += 7;
+ d = offset * 7 + wdayn;
+ } else if (offset > 0){
+ if (d > 0)
+ d += offset * 7 - 7;
+ else
+ d += offset * 7;
+ } else
+ warnx ("Invalid offset 0");
+ return (d);
+}
+
+/*
+ * 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
+parsedaymonth(char *date, int *yearp, int *monthp, int *dayp, int *flags,
+ char **edp)
+{
+ char month[100], dayofmonth[100], dayofweek[100], modifieroffset[100];
+ char syear[100];
+ char modifierindex[100], specialday[100];
+ int idayofweek = -1, imonth = -1, idayofmonth = -1, iyear = -1;
+ int year, remindex;
+ int d, m, dow, rm, rd, offset;
+ char *ed;
+ int retvalsign = 1;
+
+ /*
+ * CONVENTION
+ *
+ * Month: 1-12
+ * Monthname: Jan .. Dec
+ * Day: 1-31
+ * Weekday: Mon .. Sun
+ *
+ */
+
+ *flags = 0;
+
+ if (debug)
+ debug_determinestyle(1, date, *flags, month, imonth,
+ dayofmonth, idayofmonth, dayofweek, idayofweek,
+ modifieroffset, modifierindex, specialday, syear, iyear);
+ if (determinestyle(date, flags, month, &imonth, dayofmonth,
+ &idayofmonth, dayofweek, &idayofweek, modifieroffset,
+ modifierindex, specialday, syear, &iyear) == 0) {
+ if (debug)
+ printf("Failed!\n");
+ return (0);
+ }
+
+ if (debug)
+ debug_determinestyle(0, date, *flags, month, imonth,
+ dayofmonth, idayofmonth, dayofweek, idayofweek,
+ modifieroffset, modifierindex, specialday, syear, iyear);
+
+ remindex = 0;
+ for (year = year1; year <= year2; year++) {
+
+ int lflags = *flags;
+ /* If the year is specified, only do it if it is this year! */
+ if ((lflags & F_YEAR) != 0)
+ if (iyear != year)
+ continue;
+ lflags &= ~F_YEAR;
+
+ /* Get important dates for this year */
+ yearinfo = years;
+ while (yearinfo != NULL) {
+ if (yearinfo->year == year)
+ break;
+ yearinfo = yearinfo -> next;
+ }
+ if (yearinfo == NULL) {
+ yearinfo = (struct yearinfo *)calloc(1,
+ sizeof(struct yearinfo));
+ if (yearinfo == NULL)
+ errx(1, "Unable to allocate more years");
+ yearinfo->year = year;
+ yearinfo->next = years;
+ years = yearinfo;
+
+ yearinfo->monthdays = monthdaytab[isleap(year)];
+ yearinfo->ieaster = easter(year);
+ yearinfo->ipaskha = paskha(year);
+ fpom(year, UTCOffset, yearinfo->ffullmoon,
+ yearinfo->fnewmoon);
+ fpom(year, UTCOFFSET_CNY, yearinfo->ffullmooncny,
+ yearinfo->fnewmooncny);
+ fequinoxsolstice(year, UTCOffset,
+ yearinfo->equinoxdays, yearinfo->solsticedays);
+
+ /*
+ * CNY: Match day with sun longitude at 330` with new
+ * moon
+ */
+ yearinfo->firstcnyday = calculatesunlongitude30(year,
+ UTCOFFSET_CNY, yearinfo->ichinesemonths);
+ for (m = 0; yearinfo->fnewmooncny[m] >= 0; m++) {
+ if (yearinfo->fnewmooncny[m] >
+ yearinfo->firstcnyday) {
+ yearinfo->firstcnyday =
+ floor(yearinfo->fnewmooncny[m - 1]);
+ break;
+ }
+ }
+ }
+
+ /* Same day every year */
+ if (lflags == (F_MONTH | F_DAYOFMONTH)) {
+ if (!remember_ymd(year, imonth, idayofmonth))
+ continue;
+ remember(&remindex, yearp, monthp, dayp, edp,
+ year, imonth, idayofmonth, NULL);
+ continue;
+ }
+
+ /* XXX Same day every year, but variable */
+ if (lflags == (F_MONTH | F_DAYOFMONTH | F_VARIABLE)) {
+ if (!remember_ymd(year, imonth, idayofmonth))
+ continue;
+ remember(&remindex, yearp, monthp, dayp, edp,
+ year, imonth, idayofmonth, NULL);
+ continue;
+ }
+
+ /* Same day every month */
+ if (lflags == (F_ALLMONTH | F_DAYOFMONTH)) {
+ for (m = 1; m <= 12; m++) {
+ if (!remember_ymd(year, m, idayofmonth))
+ continue;
+ remember(&remindex, yearp, monthp, dayp, edp,
+ year, m, idayofmonth, NULL);
+ }
+ continue;
+ }
+
+ /* Every day of a month */
+ if (lflags == (F_ALLDAY | F_MONTH)) {
+ for (d = 1; d <= yearinfo->monthdays[imonth]; d++) {
+ if (!remember_ymd(year, imonth, d))
+ continue;
+ remember(&remindex, yearp, monthp, dayp, edp,
+ year, imonth, d, NULL);
+ }
+ continue;
+ }
+
+ /* One day of every month */
+ if (lflags == (F_ALLMONTH | F_DAYOFWEEK)) {
+ for (m = 1; m <= 12; m++) {
+ if (!remember_ymd(year, m, idayofmonth))
+ continue;
+ remember(&remindex, yearp, monthp, dayp, edp,
+ year, m, idayofmonth, NULL);
+ }
+ continue;
+ }
+
+ /* Every dayofweek of the year */
+ if (lflags == (F_DAYOFWEEK | F_VARIABLE)) {
+ dow = first_dayofweek_of_year(year);
+ d = (idayofweek - dow + 8) % 7;
+ while (d <= 366) {
+ if (remember_yd(year, d, &rm, &rd))
+ remember(&remindex,
+ yearp, monthp, dayp, edp,
+ year, rm, rd, NULL);
+ d += 7;
+ }
+ continue;
+ }
+
+ /*
+ * Every so-manied dayofweek of every month of the year:
+ * Thu-3
+ */
+ if (lflags == (F_DAYOFWEEK | F_MODIFIERINDEX | F_VARIABLE)) {
+ offset = indextooffset(modifierindex);
+
+ for (m = 0; m <= 12; m++) {
+ d = wdayom (idayofweek, offset, m, year);
+ if (remember_ymd(year, m, d)) {
+ remember(&remindex,
+ yearp, monthp, dayp, edp,
+ year, m, d, NULL);
+ continue;
+ }
+ }
+ continue;
+ }
+
+ /*
+ * A certain dayofweek of a month
+ * Jan/Thu-3
+ */
+ if (lflags ==
+ (F_MONTH | F_DAYOFWEEK | F_MODIFIERINDEX | F_VARIABLE)) {
+ offset = indextooffset(modifierindex);
+ dow = first_dayofweek_of_month(year, imonth);
+ d = (idayofweek - dow + 8) % 7;
+
+ if (offset > 0) {
+ while (d <= yearinfo->monthdays[imonth]) {
+ if (--offset == 0
+ && remember_ymd(year, imonth, d)) {
+ remember(&remindex,
+ yearp, monthp, dayp, edp,
+ year, imonth, d, NULL);
+ continue;
+ }
+ d += 7;
+ }
+ continue;
+ }
+ if (offset < 0) {
+ while (d <= yearinfo->monthdays[imonth])
+ d += 7;
+ while (offset != 0) {
+ offset++;
+ d -= 7;
+ }
+ if (remember_ymd(year, imonth, d))
+ remember(&remindex,
+ yearp, monthp, dayp, edp,
+ year, imonth, d, NULL);
+ continue;
+ }
+ continue;
+ }
+
+ /* Every dayofweek of the month */
+ if (lflags == (F_DAYOFWEEK | F_MONTH | F_VARIABLE)) {
+ dow = first_dayofweek_of_month(year, imonth);
+ d = (idayofweek - dow + 8) % 7;
+ while (d <= yearinfo->monthdays[imonth]) {
+ if (remember_ymd(year, imonth, d))
+ remember(&remindex,
+ yearp, monthp, dayp, edp,
+ year, imonth, d, NULL);
+ d += 7;
+ }
+ continue;
+ }
+
+ /* Easter */
+ if ((lflags & ~F_MODIFIEROFFSET) ==
+ (F_SPECIALDAY | F_VARIABLE | F_EASTER)) {
+ offset = 0;
+ if ((lflags & F_MODIFIEROFFSET) != 0)
+ offset = parseoffset(modifieroffset);
+ if (remember_yd(year, yearinfo->ieaster + offset,
+ &rm, &rd))
+ remember(&remindex, yearp, monthp, dayp, edp,
+ year, rm, rd, NULL);
+ continue;
+ }
+
+ /* Paskha */
+ if ((lflags & ~F_MODIFIEROFFSET) ==
+ (F_SPECIALDAY | F_VARIABLE | F_PASKHA)) {
+ offset = 0;
+ if ((lflags & F_MODIFIEROFFSET) != 0)
+ offset = parseoffset(modifieroffset);
+ if (remember_yd(year, yearinfo->ipaskha + offset,
+ &rm, &rd))
+ remember(&remindex, yearp, monthp, dayp, edp,
+ year, rm, rd, NULL);
+ continue;
+ }
+
+ /* Chinese New Year */
+ if ((lflags & ~F_MODIFIEROFFSET) ==
+ (F_SPECIALDAY | F_VARIABLE | F_CNY)) {
+ offset = 0;
+ if ((lflags & F_MODIFIEROFFSET) != 0)
+ offset = parseoffset(modifieroffset);
+ if (remember_yd(year, yearinfo->firstcnyday + offset,
+ &rm, &rd))
+ remember(&remindex, yearp, monthp, dayp, edp,
+ year, rm, rd, NULL);
+ continue;
+ }
+
+ /* FullMoon */
+ if ((lflags & ~F_MODIFIEROFFSET) ==
+ (F_SPECIALDAY | F_VARIABLE | F_FULLMOON)) {
+ int i;
+
+ offset = 0;
+ if ((lflags & F_MODIFIEROFFSET) != 0)
+ offset = parseoffset(modifieroffset);
+ for (i = 0; yearinfo->ffullmoon[i] > 0; i++) {
+ if (remember_yd(year,
+ floor(yearinfo->ffullmoon[i]) + offset,
+ &rm, &rd)) {
+ ed = floattotime(
+ yearinfo->ffullmoon[i]);
+ remember(&remindex,
+ yearp, monthp, dayp, edp,
+ year, rm, rd, ed);
+ }
+ }
+ continue;
+ }
+
+ /* NewMoon */
+ if ((lflags & ~F_MODIFIEROFFSET) ==
+ (F_SPECIALDAY | F_VARIABLE | F_NEWMOON)) {
+ int i;
+
+ offset = 0;
+ if ((lflags & F_MODIFIEROFFSET) != 0)
+ offset = parseoffset(modifieroffset);
+ for (i = 0; yearinfo->ffullmoon[i] > 0; i++) {
+ if (remember_yd(year,
+ floor(yearinfo->fnewmoon[i]) + offset,
+ &rm, &rd)) {
+ ed = floattotime(yearinfo->fnewmoon[i]);
+ remember(&remindex,
+ yearp, monthp, dayp, edp,
+ year, rm, rd, ed);
+ }
+ }
+ continue;
+ }
+
+ /* (Mar|Sep)Equinox */
+ if ((lflags & ~F_MODIFIEROFFSET) ==
+ (F_SPECIALDAY | F_VARIABLE | F_MAREQUINOX)) {
+ offset = 0;
+ if ((lflags & F_MODIFIEROFFSET) != 0)
+ offset = parseoffset(modifieroffset);
+ if (remember_yd(year, yearinfo->equinoxdays[0] + offset,
+ &rm, &rd)) {
+ ed = floattotime(yearinfo->equinoxdays[0]);
+ remember(&remindex, yearp, monthp, dayp, edp,
+ year, rm, rd, ed);
+ }
+ continue;
+ }
+ if ((lflags & ~F_MODIFIEROFFSET) ==
+ (F_SPECIALDAY | F_VARIABLE | F_SEPEQUINOX)) {
+ offset = 0;
+ if ((lflags & F_MODIFIEROFFSET) != 0)
+ offset = parseoffset(modifieroffset);
+ if (remember_yd(year, yearinfo->equinoxdays[1] + offset,
+ &rm, &rd)) {
+ ed = floattotime(yearinfo->equinoxdays[1]);
+ remember(&remindex, yearp, monthp, dayp, edp,
+ year, rm, rd, ed);
+ }
+ continue;
+ }
+
+ /* (Jun|Dec)Solstice */
+ if ((lflags & ~F_MODIFIEROFFSET) ==
+ (F_SPECIALDAY | F_VARIABLE | F_JUNSOLSTICE)) {
+ offset = 0;
+ if ((lflags & F_MODIFIEROFFSET) != 0)
+ offset = parseoffset(modifieroffset);
+ if (remember_yd(year,
+ yearinfo->solsticedays[0] + offset, &rm, &rd)) {
+ ed = floattotime(yearinfo->solsticedays[0]);
+ remember(&remindex, yearp, monthp, dayp, edp,
+ year, rm, rd, ed);
+ }
+ continue;
+ }
+ if ((lflags & ~F_MODIFIEROFFSET) ==
+ (F_SPECIALDAY | F_VARIABLE | F_DECSOLSTICE)) {
+ offset = 0;
+ if ((lflags & F_MODIFIEROFFSET) != 0)
+ offset = parseoffset(modifieroffset);
+ if (remember_yd(year,
+ yearinfo->solsticedays[1] + offset, &rm, &rd)) {
+ ed = floattotime(yearinfo->solsticedays[1]);
+ remember(&remindex, yearp, monthp, dayp, edp,
+ year, rm, rd, ed);
+ }
+ continue;
+ }
+
+ if (debug) {
+ printf("Unprocessed:\n");
+ debug_determinestyle(2, date, lflags, month, imonth,
+ dayofmonth, idayofmonth, dayofweek, idayofweek,
+ modifieroffset, modifierindex, specialday, syear,
+ iyear);
+ }
+ retvalsign = -1;
+ }
+
+ if (retvalsign == -1)
+ return (-remindex - 1);
+ else
+ return (remindex);
+}
+
+static char *
+showflags(int flags)
+{
+ static char s[1000];
+ s[0] = '\0';
+
+ if ((flags & F_YEAR) != 0)
+ strcat(s, "year ");
+ if ((flags & F_MONTH) != 0)
+ strcat(s, "month ");
+ if ((flags & F_DAYOFWEEK) != 0)
+ strcat(s, "dayofweek ");
+ if ((flags & F_DAYOFMONTH) != 0)
+ strcat(s, "dayofmonth ");
+ if ((flags & F_MODIFIERINDEX) != 0)
+ strcat(s, "modifierindex ");
+ if ((flags & F_MODIFIEROFFSET) != 0)
+ strcat(s, "modifieroffset ");
+ if ((flags & F_SPECIALDAY) != 0)
+ strcat(s, "specialday ");
+ if ((flags & F_ALLMONTH) != 0)
+ strcat(s, "allmonth ");
+ if ((flags & F_ALLDAY) != 0)
+ strcat(s, "allday ");
+ if ((flags & F_VARIABLE) != 0)
+ strcat(s, "variable ");
+ if ((flags & F_CNY) != 0)
+ strcat(s, "chinesenewyear ");
+ if ((flags & F_PASKHA) != 0)
+ strcat(s, "paskha ");
+ if ((flags & F_EASTER) != 0)
+ strcat(s, "easter ");
+ if ((flags & F_FULLMOON) != 0)
+ strcat(s, "fullmoon ");
+ if ((flags & F_NEWMOON) != 0)
+ strcat(s, "newmoon ");
+ if ((flags & F_MAREQUINOX) != 0)
+ strcat(s, "marequinox ");
+ if ((flags & F_SEPEQUINOX) != 0)
+ strcat(s, "sepequinox ");
+ if ((flags & F_JUNSOLSTICE) != 0)
+ strcat(s, "junsolstice ");
+ if ((flags & F_DECSOLSTICE) != 0)
+ strcat(s, "decsolstice ");
+
+ return s;
+}
+
+static const char *
+getmonthname(int i)
+{
+ if (i <= 0 || i > 12)
+ return ("");
+ if (nmonths[i - 1].len != 0 && nmonths[i - 1].name != NULL)
+ return (nmonths[i - 1].name);
+ return (months[i - 1]);
+}
+
+static int
+checkmonth(char *s, size_t *len, size_t *offset, const char **month)
+{
+ struct fixs *n;
+ int i;
+
+ for (i = 0; fnmonths[i].name != NULL; i++) {
+ n = fnmonths + i;
+ if (strncasecmp(s, n->name, n->len) == 0) {
+ *len = n->len;
+ *month = n->name;
+ *offset = i + 1;
+ return (1);
+ }
+ }
+ for (i = 0; nmonths[i].name != NULL; i++) {
+ n = nmonths + i;
+ if (strncasecmp(s, n->name, n->len) == 0) {
+ *len = n->len;
+ *month = n->name;
+ *offset = i + 1;
+ return (1);
+ }
+ }
+ for (i = 0; fmonths[i] != NULL; i++) {
+ *len = strlen(fmonths[i]);
+ if (strncasecmp(s, fmonths[i], *len) == 0) {
+ *month = fmonths[i];
+ *offset = i + 1;
+ return (1);
+ }
+ }
+ for (i = 0; months[i] != NULL; i++) {
+ if (strncasecmp(s, months[i], 3) == 0) {
+ *len = 3;
+ *month = months[i];
+ *offset = i + 1;
+ return (1);
+ }
+ }
+ return (0);
+}
+
+static const char *
+getdayofweekname(int i)
+{
+ if (ndays[i].len != 0 && ndays[i].name != NULL)
+ return (ndays[i].name);
+ return (days[i]);
+}
+
+static int
+checkdayofweek(char *s, size_t *len, size_t *offset, const char **dow)
+{
+ struct fixs *n;
+ int i;
+
+ for (i = 0; fndays[i].name != NULL; i++) {
+ n = fndays + i;
+ if (strncasecmp(s, n->name, n->len) == 0) {
+ *len = n->len;
+ *dow = n->name;
+ *offset = i;
+ return (1);
+ }
+ }
+ for (i = 0; ndays[i].name != NULL; i++) {
+ n = ndays + i;
+ if (strncasecmp(s, n->name, n->len) == 0) {
+ *len = n->len;
+ *dow = n->name;
+ *offset = i;
+ return (1);
+ }
+ }
+ for (i = 0; fdays[i] != NULL; i++) {
+ *len = strlen(fdays[i]);
+ if (strncasecmp(s, fdays[i], *len) == 0) {
+ *dow = fdays[i];
+ *offset = i;
+ return (1);
+ }
+ }
+ for (i = 0; days[i] != NULL; i++) {
+ if (strncasecmp(s, days[i], 3) == 0) {
+ *len = 3;
+ *dow = days[i];
+ *offset = i;
+ return (1);
+ }
+ }
+ return (0);
+}
+
+static int
+isonlydigits(char *s, int nostar)
+{
+ int i;
+ for (i = 0; s[i] != '\0'; i++) {
+ if (nostar == 0 && s[i] == '*' && s[i + 1] == '\0')
+ return 1;
+ if (!isdigit((unsigned char)s[i]))
+ return (0);
+ }
+ return (1);
+}
+
+static int
+indextooffset(char *s)
+{
+ int i;
+ struct fixs *n;
+ char *es;
+
+ if (s[0] == '+' || s[0] == '-') {
+ i = strtol (s, &es, 10);
+ if (*es != '\0') /* trailing junk */
+ errx (1, "Invalid specifier format: %s\n", s);
+ return (i);
+ }
+
+ for (i = 0; i < 6; i++) {
+ if (strcasecmp(s, sequences[i]) == 0) {
+ if (i == 5)
+ return (-1);
+ return (i + 1);
+ }
+ }
+ for (i = 0; i < 6; i++) {
+ n = nsequences + i;
+ if (n->len == 0)
+ continue;
+ if (strncasecmp(s, n->name, n->len) == 0) {
+ if (i == 5)
+ return (-1);
+ return (i + 1);
+ }
+ }
+ return (0);
+}
+
+static int
+parseoffset(char *s)
+{
+ return strtol(s, NULL, 10);
+}
+
+static char *
+floattotime(double f)
+{
+ static char buf[100];
+ int hh, mm, ss, i;
+
+ f -= floor(f);
+ i = f * SECSPERDAY;
+
+ hh = i / SECSPERHOUR;
+ i %= SECSPERHOUR;
+ mm = i / SECSPERMINUTE;
+ i %= SECSPERMINUTE;
+ ss = i;
+
+ sprintf(buf, "%02d:%02d:%02d", hh, mm, ss);
+ return (buf);
+}
+
+static char *
+floattoday(int year, double f)
+{
+ static char buf[100];
+ int i, m, d, hh, mm, ss;
+ int *cumdays = cumdaytab[isleap(year)];
+
+ for (i = 0; 1 + cumdays[i] < f; i++)
+ ;
+ m = --i;
+ d = floor(f - 1 - cumdays[i]);
+ f -= floor(f);
+ i = f * SECSPERDAY;
+
+ hh = i / SECSPERHOUR;
+ i %= SECSPERHOUR;
+ mm = i / SECSPERMINUTE;
+ i %= SECSPERMINUTE;
+ ss = i;
+
+ sprintf(buf, "%02d-%02d %02d:%02d:%02d", m, d, hh, mm, ss);
+ return (buf);
+}
+
+void
+dodebug(char *what)
+{
+ int year;
+
+ printf("UTCOffset: %g\n", UTCOffset);
+ printf("eastlongitude: %d\n", EastLongitude);
+
+ if (strcmp(what, "moon") == 0) {
+ double ffullmoon[MAXMOONS], fnewmoon[MAXMOONS];
+ int i;
+
+ for (year = year1; year <= year2; year++) {
+ fpom(year, UTCOffset, ffullmoon, fnewmoon);
+ printf("Full moon %d:\t", year);
+ for (i = 0; ffullmoon[i] >= 0; i++) {
+ printf("%g (%s) ", ffullmoon[i],
+ floattoday(year, ffullmoon[i]));
+ }
+ printf("\nNew moon %d:\t", year);
+ for (i = 0; fnewmoon[i] >= 0; i++) {
+ printf("%g (%s) ", fnewmoon[i],
+ floattoday(year, fnewmoon[i]));
+ }
+ printf("\n");
+
+ }
+
+ return;
+ }
+
+ if (strcmp(what, "sun") == 0) {
+ double equinoxdays[2], solsticedays[2];
+ for (year = year1; year <= year2; year++) {
+ printf("Sun in %d:\n", year);
+ fequinoxsolstice(year, UTCOffset, equinoxdays,
+ solsticedays);
+ printf("e[0] - %g (%s)\n",
+ equinoxdays[0],
+ floattoday(year, equinoxdays[0]));
+ printf("e[1] - %g (%s)\n",
+ equinoxdays[1],
+ floattoday(year, equinoxdays[1]));
+ printf("s[0] - %g (%s)\n",
+ solsticedays[0],
+ floattoday(year, solsticedays[0]));
+ printf("s[1] - %g (%s)\n",
+ solsticedays[1],
+ floattoday(year, solsticedays[1]));
+ }
+ return;
+ }
+}
diff --git a/usr.bin/calendar/paskha.c b/usr.bin/calendar/paskha.c
new file mode 100644
index 000000000000..46936e6d45cf
--- /dev/null
+++ b/usr.bin/calendar/paskha.c
@@ -0,0 +1,68 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ *
+ * 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.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "calendar.h"
+
+#define PASKHA "paskha"
+#define PASKHALEN (sizeof(PASKHA) - 1)
+
+/* return difference in days between Julian and Gregorian calendars */
+int
+j2g(int year)
+{
+ return (year < 1500) ?
+ 0 :
+ 10 + (year/100 - 16) - ((year/100 - 16) / 4);
+}
+
+/* return year day for Orthodox Easter using Gauss formula */
+/* (new style result) */
+
+int
+paskha(int R) /*year*/
+{
+ int a, b, c, d, e;
+ static int x = 15;
+ static int y = 6;
+ int *cumday;
+
+ a = R % 19;
+ b = R % 4;
+ c = R % 7;
+ d = (19 * a + x) % 30;
+ e = (2 * b + 4 * c + 6 * d + y) % 7;
+ cumday = cumdaytab[isleap(R)];
+ return (((cumday[3] + 1) + 22) + (d + e) + j2g(R));
+}
diff --git a/usr.bin/calendar/pathnames.h b/usr.bin/calendar/pathnames.h
new file mode 100644
index 000000000000..006f5bcd5cdc
--- /dev/null
+++ b/usr.bin/calendar/pathnames.h
@@ -0,0 +1,37 @@
+/*-
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Copyright (c) 1989, 1993
+ * 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. 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.
+ *
+ * @(#)pathnames.h 8.1 (Berkeley) 6/6/93
+ * $FreeBSD$
+ */
+
+#include <paths.h>
+
+#define _PATH_INCLUDE "/usr/share/calendar"
diff --git a/usr.bin/calendar/pom.c b/usr.bin/calendar/pom.c
new file mode 100644
index 000000000000..79a0d1bbf9a3
--- /dev/null
+++ b/usr.bin/calendar/pom.c
@@ -0,0 +1,278 @@
+/*-
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Copyright (c) 1989, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * This code is derived from software posted to USENET.
+ *
+ * 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. 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.
+ */
+
+#if 0
+#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
+static const char sccsid[] = "@(#)pom.c 8.1 (Berkeley) 5/31/93";
+#endif /* not lint */
+#endif
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * Phase of the Moon. Calculates the current phase of the moon.
+ * Based on routines from `Practical Astronomy with Your Calculator',
+ * by Duffett-Smith. Comments give the section from the book that
+ * particular piece of code was adapted from.
+ *
+ * -- Keith E. Brandt VIII 1984
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+#include <string.h>
+#include <sysexits.h>
+#include <time.h>
+#include <unistd.h>
+
+#include "calendar.h"
+
+#ifndef PI
+#define PI 3.14159265358979323846
+#endif
+#define EPOCH 85
+#define EPSILONg 279.611371 /* solar ecliptic long at EPOCH */
+#define RHOg 282.680403 /* solar ecliptic long of perigee at EPOCH */
+#define ECCEN 0.01671542 /* solar orbit eccentricity */
+#define lzero 18.251907 /* lunar mean long at EPOCH */
+#define Pzero 192.917585 /* lunar mean long of perigee at EPOCH */
+#define Nzero 55.204723 /* lunar mean long of node at EPOCH */
+#define isleap(y) ((((y) % 4) == 0 && ((y) % 100) != 0) || ((y) % 400) == 0)
+
+static void adj360(double *);
+static double dtor(double);
+static double potm(double onday);
+static double potm_minute(double onday, int olddir);
+
+void
+pom(int year, double utcoffset, int *fms, int *nms)
+{
+ double ffms[MAXMOONS];
+ double fnms[MAXMOONS];
+ int i, j;
+
+ fpom(year, utcoffset, ffms, fnms);
+
+ j = 0;
+ for (i = 0; ffms[i] != 0; i++)
+ fms[j++] = round(ffms[i]);
+ fms[i] = -1;
+ for (i = 0; fnms[i] != 0; i++)
+ nms[i] = round(fnms[i]);
+ nms[i] = -1;
+}
+
+void
+fpom(int year, double utcoffset, double *ffms, double *fnms)
+{
+ time_t tt;
+ struct tm GMT, tmd_today, tmd_tomorrow;
+ double days_today, days_tomorrow, today, tomorrow;
+ int cnt, d;
+ int yeardays;
+ int olddir, newdir;
+ double *pfnms, *pffms, t;
+
+ pfnms = fnms;
+ pffms = ffms;
+
+ /*
+ * We take the phase of the moon one second before and one second
+ * after midnight.
+ */
+ memset(&tmd_today, 0, sizeof(tmd_today));
+ tmd_today.tm_year = year - 1900;
+ tmd_today.tm_mon = 0;
+ tmd_today.tm_mday = -1; /* 31 December */
+ tmd_today.tm_hour = 23;
+ tmd_today.tm_min = 59;
+ tmd_today.tm_sec = 59;
+ memset(&tmd_tomorrow, 0, sizeof(tmd_tomorrow));
+ tmd_tomorrow.tm_year = year - 1900;
+ tmd_tomorrow.tm_mon = 0;
+ tmd_tomorrow.tm_mday = 0; /* 01 January */
+ tmd_tomorrow.tm_hour = 0;
+ tmd_tomorrow.tm_min = 0;
+ tmd_tomorrow.tm_sec = 1;
+
+ tt = mktime(&tmd_today);
+ gmtime_r(&tt, &GMT);
+ yeardays = 0;
+ for (cnt = EPOCH; cnt < GMT.tm_year; ++cnt)
+ yeardays += isleap(1900 + cnt) ? DAYSPERLEAPYEAR : DAYSPERYEAR;
+ days_today = (GMT.tm_yday + 1) + ((GMT.tm_hour +
+ (GMT.tm_min / FSECSPERMINUTE) + (GMT.tm_sec / FSECSPERHOUR)) /
+ FHOURSPERDAY);
+ days_today += yeardays;
+
+ tt = mktime(&tmd_tomorrow);
+ gmtime_r(&tt, &GMT);
+ yeardays = 0;
+ for (cnt = EPOCH; cnt < GMT.tm_year; ++cnt)
+ yeardays += isleap(1900 + cnt) ? DAYSPERLEAPYEAR : DAYSPERYEAR;
+ days_tomorrow = (GMT.tm_yday + 1) + ((GMT.tm_hour +
+ (GMT.tm_min / FSECSPERMINUTE) + (GMT.tm_sec / FSECSPERHOUR)) /
+ FHOURSPERDAY);
+ days_tomorrow += yeardays;
+
+ today = potm(days_today); /* 30 December 23:59:59 */
+ tomorrow = potm(days_tomorrow); /* 31 December 00:00:01 */
+ olddir = today > tomorrow ? -1 : +1;
+
+ yeardays = 1 + (isleap(year) ? DAYSPERLEAPYEAR : DAYSPERYEAR); /* reuse */
+ for (d = 0; d <= yeardays; d++) {
+ today = potm(days_today);
+ tomorrow = potm(days_tomorrow);
+ newdir = today > tomorrow ? -1 : +1;
+ if (olddir != newdir) {
+ t = potm_minute(days_today - 1, olddir) +
+ utcoffset / FHOURSPERDAY;
+ if (olddir == -1 && newdir == +1) {
+ *pfnms = d - 1 + t;
+ pfnms++;
+ } else if (olddir == +1 && newdir == -1) {
+ *pffms = d - 1 + t;
+ pffms++;
+ }
+ }
+ olddir = newdir;
+ days_today++;
+ days_tomorrow++;
+ }
+ *pffms = -1;
+ *pfnms = -1;
+}
+
+static double
+potm_minute(double onday, int olddir) {
+ double period = FSECSPERDAY / 2.0;
+ double p1, p2;
+ double before, after;
+ int newdir;
+
+// printf("---> days:%g olddir:%d\n", days, olddir);
+
+ p1 = onday + (period / SECSPERDAY);
+ period /= 2;
+
+ while (period > 30) { /* half a minute */
+// printf("period:%g - p1:%g - ", period, p1);
+ p2 = p1 + (2.0 / SECSPERDAY);
+ before = potm(p1);
+ after = potm(p2);
+// printf("before:%10.10g - after:%10.10g\n", before, after);
+ newdir = before < after ? -1 : +1;
+ if (olddir != newdir)
+ p1 += (period / SECSPERDAY);
+ else
+ p1 -= (period / SECSPERDAY);
+ period /= 2;
+// printf("newdir:%d - p1:%10.10f - period:%g\n",
+// newdir, p1, period);
+ }
+ p1 -= floor(p1);
+ //exit(0);
+ return (p1);
+}
+
+/*
+ * potm --
+ * return phase of the moon, as a percentage [0 ... 100]
+ */
+static double
+potm(double onday)
+{
+ double N, Msol, Ec, LambdaSol, l, Mm, Ev, Ac, A3, Mmprime;
+ double A4, lprime, V, ldprime, D, Nm;
+
+ N = 360 * onday / 365.2422; /* sec 42 #3 */
+ adj360(&N);
+ Msol = N + EPSILONg - RHOg; /* sec 42 #4 */
+ adj360(&Msol);
+ Ec = 360 / PI * ECCEN * sin(dtor(Msol)); /* sec 42 #5 */
+ LambdaSol = N + Ec + EPSILONg; /* sec 42 #6 */
+ adj360(&LambdaSol);
+ l = 13.1763966 * onday + lzero; /* sec 61 #4 */
+ adj360(&l);
+ Mm = l - (0.1114041 * onday) - Pzero; /* sec 61 #5 */
+ adj360(&Mm);
+ Nm = Nzero - (0.0529539 * onday); /* sec 61 #6 */
+ adj360(&Nm);
+ Ev = 1.2739 * sin(dtor(2*(l - LambdaSol) - Mm)); /* sec 61 #7 */
+ Ac = 0.1858 * sin(dtor(Msol)); /* sec 61 #8 */
+ A3 = 0.37 * sin(dtor(Msol));
+ Mmprime = Mm + Ev - Ac - A3; /* sec 61 #9 */
+ Ec = 6.2886 * sin(dtor(Mmprime)); /* sec 61 #10 */
+ A4 = 0.214 * sin(dtor(2 * Mmprime)); /* sec 61 #11 */
+ lprime = l + Ev + Ec - Ac + A4; /* sec 61 #12 */
+ V = 0.6583 * sin(dtor(2 * (lprime - LambdaSol))); /* sec 61 #13 */
+ ldprime = lprime + V; /* sec 61 #14 */
+ D = ldprime - LambdaSol; /* sec 63 #2 */
+ return(50 * (1 - cos(dtor(D)))); /* sec 63 #3 */
+}
+
+/*
+ * dtor --
+ * convert degrees to radians
+ */
+static double
+dtor(double deg)
+{
+
+ return(deg * PI / 180);
+}
+
+/*
+ * adj360 --
+ * adjust value so 0 <= deg <= 360
+ */
+static void
+adj360(double *deg)
+{
+
+ for (;;)
+ if (*deg < 0)
+ *deg += 360;
+ else if (*deg > 360)
+ *deg -= 360;
+ else
+ break;
+}
diff --git a/usr.bin/calendar/sunpos.c b/usr.bin/calendar/sunpos.c
new file mode 100644
index 000000000000..48dd89391229
--- /dev/null
+++ b/usr.bin/calendar/sunpos.c
@@ -0,0 +1,450 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ *
+ * Copyright (c) 2009-2010 Edwin Groothuis <edwin@FreeBSD.org>.
+ * 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.
+ *
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * This code is created to match the formulas available at:
+ * Formula and examples obtained from "How to Calculate alt/az: SAAO" at
+ * http://old.saao.ac.za/public-info/sun-moon-stars/sun-index/how-to-calculate-altaz/
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <limits.h>
+#include <math.h>
+#include <string.h>
+#include <time.h>
+#include "calendar.h"
+
+#define D2R(m) ((m) / 180 * M_PI)
+#define R2D(m) ((m) * 180 / M_PI)
+
+#define SIN(x) (sin(D2R(x)))
+#define COS(x) (cos(D2R(x)))
+#define TAN(x) (tan(D2R(x)))
+#define ASIN(x) (R2D(asin(x)))
+#define ATAN(x) (R2D(atan(x)))
+
+#ifdef NOTDEF
+static void
+comp(char *s, double v, double c)
+{
+
+ printf("%-*s %*g %*g %*g\n", 15, s, 15, v, 15, c, 15, v - c);
+}
+
+int expY;
+double expZJ = 30.5;
+double expUTHM = 8.5;
+double expD = 34743.854;
+double expT = 0.9512349;
+double expL = 324.885;
+double expM = 42.029;
+double expepsilon = 23.4396;
+double explambda = 326.186;
+double expalpha = 328.428;
+double expDEC = -12.789;
+double expeastlongitude = 17.10;
+double explatitude = -22.57;
+double expHA = -37.673;
+double expALT = 49.822;
+double expAZ = 67.49;
+#endif
+
+static double
+fixup(double *d)
+{
+
+ if (*d < 0) {
+ while (*d < 0)
+ *d += 360;
+ } else {
+ while (*d > 360)
+ *d -= 360;
+ }
+
+ return (*d);
+}
+
+static double ZJtable[] = {
+ 0, -0.5, 30.5, 58.5, 89.5, 119.5, 150.5, 180.5, 211.5, 242.5, 272.5, 303.5, 333.5 };
+
+static void
+sunpos(int inYY, int inMM, int inDD, double UTCOFFSET, int inHOUR, int inMIN,
+ int inSEC, double eastlongitude, double latitude, double *L, double *DEC)
+{
+ int Y;
+ double ZJ, D, T, M, epsilon, lambda, alpha, HA, UTHM;
+
+ ZJ = ZJtable[inMM];
+ if (inMM <= 2 && isleap(inYY))
+ ZJ -= 1.0;
+
+ UTHM = inHOUR + inMIN / FMINSPERHOUR + inSEC / FSECSPERHOUR - UTCOFFSET;
+ Y = inYY - 1900; /* 1 */
+ D = floor(365.25 * Y) + ZJ + inDD + UTHM / FHOURSPERDAY; /* 3 */
+ T = D / 36525.0; /* 4 */
+ *L = 279.697 + 36000.769 * T; /* 5 */
+ fixup(L);
+ M = 358.476 + 35999.050 * T; /* 6 */
+ fixup(&M);
+ epsilon = 23.452 - 0.013 * T; /* 7 */
+ fixup(&epsilon);
+
+ lambda = *L + (1.919 - 0.005 * T) * SIN(M) + 0.020 * SIN(2 * M);/* 8 */
+ fixup(&lambda);
+ alpha = ATAN(TAN(lambda) * COS(epsilon)); /* 9 */
+
+ /* Alpha should be in the same quadrant as lamba */
+ {
+ int lssign = sin(D2R(lambda)) < 0 ? -1 : 1;
+ int lcsign = cos(D2R(lambda)) < 0 ? -1 : 1;
+ while (((sin(D2R(alpha)) < 0) ? -1 : 1) != lssign
+ || ((cos(D2R(alpha)) < 0) ? -1 : 1) != lcsign)
+ alpha += 90.0;
+ }
+ fixup(&alpha);
+
+ *DEC = ASIN(SIN(lambda) * SIN(epsilon)); /* 10 */
+ fixup(DEC);
+ fixup(&eastlongitude);
+ HA = *L - alpha + 180 + 15 * UTHM + eastlongitude; /* 12 */
+ fixup(&HA);
+ fixup(&latitude);
+#ifdef NOTDEF
+ printf("%02d/%02d %02d:%02d:%02d l:%g d:%g h:%g\n",
+ inMM, inDD, inHOUR, inMIN, inSEC, latitude, *DEC, HA);
+#endif
+ return;
+
+ /*
+ * The following calculations are not used, so to save time
+ * they are not calculated.
+ */
+#ifdef NOTDEF
+ *ALT = ASIN(SIN(latitude) * SIN(*DEC) +
+ COS(latitude) * COS(*DEC) * COS(HA)); /* 13 */
+ fixup(ALT);
+ *AZ = ATAN(SIN(HA) /
+ (COS(HA) * SIN(latitude) - TAN(*DEC) * COS(latitude))); /* 14 */
+
+ if (*ALT > 180)
+ *ALT -= 360;
+ if (*ALT < -180)
+ *ALT += 360;
+ printf("a:%g a:%g\n", *ALT, *AZ);
+#endif
+
+#ifdef NOTDEF
+ printf("Y:\t\t\t %d\t\t %d\t\t %d\n", Y, expY, Y - expY);
+ comp("ZJ", ZJ, expZJ);
+ comp("UTHM", UTHM, expUTHM);
+ comp("D", D, expD);
+ comp("T", T, expT);
+ comp("L", L, fixup(&expL));
+ comp("M", M, fixup(&expM));
+ comp("epsilon", epsilon, fixup(&expepsilon));
+ comp("lambda", lambda, fixup(&explambda));
+ comp("alpha", alpha, fixup(&expalpha));
+ comp("DEC", DEC, fixup(&expDEC));
+ comp("eastlongitude", eastlongitude, fixup(&expeastlongitude));
+ comp("latitude", latitude, fixup(&explatitude));
+ comp("HA", HA, fixup(&expHA));
+ comp("ALT", ALT, fixup(&expALT));
+ comp("AZ", AZ, fixup(&expAZ));
+#endif
+}
+
+
+#define SIGN(a) (((a) > 180) ? -1 : 1)
+#define ANGLE(a, b) (((a) < (b)) ? 1 : -1)
+#define SHOUR(s) ((s) / 3600)
+#define SMIN(s) (((s) % 3600) / 60)
+#define SSEC(s) ((s) % 60)
+#define HOUR(h) ((h) / 4)
+#define MIN(h) (15 * ((h) % 4))
+#define SEC(h) 0
+#define DEBUG1(y, m, d, hh, mm, pdec, dec) \
+ printf("%4d-%02d-%02d %02d:%02d:00 - %7.7g -> %7.7g\n", \
+ y, m, d, hh, mm, pdec, dec)
+#define DEBUG2(y, m, d, hh, mm, pdec, dec, pang, ang) \
+ printf("%4d-%02d-%02d %02d:%02d:00 - %7.7g -> %7.7g - %d -> %d\n", \
+ y, m, d, hh, mm, pdec, dec, pang, ang)
+void
+equinoxsolstice(int year, double UTCoffset, int *equinoxdays, int *solsticedays)
+{
+ double fe[2], fs[2];
+
+ fequinoxsolstice(year, UTCoffset, fe, fs);
+ equinoxdays[0] = round(fe[0]);
+ equinoxdays[1] = round(fe[1]);
+ solsticedays[0] = round(fs[0]);
+ solsticedays[1] = round(fs[1]);
+}
+
+void
+fequinoxsolstice(int year, double UTCoffset, double *equinoxdays, double *solsticedays)
+{
+ double dec, prevdec, L;
+ int h, d, prevangle, angle;
+ int found = 0;
+
+ double decleft, decright, decmiddle;
+ int dial, s;
+
+ int *cumdays;
+ cumdays = cumdaytab[isleap(year)];
+
+ /*
+ * Find the first equinox, somewhere in March:
+ * It happens when the returned value "dec" goes from
+ * [350 ... 360> -> [0 ... 10]
+ */
+ for (d = 18; d < 31; d++) {
+ /* printf("Comparing day %d to %d.\n", d, d+1); */
+ sunpos(year, 3, d, UTCoffset, 0, 0, 0, 0.0, 0.0, &L, &decleft);
+ sunpos(year, 3, d + 1, UTCoffset, 0, 0, 0, 0.0, 0.0,
+ &L, &decright);
+ /* printf("Found %g and %g.\n", decleft, decright); */
+ if (SIGN(decleft) == SIGN(decright))
+ continue;
+
+ dial = SECSPERDAY;
+ s = SECSPERDAY / 2;
+ while (s > 0) {
+ /* printf("Obtaining %d (%02d:%02d)\n",
+ dial, SHOUR(dial), SMIN(dial)); */
+ sunpos(year, 3, d, UTCoffset,
+ SHOUR(dial), SMIN(dial), SSEC(dial),
+ 0.0, 0.0, &L, &decmiddle);
+ /* printf("Found %g\n", decmiddle); */
+ if (SIGN(decleft) == SIGN(decmiddle)) {
+ decleft = decmiddle;
+ dial += s;
+ } else {
+ decright = decmiddle;
+ dial -= s;
+ }
+ /*
+ printf("New boundaries: %g - %g\n", decleft, decright);
+ */
+
+ s /= 2;
+ }
+ equinoxdays[0] = 1 + cumdays[3] + d + (dial / FSECSPERDAY);
+ break;
+ }
+
+ /* Find the second equinox, somewhere in September:
+ * It happens when the returned value "dec" goes from
+ * [10 ... 0] -> <360 ... 350]
+ */
+ for (d = 18; d < 31; d++) {
+ /* printf("Comparing day %d to %d.\n", d, d+1); */
+ sunpos(year, 9, d, UTCoffset, 0, 0, 0, 0.0, 0.0, &L, &decleft);
+ sunpos(year, 9, d + 1, UTCoffset, 0, 0, 0, 0.0, 0.0,
+ &L, &decright);
+ /* printf("Found %g and %g.\n", decleft, decright); */
+ if (SIGN(decleft) == SIGN(decright))
+ continue;
+
+ dial = SECSPERDAY;
+ s = SECSPERDAY / 2;
+ while (s > 0) {
+ /* printf("Obtaining %d (%02d:%02d)\n",
+ dial, SHOUR(dial), SMIN(dial)); */
+ sunpos(year, 9, d, UTCoffset,
+ SHOUR(dial), SMIN(dial), SSEC(dial),
+ 0.0, 0.0, &L, &decmiddle);
+ /* printf("Found %g\n", decmiddle); */
+ if (SIGN(decleft) == SIGN(decmiddle)) {
+ decleft = decmiddle;
+ dial += s;
+ } else {
+ decright = decmiddle;
+ dial -= s;
+ }
+ /*
+ printf("New boundaries: %g - %g\n", decleft, decright);
+ */
+
+ s /= 2;
+ }
+ equinoxdays[1] = 1 + cumdays[9] + d + (dial / FSECSPERDAY);
+ break;
+ }
+
+ /*
+ * Find the first solstice, somewhere in June:
+ * It happens when the returned value "dec" peaks
+ * [40 ... 45] -> [45 ... 40]
+ */
+ found = 0;
+ prevdec = 0;
+ prevangle = 1;
+ for (d = 18; d < 31; d++) {
+ for (h = 0; h < 4 * HOURSPERDAY; h++) {
+ sunpos(year, 6, d, UTCoffset, HOUR(h), MIN(h), SEC(h),
+ 0.0, 0.0, &L, &dec);
+ angle = ANGLE(prevdec, dec);
+ if (prevangle != angle) {
+#ifdef NOTDEF
+ DEBUG2(year, 6, d, HOUR(h), MIN(h),
+ prevdec, dec, prevangle, angle);
+#endif
+ solsticedays[0] = 1 + cumdays[6] + d +
+ ((h / 4.0) / 24.0);
+ found = 1;
+ break;
+ }
+ prevdec = dec;
+ prevangle = angle;
+ }
+ if (found)
+ break;
+ }
+
+ /*
+ * Find the second solstice, somewhere in December:
+ * It happens when the returned value "dec" peaks
+ * [315 ... 310] -> [310 ... 315]
+ */
+ found = 0;
+ prevdec = 360;
+ prevangle = -1;
+ for (d = 18; d < 31; d++) {
+ for (h = 0; h < 4 * HOURSPERDAY; h++) {
+ sunpos(year, 12, d, UTCoffset, HOUR(h), MIN(h), SEC(h),
+ 0.0, 0.0, &L, &dec);
+ angle = ANGLE(prevdec, dec);
+ if (prevangle != angle) {
+#ifdef NOTDEF
+ DEBUG2(year, 12, d, HOUR(h), MIN(h),
+ prevdec, dec, prevangle, angle);
+#endif
+ solsticedays[1] = 1 + cumdays[12] + d +
+ ((h / 4.0) / 24.0);
+ found = 1;
+ break;
+ }
+ prevdec = dec;
+ prevangle = angle;
+ }
+ if (found)
+ break;
+ }
+
+ return;
+}
+
+int
+calculatesunlongitude30(int year, int degreeGMToffset, int *ichinesemonths)
+{
+ int m, d, h;
+ double dec;
+ double curL, prevL;
+ int *pichinesemonths, *monthdays, *cumdays, i;
+ int firstmonth330 = -1;
+
+ cumdays = cumdaytab[isleap(year)];
+ monthdays = monthdaytab[isleap(year)];
+ pichinesemonths = ichinesemonths;
+
+ h = 0;
+ sunpos(year - 1, 12, 31,
+ -24 * (degreeGMToffset / 360.0),
+ HOUR(h), MIN(h), SEC(h), 0.0, 0.0, &prevL, &dec);
+
+ for (m = 1; m <= 12; m++) {
+ for (d = 1; d <= monthdays[m]; d++) {
+ for (h = 0; h < 4 * HOURSPERDAY; h++) {
+ sunpos(year, m, d,
+ -24 * (degreeGMToffset / 360.0),
+ HOUR(h), MIN(h), SEC(h),
+ 0.0, 0.0, &curL, &dec);
+ if (curL < 180 && prevL > 180) {
+ *pichinesemonths = cumdays[m] + d;
+#ifdef DEBUG
+printf("%04d-%02d-%02d %02d:%02d - %d %g\n",
+ year, m, d, HOUR(h), MIN(h), *pichinesemonths, curL);
+#endif
+ pichinesemonths++;
+ } else {
+ for (i = 0; i <= 360; i += 30)
+ if (curL > i && prevL < i) {
+ *pichinesemonths =
+ cumdays[m] + d;
+#ifdef DEBUG
+printf("%04d-%02d-%02d %02d:%02d - %d %g\n",
+ year, m, d, HOUR(h), MIN(h), *pichinesemonths, curL);
+#endif
+ if (i == 330)
+ firstmonth330 = *pichinesemonths;
+ pichinesemonths++;
+ }
+ }
+ prevL = curL;
+ }
+ }
+ }
+ *pichinesemonths = -1;
+ return (firstmonth330);
+}
+
+#ifdef NOTDEF
+int
+main(int argc, char **argv)
+{
+/*
+ year Mar June Sept Dec
+ day time day time day time day time
+ 2004 20 06:49 21 00:57 22 16:30 21 12:42
+ 2005 20 12:33 21 06:46 22 22:23 21 18:35
+ 2006 20 18:26 21 12:26 23 04:03 22 00:22
+ 2007 21 00:07 21 18:06 23 09:51 22 06:08
+ 2008 20 05:48 20 23:59 22 15:44 21 12:04
+ 2009 20 11:44 21 05:45 22 21:18 21 17:47
+ 2010 20 17:32 21 11:28 23 03:09 21 23:38
+ 2011 20 23:21 21 17:16 23 09:04 22 05:30
+ 2012 20 05:14 20 23:09 22 14:49 21 11:11
+ 2013 20 11:02 21 05:04 22 20:44 21 17:11
+ 2014 20 16:57 21 10:51 23 02:29 21 23:03
+ 2015 20 22:45 21 16:38 23 08:20 22 04:48
+ 2016 20 04:30 20 22:34 22 14:21 21 10:44
+ 2017 20 10:28 21 04:24 22 20:02 21 16:28
+*/
+
+ int eq[2], sol[2];
+ equinoxsolstice(strtol(argv[1], NULL, 10), 0.0, eq, sol);
+ printf("%d - %d - %d - %d\n", eq[0], sol[0], eq[1], sol[1]);
+ return(0);
+}
+#endif
diff --git a/usr.bin/calendar/tests/Makefile b/usr.bin/calendar/tests/Makefile
new file mode 100644
index 000000000000..c92b0e692746
--- /dev/null
+++ b/usr.bin/calendar/tests/Makefile
@@ -0,0 +1,40 @@
+# $FreeBSD$
+
+PACKAGE= tests
+
+TAP_TESTS_SH= legacy_test
+
+TEST_METADATA.legacy_test+= timeout="600"
+
+${PACKAGE}FILES+= calendar.calibrate
+${PACKAGE}FILES+= regress.a1.out
+${PACKAGE}FILES+= regress.a2.out
+${PACKAGE}FILES+= regress.a3.out
+${PACKAGE}FILES+= regress.a4.out
+${PACKAGE}FILES+= regress.a5.out
+${PACKAGE}FILES+= regress.b1.out
+${PACKAGE}FILES+= regress.b2.out
+${PACKAGE}FILES+= regress.b3.out
+${PACKAGE}FILES+= regress.b4.out
+${PACKAGE}FILES+= regress.b5.out
+${PACKAGE}FILES+= regress.s1.out
+${PACKAGE}FILES+= regress.s2.out
+${PACKAGE}FILES+= regress.s3.out
+${PACKAGE}FILES+= regress.s4.out
+${PACKAGE}FILES+= regress.sh
+${PACKAGE}FILES+= regress.w0-1.out
+${PACKAGE}FILES+= regress.w0-2.out
+${PACKAGE}FILES+= regress.w0-3.out
+${PACKAGE}FILES+= regress.w0-4.out
+${PACKAGE}FILES+= regress.w0-5.out
+${PACKAGE}FILES+= regress.w0-6.out
+${PACKAGE}FILES+= regress.w0-7.out
+${PACKAGE}FILES+= regress.wn-1.out
+${PACKAGE}FILES+= regress.wn-2.out
+${PACKAGE}FILES+= regress.wn-3.out
+${PACKAGE}FILES+= regress.wn-4.out
+${PACKAGE}FILES+= regress.wn-5.out
+${PACKAGE}FILES+= regress.wn-6.out
+${PACKAGE}FILES+= regress.wn-7.out
+
+.include <bsd.test.mk>
diff --git a/usr.bin/calendar/tests/Makefile.depend b/usr.bin/calendar/tests/Makefile.depend
new file mode 100644
index 000000000000..f80275d86ab1
--- /dev/null
+++ b/usr.bin/calendar/tests/Makefile.depend
@@ -0,0 +1,11 @@
+# $FreeBSD$
+# Autogenerated - do NOT edit!
+
+DIRDEPS = \
+
+
+.include <dirdeps.mk>
+
+.if ${DEP_RELDIR} == ${_DEP_RELDIR}
+# local dependencies - needed for -jN in clean tree
+.endif
diff --git a/usr.bin/calendar/tests/calendar.calibrate b/usr.bin/calendar/tests/calendar.calibrate
new file mode 100644
index 000000000000..28e7e4a42268
--- /dev/null
+++ b/usr.bin/calendar/tests/calendar.calibrate
@@ -0,0 +1,374 @@
+/*
+ * Calibration calendar for calendar(1)
+ *
+ * $FreeBSD$
+ */
+
+LANG=C
+
+01/01 jan 1
+01/02 jan 2
+01/03 jan 3
+01/04 jan 4
+01/05 jan 5
+01/06 jan 6
+01/07 jan 7
+01/08 jan 8
+01/09 jan 9
+01/10 jan 10
+01/11 jan 11
+01/12 jan 12
+01/13 jan 13
+01/14 jan 14
+01/15 jan 15
+01/16 jan 16
+01/17 jan 17
+01/18 jan 18
+01/19 jan 19
+01/20 jan 20
+01/21 jan 21
+01/22 jan 22
+01/23 jan 23
+01/24 jan 24
+01/25 jan 25
+01/26 jan 26
+01/27 jan 27
+01/28 jan 28
+01/29 jan 29
+01/30 jan 30
+01/31 jan 31
+02/01 feb 1
+02/02 feb 2
+02/03 feb 3
+02/04 feb 4
+02/05 feb 5
+02/06 feb 6
+02/07 feb 7
+02/08 feb 8
+02/09 feb 9
+02/10 feb 10
+02/11 feb 11
+02/12 feb 12
+02/13 feb 13
+02/14 feb 14
+02/15 feb 15
+02/16 feb 16
+02/17 feb 17
+02/18 feb 18
+02/19 feb 19
+02/20 feb 20
+02/21 feb 21
+02/22 feb 22
+02/23 feb 23
+02/24 feb 24
+02/25 feb 25
+02/26 feb 26
+02/27 feb 27
+02/28 feb 28
+02/29 feb 29
+03/01 mar 1
+03/02 mar 2
+03/03 mar 3
+03/04 mar 4
+03/05 mar 5
+03/06 mar 6
+03/07 mar 7
+03/08 mar 8
+03/09 mar 9
+03/10 mar 10
+03/11 mar 11
+03/12 mar 12
+03/13 mar 13
+03/14 mar 14
+03/15 mar 15
+03/16 mar 16
+03/17 mar 17
+03/18 mar 18
+03/19 mar 19
+03/20 mar 20
+03/21 mar 21
+03/22 mar 22
+03/23 mar 23
+03/24 mar 24
+03/25 mar 25
+03/26 mar 26
+03/27 mar 27
+03/28 mar 28
+03/29 mar 29
+03/30 mar 30
+03/31 mar 31
+04/01 apr 1
+04/02 apr 2
+04/03 apr 3
+04/04 apr 4
+04/05 apr 5
+04/06 apr 6
+04/07 apr 7
+04/08 apr 8
+04/09 apr 9
+04/10 apr 10
+04/11 apr 11
+04/12 apr 12
+04/13 apr 13
+04/14 apr 14
+04/15 apr 15
+04/16 apr 16
+04/17 apr 17
+04/18 apr 18
+04/19 apr 19
+04/20 apr 20
+04/21 apr 21
+04/22 apr 22
+04/23 apr 23
+04/24 apr 24
+04/25 apr 25
+04/26 apr 26
+04/27 apr 27
+04/28 apr 28
+04/29 apr 29
+04/30 apr 30
+05/01 may 1
+05/02 may 2
+05/03 may 3
+05/04 may 4
+05/05 may 5
+05/06 may 6
+05/07 may 7
+05/08 may 8
+05/09 may 9
+05/10 may 10
+05/11 may 11
+05/12 may 12
+05/13 may 13
+05/14 may 14
+05/15 may 15
+05/16 may 16
+05/17 may 17
+05/18 may 18
+05/19 may 19
+05/20 may 20
+05/21 may 21
+05/22 may 22
+05/23 may 23
+05/24 may 24
+05/25 may 25
+05/26 may 26
+05/27 may 27
+05/28 may 28
+05/29 may 29
+05/30 may 30
+05/31 may 31
+06/01 jun 1
+06/02 jun 2
+06/03 jun 3
+06/04 jun 4
+06/05 jun 5
+06/06 jun 6
+06/07 jun 7
+06/08 jun 8
+06/09 jun 9
+06/10 jun 10
+06/11 jun 11
+06/12 jun 12
+06/13 jun 13
+06/14 jun 14
+06/15 jun 15
+06/16 jun 16
+06/17 jun 17
+06/18 jun 18
+06/19 jun 19
+06/20 jun 20
+06/21 jun 21
+06/22 jun 22
+06/23 jun 23
+06/24 jun 24
+06/25 jun 25
+06/26 jun 26
+06/27 jun 27
+06/28 jun 28
+06/29 jun 29
+06/30 jun 30
+07/01 jul 1
+07/02 jul 2
+07/03 jul 3
+07/04 jul 4
+07/05 jul 5
+07/06 jul 6
+07/07 jul 7
+07/08 jul 8
+07/09 jul 9
+07/10 jul 10
+07/11 jul 11
+07/12 jul 12
+07/13 jul 13
+07/14 jul 14
+07/15 jul 15
+07/16 jul 16
+07/17 jul 17
+07/18 jul 18
+07/19 jul 19
+07/20 jul 20
+07/21 jul 21
+07/22 jul 22
+07/23 jul 23
+07/24 jul 24
+07/25 jul 25
+07/26 jul 26
+07/27 jul 27
+07/28 jul 28
+07/29 jul 29
+07/30 jul 30
+07/31 jul 31
+08/01 aug 1
+08/02 aug 2
+08/03 aug 3
+08/04 aug 4
+08/05 aug 5
+08/06 aug 6
+08/07 aug 7
+08/08 aug 8
+08/09 aug 9
+08/10 aug 10
+08/11 aug 11
+08/12 aug 12
+08/13 aug 13
+08/14 aug 14
+08/15 aug 15
+08/16 aug 16
+08/17 aug 17
+08/18 aug 18
+08/19 aug 19
+08/20 aug 20
+08/21 aug 21
+08/22 aug 22
+08/23 aug 23
+08/24 aug 24
+08/25 aug 25
+08/26 aug 26
+08/27 aug 27
+08/28 aug 28
+08/29 aug 29
+08/30 aug 30
+08/31 aug 31
+09/01 sep 1
+09/02 sep 2
+09/03 sep 3
+09/04 sep 4
+09/05 sep 5
+09/06 sep 6
+09/07 sep 7
+09/08 sep 8
+09/09 sep 9
+09/10 sep 10
+09/11 sep 11
+09/12 sep 12
+09/13 sep 13
+09/14 sep 14
+09/15 sep 15
+09/16 sep 16
+09/17 sep 17
+09/18 sep 18
+09/19 sep 19
+09/20 sep 20
+09/21 sep 21
+09/22 sep 22
+09/23 sep 23
+09/24 sep 24
+09/25 sep 25
+09/26 sep 26
+09/27 sep 27
+09/28 sep 28
+09/29 sep 29
+09/30 sep 30
+10/01 oct 1
+10/02 oct 2
+10/03 oct 3
+10/04 oct 4
+10/05 oct 5
+10/06 oct 6
+10/07 oct 7
+10/08 oct 8
+10/09 oct 9
+10/10 oct 10
+10/11 oct 11
+10/12 oct 12
+10/13 oct 13
+10/14 oct 14
+10/15 oct 15
+10/16 oct 16
+10/17 oct 17
+10/18 oct 18
+10/19 oct 19
+10/20 oct 20
+10/21 oct 21
+10/22 oct 22
+10/23 oct 23
+10/24 oct 24
+10/25 oct 25
+10/26 oct 26
+10/27 oct 27
+10/28 oct 28
+10/29 oct 29
+10/30 oct 30
+10/31 oct 31
+11/01 nov 1
+11/02 nov 2
+11/03 nov 3
+11/04 nov 4
+11/05 nov 5
+11/06 nov 6
+11/07 nov 7
+11/08 nov 8
+11/09 nov 9
+11/10 nov 10
+11/11 nov 11
+11/12 nov 12
+11/13 nov 13
+11/14 nov 14
+11/15 nov 15
+11/16 nov 16
+11/17 nov 17
+11/18 nov 18
+11/19 nov 19
+11/20 nov 20
+11/21 nov 21
+11/22 nov 22
+11/23 nov 23
+11/24 nov 24
+11/25 nov 25
+11/26 nov 26
+11/27 nov 27
+11/28 nov 28
+11/29 nov 29
+11/30 nov 30
+12/01 dec 1
+12/02 dec 2
+12/03 dec 3
+12/04 dec 4
+12/05 dec 5
+12/06 dec 6
+12/07 dec 7
+12/08 dec 8
+12/09 dec 9
+12/10 dec 10
+12/11 dec 11
+12/12 dec 12
+12/13 dec 13
+12/14 dec 14
+12/15 dec 15
+12/16 dec 16
+12/17 dec 17
+12/18 dec 18
+12/19 dec 19
+12/20 dec 20
+12/21 dec 21
+12/22 dec 22
+12/23 dec 23
+12/24 dec 24
+12/25 dec 25
+12/26 dec 26
+12/27 dec 27
+12/28 dec 28
+12/29 dec 29
+12/30 dec 30
+12/31 dec 31
diff --git a/usr.bin/calendar/tests/legacy_test.sh b/usr.bin/calendar/tests/legacy_test.sh
new file mode 100644
index 000000000000..1b6b806c5980
--- /dev/null
+++ b/usr.bin/calendar/tests/legacy_test.sh
@@ -0,0 +1,6 @@
+#!/bin/sh
+# $FreeBSD$
+
+SRCDIR="$(dirname "${0}")"; export SRCDIR
+
+m4 "${SRCDIR}/../regress.m4" "${SRCDIR}/regress.sh" | sh
diff --git a/usr.bin/calendar/tests/regress.a1.out b/usr.bin/calendar/tests/regress.a1.out
new file mode 100644
index 000000000000..ef3d71db5e57
--- /dev/null
+++ b/usr.bin/calendar/tests/regress.a1.out
@@ -0,0 +1,4 @@
+Dec 28 dec 28
+Dec 29 dec 29
+Dec 30 dec 30
+Dec 31 dec 31
diff --git a/usr.bin/calendar/tests/regress.a2.out b/usr.bin/calendar/tests/regress.a2.out
new file mode 100644
index 000000000000..0fed38ba2486
--- /dev/null
+++ b/usr.bin/calendar/tests/regress.a2.out
@@ -0,0 +1,4 @@
+Dec 29 dec 29
+Dec 30 dec 30
+Dec 31 dec 31
+Jan 1 jan 1
diff --git a/usr.bin/calendar/tests/regress.a3.out b/usr.bin/calendar/tests/regress.a3.out
new file mode 100644
index 000000000000..9dabd3393352
--- /dev/null
+++ b/usr.bin/calendar/tests/regress.a3.out
@@ -0,0 +1,4 @@
+Dec 30 dec 30
+Dec 31 dec 31
+Jan 1 jan 1
+Jan 2 jan 2
diff --git a/usr.bin/calendar/tests/regress.a4.out b/usr.bin/calendar/tests/regress.a4.out
new file mode 100644
index 000000000000..e3756b11f2b4
--- /dev/null
+++ b/usr.bin/calendar/tests/regress.a4.out
@@ -0,0 +1,4 @@
+Dec 31 dec 31
+Jan 1 jan 1
+Jan 2 jan 2
+Jan 3 jan 3
diff --git a/usr.bin/calendar/tests/regress.a5.out b/usr.bin/calendar/tests/regress.a5.out
new file mode 100644
index 000000000000..4f61d48b291b
--- /dev/null
+++ b/usr.bin/calendar/tests/regress.a5.out
@@ -0,0 +1,4 @@
+Jan 1 jan 1
+Jan 2 jan 2
+Jan 3 jan 3
+Jan 4 jan 4
diff --git a/usr.bin/calendar/tests/regress.b1.out b/usr.bin/calendar/tests/regress.b1.out
new file mode 100644
index 000000000000..ef3d71db5e57
--- /dev/null
+++ b/usr.bin/calendar/tests/regress.b1.out
@@ -0,0 +1,4 @@
+Dec 28 dec 28
+Dec 29 dec 29
+Dec 30 dec 30
+Dec 31 dec 31
diff --git a/usr.bin/calendar/tests/regress.b2.out b/usr.bin/calendar/tests/regress.b2.out
new file mode 100644
index 000000000000..0fed38ba2486
--- /dev/null
+++ b/usr.bin/calendar/tests/regress.b2.out
@@ -0,0 +1,4 @@
+Dec 29 dec 29
+Dec 30 dec 30
+Dec 31 dec 31
+Jan 1 jan 1
diff --git a/usr.bin/calendar/tests/regress.b3.out b/usr.bin/calendar/tests/regress.b3.out
new file mode 100644
index 000000000000..9dabd3393352
--- /dev/null
+++ b/usr.bin/calendar/tests/regress.b3.out
@@ -0,0 +1,4 @@
+Dec 30 dec 30
+Dec 31 dec 31
+Jan 1 jan 1
+Jan 2 jan 2
diff --git a/usr.bin/calendar/tests/regress.b4.out b/usr.bin/calendar/tests/regress.b4.out
new file mode 100644
index 000000000000..e3756b11f2b4
--- /dev/null
+++ b/usr.bin/calendar/tests/regress.b4.out
@@ -0,0 +1,4 @@
+Dec 31 dec 31
+Jan 1 jan 1
+Jan 2 jan 2
+Jan 3 jan 3
diff --git a/usr.bin/calendar/tests/regress.b5.out b/usr.bin/calendar/tests/regress.b5.out
new file mode 100644
index 000000000000..4f61d48b291b
--- /dev/null
+++ b/usr.bin/calendar/tests/regress.b5.out
@@ -0,0 +1,4 @@
+Jan 1 jan 1
+Jan 2 jan 2
+Jan 3 jan 3
+Jan 4 jan 4
diff --git a/usr.bin/calendar/tests/regress.s1.out b/usr.bin/calendar/tests/regress.s1.out
new file mode 100644
index 000000000000..0fed38ba2486
--- /dev/null
+++ b/usr.bin/calendar/tests/regress.s1.out
@@ -0,0 +1,4 @@
+Dec 29 dec 29
+Dec 30 dec 30
+Dec 31 dec 31
+Jan 1 jan 1
diff --git a/usr.bin/calendar/tests/regress.s2.out b/usr.bin/calendar/tests/regress.s2.out
new file mode 100644
index 000000000000..65ab9c9c2733
--- /dev/null
+++ b/usr.bin/calendar/tests/regress.s2.out
@@ -0,0 +1,2 @@
+Dec 30 dec 30
+Dec 31 dec 31
diff --git a/usr.bin/calendar/tests/regress.s3.out b/usr.bin/calendar/tests/regress.s3.out
new file mode 100644
index 000000000000..0c6120786ad0
--- /dev/null
+++ b/usr.bin/calendar/tests/regress.s3.out
@@ -0,0 +1,2 @@
+Dec 31 dec 31
+Jan 1 jan 1
diff --git a/usr.bin/calendar/tests/regress.s4.out b/usr.bin/calendar/tests/regress.s4.out
new file mode 100644
index 000000000000..848976936398
--- /dev/null
+++ b/usr.bin/calendar/tests/regress.s4.out
@@ -0,0 +1,2 @@
+Jan 1 jan 1
+Jan 2 jan 2
diff --git a/usr.bin/calendar/tests/regress.sh b/usr.bin/calendar/tests/regress.sh
new file mode 100644
index 000000000000..248123ac5dac
--- /dev/null
+++ b/usr.bin/calendar/tests/regress.sh
@@ -0,0 +1,45 @@
+# $FreeBSD$
+
+CALENDAR_FILE="-f ${SRCDIR}/calendar.calibrate"
+CALENDAR_BIN="calendar"
+
+CALENDAR="${CALENDAR_BIN} ${CALENDAR_FILE}"
+
+REGRESSION_START($1)
+
+echo 1..28
+
+REGRESSION_TEST(`s1',`$CALENDAR -t 29.12.2006')
+REGRESSION_TEST(`s2',`$CALENDAR -t 30.12.2006')
+REGRESSION_TEST(`s3',`$CALENDAR -t 31.12.2006')
+REGRESSION_TEST(`s4',`$CALENDAR -t 01.01.2007')
+
+REGRESSION_TEST(`a1',`$CALENDAR -A 3 -t 28.12.2006')
+REGRESSION_TEST(`a2',`$CALENDAR -A 3 -t 29.12.2006')
+REGRESSION_TEST(`a3',`$CALENDAR -A 3 -t 30.12.2006')
+REGRESSION_TEST(`a4',`$CALENDAR -A 3 -t 31.12.2006')
+REGRESSION_TEST(`a5',`$CALENDAR -A 3 -t 01.01.2007')
+
+REGRESSION_TEST(`b1',`$CALENDAR -B 3 -t 31.12.2006')
+REGRESSION_TEST(`b2',`$CALENDAR -B 3 -t 01.01.2007')
+REGRESSION_TEST(`b3',`$CALENDAR -B 3 -t 02.01.2007')
+REGRESSION_TEST(`b4',`$CALENDAR -B 3 -t 03.01.2007')
+REGRESSION_TEST(`b5',`$CALENDAR -B 3 -t 04.01.2007')
+
+REGRESSION_TEST(`w0-1',`$CALENDAR -W 0 -t 28.12.2006')
+REGRESSION_TEST(`w0-2',`$CALENDAR -W 0 -t 29.12.2006')
+REGRESSION_TEST(`w0-3',`$CALENDAR -W 0 -t 30.12.2006')
+REGRESSION_TEST(`w0-4',`$CALENDAR -W 0 -t 31.12.2006')
+REGRESSION_TEST(`w0-5',`$CALENDAR -W 0 -t 01.01.2007')
+REGRESSION_TEST(`w0-6',`$CALENDAR -W 0 -t 02.01.2007')
+REGRESSION_TEST(`w0-7',`$CALENDAR -W 0 -t 03.01.2007')
+
+REGRESSION_TEST(`wn-1',`$CALENDAR -W 0 -t 28.12.2006')
+REGRESSION_TEST(`wn-2',`$CALENDAR -W 1 -t 28.12.2006')
+REGRESSION_TEST(`wn-3',`$CALENDAR -W 2 -t 28.12.2006')
+REGRESSION_TEST(`wn-4',`$CALENDAR -W 3 -t 28.12.2006')
+REGRESSION_TEST(`wn-5',`$CALENDAR -W 4 -t 28.12.2006')
+REGRESSION_TEST(`wn-6',`$CALENDAR -W 5 -t 28.12.2006')
+REGRESSION_TEST(`wn-7',`$CALENDAR -W 6 -t 28.12.2006')
+
+REGRESSION_END()
diff --git a/usr.bin/calendar/tests/regress.w0-1.out b/usr.bin/calendar/tests/regress.w0-1.out
new file mode 100644
index 000000000000..5bd407202318
--- /dev/null
+++ b/usr.bin/calendar/tests/regress.w0-1.out
@@ -0,0 +1 @@
+Dec 28 dec 28
diff --git a/usr.bin/calendar/tests/regress.w0-2.out b/usr.bin/calendar/tests/regress.w0-2.out
new file mode 100644
index 000000000000..66e70639ce56
--- /dev/null
+++ b/usr.bin/calendar/tests/regress.w0-2.out
@@ -0,0 +1 @@
+Dec 29 dec 29
diff --git a/usr.bin/calendar/tests/regress.w0-3.out b/usr.bin/calendar/tests/regress.w0-3.out
new file mode 100644
index 000000000000..03073eee3a4b
--- /dev/null
+++ b/usr.bin/calendar/tests/regress.w0-3.out
@@ -0,0 +1 @@
+Dec 30 dec 30
diff --git a/usr.bin/calendar/tests/regress.w0-4.out b/usr.bin/calendar/tests/regress.w0-4.out
new file mode 100644
index 000000000000..a14f6b68b2fa
--- /dev/null
+++ b/usr.bin/calendar/tests/regress.w0-4.out
@@ -0,0 +1 @@
+Dec 31 dec 31
diff --git a/usr.bin/calendar/tests/regress.w0-5.out b/usr.bin/calendar/tests/regress.w0-5.out
new file mode 100644
index 000000000000..1232b9b2d9ec
--- /dev/null
+++ b/usr.bin/calendar/tests/regress.w0-5.out
@@ -0,0 +1 @@
+Jan 1 jan 1
diff --git a/usr.bin/calendar/tests/regress.w0-6.out b/usr.bin/calendar/tests/regress.w0-6.out
new file mode 100644
index 000000000000..b3545a21bd9a
--- /dev/null
+++ b/usr.bin/calendar/tests/regress.w0-6.out
@@ -0,0 +1 @@
+Jan 2 jan 2
diff --git a/usr.bin/calendar/tests/regress.w0-7.out b/usr.bin/calendar/tests/regress.w0-7.out
new file mode 100644
index 000000000000..6449760481f6
--- /dev/null
+++ b/usr.bin/calendar/tests/regress.w0-7.out
@@ -0,0 +1 @@
+Jan 3 jan 3
diff --git a/usr.bin/calendar/tests/regress.wn-1.out b/usr.bin/calendar/tests/regress.wn-1.out
new file mode 100644
index 000000000000..5bd407202318
--- /dev/null
+++ b/usr.bin/calendar/tests/regress.wn-1.out
@@ -0,0 +1 @@
+Dec 28 dec 28
diff --git a/usr.bin/calendar/tests/regress.wn-2.out b/usr.bin/calendar/tests/regress.wn-2.out
new file mode 100644
index 000000000000..84a2b33a2969
--- /dev/null
+++ b/usr.bin/calendar/tests/regress.wn-2.out
@@ -0,0 +1,2 @@
+Dec 28 dec 28
+Dec 29 dec 29
diff --git a/usr.bin/calendar/tests/regress.wn-3.out b/usr.bin/calendar/tests/regress.wn-3.out
new file mode 100644
index 000000000000..7f027e59a8fe
--- /dev/null
+++ b/usr.bin/calendar/tests/regress.wn-3.out
@@ -0,0 +1,3 @@
+Dec 28 dec 28
+Dec 29 dec 29
+Dec 30 dec 30
diff --git a/usr.bin/calendar/tests/regress.wn-4.out b/usr.bin/calendar/tests/regress.wn-4.out
new file mode 100644
index 000000000000..ef3d71db5e57
--- /dev/null
+++ b/usr.bin/calendar/tests/regress.wn-4.out
@@ -0,0 +1,4 @@
+Dec 28 dec 28
+Dec 29 dec 29
+Dec 30 dec 30
+Dec 31 dec 31
diff --git a/usr.bin/calendar/tests/regress.wn-5.out b/usr.bin/calendar/tests/regress.wn-5.out
new file mode 100644
index 000000000000..c38c00b86cef
--- /dev/null
+++ b/usr.bin/calendar/tests/regress.wn-5.out
@@ -0,0 +1,5 @@
+Dec 28 dec 28
+Dec 29 dec 29
+Dec 30 dec 30
+Dec 31 dec 31
+Jan 1 jan 1
diff --git a/usr.bin/calendar/tests/regress.wn-6.out b/usr.bin/calendar/tests/regress.wn-6.out
new file mode 100644
index 000000000000..63c99fe44e6e
--- /dev/null
+++ b/usr.bin/calendar/tests/regress.wn-6.out
@@ -0,0 +1,6 @@
+Dec 28 dec 28
+Dec 29 dec 29
+Dec 30 dec 30
+Dec 31 dec 31
+Jan 1 jan 1
+Jan 2 jan 2
diff --git a/usr.bin/calendar/tests/regress.wn-7.out b/usr.bin/calendar/tests/regress.wn-7.out
new file mode 100644
index 000000000000..4b48f68101c3
--- /dev/null
+++ b/usr.bin/calendar/tests/regress.wn-7.out
@@ -0,0 +1,7 @@
+Dec 28 dec 28
+Dec 29 dec 29
+Dec 30 dec 30
+Dec 31 dec 31
+Jan 1 jan 1
+Jan 2 jan 2
+Jan 3 jan 3
diff --git a/usr.bin/leave/leave.1 b/usr.bin/leave/leave.1
index 919f9f7fbe5f..dd4f3d0d4a00 100644
--- a/usr.bin/leave/leave.1
+++ b/usr.bin/leave/leave.1
@@ -87,6 +87,8 @@ To get rid of
you should either log off or use
.Ql kill \-s KILL
giving its process id.
+.Sh SEE ALSO
+.Xr calendar 1
.Sh HISTORY
The
.Nm
diff --git a/usr.sbin/periodic/etc/daily/300.calendar b/usr.sbin/periodic/etc/daily/300.calendar
new file mode 100755
index 000000000000..cc12097162e5
--- /dev/null
+++ b/usr.sbin/periodic/etc/daily/300.calendar
@@ -0,0 +1,29 @@
+#!/bin/sh
+#
+# $FreeBSD$
+#
+# `calendar -a' needs to die. Why? Because it's a bad idea, particular
+# with networked home directories, but also in general. If you want the
+# output of `calendar' mailed to you, set up a cron job to do it,
+# or run it from your ~/.profile or ~/.login.
+#
+
+# If there is a global system configuration file, suck it in.
+#
+if [ -r /etc/defaults/periodic.conf ]
+then
+ . /etc/defaults/periodic.conf
+ source_periodic_confs
+fi
+
+case "$daily_calendar_enable" in
+ [Yy][Ee][Ss])
+ echo ""
+ echo "Running calendar:"
+
+ calendar -a && rc=0 || rc=3;;
+
+ *) rc=0;;
+esac
+
+exit $rc
diff --git a/usr.sbin/periodic/etc/daily/Makefile b/usr.sbin/periodic/etc/daily/Makefile
index 97e8ea355697..b65bc1310cb4 100644
--- a/usr.sbin/periodic/etc/daily/Makefile
+++ b/usr.sbin/periodic/etc/daily/Makefile
@@ -33,6 +33,10 @@ ACCTMODE= ${BINMODE}
ACCTPACKAGE= acct
.endif
+.if ${MK_CALENDAR} != "no"
+CONFS+= 300.calendar
+.endif
+
.if ${MK_MAIL} != "no"
CONFS+= 130.clean-msgs
.endif
diff --git a/usr.sbin/periodic/periodic.conf b/usr.sbin/periodic/periodic.conf
index d1c7bb274666..801733301318 100644
--- a/usr.sbin/periodic/periodic.conf
+++ b/usr.sbin/periodic/periodic.conf
@@ -77,6 +77,9 @@ daily_backup_passwd_enable="YES" # Backup passwd & group
# 210.backup-aliases
daily_backup_aliases_enable="YES" # Backup mail aliases
+# 300.calendar
+daily_calendar_enable="NO" # Run calendar -a
+
# 310.accounting
daily_accounting_enable="YES" # Rotate acct files
daily_accounting_compress="NO" # Gzip rotated files