| The programs I entered here a while back seem to have "gone away".
I'll post them one more time.
YERTZ.C is a program for generating an 80 year yertzite calendar.
it is also useful for future birthdays, anniversaries, and
holidays. Here is a quick cookbook method to get this program to
run.
Use the following commands to compile and link the program.
$ cc yertz
$ link yertz,sys$library:vaxcrtl/lib
Add the following symbol to your login.com. Don't forget the $
before the disk name.
YERTZ :== $yourdisk:[yourdirectory]yertz
Run your login.com file.
Run the program by typing...
yertz mm dd yyyy
mm is the month
dd is the day
yyyy is the year
For example enter yertz 02 15 1987 for Feb 15, 1987. If
you do not enter a date the default will be todays date. There
is additional information in the program listing. Have fun.
-----------------------< cut here >-----------------------
#include <stdio.h>
#include <time.h>
/*
This program writes a 80-year 'Yahrzeit' table (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)).
*/
/*
The rules for the case that the event occurs on the 30th of Chshvn or Kislev
were obtained from 'A Guide to Jewish Practice' by Rabbi Isaac Klein and
from a conversation with Rabbi Eliahv Soloveichik of the Chicago, IL, area.
*/
static char *copyright = {
"(C) 1986 Randolph J. Herber Usage is unrestricted with retention of notice."
};
#define TRUE 1
#define FALSE 0
extern void exit();
static char *program;
static char msg1[] = "%s: Internal error (%d)\n";
static char msg2[] = "%s: Can not setup %s year (%d)\n";
static char Jewish[] = "Jewish";
static char Common[] = "Common";
static char *dname[] = {
"Sunday",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday"
};
static int cyear, cstyle, cleap;
static int cmln[] = {
0,31,28,31,30,31,30,31,31,30,31,30,31
};
static char *cmname[] = {
"",
"January",
"February",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"October",
"November",
"December"
};
static int jyear, jtype, jleap, jrhdow, jpdow;
static int jmln[] = {
0,30,29,30,29,30,30,29,30,29,30,29,30,29
};
static char *jmname[] = {
"",
"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 *jtx1[] = {
"", "defective", "normal", "complete"
};
static char *jtx2[] = {
"", " leap"
};
int unit(f1,f2)
int f1, f2;
{
int rmdr;
rmdr = f1 % f2;
if (rmdr < 0) rmdr += f2;
return (f1 - rmdr) / f2;
}
long lunit(f1,f2)
long f1, f2;
{
long rmdr;
rmdr = f1 % f2;
if (rmdr < 0) rmdr += f2;
return (f1 - rmdr) / f2;
}
int rmdr(f1,f2)
int f1, f2;
{
int rmdrx;
rmdrx = f1 % f2;
if (rmdrx < 0) rmdrx += f2;
return rmdrx;
}
long lrmdr(f1,f2)
long f1, f2;
{
long rmdrx;
rmdrx = f1 % f2;
if (rmdrx < 0) rmdrx += f2;
return rmdrx;
}
static int ca(year,month,day,jdcommon)
int year, month, day;
long *jdcommon;
{
int yr, yrm1, n;
*jdcommon = 0;
if (year != 0 && year >= -3761 && year < 10000) {
yr = year > 0 ? year : year + 1;
cstyle = year > 1582;
cleap = cstyle
? (((yr % 4) == 0) && ((yr % 100) != 0)) ||
((yr % 400) == 0)
: ((yr % 4) == 0);
cmln[2] = cleap ? 29 : 28;
if (month>=1 && month<=12 && day>=1 && day<=cmln[month] &&
!(year==1582 && month==10 && day>=5 && day<=14)) {
if (year == 1582 && month == 10) {
cmln[10] = 21;
if (day >= 15) day -= 10;
} else {
cmln[10] = 31;
}
yrm1 = yr - 1;
*jdcommon = 1721423l+yrm1*365+unit(yrm1,4)+day;
for (n=1;n<month;++n) {
*jdcommon += cmln[n];
}
if (cstyle) {
*jdcommon -= 10 +
(yrm1-1500)/100 - (yrm1-1200)/400;
}
cyear = year;
return 0;
} else
return 1;
} else
return 2;
}
static int ja(year,month,day,jdjewish)
int year, month, day;
long *jdjewish;
{
long jparts, days, jarg, jwork;
int jyr;
int jcycle, n;
*jdjewish = 0;
jtype = 0;
jleap = 0;
jrhdow = 0;
jpdow = 0;
if (year < 1 || (year==1 && (month<13 || (month==13 && day<25))))
return 2;
if (year > 13760)
return 2;
jyr = year - 1;
jcycle = unit(jyr,19);
year = rmdr(jyr,19);
jtype = mtype[year];
jleap = jtype == 0;
jparts = 17875l*jcycle+mparts[year]+25044l;
days = lunit(jparts,25920l);
jparts -= days * 25920l;
days += 6939l*jcycle+mdays[year]+347998l;
jarg = lrmdr(days,7l)*25920l+jparts;
for(n=0;n<=7;++n) {
if (table1[jtype][n]<=jarg &&
jarg<table1[jtype][n+1]) break;
}
jtype = table2[jleap][n];
jwork = days+lrmdr(2l+table3[n]-days,7l)-3l;
switch (jtype) {
case 1: jmln[2] = 29; jmln[3] = 29; break;
case 2: jmln[2] = 29; jmln[3] = 30; break;
case 3: jmln[2] = 30; jmln[3] = 30; break;
default:
(void) printf(msg1, program, 1);
(void) exit(3);
break;
}
if (jleap) {
jmln[6] = 30;
jmln[7] = 29;
} else {
jmln[6] = 29;
jmln[7] = 0;
}
if (month==7 && !jleap)
month = 6;
if (month<1 || month>13 || day<1 || day>jmln[month])
return 1;
jrhdow = lrmdr(jwork+1l,7l);
jpdow = lrmdr(jwork+
jmln[1]+jmln[2]+jmln[3]+jmln[4]+jmln[5]+jmln[6]+jmln[7]+15l,7l);
for(n=1; n<month; ++n)
jwork += jmln[n];
*jdjewish = jwork+day-1;
jyear = year;
return 0;
}
main(argc,argv)
int argc;
char **argv;
{
long secs, time();
struct tm *tbuf, *localtime();
int yr, mo, da, jyr, jmo, jda, wjmo, wjda;
long jdcommon, jdjewish, junk;
int n, delay = 1;
char text[80];
char up = FALSE;
program = *argv;
if (!((argc == 1) ||
(argc == 2 && argv[1][0] == '-') ||
(argc == 4 && argv[1][0] != '-') ||
(argc == 5 && argv[1][0] == '-'))) {
(void) printf("Usage: %s [-<n>] [<mo> <da> <yr>]\n", program);
(void) printf(" <n> (default is 1)\n");
(void) printf(" years to first observation\n");
(void) printf(" <mo> <da> <yr> (default is today)\n");
(void) printf(" common date of initial event\n");
(void) exit(1);
}
if (argc == 2 || argc == 5) {
delay = atoi(argv[1]+1);
if (delay < 0)
delay = 0;
--argc;
++argv;
}
if (argc == 1) {
secs = time((long *)0);
tbuf = localtime(&secs);
mo = tbuf->tm_mon + 1;
da = tbuf->tm_mday;
yr = tbuf->tm_year + 1900;
}
else {
mo = atoi(argv[1]);
da = atoi(argv[2]);
yr = atoi(argv[3]);
}
if (!ca(yr,mo,da,&jdcommon)) {
if (jdcommon < 348348) {
(void) printf("%s: Date of range!\n",program);
(void) exit(2);
}
jyr = yr + 3762;
do {
--jyr;
if(ja(jyr,1,1,&jdjewish)) {
(void) printf(msg2, program, Jewish, 1);
(void) exit(4);
}
} while (jdjewish > jdcommon);
jda = (jdcommon-jdjewish)+1;
for(jmo=1; jmo<=13 && jda>jmln[jmo]; ++jmo)
jda -= jmln[jmo];
if(jmo>13) {
(void) printf(msg1, program, 2);
(void) exit(3);
}
if(ja(jyr,jmo,jda,&jdjewish)) {
(void) printf(msg2, program, Jewish, 2);
(void) exit(4);
}
(void) sprintf(text,"%s, %d %s %d %.2s %s%s %.2s",
dname[lrmdr(jdjewish+1l,7l)],
jda,jmname[jmo],jyr,
dname[jrhdow],
jtx1[jtype],jtx2[jleap],
dname[jpdow]);
yr = jyr - 3759;
do {
--yr;
if(ca(yr,1,1,&jdcommon)) {
(void) printf(msg2, program, Common, 1);
(void) exit(4);
}
} while (jdcommon > jdjewish);
da = (jdjewish-jdcommon)+1;
for(mo=1; mo<=12 && da>cmln[mo]; ++mo)
da -= cmln[mo];
if(mo>12) {
(void) printf(msg1, program, 3);
(void) exit(3);
}
(void) printf("Event:\t%-47.47s %s %d, %d %s\n\n",
text,cmname[mo],da,yr,jtx2[cleap]);
if (jda == 30 && (jmo == 2 || jmo == 3 || jmo == 6)) {
if (delay) {
switch(ja(jyr+delay,jmo,jda,&junk)) {
case 0:
up = TRUE;
break;
case 1:
jda = 29;
break;
case 2:
(void) printf(msg2, program, Jewish, 3);
(void) exit(4);
break;
default:
(void) printf(msg1, program, 4);
(void) exit(3);
break;
}
} else {
up = TRUE;
}
}
for(n=delay?delay:1, jyr += n; n<=80; ++n, ++jyr) {
wjmo = jmo;
wjda = jda;
if(ja(jyr,jmo,jda,&jdjewish)) {
if (up && jda == 30)
if(jmo == 2 || jmo == 3) {
wjmo += 1;
wjda = 1;
if(ja(jyr,wjmo,wjda,
&jdjewish)) {
(void) printf(msg2,
program,
Jewish, 4);
(void) exit(4);
}
} else if (jmo = 6) {
wjmo += 2;
wjda = 1;
if(ja(jyr,wjmo,wjda,
&jdjewish)) {
(void) printf(msg2,
program,
Jewish, 5);
(void) exit(4);
}
} else {
(void) printf(msg2,
program, Jewish, 6);
(void) exit(4);
}
else {
(void) printf(msg2, program, Jewish, 7);
(void) exit(4);
}
}
if(!jleap&&wjmo==7)
--wjmo;
(void) sprintf(text,
"%s, %d %s %d %.2s %s%s %.2s",
dname[lrmdr(jdjewish+1l,7l)],
wjda,jmname[wjmo],jyr,
dname[jrhdow],
jtx1[jtype],jtx2[jleap],
dname[jpdow]);
yr = jyr - 3759;
do {
--yr;
if(ca(yr,1,1,&jdcommon)) {
(void) printf(msg2, program, Common, 2);
(void) exit(4);
}
} while (jdcommon > jdjewish);
da = (jdjewish-jdcommon)+1;
for(mo=1; mo<=12 && da>cmln[mo]; ++mo)
da -= cmln[mo];
if(mo>12) {
(void) printf(msg1, program, 5);
(void) exit(3);
}
(void) printf("+%d\t%-47.47s %s %d, %d %s\n",
n,text,cmname[mo],da,yr,jtx2[cleap]);
}
(void) exit(0);
} else {
(void) printf("%s: Invalid date!\n",program);
(void) exit(2);
}
return 0;
}
|
| HCAL is a calandar program for giving a Hebrew date for the
corresponding date. Here is a quick cookbook method to get
this program to run.
Use the following commands to compile and link the program.
$ cc hcal
$ link hcal,sys$library:vaxcrtl/lib
Add the following symbol to your login.com. Don't forget the $
before the disk name.
HCAL :== $yourdisk:[yourdirectory]hcal
Run your login.com file.
Run the program by typing...
hcal mm dd yyyy
mm is the month
dd is the day
yyyy is the year
For example enter hcal 02 15 1987 for Feb 15, 1987.
If you do not enter a date the default will be the current
date.
Some of the terms that asre printed with the date are explained
in note #197.18.
---------------------------< cut here >-------------------------
#endif
#include <stdio.h>
#include <time.h>
#ifdef vms
#include errno
#include ssdef
#include stsdef
#define IO_SUCCESS (SS$_NORMAL | STS$M_INHIB_MSG)
#define IO_ERROR (SS$_ABORT)
#endif
#ifndef IO_SUCCESS
#define IO_SUCCESS 0 /* Normal exit */
#define IO_ERROR 1 /* Error exit */
#endif
/*
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 <mo> <da> <yr>'.\n", *argv);
(void) exit(IO_ERROR);
}
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<mo;++n) {
jdate += mlen[n];
}
if (style) {
jdate -= 10 + (yrm1-1500)/100 - (yrm1-1200)/400;
}
if (jdate < 347998) {
(void) printf("%s: Date of range!\n",*argv);
(void) exit(IO_ERROR);
}
jyr = yr + 3761;
do {
jyr -= 1;
jcycle = unit(jyr,19);
jyear = rmdr(jyr,19);
jtype = mtype[jyear];
jleap = jtype == 0;
jpart = 17875l*jcycle+mparts[jyear]+25044l;
jday = lunit(jpart,25920l);
jpart -= jday * 25920l;
jday += 6939l*jcycle+mdays[jyear]+347998l;
jarg = lrmdr(jday,7l)*25920l+jpart;
for(n=0;n<=7;++n) {
if (table1[jtype][n]<=jarg &&
jarg<table1[jtype][n+1]) break;
}
jtype = table2[jleap][n];
jstart = jday+lrmdr(2l+table3[n]-jday,7l)-3l;
} while (jdate < jstart);
jyr += 1;
jday = (jdate - jstart) + 1;
switch (jtype) {
case 1: jmlen[3] = 29; break;
case 2: break;
case 3: jmlen[2] = 30; break;
default:
printf("%s: Internal error 1\n",*argv);
exit(IO_ERROR);
break;
}
if (!jleap) {
mname[7] = mname[6];
mname[6] = mname[0];
jmlen[6] = 0;
}
for(n=1;n<=13;++n) {
if(jday<=jmlen[n]) break;
jday -= jmlen[n];
}
(void) printf("%s %d, %d %s%s\n",
mname[n],jday,jyr,
jkind1[jtype],jkind2[jleap]);
(void) exit(IO_SUCCESS);
} else {
(void) printf("%s: Invalid date!\n",*argv);
(void) exit(IO_ERROR);
}
}
(void) printf("%s: Date out of range!\n",*argv);
(void) exit(IO_ERROR);
}
int unit(f1,f2)
int f1, f2;
{
int rmdr;
rmdr = f1 % f2;
if (rmdr < 0) rmdr += f2;
return (f1 - rmdr) / f2;
}
long lunit(f1,f2)
long f1, f2;
{
long rmdr;
rmdr = f1 % f2;
if (rmdr < 0) rmdr += f2;
return (f1 - rmdr) / f2;
}
int rmdr(f1,f2)
int f1, f2;
{
int rmdrx;
rmdrx = f1 % f2;
if (rmdrx < 0) rmdrx += f2;
return rmdrx;
}
long lrmdr(f1,f2)
long f1, f2;
{
long rmdrx;
rmdrx = f1 % f2;
if (rmdrx < 0) rmdrx += f2;
return rmdrx;
}
|
| LUNCAL is a calandar program for giving a Hebrew date for the
corresponding date. Here is a quick cookbook method to get
this program to run.
Use the following commands to compile and link the program.
$ cc luncal
$ link luncal,sys$library:vaxcrtl/lib
Add the following symbol to your login.com. Don't forget the $
before the disk name.
LCAL :== $yourdisk:[yourdirectory]luncal
Run your login.com file.
Run the program by typing...
lcal yyyy mm dd
yyyy is the year
mm is the month
dd is the day
For example enter lcal 1987 02 15 for Feb 15, 1987.
There is no default. You must enter a date.
-----------------------< cut here >-----------------------
#ifdef comment
>From floyd!trb Wed Oct 20 17:31:27 1982
To: rabbit!smb
Subject: REAL hebcal.c
>From harpo!alice!adw Tue Aug 17 10:45:55 1982
Date: Tue Aug 17 10:44:39 1982
Status: R
#endif
/* This program accepts a Gregorian date (yr mon date) and produces the*/
/*equivilant Hebrew date, input from command line*/
#include <stdio.h>
main(c,v)
int c;
char *v[];
{int y,m,d;
if(c != 4){
fprintf(stderr,"usage: %s yyyy mm dd\n",v[0]);
exit(1);
}
sscanf(v[1],"%d",&y);
sscanf(v[2],"%d",&m);
sscanf(v[3],"%d",&d);
greg_heb(y,m,d);
}
int daysinh[6][14] ={
{0,30,29,29,29,30,29,30,29,30,29,30,29},
{0,30,29,30,29,30,29,30,29,30,29,30,29},
{0,30,30,30,29,30,29,30,29,30,29,30,29},
{0,30,29,29,29,30,30,29,30,29,30,29,30,29},
{0,30,29,30,29,30,30,29,30,29,30,29,30,29},
{0,30,30,30,29,30,30,29,30,29,30,29,30,29}
};
int daysing[2][12] ={
{30,31,30,31,31,28,31,30,31,30,31,31},
{30,31,30,31,31,29,31,30,31,30,31,31}
};
char *nameh[2][14] = {
{"Tishri", "Heshvan", "Kislev", "Tevet", "Shevat", "Adar", "Nisan",
"Iyyar", "Sivan", "Tammuz", "Av", "Elul","Elul"},
{"Tishri", "Heshvan", "Kislev", "Tevet", "Shevat", "Adar I", "Adar II",
"Nisan", "Iyyar", "Sivan", "Tammuz", "Av", "Elul", "Elul"}
};
greg_heb(gyr, gmo, gdate)
int gyr,gmo,gdate;
{int rhgr0, rhgr1, rh(), t1, t, type, gdayno, useleap, flag;
int hyr,hmo, hdate, septdate,septmon;
hyr = (gmo < 9)? gyr -1 :gyr; /*Greg. yr of RH*/
type = 0;
rhgr0 = rh(hyr); /*Sept x of RH*/
if(gmo == 9 && gdate < rhgr0) { /*check if date is before RH*/
flag = 1;
hyr = gyr +3760;
hmo = 13; /*Elul is also 14th month */
hdate = 30 - (rhgr0 -gdate);
}
else if(gmo == 10 && gdate +30 < rhgr0){
flag = 1;
hyr = gyr +3760;
hmo = 13;
hdate = 30 - (rhgr0 -gdate -30);
}
else {
useleap = 0;
if(((hyr+1)%400==0)||(((hyr+1)%4 ==0)&& ((hyr+1)%100 !=0))) useleap = 1;
septdate = gdate; /*no. of days from Sept 0*/
septmon = (gmo > 8) ? (gmo -9): gmo +3; /*ie Sept is mon0 */
while( septmon > 0)
septdate = daysing[useleap][--septmon] + septdate;
rhgr1 = rh(hyr +1); /*Sept x of next RH*/
t= rhgr1 - rhgr0 + useleap;
if(t == -12) type = 0;
if(t == -11) type = 1;
if(t == -10) type = 2; /*Type of year: 12 months is 0-2*/
if(t == 18) type = 3; /*13 months is 3-5*/
if(t == 19) type = 4;
if(t == 20) type = 5;
hyr = hyr + 3761;
hmo = 1;
hdate = septdate - rhgr0 + 1;
while(hdate > daysinh[type][hmo])
hdate = hdate - daysinh[type][hmo++];
}
t1 = (type <3) ? 0 : 1;
printf("%d %s %d\n", hyr, nameh[t1][hmo-1], hdate);
}
rh(y)
int y;
{int day,x,n2,g;
float fraction,n1;
g = (y%19) +1; /*g = "golden number"*/
n1 = y/100.0 -y/400.0 -2.0 +(765433.0/492480.0)*((12*g)%19) +(y%4)/4.0
-(313.0*y + 89091.0)/98496.0;
n2 = n1; /*this is 'N' in Conway's formula */
day = dayofwk(y-2000,7,n2);
fraction = n1 -n2;
x = (12 * g)%19;
if(day == 1 || day == 4 || day == 6)
{n2 = n1 +1;
day = day +1;
}
else {
if(day == 3 && (fraction >=(1367.0/2160.0)) && x >6)
{day = 5; n2 = n2 +2; }
if(day == 2 && (fraction >= (23269.0/25920.0)) && x >11)
{day = 3; n2 = n2 +1; }
}
return(n2);
}
/*This subroutine computes the day of week of the unadjusted RH */
/*The month is reduced by 2- ie September is the 7th month */
int daysin[] = {
0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 31, 29
};
dayofwk(yr, mon, date)
int yr, mon, date;
{
int dayofyr, offset, x, y;
if(mon <= 0) mon = mon +12;
if(mon==12 || mon == 11) yr = yr -1;
dayofyr = date;
while(mon >1)
dayofyr = daysin[--mon] + dayofyr;
x = (yr < 0) ? 1 : 0 ; /*adjust for 2000 a leap year*/
y = (dayofyr + yr -x +(yr+x)/4 - (yr+x)/100 + (yr+x)/400 +3)%7;
offset = (y >= 0) ? y : y + 7; /*get remainder into [0,6]*/
return(offset);
}
|
| /*
The program HCAL.C has a couple of minor problems with it, however
these can be easily fixed - by minor problems, I mean with regard
to getting a successful compilation - not with regard to the historical
accuracy or theolical accuracy, which I have no way of checking.
All three of these programs (including HCAL.C when fixed as shown
below) will compile using Microsoft C V5.1, and will therefore run
quite nicely under MSDOS.
The following are the errors which were fixed to compile HCAL.C
using MSC 5.1 (note that YERTZ.C and LCAL.C were OK as is):
1. remove the endif statement just after the line --< cut here >--
2. move the functions from the end of the program, which are
unit, lunit, rmdr, and lrmdr so that they are placed just
before the function main() which calls them. Otherwise you
get function redefinition errors with MSC.
For those who may be somewhat unfamiliar with this process, I will
post the new version of HCAL.C here. If anyone wishes the MSDOS
executable files (ie you don't have MSC) send me some mail and I
will put them up so you can copy and download them.
PS thanks for putting these programs in here. The Jewish calander
has been something I have been trying to understand for a long time,
and though I don't think I'm any closer to understanding it, these
programs point out why (the complexity) and give me some basis upon
which I can base further study.
/Len
*/
/*
================================================================================
Note 260.2 Jewish Software
2 of 3
GRAMPS::LISS "ESD&P Shrewsbury" 292 lines
20-FEB-1987 12:22
-< HCAL.C >-
--------------------------------------------------------------------------------
HCAL is a calandar program for giving a Hebrew date for the
corresponding date. Here is a quick cookbook method to get
this program to run.
Use the following commands to compile and link the program.
$ cc hcal
$ link hcal,sys$library:vaxcrtl/lib
Add the following symbol to your login.com. Don't forget the
$
before the disk name.
HCAL :== $yourdisk:[yourdirectory]hcal
Run your login.com file.
Run the program by typing...
hcal mm dd yyyy
mm is the month
dd is the day
yyyy is the year
For example enter hcal 02 15 1987 for Feb 15, 1987.
If you do not enter a date the default will be the current
date.
Some of the terms that asre printed with the date are explained
in note #197.18.
---------------------------< cut here >-------------------------
*/
#include <stdio.h>
#include <time.h>
#ifdef vms
#include errno
#include ssdef
#include stsdef
#define IO_SUCCESS (SS$_NORMAL | STS$M_INHIB_MSG)
#define IO_ERROR (SS$_ABORT)
#endif
#ifndef IO_SUCCESS
#define IO_SUCCESS 0 /* Normal exit
*/#define IO_ERROR 1 /* Error exit
*/#endif
/*
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"
};
int unit(f1,f2)
int f1, f2;
{
int rmdr;
rmdr = f1 % f2;
if (rmdr < 0) rmdr += f2;
return (f1 - rmdr) / f2;
}
long hlunit(f1,f2)
long f1, f2;
{
long rmdr;
rmdr = f1 % f2;
if (rmdr < 0) rmdr += f2;
return (f1 - rmdr) / f2;
}
int rmdr(f1,f2)
int f1, f2;
{
int rmdrx;
rmdrx = f1 % f2;
if (rmdrx < 0) rmdrx += f2;
return rmdrx;
}
long hlrmdr(f1,f2)
long f1, f2;
{
long rmdrx;
rmdrx = f1 % f2;
if (rmdrx < 0) rmdrx += f2;
return rmdrx;
}
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 <mo> <da> <yr>'.\n", *argv);
(void) exit(IO_ERROR);
}
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<mo;++n) {
jdate += mlen[n];
}
if (style) {
jdate -= 10 + (yrm1-1500)/100 -
(yrm1-1200)/400; }
if (jdate < 347998) {
(void) printf("%s: Date of
range!\n",*argv); (void) exit(IO_ERROR);
}
jyr = yr + 3761;
do {
jyr -= 1;
jcycle = unit(jyr,19);
jyear = rmdr(jyr,19);
jtype = mtype[jyear];
jleap = jtype == 0;
jpart = 17875l*jcycle+mparts[jyear]+25044l;
jday = hlunit(jpart,25920l);
jpart -= jday * 25920l;
jday += 6939l*jcycle+mdays[jyear]+347998l;
jarg = hlrmdr(jday,7l)*25920l+jpart;
for(n=0;n<=7;++n) {
if (table1[jtype][n]<=jarg &&
jarg<table1[jtype][n+1])
break;
}
jtype = table2[jleap][n];
jstart =
jday+hlrmdr(2l+table3[n]-jday,7l)-3l; } while
(jdate < jstart);
jyr += 1;
jday = (jdate - jstart) + 1;
switch (jtype) {
case 1: jmlen[3] = 29; break;
case 2: break;
case 3: jmlen[2] = 30; break;
default:
printf("%s: Internal error
1\n",*argv); exit(IO_ERROR);
break;
}
if (!jleap) {
mname[7] = mname[6];
mname[6] = mname[0];
jmlen[6] = 0;
}
for(n=1;n<=13;++n) {
if(jday<=jmlen[n]) break;
jday -= jmlen[n];
}
(void) printf("%s %d, %d %s%s\n",
mname[n],jday,jyr,
jkind1[jtype],jkind2[jleap]);
(void) exit(IO_SUCCESS);
} else {
(void) printf("%s: Invalid date!\n",*argv);
(void) exit(IO_ERROR);
}
}
(void) printf("%s: Date out of range!\n",*argv);
(void) exit(IO_ERROR);
}
|