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