Skip to content

Improved fix for bug #54254 #149

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 5 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 16 additions & 7 deletions ext/calendar/calendar.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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)-1) % 19] == 13)?JewishMonthNameLeap:JewishMonthName)
#define JEWISH_HEB_MONTH_NAME(year) ((monthsPerYear[((year)-1) % 19] == 13)?JewishMonthHebNameLeap:JewishMonthHebName)

/* For jddayofweek */
enum { CAL_DOW_DAYNO, CAL_DOW_SHORT, CAL_DOW_LONG };

Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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);
}
}
/* }}} */

Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand Down
64 changes: 52 additions & 12 deletions ext/calendar/jewish.c
Original file line number Diff line number Diff line change
Expand Up @@ -85,8 +85,8 @@
* 3 Kislev 29 30 30 29 30 30 (variable)
* 4 Tevet 29 29 29 29 29 29
* 5 Shevat 30 30 30 30 30 30
* 6 Adar I 29 29 29 30 30 30 (variable)
* 7 Adar II -- -- -- 29 29 29 (optional)
* 6 Adar I -- -- -- 30 30 30 (optional)
* 7 Adar (II) 29 29 29 29 29 29
* 8 Nisan 30 30 30 30 30 30
* 9 Iyyar 29 29 29 29 29 29
* 10 Sivan 30 30 30 30 30 30
Expand All @@ -100,8 +100,8 @@
* have multiple possible spellings in the Roman character set. I have
* chosen to use the spellings found in the Encyclopedia Judaica.
*
* Adar II, the month added for leap years, is sometimes referred to as
* the 13th month, but I have chosen to assign it the number 7 to keep
* Adar I, the month added for leap years, is sometimes referred to as
* the 13th month, but I have chosen to assign it the number 6 to keep
* the months in chronological order. This may not be consistent with
* other numbering schemes.
*
Expand Down Expand Up @@ -286,7 +286,7 @@
#define AM3_11_20 ((9 * HALAKIM_PER_HOUR) + 204)
#define AM9_32_43 ((15 * HALAKIM_PER_HOUR) + 589)

static int monthsPerYear[19] =
int monthsPerYear[19] =
{
12, 12, 13, 12, 12, 13, 12, 13, 12, 12, 13, 12, 12, 13, 12, 12, 13, 12, 13
};
Expand All @@ -297,16 +297,36 @@ static int yearOffset[19] =
136, 148, 160, 173, 185, 197, 210, 222
};

/* names for leap (13-month) year */
char *JewishMonthNameLeap[14] =
{
"",
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One of us added a trailing space here

"Tishri",
"Heshvan",
"Kislev",
"Tevet",
"Shevat",
"Adar I",
"Adar II",
"Nisan",
"Iyyar",
"Sivan",
"Tammuz",
"Av",
"Elul"
};

/* names for regular year */
char *JewishMonthName[14] =
{
"",
"",
"Tishri",
"Heshvan",
"Kislev",
"Tevet",
"Shevat",
"AdarI",
"AdarII",
"",
"Adar",
"Nisan",
"Iyyar",
"Sivan",
Expand All @@ -315,16 +335,36 @@ char *JewishMonthName[14] =
"Elul"
};

/* names for leap (13-month) year */
char *JewishMonthHebNameLeap[14] =
{
"",
"����",
"����",
"����",
"���",
"���",
"��� �'",
"��� �'",
"����",
"����",
"����",
"����",
"��",
"����"
};

/* names for regular year */
char *JewishMonthHebName[14] =
{
"",
"",
"����",
"����",
"����",
"���",
"���",
"",
"���",
"'��� �",
"����",
"����",
"����",
Expand Down Expand Up @@ -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)
Expand Down
3 changes: 3 additions & 0 deletions ext/calendar/sdncal.h
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,10 @@ long int JulianToSdn(int year, int month, int day);
void SdnToJewish(long int sdn, int *pYear, int *pMonth, int *pDay);
long int JewishToSdn(int year, int month, int day);
extern char *JewishMonthName[14];
extern char *JewishMonthNameLeap[14];
extern char *JewishMonthHebName[14];
extern char *JewishMonthHebNameLeap[14];
extern int monthsPerYear[19];

