summaryrefslogtreecommitdiffstats
path: root/usr.bin/calendar/ostern.c
diff options
context:
space:
mode:
authorwosch <wosch@FreeBSD.org>1996-02-02 06:02:41 +0000
committerwosch <wosch@FreeBSD.org>1996-02-02 06:02:41 +0000
commitf351e4d35ed659e670f8cf3293f0d200f3a55f4a (patch)
treeec2d23fe6eecf6aeec0846f3362a3c6b9b008c8d /usr.bin/calendar/ostern.c
parent358b3e4f0569f8e4483911ea62556cdc998a72a5 (diff)
downloadFreeBSD-src-f351e4d35ed659e670f8cf3293f0d200f3a55f4a.zip
FreeBSD-src-f351e4d35ed659e670f8cf3293f0d200f3a55f4a.tar.gz
- handle events that move around from year to year, i.e.,
``the last Monday in April' - handle easter new options -f calendarfile -A days -B days Calendar HOME directory ~/.calendar don't sent mail if ~/.calendar/nomail exist
Diffstat (limited to 'usr.bin/calendar/ostern.c')
-rw-r--r--usr.bin/calendar/ostern.c94
1 files changed, 94 insertions, 0 deletions
diff --git a/usr.bin/calendar/ostern.c b/usr.bin/calendar/ostern.c
new file mode 100644
index 0000000..06e843b
--- /dev/null
+++ b/usr.bin/calendar/ostern.c
@@ -0,0 +1,94 @@
+/*
+ * Copyright (c) 1995 Wolfram Schneider. Public domain.
+ *
+ * $Id: ostern.c,v 1.2 1996/02/01 13:05:12 wosch Exp $
+*/
+
+#include <string.h>
+
+/* return year day for Easter */
+
+int easter (year)
+ int year; /* 0 ... abcd, NOT since 1900 */
+{
+
+ int e_a, e_b, e_c, e_d, e_e,e_f, e_g, e_h, e_i, e_k,
+ e_l, e_m, e_n, e_p, e_q;
+
+ /* silly, but it works */
+ e_a = year % 19;
+ e_b = year / 100;
+ e_c = year % 100;
+
+ e_d = e_b / 4;
+ e_e = e_b % 4;
+ e_f = (e_b + 8) / 25;
+ e_g = (e_b + 1 - e_f) / 3;
+ e_h = ((19 * e_a) + 15 + e_b - (e_d + e_g)) % 30;
+ e_i = e_c / 4;
+ e_k = e_c % 4;
+ e_l = (32 + 2 * e_e + 2 * e_i - (e_h + e_k)) % 7;
+ e_m = (e_a + 11 * e_h + 22 * e_l) / 451;
+ e_n = (e_h + e_l + 114 - (7 * e_m)) / 31;
+ e_p = (e_h + e_l + 114 - (7 * e_m)) % 31;
+ e_p = e_p + 1;
+
+ e_q = 31 + 28;
+
+ if (e_k == 0 && e_c != 0)
+ e_q += 1;
+
+ if (e_n == 4)
+ e_q += 31;
+
+ e_q += e_p;
+
+#if DEBUG
+ printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d\n", e_a , e_b , e_c , e_d , e_e , e_f , e_g , e_h , e_i , e_k , e_l , e_m , e_n , e_p , e_q);
+#endif
+
+ return (e_q);
+}
+
+/* return year day for Easter or easter depending days
+ * Match: Easter([+-][0-9]+)?
+ * e.g: Easter-2 is Good Friday (2 days before Easter)
+ */
+
+int
+geteaster(s, year)
+ char *s;
+ int year;
+{
+ register int offset = 0;
+
+#define EASTER "easter"
+#define EASTERNAMELEN (sizeof(EASTER) - 1)
+
+ /* no easter */
+ if (strncasecmp(s, EASTER, EASTERNAMELEN))
+ return(0);
+
+#if DEBUG
+ printf("%s %d %d\n", s, year, EASTERNAMELEN);
+#endif
+
+ /* Easter+1 or Easter-2
+ * ^ ^ */
+
+ switch(*(s + EASTERNAMELEN)) {
+
+ case '-':
+ offset = -(atoi(s + EASTERNAMELEN + 1));
+ break;
+
+ case '+':
+ offset = atoi(s + EASTERNAMELEN + 1);
+ break;
+
+ default:
+ offset = 0;
+ }
+
+ return (easter(year) + offset);
+}
OpenPOWER on IntegriCloud