Skip to content

Commit a4538a4

Browse files
committed
intl: add intlcal_set_minimal_days_in_first_week()
and IntlCalendar::setMinimalDaysInFirstWeek(). This one had slipped. we had a ::getMinimalDaysInFirstWeek() but no way to change the value.
1 parent 1aeb251 commit a4538a4

6 files changed

+105
-0
lines changed

ext/intl/calendar/calendar_class.cpp

+5
Original file line numberDiff line numberDiff line change
@@ -361,6 +361,10 @@ ZEND_BEGIN_ARG_INFO_EX(ainfo_cal_setLenient, 0, 0, 1)
361361
ZEND_ARG_INFO(0, isLenient)
362362
ZEND_END_ARG_INFO()
363363

364+
ZEND_BEGIN_ARG_INFO_EX(ainfo_cal_set_minimal_days_in_first_week, 0, 0, 1)
365+
ZEND_ARG_INFO(0, numberOfDays)
366+
ZEND_END_ARG_INFO()
367+
364368
ZEND_BEGIN_ARG_INFO_EX(ainfo_cal_from_date_time, 0, 0, 1)
365369
ZEND_ARG_INFO(0, dateTime)
366370
ZEND_END_ARG_INFO()
@@ -433,6 +437,7 @@ static const zend_function_entry Calendar_class_functions[] = {
433437
#endif
434438
PHP_ME_MAPPING(setFirstDayOfWeek, intlcal_set_first_day_of_week, ainfo_cal_dow, ZEND_ACC_PUBLIC)
435439
PHP_ME_MAPPING(setLenient, intlcal_set_lenient, ainfo_cal_setLenient, ZEND_ACC_PUBLIC)
440+
PHP_ME_MAPPING(setMinimalDaysInFirstWeek,intlcal_set_minimal_days_in_first_week,ainfo_cal_set_minimal_days_in_first_week,ZEND_ACC_PUBLIC)
436441
PHP_ME_MAPPING(equals, intlcal_equals, ainfo_cal_other_cal, ZEND_ACC_PUBLIC)
437442
#if U_ICU_VERSION_MAJOR_NUM >= 49
438443
PHP_ME_MAPPING(getRepeatedWallTimeOption,intlcal_get_repeated_wall_time_option,ainfo_cal_void, ZEND_ACC_PUBLIC)

ext/intl/calendar/calendar_methods.cpp

+26
Original file line numberDiff line numberDiff line change
@@ -997,6 +997,32 @@ U_CFUNC PHP_FUNCTION(intlcal_set_lenient)
997997
RETURN_TRUE;
998998
}
999999

