| 70 | | psex_add_output(php_syck_emitter_xtra *ptr) |
| 71 | | { |
| 72 | | |
| 73 | | } |
| 74 | | |
| | 71 | void 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 | |
| | 80 | void 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 | |
| | 97 | void 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 | |
| | 108 | int 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 | |
| | 117 | zval * 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 | } |
| 237 | | void php_syck_emitter_handler(SyckEmitter *e, st_data_t data) |
| 238 | | { |
| 239 | | |
| | 286 | void 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 | } |