/* Hebrew dates for Gregorian dates 2.10.1655 - 2.10.2168 */ /* Lower bound: beginning of cycle 286, 1 Tishri 5416 */ /* Upper bound: end of cycle 312, 29 Elul 5928 */ /* Missing, zero, or non-numeric parameters are supplied from today's date */ /* If none are given, the hebrew day is incremented after 18:00 local time */ #include main(argc, argv) char **argv; { int m = 0, y = 0, yc, x = 0; long d = 0, clock, time(); struct tm *tmbuf, *localtime(); clock = time ((long *)0); tmbuf = localtime (&clock); switch (argc) { default: printf("Usage: %s [day [month [year]]]\n", argv[0]); exit(1); case 4: y = atoi (argv[3]); case 3: m = atoi (argv[2]); case 2: d = atoi (argv[1]); break; case 1: if (tmbuf->tm_hour >= 18) x = 1; break; } if (!y) y = tmbuf->tm_year + 1900; if (!m) m = tmbuf->tm_mon + 1; if (!d) d = tmbuf->tm_mday + x; if((m -= 2) <= 0) { m += 12; y--; } yc = y/100; y %= 100; d += 36524L*(yc-16) + 365L*y + yc/4 + y/4 + 367*m/12 - 20338; if(d < 0 || d > 187370L) { printf("Out of range\n"); exit (1); } else nhd (d); } /* cycle types */ /* 16 types are enough for cycles 286 - 313 */ /* The table is generated from the well-known "61 Heads Table" */ /* The 16 heads coressponding to types 0 - 15 are 23, 44, 8, 6, 31, 54, 17, 40, 39, 5, 28, 27, 48, 11, 35, 61 */ char ctyp[27] = { 7, 9, 10, 12, 13, 14, 15, 0, 1, 2, 4, 5, 6, 8, 9, 11, 12, 13, 14, 15, 0, 1, 3, 4, 5, 6, 8 }; char *mname[12] = { "Tishri", "Heshvan", "Kislev", "Tevet", "Shevat", "Adar", "Nisan", "Iyyar", "Sivan", "Tammuz", "Av", "Elul" }; /* * compute date string from no. of days since 1 Tishri 5416 */ nhd (ln) long ln; { int dy, dm, cy; register m, y, n; for(cy = 0; ln >= (dy = cycsiz(ctyp[cy])); cy++) ln -= dy; n = ln; for(y = 1; n >= (dy = dysiz(y, ctyp[cy])); y++) n -= dy; y += (cy+285)*19; for(m = 0; ; m++) { dm = ((m+1)&1)+29;/*Alternating 30 and 29*/ if(m == 1 && dy%30 == 25) dm++;/*Heshvan in an extended year*/ if(m == 2 && dy%30 == 23) dm--;/*Kislev in a diminished year*/ if(m == 5 && dy > 365) dm = 59;/*Two Adars in a leap year*/ if(n < dm) break; n -= dm; } if(m == 5 && dy > 365) if(n >= 30) { mname[5] = "Adar_b"; n -= 30; } else mname[5] = "Adar_a"; printf("%d %s %d\n", n+1, mname[m], y); } /* * masks for extended and diminished cycles and years. * bit i in pl[0] (mi[0]) is set if an i'th type cycle is extended (diminished). * bit i in pl[j] (mi[j]) is set, j = 1 ... 19, if the j'th year in an i'th type * cycle is extended (diminished, respectively). * short integer are used, as 16 types are expected. */ short pl[20] = { 0040400, 0031456, 0066120, 0140741, 0111616, 0027035, 0070160, 0142642, 0015017, 0126134, 0050661, 0101702, 0127055, 0056122, 0060664, 0111151, 0026603, 0057034, 0120146, 0141611 }; short mi[20] = { 0016323, 0100200, 0001015, 0036022, 0040040, 0100100, 0007617, 0010020, 0160740, 0001001, 0006002, 0070074, 0000100, 0000601, 0117012, 0020004, 0040120, 0100643, 0011010, 0026164 }; /* * size of hebrew year y of cycle type cy */ dysiz(y, cy) register y, cy; { register x = (y*7+1)%19 < 7 ? 384 : 354; if(pl[y]&(1<