Changeset 264

Show
Ignore:
Timestamp:
07/08/2007 14:57:08 (17 months ago)
Author:
indeyets
Message:

support for sexagecimal floats

Location:
trunk/ext/php
Files:
4 modified

Legend:

Unmodified
Added
Removed
  • trunk/ext/php/TODO

    r263 r264  
    99load: 
    1010  - "Add support for datatypes": 
    11     - "float#base60" 
    1211    - merge 
    1312    - "timestamp#iso8601" 
  • trunk/ext/php/config.m4

    r246 r264  
    2020    done 
    2121  fi 
    22    
     22 
    2323  if test -z "$SYCK_DIR"; then 
    2424    AC_MSG_RESULT([not found]) 
     
    4242    -L$SYCK_DIR/lib 
    4343  ]) 
    44    
     44 
    4545  PHP_NEW_EXTENSION(syck, phpext.c, $ext_shared) 
     46  PHP_ADD_EXTENSION_DEP(syck, hash) 
     47  PHP_ADD_EXTENSION_DEP(syck, spl) 
    4648 
    4749  PHP_SUBST(SYCK_SHARED_LIBADD) 
  • trunk/ext/php/phpext.c

    r263 r264  
    3636{ 
    3737        TSRMLS_FETCH(); 
    38 #if defined(HAVE_SPL) && ((PHP_MAJOR_VERSION > 5) || (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION >= 1)) 
     38 
    3939        if (!spl_ce_RuntimeException) { 
    4040                zend_class_entry **pce; 
     
    4747                return spl_ce_RuntimeException; 
    4848        } 
    49 #endif 
    50 #if (PHP_MAJOR_VERSION == 5) && (PHP_MINOR_VERSION < 2) 
    51         return zend_exception_get_default(); 
    52 #else 
     49 
    5350        return zend_exception_get_default(TSRMLS_C); 
    54 #endif 
    5551} 
    5652 
     
    129125}; 
    130126 
    131 #if ZEND_MODULE_API_NO >= 20050922 
    132127static zend_module_dep syck_deps[] = { 
    133 # ifdef HAVE_SPL 
    134128        ZEND_MOD_REQUIRED("spl") 
    135 # endif 
     129        ZEND_MOD_REQUIRED("hash") 
    136130        {NULL, NULL, NULL} 
    137131}; 
    138 #endif 
    139132 
    140133zend_module_entry syck_module_entry = { 
    141 #if ZEND_MODULE_API_NO >= 20050922 
    142134        STANDARD_MODULE_HEADER_EX, NULL, 
    143135        syck_deps, 
    144 #else 
    145         STANDARD_MODULE_HEADER, 
    146 #endif 
    147136        "syck", 
    148137        syck_functions, 
     
    275264 
    276265                                ZVAL_DOUBLE(o, f); 
    277                         } else if (strcmp(n->type_id, "float#sixty") == 0) { 
    278                                 double f; 
     266                        } else if (strcmp(n->type_id, "float#base60") == 0) { 
     267                                char *ptr, *end; 
     268                                long multiplier = 1; 
     269                                double total = 0; 
     270 
    279271                                syck_str_blow_away_commas(n); 
    280                                 f = strtod(n->data.str->ptr, NULL); 
    281  
    282                                 ZVAL_DOUBLE(o, f); 
     272                                ptr = n->data.str->ptr; 
     273                                end = n->data.str->ptr + n->data.str->len; 
     274 
     275                                while (end > ptr) { 
     276                                        double bnum = 0; 
     277                                        char *colon = end - 1; 
     278                                        while (colon >= ptr && *colon != ':') { 
     279                                            colon--; 
     280                                        } 
     281 
     282                                        if (colon >= ptr && *colon == ':') 
     283                                                *colon = '\0'; 
     284 
     285                                        bnum = strtod(colon + 1, NULL); 
     286                                        total += bnum * multiplier; 
     287                                        multiplier *= 60; 
     288                                        end = colon; 
     289                                } 
     290 
     291                                ZVAL_DOUBLE(o, total); 
    283292                        } else if (strcmp(n->type_id, "float#nan") == 0) { 
    284293                                ZVAL_DOUBLE(o, nanphp()); 
  • trunk/ext/php/phpunit-tests/TestLoad.php

    r263 r264  
    9090        $this->assertSame(syck_load('99.0'), 99.0); 
    9191        $this->assertSame(syck_load('!float 99'), 99.0); 
     92        $this->assertSame(syck_load('190:20:30.15'), 6.8523015e+5); 
    9293    } 
    9394