]> granicus.if.org Git - php/commitdiff
fix for display of Jewish month names
authorStanislav Malyshev <stas@php.net>
Sun, 15 Jul 2012 04:25:55 +0000 (21:25 -0700)
committerStanislav Malyshev <stas@php.net>
Tue, 7 Aug 2012 08:48:31 +0000 (01:48 -0700)
ext/calendar/calendar.c
ext/calendar/jewish.c

index 7926fad6714adf5e90473af6ab8d3c3c694a4ecc..1ab1f1652ebee283a36fbe22fb76ef33b0b98e37 100644 (file)
@@ -140,7 +140,7 @@ const zend_function_entry calendar_functions[] = {
        PHP_FE(frenchtojd, arginfo_frenchtojd)
        PHP_FE(jddayofweek, arginfo_jddayofweek)
        PHP_FE(jdmonthname, arginfo_jdmonthname)
-       PHP_FE(easter_date, arginfo_easter_date) 
+       PHP_FE(easter_date, arginfo_easter_date)
        PHP_FE(easter_days, arginfo_easter_days)
        PHP_FE(unixtojd, arginfo_unixtojd)
        PHP_FE(jdtounix, arginfo_jdtounix)
@@ -199,11 +199,14 @@ static struct cal_entry_t cal_conversion_table[CAL_NUM_CALS] = {
        {"Julian", "CAL_JULIAN", JulianToSdn, SdnToJulian, 12, 31,
         MonthNameShort, MonthNameLong},
        {"Jewish", "CAL_JEWISH", JewishToSdn, SdnToJewish, 13, 30,
-        JewishMonthName, JewishMonthName},
+        JewishMonthNameLeap, JewishMonthNameLeap},
        {"French", "CAL_FRENCH", FrenchToSdn, SdnToFrench, 13, 30,
         FrenchMonthName, FrenchMonthName}
 };
 
+#define JEWISH_MONTH_NAME(year)        ((monthsPerYear[(year) % 19] == 13)?JewishMonthNameLeap:JewishMonthName)
+#define JEWISH_HEB_MONTH_NAME(year) ((monthsPerYear[(year) % 19] == 13)?JewishMonthHebNameLeap:JewishMonthHebName)
+
 /* For jddayofweek */
 enum { CAL_DOW_DAYNO, CAL_DOW_SHORT, CAL_DOW_LONG };
 
@@ -288,7 +291,7 @@ static void _php_cal_info(int cal, zval **ret)
 PHP_FUNCTION(cal_info)
 {
        long cal = -1;
-       
+
 
        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|l", &cal) == FAILURE) {
                RETURN_FALSE;
@@ -418,8 +421,14 @@ PHP_FUNCTION(cal_from_jd)
        add_assoc_string(return_value, "abbrevdayname", DayNameShort[dow], 1);
        add_assoc_string(return_value, "dayname", DayNameLong[dow], 1);
 /* month name */
-       add_assoc_string(return_value, "abbrevmonth", calendar->month_name_short[month], 1);
-       add_assoc_string(return_value, "monthname", calendar->month_name_long[month], 1);
+       if(cal == CAL_JEWISH) {
+               /* special case for Jewish calendar */
+               add_assoc_string(return_value, "abbrevmonth", JEWISH_MONTH_NAME(year)[month], 1);
+               add_assoc_string(return_value, "monthname", JEWISH_MONTH_NAME(year)[month], 1);
+       } else {
+               add_assoc_string(return_value, "abbrevmonth", calendar->month_name_short[month], 1);
+               add_assoc_string(return_value, "monthname", calendar->month_name_long[month], 1);
+       }
 }
 /* }}} */
 
@@ -608,7 +617,7 @@ PHP_FUNCTION(jdtojewish)
                        RETURN_FALSE;
                }
 
-               snprintf(hebdate, sizeof(hebdate), "%s %s %s", heb_number_to_chars(day, fl, &dayp), JewishMonthHebName[month], heb_number_to_chars(year, fl, &yearp));
+               snprintf(hebdate, sizeof(hebdate), "%s %s %s", heb_number_to_chars(day, fl, &dayp), JEWISH_HEB_MONTH_NAME(year)[month], heb_number_to_chars(year, fl, &yearp));
 
                if (dayp) {
                        efree(dayp);
@@ -728,7 +737,7 @@ PHP_FUNCTION(jdmonthname)
                break;
        case CAL_MONTH_JEWISH:          /* jewish month */
                SdnToJewish(julday, &year, &month, &day);
-               monthname = JewishMonthName[month];
+               monthname = JEWISH_MONTH_NAME(year)[month];
                break;
        case CAL_MONTH_FRENCH:          /* french month */
                SdnToFrench(julday, &year, &month, &day);
index f4dc7c35ae57cb63c7f32d0633e2a377c0eb7bd8..ac256c986060504883a6d08b4451f589b19cf82f 100644 (file)
@@ -297,9 +297,10 @@ static int yearOffset[19] =
        136, 148, 160, 173, 185, 197, 210, 222
 };
 
-char *JewishMonthName[14] =
+/* names for leap (13-month) year */
+char *JewishMonthNameLeap[14] =
 {
-       "",
+       "", 
        "Tishri",
        "Heshvan",
        "Kislev",
@@ -315,15 +316,35 @@ char *JewishMonthName[14] =
        "Elul"
 };
 
-char *JewishMonthHebName[14] =
+/* names for regular year */
+char *JewishMonthName[14] =
 {
+       "", 
+       "Tishri",
+       "Heshvan",
+       "Kislev",
+       "Tevet",
+       "Shevat",
        "",
+       "Adar",
+       "Nisan",
+       "Iyyar",
+       "Sivan",
+       "Tammuz",
+       "Av",
+       "Elul"
+};
+
+/* names for leap (13-month) year */
+char *JewishMonthHebNameLeap[14] =
+{
+       "", 
        "úùøé",
        "çùåï",
        "ëñìå",
        "èáú",
        "ùáè",
-       "àãø",
+       "'àãø ø",
        "'àãø á",
        "ðéñï",
        "àééø",
@@ -333,6 +354,25 @@ char *JewishMonthHebName[14] =
        "àìåì"
 };
 
+/* names for regular year */
+char *JewishMonthHebName[14] =
+{
+       "", 
+       "úùøé",
+       "çùåï",
+       "ëñìå",
+       "èáú",
+       "ùáè",
+       "",
+       "àãø",
+       "ðéñï",
+       "àééø",
+       "ñéåï",
+       "úîåæ",
+       "àá",
+       "àìåì"
+};
+
 /************************************************************************
  * Given the year within the 19 year metonic cycle and the time of a molad
  * (new moon) which starts that year, this routine will calculate what day
@@ -587,11 +627,11 @@ void SdnToJewish(
                                (*pMonth)--;
                                (*pDay) += 30;
                        } else {
-                               *pMonth = 6;
+                               *pMonth = 7;
                                *pDay = inputDay - tishri1 + 207;
                                if (*pDay > 0)
                                        return;
-                               (*pMonth)--;
+                               (*pMonth) -= 2;
                                (*pDay) += 30;
                        }
                        if (*pDay > 0)