paskha.c revision 15714
115714Sache/* 215714Sache * Copyright (C) 1993-1996 by Andrey A. Chernov, Moscow, Russia. 315714Sache * All rights reserved. 415714Sache * 515714Sache * Redistribution and use in source and binary forms, with or without 615714Sache * modification, are permitted provided that the following conditions 715714Sache * are met: 815714Sache * 1. Redistributions of source code must retain the above copyright 915714Sache * notice, this list of conditions and the following disclaimer. 1015714Sache * 2. Redistributions in binary form must reproduce the above copyright 1115714Sache * notice, this list of conditions and the following disclaimer in the 1215714Sache * documentation and/or other materials provided with the distribution. 1315714Sache * 1415714Sache * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND 1515714Sache * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1615714Sache * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 1715714Sache * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 1815714Sache * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 1915714Sache * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2015714Sache * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2115714Sache * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2215714Sache * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2315714Sache * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2415714Sache * SUCH DAMAGE. 2515714Sache */ 2615714Sache 2715714Sache#include <stdlib.h> 2815714Sache#include <string.h> 2915714Sache 3015714Sache#define PASKHA "paskha" 3115714Sache#define PASKHALEN (sizeof(PASKHA) - 1) 3215714Sache 3315714Sache/* KOI8-R encoding, needed to fully handle Russian case */ 3415714Sache#define PASKHA1 "�����" 3515714Sache#define PASKHALEN1 (sizeof(PASKHA1) - 1) 3615714Sache 3715714Sacheextern int *cumdays; 3815714Sache 3915714Sache/* return year day for Orthodox Easter using Gauss formula */ 4015714Sache/* (old style result) */ 4115714Sache 4215714Sachestatic int 4315714Sachepaskha (R) 4415714Sacheint R; /*year*/ 4515714Sache{ 4615714Sache int a, b, c, d, e; 4715714Sache static int x = 15; 4815714Sache static int y = 6; 4915714Sache 5015714Sache a = R % 19; 5115714Sache b = R % 4; 5215714Sache c = R % 7; 5315714Sache d = (19*a + x) % 30; 5415714Sache e = (2*b + 4*c + 6*d + y) % 7; 5515714Sache return ((cumdays[2/*feb*/] + 22/*mar*/) + (d + e)); 5615714Sache} 5715714Sache 5815714Sache/* return year day for Orthodox Easter depending days */ 5915714Sache 6015714Sacheint 6115714Sachegetpaskha(s, year) 6215714Sache char *s; 6315714Sache int year; 6415714Sache{ 6515714Sache int offset; 6615714Sache 6715714Sache if (strncasecmp(s, PASKHA, PASKHALEN) == 0) 6815714Sache s += PASKHALEN; 6915714Sache else if (strncasecmp(s, PASKHA1, PASKHALEN1) == 0) 7015714Sache s += PASKHALEN1; 7115714Sache else 7215714Sache return 0; 7315714Sache 7415714Sache 7515714Sache /* Paskha+1 or Paskha-2 7615714Sache * ^ ^ */ 7715714Sache 7815714Sache switch(*s) { 7915714Sache 8015714Sache case '-': 8115714Sache case '+': 8215714Sache offset = atoi(s); 8315714Sache break; 8415714Sache 8515714Sache default: 8615714Sache offset = 0; 8715714Sache break; 8815714Sache } 8915714Sache 9015714Sache return (paskha(year) + offset + 13/* new style */); 9115714Sache} 92