Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP
Posting-Version: version B 2.10.2 9/18/84 exptools; site ihlpa.UUCP
Path: utzoo!watmath!clyde!burl!ulysses!mhuxr!mhuxn!ihnp4!ihlpa!rjh
From: rjh@ihlpa.UUCP (Randolph J. Herber)
Newsgroups: net.religion.jewish
Subject: Question about Jewish calendar
Message-ID: <711@ihlpa.UUCP>
Date: Tue, 2-Jul-85 18:23:39 EDT
Article-I.D.: ihlpa.711
Posted: Tue Jul 2 18:23:39 1985
Date-Received: Wed, 3-Jul-85 08:48:56 EDT
Distribution: net
Organization: AT&T Bell Laboratories
Lines: 253
Shalom!
I have enclosed with this item a proposed algorithm for converting
a Julian (on or before Oct 4, 1582) or Georgian (on or after Oct 15, 1582)
calendar date to the coresponding Jewish calendar date. I am asking
whether or not the algorithm does an accurate job.
Randolph J. Herber, ...ihnp4!ihlpa!rjh, 312-979-6553 (U.S.A.)
U.S.Mail address Amdahl Corp, C/O Room IH1C220, AT&T Bell Labs, Naperville, IL,
60566-1005
#include
#include
/*
This program writes a date (to stdout) according to the Jewish
Calendar. If no argument is specified, it calls a "ctime"
function to use today's date. Otherwise, it may be invoked
with 3 arguments -- month, day, year (4-digit negative for BC(E)).
*/
static char *copyright = {
"(C) 1985 Randolph J. Herber Usage is unrestricted with retention of notice."
};
#define TRUE 1
#define FALSE 0
static int mlen[] = {
0,31,28,31,30,31,30,31,31,30,31,30,31
};
static int jmlen[] = {
0,30,29,30,29,30,30,29,30,29,30,29,30,29
};
static char *mname[] = {
"",
"Tishri",
"Chshvn",
"Kislev",
"Tebet",
"Shebat",
"Adar",
"VeAdar",
"Nisan",
"Iyar",
"Sivan",
"Tammuz",
"Ab",
"Elul"
};
static short mdays[] = {
0, 354, 708, 1092,
1446, 1801, 2185, 2539,
2923, 3277, 3632, 4016,
4370, 4724, 5108, 5463,
5817, 6201, 6555
};
static short mparts[] = {
0, 9516, 19032, 16381,
25897, 9493, 6842, 16358,
13703, 23223, 6819, 4168,
13684, 23200, 20549, 4145,
13661, 11010, 20526
};
static short mtype[] = {
2, 1, 0, 2,
1, 0, 3, 0,
2, 1, 0, 2,
1, 0, 2, 1,
0, 3, 0
};
static long table1[4][9] = {
{0,15611,38880,64800, 83855,116640,145211,168480,181440},
{0, 3444,38880,55284,107124,116640,133044,168480,181440},
{0, 3444,36229,55284,107124,116640,123528,168480,181440},
{0, 3444,36229,55284,107124,116640,133044,168480,181440}
};
static short table2[2][9] = {
{1,3,2,2,3,1,3,1,0},
{1,3,2,1,3,1,3,1,0}
};
static short table3[] = {
1,1,2,4,4,6,6,1,0
};
static char *jkind1[] = {
"", "defective", "normal", "complete"
};
static char *jkind2[] = {
"", " leap"
};
main(argc,argv)
int argc;
char **argv;
{
long secs, time();
struct tm *tbuf, *localtime();
void exit();
int year, yr, mo, da, unit(), jyr, jcycle;
long jdate, jpart, jday, jarg, jstart;
short yrm1, n, jyear;
char style, leap, jtype, jleap;
if (argc > 1 && argc != 4) {
(void) printf("Usage: No arguments for today's date,");
(void) printf(" or '%s '.\n", *argv);
(void) exit(1);
}
else if (argc == 1) {
secs = time((long *)0);
tbuf = localtime(&secs);
mo = tbuf->tm_mon + 1;
da = tbuf->tm_mday;
year = tbuf->tm_year + 1900;
}
else {
mo = atoi(argv[1]);
da = atoi(argv[2]);
year = atoi(argv[3]);
}
if (year != 0 && year >= -3761 && year < 10000) {
yr = year > 0 ? year : year + 1;
style = year > 1582;
leap = style
? (((yr % 4) == 0) && ((yr % 100) != 0)) ||
((yr % 400) == 0)
: ((yr % 4) == 0);
mlen[2] = leap ? 29 : 28;
if (mo >=1 && mo <= 12 && da >= 1 && da <= mlen[mo] &&
!(year == 1582 && (mo == 1 || mo == 2 ||
(mo == 10 && da >= 5 && da <= 14)))) {
if (year == 1582 && mo == 10) {
mlen[10] = 21;
if (da >= 15) da -= 10;
} else {
mlen[10] = 31;
}
yrm1 = yr - 1;
jdate = 1721423l+yrm1*365+unit(yrm1,4)+da;
for (n=1;n