summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDerick Rethans <github@derickrethans.nl>2013-04-16 16:31:10 +0100
committerDerick Rethans <github@derickrethans.nl>2013-11-28 12:02:36 +0000
commit5d0c526199add0e4f054a57db29d882c8ad89a23 (patch)
tree8b07b0d8e4d69924c440d57891c4d7f7f531b502
parent324e6a5f82d830cf46e0cf35f82c44253b8bd2cf (diff)
downloadphp-git-5d0c526199add0e4f054a57db29d882c8ad89a23.tar.gz
Move add/sub to timelib.
-rw-r--r--ext/date/lib/interval.c56
-rw-r--r--ext/date/lib/timelib.h2
-rw-r--r--ext/date/php_date.c49
3 files changed, 66 insertions, 41 deletions
diff --git a/ext/date/lib/interval.c b/ext/date/lib/interval.c
index e765a42e93..7fa1fc5c13 100644
--- a/ext/date/lib/interval.c
+++ b/ext/date/lib/interval.c
@@ -87,3 +87,59 @@ timelib_rel_time *timelib_diff(timelib_time *one, timelib_time *two)
return rt;
}
+
+timelib_time *timelib_add(timelib_time *old_time, timelib_rel_time *interval)
+{
+ int bias = 1;
+ timelib_time *t = timelib_time_clone(old_time);
+
+ if (interval->have_weekday_relative || interval->have_special_relative) {
+ memcpy(&t->relative, interval, sizeof(struct timelib_rel_time));
+ } else {
+ if (interval->invert) {
+ bias = -1;
+ }
+ memset(&t->relative, 0, sizeof(struct timelib_rel_time));
+ t->relative.y = interval->y * bias;
+ t->relative.m = interval->m * bias;
+ t->relative.d = interval->d * bias;
+ t->relative.h = interval->h * bias;
+ t->relative.i = interval->i * bias;
+ t->relative.s = interval->s * bias;
+ }
+ t->have_relative = 1;
+ t->sse_uptodate = 0;
+
+ timelib_update_ts(t, NULL);
+ timelib_update_from_sse(t);
+ t->have_relative = 0;
+
+ return t;
+}
+
+timelib_time *timelib_sub(timelib_time *old_time, timelib_rel_time *interval)
+{
+ int bias = 1;
+ timelib_time *t = timelib_time_clone(old_time);
+
+ if (interval->invert) {
+ bias = -1;
+ }
+
+ memset(&t->relative, 0, sizeof(struct timelib_rel_time));
+ t->relative.y = 0 - (interval->y * bias);
+ t->relative.m = 0 - (interval->m * bias);
+ t->relative.d = 0 - (interval->d * bias);
+ t->relative.h = 0 - (interval->h * bias);
+ t->relative.i = 0 - (interval->i * bias);
+ t->relative.s = 0 - (interval->s * bias);
+ t->have_relative = 1;
+ t->sse_uptodate = 0;
+
+ timelib_update_ts(t, NULL);
+ timelib_update_from_sse(t);
+
+ t->have_relative = 0;
+
+ return t;
+}
diff --git a/ext/date/lib/timelib.h b/ext/date/lib/timelib.h
index 478dec32d0..2acb765e63 100644
--- a/ext/date/lib/timelib.h
+++ b/ext/date/lib/timelib.h
@@ -136,5 +136,7 @@ int timelib_astro_rise_set_altitude(timelib_time *time, double lon, double lat,
/* from interval.c */
timelib_rel_time *timelib_diff(timelib_time *one, timelib_time *two);
+timelib_time *timelib_add(timelib_time *t, timelib_rel_time *interval);
+timelib_time *timelib_sub(timelib_time *t, timelib_rel_time *interval);
#endif
diff --git a/ext/date/php_date.c b/ext/date/php_date.c
index 05ac67216b..2bb555a68b 100644
--- a/ext/date/php_date.c
+++ b/ext/date/php_date.c
@@ -2889,7 +2889,7 @@ PHP_FUNCTION(date_add)
zval *object, *interval;
php_date_obj *dateobj;
php_interval_obj *intobj;
- int bias = 1;
+ timelib_time *new_time;
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "OO", &object, date_ce_date, &interval, date_ce_interval) == FAILURE) {
RETURN_FALSE;
@@ -2899,27 +2899,9 @@ PHP_FUNCTION(date_add)
intobj = (php_interval_obj *) zend_object_store_get_object(interval TSRMLS_CC);
DATE_CHECK_INITIALIZED(intobj->initialized, DateInterval);
-
- if (intobj->diff->have_weekday_relative || intobj->diff->have_special_relative) {
- memcpy(&dateobj->time->relative, intobj->diff, sizeof(struct timelib_rel_time));
- } else {
- if (intobj->diff->invert) {
- bias = -1;
- }
- memset(&dateobj->time->relative, 0, sizeof(struct timelib_rel_time));
- dateobj->time->relative.y = intobj->diff->y * bias;
- dateobj->time->relative.m = intobj->diff->m * bias;
- dateobj->time->relative.d = intobj->diff->d * bias;
- dateobj->time->relative.h = intobj->diff->h * bias;
- dateobj->time->relative.i = intobj->diff->i * bias;
- dateobj->time->relative.s = intobj->diff->s * bias;
- }
- dateobj->time->have_relative = 1;
- dateobj->time->sse_uptodate = 0;
-
- timelib_update_ts(dateobj->time, NULL);
- timelib_update_from_sse(dateobj->time);
- dateobj->time->have_relative = 0;
+ new_time = timelib_add(dateobj->time, intobj->diff);
+ timelib_time_dtor(dateobj->time);
+ dateobj->time = new_time;
RETURN_ZVAL(object, 1, 0);
}
@@ -2933,7 +2915,7 @@ PHP_FUNCTION(date_sub)
zval *object, *interval;
php_date_obj *dateobj;
php_interval_obj *intobj;
- int bias = 1;
+ timelib_time *new_time;
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "OO", &object, date_ce_date, &interval, date_ce_interval) == FAILURE) {
RETURN_FALSE;
@@ -2948,24 +2930,9 @@ PHP_FUNCTION(date_sub)
return;
}
- if (intobj->diff->invert) {
- bias = -1;
- }
-
- memset(&dateobj->time->relative, 0, sizeof(struct timelib_rel_time));
- dateobj->time->relative.y = 0 - (intobj->diff->y * bias);
- dateobj->time->relative.m = 0 - (intobj->diff->m * bias);
- dateobj->time->relative.d = 0 - (intobj->diff->d * bias);
- dateobj->time->relative.h = 0 - (intobj->diff->h * bias);
- dateobj->time->relative.i = 0 - (intobj->diff->i * bias);
- dateobj->time->relative.s = 0 - (intobj->diff->s * bias);
- dateobj->time->have_relative = 1;
- dateobj->time->sse_uptodate = 0;
-
- timelib_update_ts(dateobj->time, NULL);
- timelib_update_from_sse(dateobj->time);
-
- dateobj->time->have_relative = 0;
+ new_time = timelib_sub(dateobj->time, intobj->diff);
+ timelib_time_dtor(dateobj->time);
+ dateobj->time = new_time;
RETURN_ZVAL(object, 1, 0);
}