Changeset 258 for trunk/ext/php

Show
Ignore:
Timestamp:
07/03/2007 15:56:19 (17 months ago)
Author:
indeyets
Message:

syck_dump() works for primitive types

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • trunk/ext/php/phpext.c

    r257 r258  
    6464        char *output; 
    6565        size_t output_size; 
     66        size_t output_alloc; 
    6667        zval **stack; 
    6768        unsigned char level; 
    6869} php_syck_emitter_xtra; 
    6970 
    70 psex_add_output(php_syck_emitter_xtra *ptr) 
    71 { 
    72          
    73 } 
    74  
     71void psex_init(php_syck_emitter_xtra *ptr) 
     72{ 
     73        ptr->output = NULL; 
     74        ptr->output_size = 0; 
     75        ptr->output_alloc = 0; 
     76        ptr->stack = emalloc(sizeof(zval *) * 255); 
     77        ptr->level = 0; 
     78} 
     79 
     80void psex_free(php_syck_emitter_xtra *ptr) 
     81{ 
     82        if (ptr->output) { 
     83                efree(ptr->output); 
     84                ptr->output = NULL; 
     85        } 
     86 
     87        if (ptr->stack) { 
     88                efree(ptr->stack); 
     89                ptr->stack = NULL; 
     90        } 
     91 
     92        ptr->output_size = 0; 
     93        ptr->output_alloc = 0; 
     94        ptr->level = 0; 
     95} 
     96 
     97void psex_add_output(php_syck_emitter_xtra *ptr, char *data, size_t len) 
     98{ 
     99        while (ptr->output_size + len > ptr->output_alloc) { 
     100                ptr->output_alloc += 8192; 
     101                ptr->output = erealloc(ptr->output, ptr->output_alloc); 
     102        } 
     103 
     104        strncpy(ptr->output + ptr->output_size, data, len); 
     105        ptr->output_size += len; 
     106} 
     107 
     108int psex_push_obj(php_syck_emitter_xtra *ptr, zval *obj) 
     109{ 
     110        if (ptr->level == 255) 
     111                return 0; 
     112 
     113        ptr->stack[++(ptr->level)] = obj; 
     114        return 1; 
     115} 
     116 
     117zval * psex_pop_obj(php_syck_emitter_xtra *ptr) 
     118{ 
     119        if (ptr->level == 0) 
     120                return NULL; 
     121 
     122        return ptr->stack[(ptr->level)--]; 
     123} 
    75124 
    76125function_entry syck_functions[] = { 
     
    168217                        } else if (strcmp(n->type_id, "merge") == 0) { 
    169218                                /* This thing doesn't work, anyway */ 
    170                                 /*  
     219                                /* 
    171220                                TSRMLS_FETCH(); 
    172221                                object_init_ex(o, merge_key_entry); 
     
    235284} 
    236285 
    237 void php_syck_emitter_handler(SyckEmitter *e, st_data_t data) 
    238 { 
    239          
     286void php_syck_emitter_handler(SyckEmitter *e, st_data_t id) 
     287{ 
     288        php_syck_emitter_xtra *bonus = (php_syck_emitter_xtra *) e->bonus; 
     289        zval *data = bonus->stack[id]; 
     290 
     291        switch (Z_TYPE_P(data)) { 
     292                case IS_NULL: 
     293                        syck_emit_scalar(e, "null", scalar_none, 0, 0, 0, "", 0); 
     294                break; 
     295 
     296                case IS_BOOL: 
     297                { 
     298                    char *bool_s = Z_BVAL_P(data) ? "true" : "false"; 
     299                    syck_emit_scalar(e, "boolean", scalar_none, 0, 0, 0, bool_s, strlen(bool_s)); 
     300                } 
     301                break; 
     302 
     303                case IS_LONG: 
     304                { 
     305                        size_t res_size; 
     306                        char *res; 
     307 
     308                        res_size = snprintf(res, 0, "%ld", Z_LVAL_P(data)); /* getting size ("0" doesn't let output) */ 
     309                        res = emalloc(res_size + 1); 
     310                        snprintf(res, res_size + 1, "%ld", Z_LVAL_P(data)); 
     311 
     312                        syck_emit_scalar(e, "number", scalar_none, 0, 0, 0, res, res_size); 
     313                        efree(res); 
     314                } 
     315                break; 
     316 
     317                case IS_DOUBLE: 
     318                { 
     319                        size_t res_size; 
     320                        char *res; 
     321 
     322                        res_size = snprintf(res, 0, "%f", Z_DVAL_P(data)); /* getting size ("0" doesn't let output) */ 
     323                        res = emalloc(res_size + 1); 
     324                        snprintf(res, res_size + 1, "%f", Z_DVAL_P(data)); 
     325 
     326                        syck_emit_scalar(e, "number", scalar_none, 0, 0, 0, res, res_size); 
     327                        efree(res); 
     328                } 
     329                break; 
     330 
     331                case IS_STRING: 
     332                        syck_emit_scalar(e, "string", scalar_none, 0, 0, 0, Z_STRVAL_P(data), Z_STRLEN_P(data)); 
     333                break; 
     334 
     335                case IS_ARRAY: 
     336                break; 
     337 
     338                case IS_OBJECT: 
     339                break; 
     340 
     341                case IS_RESOURCE: 
     342                default: 
     343                        /* something unknown */ 
     344                break; 
     345        } 
    240346} 
    241347 
    242348void php_syck_output_handler(SyckEmitter *e, char *str, long len) 
    243349{ 
    244          
     350        php_syck_emitter_xtra *bonus = (php_syck_emitter_xtra *) e->bonus; 
     351        psex_add_output(bonus, str, (size_t)len); 
    245352} 
    246353 
     
    292399{ 
    293400        SyckEmitter *emitter; 
    294         emitter_extra *extra; 
     401        php_syck_emitter_xtra *extra; 
    295402        zval *ptr; 
    296403 
     
    303410        } 
    304411 
     412        extra = emalloc(sizeof(php_syck_emitter_xtra)); 
     413        psex_init(extra); 
     414        psex_push_obj(extra, ptr); 
     415 
    305416        emitter = syck_new_emitter(); 
    306         emitter->bonus = emalloc(sizeof(emitter_extra)); 
    307         emitter->bonus.output = emalloc(8192); 
    308         emitter->bonus.output_size = 8192; 
     417        emitter->bonus = extra; 
    309418 
    310419        syck_emitter_handler(emitter, php_syck_emitter_handler); 
    311420        syck_output_handler(emitter, php_syck_output_handler); 
    312421 
    313         syck_emit(emitter, 0); 
     422        syck_emit(emitter, extra->level); 
    314423        syck_emitter_flush(emitter, 0); 
    315424 
    316         efree(emitter->bonus); 
     425        ZVAL_STRINGL(return_value, extra->output, extra->output_size, 1); 
     426 
     427        psex_free(extra); 
     428        efree(extra); 
    317429        syck_free_emitter(emitter); 
    318430}