summaryrefslogtreecommitdiff
path: root/ext/calendar
diff options
context:
space:
mode:
authorStanislav Malyshev <stas@php.net>2012-07-14 21:25:55 -0700
committerStanislav Malyshev <stas@php.net>2012-08-07 01:48:31 -0700
commitad545949d027f39dad783d9cec1f4e4b58cd3680 (patch)
tree76ca872127c5893f6389edb58bcfdd9ff7027a73 /ext/calendar
parent7e2d550e881cba1d2a039d1bd2459831a359096c (diff)
downloadphp-git-ad545949d027f39dad783d9cec1f4e4b58cd3680.tar.gz
fix for display of Jewish month names
Diffstat (limited to 'ext/calendar')
-rw-r--r--ext/calendar/calendar.c23
-rw-r--r--ext/calendar/jewish.c52
2 files changed, 62 insertions, 13 deletions
diff --git a/ext/calendar/calendar.c b/ext/calendar/calendar.c
index 7926fad671..1ab1f1652e 100644
--- a/ext/calendar/calendar.c
+++ b/ext/calendar/calendar.c
@@ -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);
diff --git a/ext/calendar/jewish.c b/ext/calendar/jewish.c
index f4dc7c35ae..ac256c9860 100644
--- a/ext/calendar/jewish.c
+++ b/ext/calendar/jewish.c
@@ -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)