1000+
U_CFUNC PHP_FUNCTION(intlcal_set_minimal_days_in_first_week)
1001+
{
1002+
long num_days;
1003+
CALENDAR_METHOD_INIT_VARS;
1004+
1005+
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(),
1006+
"Ol", &object, Calendar_ce_ptr, &num_days) == FAILURE) {
1007+
intl_error_set(NULL, U_ILLEGAL_ARGUMENT_ERROR,
1008+
"intlcal_set_minimal_days_in_first_week: bad arguments", 0 TSRMLS_CC);
1009+
RETURN_FALSE;
1010+
}
1011+
1012+
if (num_days < 1 || num_days > 7) {
1013+
intl_error_set(NULL, U_ILLEGAL_ARGUMENT_ERROR,
1014+
"intlcal_set_minimal_days_in_first_week: invalid number of days; "
1015+
"must be between 1 and 7", 0 TSRMLS_CC);
1016+
RETURN_FALSE;
1017+
}
1018+
1019+
CALENDAR_METHOD_FETCH_OBJECT;
1020+
1021+
co->ucal->setMinimalDaysInFirstWeek((uint8_t)num_days);
1022+
1023+
RETURN_TRUE;
1024+
}
1025+
10001026
U_CFUNC PHP_FUNCTION(intlcal_equals)
10011027
{
10021028
zval *other_object;

ext/intl/calendar/calendar_methods.h

+2
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,8 @@ PHP_FUNCTION(intlcal_set_first_day_of_week);
9191

9292
PHP_FUNCTION(intlcal_set_lenient);
9393

94+
PHP_FUNCTION(intlcal_set_minimal_days_in_first_week);
95+
9496
PHP_FUNCTION(intlcal_equals);
9597

9698
PHP_FUNCTION(intlcal_get_repeated_wall_time_option);

ext/intl/php_intl.c

+6
Original file line numberDiff line numberDiff line change
@@ -590,6 +590,11 @@ ZEND_BEGIN_ARG_INFO_EX( ainfo_cal_set_lenient, 0, 0, 2 )
590590
ZEND_ARG_INFO( 0, isLenient )
591591
ZEND_END_ARG_INFO()
592592

593+
ZEND_BEGIN_ARG_INFO_EX( ainfo_cal_set_minimal_days_in_first_week, 0, 0, 2 )
594+
ZEND_ARG_OBJ_INFO( 0, calendar, IntlCalendar, 0 )
595+
ZEND_ARG_INFO( 0, numberOfDays )
596+
ZEND_END_ARG_INFO()
597+
593598
ZEND_BEGIN_ARG_INFO_EX(ainfo_cal_from_date_time, 0, 0, 1)
594599
ZEND_ARG_INFO(0, dateTime)
595600
ZEND_END_ARG_INFO()
@@ -828,6 +833,7 @@ zend_function_entry intl_functions[] = {
828833
#endif
829834
PHP_FE( intlcal_set_first_day_of_week, ainfo_cal_dow )
830835
PHP_FE( intlcal_set_lenient, ainfo_cal_set_lenient )
836+
PHP_FE( intlcal_set_minimal_days_in_first_week, ainfo_cal_set_minimal_days_in_first_week )
831837
PHP_FE( intlcal_equals, ainfo_cal_other_cal )
832838
PHP_FE( intlcal_from_date_time, ainfo_cal_from_date_time )
833839
PHP_FE( intlcal_to_date_time, ainfo_cal_only_cal )
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
--TEST--
2+
IntlCalendar::setMinimalDaysInFirstWeek() basic test
3+
--SKIPIF--
4+
<?php
5+
if (!extension_loaded('intl'))
6+
die('skip intl extension not enabled');
7+
--FILE--
8+
<?php
9+
ini_set("intl.error_level", E_WARNING);
10+
ini_set("intl.default_locale", "nl");
11+
12+
$intlcal = IntlCalendar::createInstance('UTC');
13+
var_dump(
14+
$intlcal->setMinimalDaysInFirstWeek(6),
15+
$intlcal->getMinimalDaysInFirstWeek(),
16+
intlcal_set_minimal_days_in_first_week($intlcal, 5),
17+
$intlcal->getMinimalDaysInFirstWeek()
18+
);
19+
?>
20+
==DONE==
21+
--EXPECT--
22+
bool(true)
23+
int(6)
24+
bool(true)
25+
int(5)
26+
==DONE==
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
--TEST--
2+
IntlCalendar::setMinimalDaysInFirstWeek(): bad arguments
3+
--INI--
4+
date.timezone=Atlantic/Azores
5+
--SKIPIF--
6+
<?php
7+
if (!extension_loaded('intl'))
8+
die('skip intl extension not enabled');
9+
--FILE--
10+
<?php
11+
ini_set("intl.error_level", E_WARNING);
12+
13+
$c = new IntlGregorianCalendar(NULL, 'pt_PT');
14+
15+
var_dump($c->setMinimalDaysInFirstWeek());
16+
var_dump($c->setMinimalDaysInFirstWeek(1, 2));
17+
var_dump($c->setMinimalDaysInFirstWeek(0));
18+
19+
var_dump(intlcal_set_minimal_days_in_first_week($c, 0));
20+
var_dump(intlcal_set_minimal_days_in_first_week(1, 2));
21+
22+
--EXPECTF--
23+
Warning: IntlCalendar::setMinimalDaysInFirstWeek() expects exactly 1 parameter, 0 given in %s on line %d
24+
25+
Warning: IntlCalendar::setMinimalDaysInFirstWeek(): intlcal_set_minimal_days_in_first_week: bad arguments in %s on line %d
26+
bool(false)
27+
28+
Warning: IntlCalendar::setMinimalDaysInFirstWeek() expects exactly 1 parameter, 2 given in %s on line %d
29+
30+
Warning: IntlCalendar::setMinimalDaysInFirstWeek(): intlcal_set_minimal_days_in_first_week: bad arguments in %s on line %d
31+
bool(false)
32+
33+
Warning: IntlCalendar::setMinimalDaysInFirstWeek(): intlcal_set_minimal_days_in_first_week: invalid number of days; must be between 1 and 7 in %s on line %d
34+
bool(false)
35+
36+
Warning: intlcal_set_minimal_days_in_first_week(): intlcal_set_minimal_days_in_first_week: invalid number of days; must be between 1 and 7 in %s on line %d
37+
bool(false)
38+
39+
Catchable fatal error: Argument 1 passed to intlcal_set_minimal_days_in_first_week() must be an instance of IntlCalendar, integer given in %s on line %d
40+

0 commit comments

Comments
 (0)