/* French republic calendar conversions. */
void SdnToFrench(long int sdn, int *pYear, int *pMonth, int *pDay);
Expand Down
59 changes: 59 additions & 0 deletions ext/calendar/tests/bug54254.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
--TEST--
Bug #54254 (cal_days_in_month incompatible with jdtojewish in non-leap-years)
--SKIPIF--
<?php include 'skipif.inc'; ?>
--FILE--
<?php
var_dump(cal_days_in_month(CAL_JEWISH, 1, 5771));
var_dump(cal_days_in_month(CAL_JEWISH, 2, 5771));
var_dump(cal_days_in_month(CAL_JEWISH, 3, 5771));
var_dump(cal_days_in_month(CAL_JEWISH, 4, 5771));
var_dump(cal_days_in_month(CAL_JEWISH, 5, 5771));
var_dump(cal_days_in_month(CAL_JEWISH, 6, 5771));
var_dump(cal_days_in_month(CAL_JEWISH, 7, 5771));
var_dump(cal_days_in_month(CAL_JEWISH, 8, 5771));
var_dump(cal_days_in_month(CAL_JEWISH, 9, 5771));
var_dump(cal_days_in_month(CAL_JEWISH, 10, 5771));
var_dump(cal_days_in_month(CAL_JEWISH, 11, 5771));
var_dump(cal_days_in_month(CAL_JEWISH, 12, 5771));
var_dump(cal_days_in_month(CAL_JEWISH, 13, 5771));
var_dump(cal_days_in_month(CAL_JEWISH, 1, 5772));
var_dump(cal_days_in_month(CAL_JEWISH, 2, 5772));
var_dump(cal_days_in_month(CAL_JEWISH, 3, 5772));
var_dump(cal_days_in_month(CAL_JEWISH, 4, 5772));
var_dump(cal_days_in_month(CAL_JEWISH, 5, 5772));
var_dump(cal_days_in_month(CAL_JEWISH, 6, 5772));
var_dump(cal_days_in_month(CAL_JEWISH, 7, 5772));
var_dump(cal_days_in_month(CAL_JEWISH, 8, 5772));
var_dump(cal_days_in_month(CAL_JEWISH, 9, 5772));
var_dump(cal_days_in_month(CAL_JEWISH, 10, 5772));
var_dump(cal_days_in_month(CAL_JEWISH, 11, 5772));
var_dump(cal_days_in_month(CAL_JEWISH, 12, 5772));
var_dump(cal_days_in_month(CAL_JEWISH, 13, 5772));
--EXPECT--
int(30)
int(30)
int(30)
int(29)
int(30)
int(30)
int(29)
int(30)
int(29)
int(30)
int(29)
int(30)
int(29)
int(30)
int(29)
int(30)
int(29)
int(30)
int(0)
int(29)
int(30)
int(29)
int(30)
int(29)
int(30)
int(29)
8 changes: 4 additions & 4 deletions ext/calendar/tests/cal_info.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -100,8 +100,8 @@ Array
[3] => Kislev
[4] => Tevet
[5] => Shevat
[6] => AdarI
[7] => AdarII
[6] => Adar I
[7] => Adar II
[8] => Nisan
[9] => Iyyar
[10] => Sivan
Expand All @@ -117,8 +117,8 @@ Array
[3] => Kislev
[4] => Tevet
[5] => Shevat
[6] => AdarI
[7] => AdarII
[6] => Adar I
[7] => Adar II
[8] => Nisan
[9] => Iyyar
[10] => Sivan
Expand Down
8 changes: 4 additions & 4 deletions ext/calendar/tests/jdmonthname.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -75,8 +75,8 @@ December
--- mode 4 ---
Tevet
Shevat
AdarI
AdarII
Adar I
Adar II
Nisan
Iyyar
Sivan
Expand Down Expand Up @@ -178,7 +178,7 @@ Heshvan
Kislev
Tevet
Shevat
AdarI
Adar
Nisan
Iyyar
Sivan
Expand Down Expand Up @@ -279,7 +279,7 @@ Heshvan
Kislev
Tevet
Shevat
AdarI
Adar
Nisan
Iyyar
Sivan
Expand Down
8 changes: 5 additions & 3 deletions ext/calendar/tests/jdtojewish.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,11 @@ var_dump(jdtojewish(gregoriantojd(10,28,2002))."\r\n".
jdtojewish(gregoriantojd(10,8,2002),true, CAL_JEWISH_ADD_GERESHAYIM)."\r\n".
jdtojewish(gregoriantojd(10,8,2002),true, CAL_JEWISH_ADD_GERESHAYIM+CAL_JEWISH_ADD_ALAFIM_GERESH)."\r\n".
jdtojewish(gregoriantojd(10,8,2002),true, CAL_JEWISH_ADD_GERESHAYIM+CAL_JEWISH_ADD_ALAFIM)."\r\n".
jdtojewish(gregoriantojd(10,8,2002),true, CAL_JEWISH_ADD_GERESHAYIM+CAL_JEWISH_ADD_ALAFIM+CAL_JEWISH_ADD_ALAFIM_GERESH)."\r\n");
jdtojewish(gregoriantojd(10,8,2002),true, CAL_JEWISH_ADD_GERESHAYIM+CAL_JEWISH_ADD_ALAFIM+CAL_JEWISH_ADD_ALAFIM_GERESH)."\r\n".
jdtojewish(gregoriantojd(3,10,2007))."\r\n");
?>
--EXPECT--
string(184) "2/22/5763
--EXPECTF--
string(%d) "2/22/5763
�� ���� �����
�� ���� �'����
�� ���� � ����� ����
Expand All @@ -27,4 +28,5 @@ string(184) "2/22/5763
�' ���� �'���"�
�' ���� � ����� ���"�
�' ���� �' ����� ���"�
7/20/5767
"