ostern.c revision 15737
144301Swollman/* 244301Swollman * Copyright (c) 1995 Wolfram Schneider. Public domain. 344301Swollman * 444301Swollman * $Id: ostern.c,v 1.3 1996/05/10 17:32:05 ache Exp $ 544301Swollman*/ 644301Swollman 744301Swollman#include <stdio.h> 844301Swollman#include <stdlib.h> 944301Swollman#include <string.h> 1044301Swollman#include <time.h> 1144301Swollman 1244301Swollman#include "calendar.h" 1344301Swollman 1444301Swollman/* return year day for Easter */ 1544301Swollman 1644301Swollmanint easter (year) 1744301Swollman int year; /* 0 ... abcd, NOT since 1900 */ 1844301Swollman{ 1944301Swollman 2044301Swollman int e_a, e_b, e_c, e_d, e_e,e_f, e_g, e_h, e_i, e_k, 2144301Swollman e_l, e_m, e_n, e_p, e_q; 2244301Swollman 2344301Swollman /* silly, but it works */ 2444301Swollman e_a = year % 19; 2544301Swollman e_b = year / 100; 2644301Swollman e_c = year % 100; 2744301Swollman 2844301Swollman e_d = e_b / 4; 2944301Swollman e_e = e_b % 4; 3044301Swollman e_f = (e_b + 8) / 25; 3144301Swollman e_g = (e_b + 1 - e_f) / 3; 3244301Swollman e_h = ((19 * e_a) + 15 + e_b - (e_d + e_g)) % 30; 3344301Swollman e_i = e_c / 4; 3444301Swollman e_k = e_c % 4; 3544301Swollman e_l = (32 + 2 * e_e + 2 * e_i - (e_h + e_k)) % 7; 3644301Swollman e_m = (e_a + 11 * e_h + 22 * e_l) / 451; 3744301Swollman e_n = (e_h + e_l + 114 - (7 * e_m)) / 31; 3844301Swollman e_p = (e_h + e_l + 114 - (7 * e_m)) % 31; 3944301Swollman e_p = e_p + 1; 4044301Swollman 4144301Swollman e_q = 31 + 28; 4244301Swollman 4344301Swollman if (e_k == 0 && e_c != 0) 4444301Swollman e_q += 1; 4544301Swollman 4644301Swollman if (e_n == 4) 4744301Swollman e_q += 31; 4844301Swollman 4944301Swollman e_q += e_p; 5044301Swollman 5144301Swollman#if DEBUG 5244301Swollman 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); 5344301Swollman#endif 5444301Swollman 5544301Swollman return (e_q); 5644301Swollman} 5744301Swollman 5844301Swollman/* return year day for Easter or easter depending days 5984211Sdillon * Match: Easter([+-][0-9]+)? 6084211Sdillon * e.g: Easter-2 is Good Friday (2 days before Easter) 6184211Sdillon */ 6244301Swollman 6344301Swollmanint 6444301Swollmangeteaster(s, year) 6544310Smjacob char *s; 6644301Swollman int year; 6744301Swollman{ 6844301Swollman register int offset = 0; 6944301Swollman extern struct fixs neaster; 7044301Swollman 7144301Swollman#define EASTER "easter" 7244301Swollman#define EASTERNAMELEN (sizeof(EASTER) - 1) 7344301Swollman 7444301Swollman if (strncasecmp(s, EASTER, EASTERNAMELEN) == 0) 7544301Swollman s += EASTERNAMELEN; 7644301Swollman else if ( neaster.name != NULL 7744301Swollman && strncasecmp(s, neaster.name, neaster.len) == 0 7844301Swollman ) 7944301Swollman s += neaster.len; 8044301Swollman else 8144301Swollman return(0); 8244301Swollman 8344301Swollman#if DEBUG 8444301Swollman printf("%s %d %d\n", s, year, EASTERNAMELEN); 8544301Swollman#endif 8644301Swollman 8744301Swollman /* Easter+1 or Easter-2 8844301Swollman * ^ ^ */ 8944301Swollman 9044301Swollman switch(*s) { 9144301Swollman 9244301Swollman case '-': 9344301Swollman case '+': 9444301Swollman offset = atoi(s); 9544301Swollman break; 9644301Swollman 9744301Swollman default: 9844301Swollman offset = 0; 9944301Swollman } 10044301Swollman 10144301Swollman return (easter(year) + offset); 10244301Swollman} 10344301Swollman