123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795 |
- #if defined(PHP_WIN32)
- #pragma setlocale("english")
- #endif
- #include "sdncal.h"
- #define HALAKIM_PER_HOUR 1080
- #define HALAKIM_PER_DAY 25920
- #define HALAKIM_PER_LUNAR_CYCLE ((29 * HALAKIM_PER_DAY) + 13753)
- #define HALAKIM_PER_METONIC_CYCLE (HALAKIM_PER_LUNAR_CYCLE * (12 * 19 + 7))
- #define JEWISH_SDN_OFFSET 347997
- #define JEWISH_SDN_MAX 324542846L
- #define NEW_MOON_OF_CREATION 31524
- #define SUNDAY 0
- #define MONDAY 1
- #define TUESDAY 2
- #define WEDNESDAY 3
- #define THURSDAY 4
- #define FRIDAY 5
- #define SATURDAY 6
- #define NOON (18 * HALAKIM_PER_HOUR)
- #define AM3_11_20 ((9 * HALAKIM_PER_HOUR) + 204)
- #define AM9_32_43 ((15 * HALAKIM_PER_HOUR) + 589)
- const int monthsPerYear[19] =
- {
- 12, 12, 13, 12, 12, 13, 12, 13, 12, 12, 13, 12, 12, 13, 12, 12, 13, 12, 13
- };
- static const int yearOffset[19] =
- {
- 0, 12, 24, 37, 49, 61, 74, 86, 99, 111, 123,
- 136, 148, 160, 173, 185, 197, 210, 222
- };
- const char * const JewishMonthNameLeap[14] =
- {
- "",
- "Tishri",
- "Heshvan",
- "Kislev",
- "Tevet",
- "Shevat",
- "Adar I",
- "Adar II",
- "Nisan",
- "Iyyar",
- "Sivan",
- "Tammuz",
- "Av",
- "Elul"
- };
- const char * const JewishMonthName[14] =
- {
- "",
- "Tishri",
- "Heshvan",
- "Kislev",
- "Tevet",
- "Shevat",
- "",
- "Adar",
- "Nisan",
- "Iyyar",
- "Sivan",
- "Tammuz",
- "Av",
- "Elul"
- };
- const char * const JewishMonthHebNameLeap[14] =
- {
- "",
- "\xFA\xF9\xF8\xE9",
- "\xE7\xF9\xE5\xEF",
- "\xEB\xF1\xEC\xE5",
- "\xE8\xE1\xFA",
- "\xF9\xE1\xE8",
- "\xE0\xE3\xF8 \xE0'",
- "\xE0\xE3\xF8 \xE1'",
- "\xF0\xE9\xF1\xEF",
- "\xE0\xE9\xE9\xF8",
- "\xF1\xE9\xe5\xEF",
- "\xFA\xEE\xE5\xE6",
- "\xE0\xE1",
- "\xE0\xEC\xE5\xEC"
- };
- const char * const JewishMonthHebName[14] =
- {
- "",
- "\xFA\xF9\xF8\xE9",
- "\xE7\xF9\xE5\xEF",
- "\xEB\xF1\xEC\xE5",
- "\xE8\xE1\xFA",
- "\xF9\xE1\xE8",
- "",
- "\xE0\xE3\xF8",
- "\xF0\xE9\xF1\xEF",
- "\xE0\xE9\xE9\xF8",
- "\xF1\xE9\xE5\xEF",
- "\xFA\xEE\xE5\xE6",
- "\xE0\xE1",
- "\xE0\xEC\xE5\xEC"
- };
- static zend_long Tishri1(
- int metonicYear,
- zend_long moladDay,
- zend_long moladHalakim)
- {
- zend_long tishri1;
- int dow;
- int leapYear;
- int lastWasLeapYear;
- tishri1 = moladDay;
- dow = tishri1 % 7;
- leapYear = metonicYear == 2 || metonicYear == 5 || metonicYear == 7
- || metonicYear == 10 || metonicYear == 13 || metonicYear == 16
- || metonicYear == 18;
- lastWasLeapYear = metonicYear == 3 || metonicYear == 6
- || metonicYear == 8 || metonicYear == 11 || metonicYear == 14
- || metonicYear == 17 || metonicYear == 0;
-
- if ((moladHalakim >= NOON) ||
- ((!leapYear) && dow == TUESDAY && moladHalakim >= AM3_11_20) ||
- (lastWasLeapYear && dow == MONDAY && moladHalakim >= AM9_32_43)) {
- tishri1++;
- dow++;
- if (dow == 7) {
- dow = 0;
- }
- }
-
- if (dow == WEDNESDAY || dow == FRIDAY || dow == SUNDAY) {
- tishri1++;
- }
- return (tishri1);
- }
- static void MoladOfMetonicCycle(
- int metonicCycle,
- zend_long *pMoladDay,
- zend_long *pMoladHalakim)
- {
- register zend_ulong r1, r2, d1, d2;
-
- r1 = NEW_MOON_OF_CREATION;
-
- r1 += metonicCycle * (HALAKIM_PER_METONIC_CYCLE & 0xFFFF);
- r2 = r1 >> 16;
- r2 += metonicCycle * ((HALAKIM_PER_METONIC_CYCLE >> 16) & 0xFFFF);
-
- d2 = r2 / HALAKIM_PER_DAY;
- r2 -= d2 * HALAKIM_PER_DAY;
- r1 = (r2 << 16) | (r1 & 0xFFFF);
- d1 = r1 / HALAKIM_PER_DAY;
- r1 -= d1 * HALAKIM_PER_DAY;
- *pMoladDay = (d2 << 16) | d1;
- *pMoladHalakim = r1;
- }
- static void FindTishriMolad(
- zend_long inputDay,
- int *pMetonicCycle,
- int *pMetonicYear,
- zend_long *pMoladDay,
- zend_long *pMoladHalakim)
- {
- zend_long moladDay;
- zend_long moladHalakim;
- int metonicCycle;
- int metonicYear;
-
- metonicCycle = (inputDay + 310) / 6940;
-
- MoladOfMetonicCycle(metonicCycle, &moladDay, &moladHalakim);
-
- while (moladDay < inputDay - 6940 + 310) {
- metonicCycle++;
- moladHalakim += HALAKIM_PER_METONIC_CYCLE;
- moladDay += moladHalakim / HALAKIM_PER_DAY;
- moladHalakim = moladHalakim % HALAKIM_PER_DAY;
- }
-
- for (metonicYear = 0; metonicYear < 18; metonicYear++) {
- if (moladDay > inputDay - 74) {
- break;
- }
- moladHalakim += HALAKIM_PER_LUNAR_CYCLE * monthsPerYear[metonicYear];
- moladDay += moladHalakim / HALAKIM_PER_DAY;
- moladHalakim = moladHalakim % HALAKIM_PER_DAY;
- }
- *pMetonicCycle = metonicCycle;
- *pMetonicYear = metonicYear;
- *pMoladDay = moladDay;
- *pMoladHalakim = moladHalakim;
- }
- static void FindStartOfYear(
- int year,
- int *pMetonicCycle,
- int *pMetonicYear,
- zend_long *pMoladDay,
- zend_long *pMoladHalakim,
- int *pTishri1)
- {
- *pMetonicCycle = (year - 1) / 19;
- *pMetonicYear = (year - 1) % 19;
- MoladOfMetonicCycle(*pMetonicCycle, pMoladDay, pMoladHalakim);
- *pMoladHalakim += HALAKIM_PER_LUNAR_CYCLE * yearOffset[*pMetonicYear];
- *pMoladDay += *pMoladHalakim / HALAKIM_PER_DAY;
- *pMoladHalakim = *pMoladHalakim % HALAKIM_PER_DAY;
- *pTishri1 = Tishri1(*pMetonicYear, *pMoladDay, *pMoladHalakim);
- }
- void SdnToJewish(
- zend_long sdn,
- int *pYear,
- int *pMonth,
- int *pDay)
- {
- zend_long inputDay;
- zend_long day;
- zend_long halakim;
- int metonicCycle;
- int metonicYear;
- int tishri1;
- int tishri1After;
- int yearLength;
- if (sdn <= JEWISH_SDN_OFFSET || sdn > JEWISH_SDN_MAX) {
- *pYear = 0;
- *pMonth = 0;
- *pDay = 0;
- return;
- }
- inputDay = sdn - JEWISH_SDN_OFFSET;
- FindTishriMolad(inputDay, &metonicCycle, &metonicYear, &day, &halakim);
- tishri1 = Tishri1(metonicYear, day, halakim);
- if (inputDay >= tishri1) {
-
- *pYear = metonicCycle * 19 + metonicYear + 1;
- if (inputDay < tishri1 + 59) {
- if (inputDay < tishri1 + 30) {
- *pMonth = 1;
- *pDay = inputDay - tishri1 + 1;
- } else {
- *pMonth = 2;
- *pDay = inputDay - tishri1 - 29;
- }
- return;
- }
-
- halakim += HALAKIM_PER_LUNAR_CYCLE * monthsPerYear[metonicYear];
- day += halakim / HALAKIM_PER_DAY;
- halakim = halakim % HALAKIM_PER_DAY;
- tishri1After = Tishri1((metonicYear + 1) % 19, day, halakim);
- } else {
-
- *pYear = metonicCycle * 19 + metonicYear;
- if (inputDay >= tishri1 - 177) {
-
- if (inputDay > tishri1 - 30) {
- *pMonth = 13;
- *pDay = inputDay - tishri1 + 30;
- } else if (inputDay > tishri1 - 60) {
- *pMonth = 12;
- *pDay = inputDay - tishri1 + 60;
- } else if (inputDay > tishri1 - 89) {
- *pMonth = 11;
- *pDay = inputDay - tishri1 + 89;
- } else if (inputDay > tishri1 - 119) {
- *pMonth = 10;
- *pDay = inputDay - tishri1 + 119;
- } else if (inputDay > tishri1 - 148) {
- *pMonth = 9;
- *pDay = inputDay - tishri1 + 148;
- } else {
- *pMonth = 8;
- *pDay = inputDay - tishri1 + 178;
- }
- return;
- } else {
- if (monthsPerYear[(*pYear - 1) % 19] == 13) {
- *pMonth = 7;
- *pDay = inputDay - tishri1 + 207;
- if (*pDay > 0)
- return;
- (*pMonth)--;
- (*pDay) += 30;
- if (*pDay > 0)
- return;
- (*pMonth)--;
- (*pDay) += 30;
- } else {
- *pMonth = 7;
- *pDay = inputDay - tishri1 + 207;
- if (*pDay > 0)
- return;
- (*pMonth) -= 2;
- (*pDay) += 30;
- }
- if (*pDay > 0)
- return;
- (*pMonth)--;
- (*pDay) += 29;
- if (*pDay > 0)
- return;
-
- tishri1After = tishri1;
- FindTishriMolad(day - 365,
- &metonicCycle, &metonicYear, &day, &halakim);
- tishri1 = Tishri1(metonicYear, day, halakim);
- }
- }
- yearLength = tishri1After - tishri1;
- day = inputDay - tishri1 - 29;
- if (yearLength == 355 || yearLength == 385) {
-
- if (day <= 30) {
- *pMonth = 2;
- *pDay = day;
- return;
- }
- day -= 30;
- } else {
-
- if (day <= 29) {
- *pMonth = 2;
- *pDay = day;
- return;
- }
- day -= 29;
- }
-
- *pMonth = 3;
- *pDay = day;
- }
- zend_long JewishToSdn(
- int year,
- int month,
- int day)
- {
- zend_long sdn;
- int metonicCycle;
- int metonicYear;
- int tishri1;
- int tishri1After;
- zend_long moladDay;
- zend_long moladHalakim;
- int yearLength;
- int lengthOfAdarIAndII;
- if (year <= 0 || day <= 0 || day > 30) {
- return (0);
- }
- switch (month) {
- case 1:
- case 2:
-
- FindStartOfYear(year, &metonicCycle, &metonicYear,
- &moladDay, &moladHalakim, &tishri1);
- if (month == 1) {
- sdn = tishri1 + day - 1;
- } else {
- sdn = tishri1 + day + 29;
- }
- break;
- case 3:
-
-
- FindStartOfYear(year, &metonicCycle, &metonicYear,
- &moladDay, &moladHalakim, &tishri1);
-
- moladHalakim += HALAKIM_PER_LUNAR_CYCLE * monthsPerYear[metonicYear];
- moladDay += moladHalakim / HALAKIM_PER_DAY;
- moladHalakim = moladHalakim % HALAKIM_PER_DAY;
- tishri1After = Tishri1((metonicYear + 1) % 19, moladDay, moladHalakim);
- yearLength = tishri1After - tishri1;
- if (yearLength == 355 || yearLength == 385) {
- sdn = tishri1 + day + 59;
- } else {
- sdn = tishri1 + day + 58;
- }
- break;
- case 4:
- case 5:
- case 6:
-
- FindStartOfYear(year + 1, &metonicCycle, &metonicYear,
- &moladDay, &moladHalakim, &tishri1After);
- if (monthsPerYear[(year - 1) % 19] == 12) {
- lengthOfAdarIAndII = 29;
- } else {
- lengthOfAdarIAndII = 59;
- }
- if (month == 4) {
- sdn = tishri1After + day - lengthOfAdarIAndII - 237;
- } else if (month == 5) {
- sdn = tishri1After + day - lengthOfAdarIAndII - 208;
- } else {
- sdn = tishri1After + day - lengthOfAdarIAndII - 178;
- }
- break;
- default:
-
- FindStartOfYear(year + 1, &metonicCycle, &metonicYear,
- &moladDay, &moladHalakim, &tishri1After);
- switch (month) {
- case 7:
- sdn = tishri1After + day - 207;
- break;
- case 8:
- sdn = tishri1After + day - 178;
- break;
- case 9:
- sdn = tishri1After + day - 148;
- break;
- case 10:
- sdn = tishri1After + day - 119;
- break;
- case 11:
- sdn = tishri1After + day - 89;
- break;
- case 12:
- sdn = tishri1After + day - 60;
- break;
- case 13:
- sdn = tishri1After + day - 30;
- break;
- default:
- return (0);
- }
- }
- return (sdn + JEWISH_SDN_OFFSET);
- }
|