Skip to content

Commit 5d0c526

Browse files
committed
Move add/sub to timelib.
1 parent 324e6a5 commit 5d0c526

File tree

3 files changed

+66
-41
lines changed

3 files changed

+66
-41
lines changed

ext/date/lib/interval.c

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,3 +87,59 @@ timelib_rel_time *timelib_diff(timelib_time *one, timelib_time *two)
8787

8888
return rt;
8989
}
90+
91+
timelib_time *timelib_add(timelib_time *old_time, timelib_rel_time *interval)
92+
{
93+
int bias = 1;
94+
timelib_time *t = timelib_time_clone(old_time);
95+
96+
if (interval->have_weekday_relative || interval->have_special_relative) {
97+
memcpy(&t->relative, interval, sizeof(struct timelib_rel_time));
98+
} else {
99+
if (interval->invert) {
100+
bias = -1;
101+
}
102+
memset(&t->relative, 0, sizeof(struct timelib_rel_time));
103+
t->relative.y = interval->y * bias;
104+
t->relative.m = interval->m * bias;
105+
t->relative.d = interval->d * bias;
106+
t->relative.h = interval->h * bias;
107+
t->relative.i = interval->i * bias;
108+
t->relative.s = interval->s * bias;
109+
}
110+
t->have_relative = 1;
111+
t->sse_uptodate = 0;
112+
113+
timelib_update_ts(t, NULL);
114+
timelib_update_from_sse(t);
115+
t->have_relative = 0;
116+
117+
return t;
118+
}
119+
120+
timelib_time *timelib_sub(timelib_time *old_time, timelib_rel_time *interval)
121+
{
122+
int bias = 1;
123+
timelib_time *t = timelib_time_clone(old_time);
124+
125+
if (interval->invert) {
126+
bias = -1;
127+
}
128+
129+
memset(&t->relative, 0, sizeof(struct timelib_rel_time));
130+
t->relative.y = 0 - (interval->y * bias);
131+
t->relative.m = 0 - (interval->m * bias);
132+
t->relative.d = 0 - (interval->d * bias);
133+
t->relative.h = 0 - (interval->h * bias);
134+
t->relative.i = 0 - (interval->i * bias);
135+
t->relative.s = 0 - (interval->s * bias);
136+
t->have_relative = 1;
137+
t->sse_uptodate = 0;
138+
139+
timelib_update_ts(t, NULL);
140+
timelib_update_from_sse(t);
141+
142+
t->have_relative = 0;
143+
144+
return t;
145+
}

ext/date/lib/timelib.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,5 +136,7 @@ int timelib_astro_rise_set_altitude(timelib_time *time, double lon, double lat,
136136

137137
/* from interval.c */
138138
timelib_rel_time *timelib_diff(timelib_time *one, timelib_time *two);
139+
timelib_time *timelib_add(timelib_time *t, timelib_rel_time *interval);
140+
timelib_time *timelib_sub(timelib_time *t, timelib_rel_time *interval);
139141

140142
#endif

ext/date/php_date.c

Lines changed: 8 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -2889,7 +2889,7 @@ PHP_FUNCTION(date_add)
28892889
zval *object, *interval;
28902890
php_date_obj *dateobj;
28912891
php_interval_obj *intobj;
2892-
int bias = 1;
2892+
timelib_time *new_time;
28932893

28942894
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "OO", &object, date_ce_date, &interval, date_ce_interval) == FAILURE) {
28952895
RETURN_FALSE;
@@ -2899,27 +2899,9 @@ PHP_FUNCTION(date_add)
28992899
intobj = (php_interval_obj *) zend_object_store_get_object(interval TSRMLS_CC);
29002900
DATE_CHECK_INITIALIZED(intobj->initialized, DateInterval);
29012901

2902-
2903-
if (intobj->diff->have_weekday_relative || intobj->diff->have_special_relative) {
2904-
memcpy(&dateobj->time->relative, intobj->diff, sizeof(struct timelib_rel_time));
2905-
} else {
2906-
if (intobj->diff->invert) {
2907-
bias = -1;
2908-
}
2909-
memset(&dateobj->time->relative, 0, sizeof(struct timelib_rel_time));
2910-
dateobj->time->relative.y = intobj->diff->y * bias;
2911-
dateobj->time->relative.m = intobj->diff->m * bias;
2912-
dateobj->time->relative.d = intobj->diff->d * bias;
2913-
dateobj->time->relative.h = intobj->diff->h * bias;
2914-
dateobj->time->relative.i = intobj->diff->i * bias;
2915-
dateobj->time->relative.s = intobj->diff->s * bias;
2916-
}
2917-
dateobj->time->have_relative = 1;
2918-
dateobj->time->sse_uptodate = 0;
2919-
2920-
timelib_update_ts(dateobj->time, NULL);
2921-
timelib_update_from_sse(dateobj->time);
2922-
dateobj->time->have_relative = 0;
2902+
new_time = timelib_add(dateobj->time, intobj->diff);
2903+
timelib_time_dtor(dateobj->time);
2904+
dateobj->time = new_time;
29232905

29242906
RETURN_ZVAL(object, 1, 0);
29252907
}
@@ -2933,7 +2915,7 @@ PHP_FUNCTION(date_sub)
29332915
zval *object, *interval;
29342916
php_date_obj *dateobj;
29352917
php_interval_obj *intobj;
2936-
int bias = 1;
2918+
timelib_time *new_time;
29372919

29382920
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "OO", &object, date_ce_date, &interval, date_ce_interval) == FAILURE) {
29392921
RETURN_FALSE;
@@ -2948,24 +2930,9 @@ PHP_FUNCTION(date_sub)
29482930
return;
29492931
}
29502932

2951-
if (intobj->diff->invert) {
2952-
bias = -1;
2953-
}
2954-
2955-
memset(&dateobj->time->relative, 0, sizeof(struct timelib_rel_time));
2956-
dateobj->time->relative.y = 0 - (intobj->diff->y * bias);
2957-
dateobj->time->relative.m = 0 - (intobj->diff->m * bias);
2958-
dateobj->time->relative.d = 0 - (intobj->diff->d * bias);
2959-
dateobj->time->relative.h = 0 - (intobj->diff->h * bias);
2960-
dateobj->time->relative.i = 0 - (intobj->diff->i * bias);
2961-
dateobj->time->relative.s = 0 - (intobj->diff->s * bias);
2962-
dateobj->time->have_relative = 1;
2963-
dateobj->time->sse_uptodate = 0;
2964-
2965-
timelib_update_ts(dateobj->time, NULL);
2966-
timelib_update_from_sse(dateobj->time);
2967-
2968-
dateobj->time->have_relative = 0;
2933+
new_time = timelib_sub(dateobj->time, intobj->diff);
2934+
timelib_time_dtor(dateobj->time);
2935+
dateobj->time = new_time;
29692936

29702937
RETURN_ZVAL(object, 1, 0);
29712938
}

0 commit comments

Comments
 (0)