Commit:    5d0c526199add0e4f054a57db29d882c8ad89a23
Author:    Derick Rethans <git...@derickrethans.nl>         Tue, 16 Apr 2013 
16:31:10 +0100
Parents:   324e6a5f82d830cf46e0cf35f82c44253b8bd2cf
Branches:  master

Link:       
http://git.php.net/?p=php-src.git;a=commitdiff;h=5d0c526199add0e4f054a57db29d882c8ad89a23

Log:
Move add/sub to timelib.

Changed paths:
  M  ext/date/lib/interval.c
  M  ext/date/lib/timelib.h
  M  ext/date/php_date.c


Diff:
diff --git a/ext/date/lib/interval.c b/ext/date/lib/interval.c
index e765a42..7fa1fc5 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 478dec3..2acb765 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 05ac672..2bb555a 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);
 }


--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to