2 +--------------------------------------------------------------------+
4 +--------------------------------------------------------------------+
5 | Redistribution and use in source and binary forms, with or without |
6 | modification, are permitted provided that the conditions mentioned |
7 | in the accompanying LICENSE file are met. |
8 +--------------------------------------------------------------------+
9 | Copyright (c) 2021, Michael Wallner <mike@php.net> |
10 +--------------------------------------------------------------------+
18 #include "ext/standard/info.h"
20 #include "Zend/zend_enum.h"
21 #include "Zend/zend_exceptions.h"
22 #include "Zend/zend_closures.h"
23 #include "Zend/zend_interfaces.h"
24 #include "Zend/zend_smart_str.h"
26 #include "ext/date/php_date.h"
27 #include "ext/spl/spl_exceptions.h"
30 #include "ion_private.h"
32 static ZEND_METHOD(ion_Symbol_ImportLocation
, __construct
)
34 php_ion_symbol_iloc
*obj
= php_ion_obj(symbol_iloc
, Z_OBJ_P(ZEND_THIS
));
38 ZEND_PARSE_PARAMETERS_START(2, 2)
39 Z_PARAM_STR(obj
->name
)
40 Z_PARAM_LONG(location
)
41 ZEND_PARSE_PARAMETERS_END();
43 obj
->loc
.location
= (SID
) location
;
44 php_ion_symbol_iloc_ctor(obj
);
46 static ZEND_METHOD(ion_Symbol
, __construct
)
48 php_ion_symbol
*obj
= php_ion_obj(symbol
, Z_OBJ_P(ZEND_THIS
));
52 ZEND_PARSE_PARAMETERS_START(0, 3)
54 Z_PARAM_STR_OR_NULL(obj
->value
)
56 Z_PARAM_OBJ_OF_CLASS_OR_NULL(obj
->iloc
, ce_Symbol_ImportLocation
)
57 ZEND_PARSE_PARAMETERS_END();
59 obj
->sym
.sid
= (SID
) sid
;
60 php_ion_symbol_ctor(obj
);
62 static ZEND_METHOD(ion_Symbol
, equals
)
64 php_ion_symbol
*sym
= php_ion_obj(symbol
, Z_OBJ_P(ZEND_THIS
));
67 zend_object
*other_obj
;
68 ZEND_PARSE_PARAMETERS_START(1, 1)
69 Z_PARAM_OBJ_OF_CLASS(other_obj
, ce_Symbol
)
70 ZEND_PARSE_PARAMETERS_END();
73 iERR err
= ion_symbol_is_equal(
75 &php_ion_obj(symbol
, other_obj
)->sym
, &eq
);
79 static ZEND_METHOD(ion_Symbol
, __toString
)
81 php_ion_symbol
*sym
= php_ion_obj(symbol
, Z_OBJ_P(ZEND_THIS
));
84 ZEND_PARSE_PARAMETERS_NONE();
87 RETURN_EMPTY_STRING();
89 RETURN_STR_COPY(sym
->value
);
91 static ZEND_METHOD(ion_Symbol_Enum
, toSymbol
)
93 ZEND_PARSE_PARAMETERS_NONE();
95 zval
*zc
= zend_enum_fetch_case_name(Z_OBJ_P(ZEND_THIS
));
98 zval
*zsym
= php_ion_global_symbol_fetch_by_enum(Z_STR_P(zc
));
100 RETVAL_ZVAL(zsym
, 1, 0);
102 static ZEND_METHOD(ion_Symbol_Enum
, toSID
)
104 ZEND_PARSE_PARAMETERS_NONE();
106 zval
*zc
= zend_enum_fetch_case_name(Z_OBJ_P(ZEND_THIS
));
109 zval
*zsym
= php_ion_global_symbol_fetch_by_enum(Z_STR_P(zc
));
113 RETVAL_ZVAL(zend_read_property(Z_OBJCE_P(zsym
), Z_OBJ_P(zsym
), ZEND_STRL("sid"), 0, &tmp
), 1, 0);
115 static ZEND_METHOD(ion_Symbol_Enum
, toString
)
117 ZEND_PARSE_PARAMETERS_NONE();
119 zval
*zc
= zend_enum_fetch_case_name(Z_OBJ_P(ZEND_THIS
));
122 zval
*zsym
= php_ion_global_symbol_fetch_by_enum(Z_STR_P(zc
));
126 RETVAL_ZVAL(zend_read_property(Z_OBJCE_P(zsym
), Z_OBJ_P(zsym
), ZEND_STRL("value"), 0, &tmp
), 1, 0);
128 static ZEND_FUNCTION(ion_Symbol_Table_System
)
130 ZEND_PARSE_PARAMETERS_NONE();
132 object_init_ex(return_value
, ce_Symbol_Table_Shared
);
133 php_ion_symbol_table
*obj
= php_ion_obj(symbol_table
, Z_OBJ_P(return_value
));
134 ION_CHECK(ion_symbol_table_get_system_table(&obj
->tab
, 1));
135 php_ion_symbol_table_ctor(obj
);
136 ion_symbol_table_lock(obj
->tab
);
138 static ZEND_FUNCTION(ion_Symbol_Table_PHP
)
140 ZEND_PARSE_PARAMETERS_NONE();
142 object_init_ex(return_value
, ce_Symbol_Table_Shared
);
143 php_ion_symbol_table
*obj
= php_ion_obj(symbol_table
, Z_OBJ_P(return_value
));
144 obj
->tab
= g_sym_tab_php
;
145 php_ion_symbol_table_ctor(obj
);
146 ion_symbol_table_lock(obj
->tab
);
148 static ZEND_METHOD(ion_Symbol_Table_Local
, __construct
)
150 php_ion_symbol_table
*obj
= php_ion_obj(symbol_table
, Z_OBJ_P(ZEND_THIS
));
153 ZEND_PARSE_PARAMETERS_NONE();
155 ION_CHECK(ion_symbol_table_open_with_type(&obj
->tab
, NULL
, ist_LOCAL
));
156 obj
->dtor
= ion_symbol_table_close
;
159 static ZEND_METHOD(ion_Symbol_Table_Local
, import
)
161 php_ion_symbol_table
*obj
= php_ion_obj(symbol_table
, Z_OBJ_P(ZEND_THIS
));
164 zend_object
*zo_import
;
165 ZEND_PARSE_PARAMETERS_START(1, 1)
166 Z_PARAM_OBJ_OF_CLASS(zo_import
, ce_Symbol_Table
);
167 ZEND_PARSE_PARAMETERS_END();
169 php_ion_symbol_table_import(obj
, php_ion_obj(symbol_table
, zo_import
));
171 static ZEND_METHOD(ion_Symbol_Table_Shared
, __construct
)
173 php_ion_symbol_table
*obj
= php_ion_obj(symbol_table
, Z_OBJ_P(ZEND_THIS
));
177 zend_long version
= 1;
178 HashTable
*ht_sym
= NULL
;
179 ZEND_PARSE_PARAMETERS_START(1, 3)
182 Z_PARAM_LONG(version
)
183 Z_PARAM_ARRAY_HT_OR_NULL(ht_sym
)
184 ZEND_PARSE_PARAMETERS_END();
186 ION_CHECK(ion_symbol_table_open_with_type(&obj
->tab
, NULL
, ist_SHARED
));
187 obj
->dtor
= ion_symbol_table_close
;
190 ION_CHECK(ion_symbol_table_set_name(obj
->tab
, ion_string_from_zend(&is
, zname
)));
191 ION_CHECK(ion_symbol_table_set_version(obj
->tab
, version
));
193 php_ion_symbol_table_ctor(obj
);
196 if (ht_sym
) ZEND_HASH_FOREACH_VAL(ht_sym
, zsym
)
198 zend_string
*str
= zval_get_string(zsym
);
204 ION_CHECK(ion_symbol_table_add_symbol(obj
->tab
, ion_string_from_zend(&istr
, str
), NULL
), zend_string_release(str
));
205 zend_string_release(str
);
207 ZEND_HASH_FOREACH_END();
209 static ZEND_METHOD(ion_Symbol_Table
, getMaxId
)
211 php_ion_symbol_table
*obj
= php_ion_obj(symbol_table
, Z_OBJ_P(ZEND_THIS
));
214 ZEND_PARSE_PARAMETERS_NONE();
217 ION_CHECK(ion_symbol_table_get_max_sid(obj
->tab
, &max_sid
));
218 RETURN_LONG(max_sid
);
220 static ZEND_METHOD(ion_Symbol_Table
, add
)
222 php_ion_symbol_table
*obj
= php_ion_obj(symbol_table
, Z_OBJ_P(ZEND_THIS
));
225 zend_object
*zo_sym
= NULL
;
226 zend_string
*zs_sym
= NULL
;
227 ZEND_PARSE_PARAMETERS_START(1, 1)
228 Z_PARAM_OBJ_OF_CLASS_OR_STR(zo_sym
, ce_Symbol
, zs_sym
)
229 ZEND_PARSE_PARAMETERS_END();
233 ZVAL_OBJ(&z_sym
, zo_sym
);
234 zs_sym
= zval_get_string(&z_sym
);
239 ION_CHECK(ion_symbol_table_add_symbol(obj
->tab
, ion_string_from_zend(&is
, zs_sym
), &sid
),
241 zend_string_release(zs_sym
);
244 zend_string_release(zs_sym
);
248 static ZEND_METHOD(ion_Symbol_Table
, find
)
250 php_ion_symbol_table
*obj
= php_ion_obj(symbol_table
, Z_OBJ_P(ZEND_THIS
));
254 zend_string
*zstring
= NULL
;
255 ZEND_PARSE_PARAMETERS_START(1, 1)
256 Z_PARAM_STR_OR_LONG(zstring
, zsid
)
257 ZEND_PARSE_PARAMETERS_END();
262 ION_CHECK(ion_symbol_table_find_by_name(obj
->tab
, ion_string_from_zend(&is
, zstring
), &sid
));
266 ION_CHECK(ion_symbol_table_get_symbol(obj
->tab
, zsid
, &sym
));
268 php_ion_symbol_table_symbol_zval(obj
, sym
, return_value
);
271 static ZEND_METHOD(ion_Symbol_Table
, findLocal
)
273 php_ion_symbol_table
*obj
= php_ion_obj(symbol_table
, Z_OBJ_P(ZEND_THIS
));
277 zend_string
*zstring
;
278 ZEND_PARSE_PARAMETERS_START(1, 1)
279 Z_PARAM_STR_OR_LONG(zstring
, zsid
)
280 ZEND_PARSE_PARAMETERS_END();
285 ION_CHECK(ion_symbol_table_find_by_name(obj
->tab
, ion_string_from_zend(&is
, zstring
), &sid
));
289 ION_CHECK(ion_symbol_table_get_local_symbol(obj
->tab
, zsid
, &sym
));
291 php_ion_symbol_table_symbol_zval(obj
, sym
, return_value
);
294 static ZEND_METHOD(ion_Catalog
, __construct
)
296 php_ion_catalog
*obj
= php_ion_obj(catalog
, Z_OBJ_P(ZEND_THIS
));
299 ZEND_PARSE_PARAMETERS_NONE();
301 php_ion_catalog_ctor(obj
);
303 static ZEND_METHOD(ion_Catalog
, count
)
305 php_ion_catalog
*obj
= php_ion_obj(catalog
, Z_OBJ_P(ZEND_THIS
));
308 ZEND_PARSE_PARAMETERS_NONE();
311 ION_CHECK(ion_catalog_get_symbol_table_count(obj
->cat
, &c
));
314 static ZEND_METHOD(ion_Catalog
, add
)
316 php_ion_catalog
*obj
= php_ion_obj(catalog
, Z_OBJ_P(ZEND_THIS
));
319 zend_object
*zo_symtab
;
320 ZEND_PARSE_PARAMETERS_START(1, 1)
321 Z_PARAM_OBJ_OF_CLASS(zo_symtab
, ce_Symbol_Table
)
322 ZEND_PARSE_PARAMETERS_END();
324 php_ion_symbol_table
*o_symtab
= php_ion_obj(symbol_table
, zo_symtab
);
325 php_ion_catalog_add_symbol_table(obj
, o_symtab
);
328 static ZEND_METHOD(ion_Catalog
, remove
)
330 php_ion_catalog
*obj
= php_ion_obj(catalog
, Z_OBJ_P(ZEND_THIS
));
333 zend_object
*zo_symtab
= NULL
;
334 zend_string
*zs_symtab
= NULL
;
335 ZEND_PARSE_PARAMETERS_START(1, 1)
336 Z_PARAM_OBJ_OF_CLASS_OR_STR(zo_symtab
, ce_Symbol_Table
, zs_symtab
)
337 ZEND_PARSE_PARAMETERS_END();
342 zval
*ztabs
= zend_read_property(obj
->std
.ce
, &obj
->std
, ZEND_STRL("symbolTables"), 0, &tmp
);
346 zend_ulong idx
= (uintptr_t) &zo_symtab
->gc
;
347 RETVAL_BOOL(SUCCESS
== zend_hash_index_del(Z_ARRVAL_P(ztabs
), idx
));
348 ION_CHECK(ion_catalog_release_symbol_table(obj
->cat
, php_ion_obj(symbol_table
, zo_symtab
)->tab
));
350 bool deleted
= false;
351 ION_SYMBOL_TABLE
*tab
;
353 ion_string_from_zend(&is
, zs_symtab
);
356 ION_CHECK(ion_catalog_find_best_match(obj
->cat
, &is
, 0, &tab
));
358 ION_CHECK(ion_catalog_release_symbol_table(obj
->cat
, tab
));
362 RETVAL_BOOL(deleted
);
366 static ZEND_METHOD(ion_Catalog
, find
)
368 php_ion_catalog
*obj
= php_ion_obj(catalog
, Z_OBJ_P(ZEND_THIS
));
371 zend_long zversion
= 0;
373 ZEND_PARSE_PARAMETERS_START(1, 2)
376 Z_PARAM_LONG(zversion
)
377 ZEND_PARSE_PARAMETERS_END();
380 ION_SYMBOL_TABLE
*tab_ptr
= NULL
;
381 ION_CHECK(ion_catalog_find_symbol_table(obj
->cat
, ion_string_from_zend(&is
, zname
), zversion
, &tab_ptr
));
383 php_ion_catalog_symbol_table_zval(obj
, tab_ptr
, return_value
);
386 static ZEND_METHOD(ion_Catalog
, findBest
)
388 php_ion_catalog
*obj
= php_ion_obj(catalog
, Z_OBJ_P(ZEND_THIS
));
391 zend_long zversion
= 0;
393 ZEND_PARSE_PARAMETERS_START(1, 2)
396 Z_PARAM_LONG(zversion
)
397 ZEND_PARSE_PARAMETERS_END();
400 ION_SYMBOL_TABLE
*tab_ptr
= NULL
;
401 ION_CHECK(ion_catalog_find_best_match(obj
->cat
, ion_string_from_zend(&is
, zname
), zversion
, &tab_ptr
));
403 php_ion_catalog_symbol_table_zval(obj
, tab_ptr
, return_value
);
406 static ZEND_METHOD(ion_Timestamp
, __construct
)
408 php_ion_timestamp
*obj
= php_ion_obj(timestamp
, Z_OBJ_P(ZEND_THIS
));
412 zend_object
*precision_obj
= NULL
, *format_obj
= NULL
;
413 zend_string
*fmt
= NULL
, *dt
= NULL
;
415 ZEND_PARSE_PARAMETERS_START(1, 4)
416 Z_PARAM_OBJ_OF_CLASS_OR_LONG(precision_obj
, ce_Timestamp_Precision
, precision
)
418 Z_PARAM_OBJ_OF_CLASS_OR_STR_OR_NULL(format_obj
, ce_Timestamp_Format
, fmt
)
419 Z_PARAM_STR_OR_NULL(dt
)
421 ZEND_PARSE_PARAMETERS_END();
424 precision
= Z_LVAL_P(zend_enum_fetch_case_value(precision_obj
));
427 fmt
= Z_STR_P(zend_enum_fetch_case_value(format_obj
));
429 php_ion_timestamp_ctor(obj
, precision
, fmt
, dt
, tz
);
431 static ZEND_METHOD(ion_Timestamp
, __toString
)
433 php_ion_timestamp
*obj
= php_ion_obj(timestamp
, Z_OBJ_P(ZEND_THIS
));
436 ZEND_PARSE_PARAMETERS_NONE();
440 zend_call_method_with_1_params(&obj
->std
, obj
->std
.ce
, NULL
, "format", return_value
,
441 zend_read_property(obj
->std
.ce
, &obj
->std
, ZEND_STRL("format"), 0, &fmt
));
443 static ZEND_METHOD(ion_Decimal_Context
, __construct
)
445 php_ion_decimal_ctx
*obj
= php_ion_obj(decimal_ctx
, Z_OBJ_P(ZEND_THIS
));
449 zend_object
*o_round
= NULL
;
450 zend_long digits
, emax
, emin
, round
;
451 ZEND_PARSE_PARAMETERS_START(5, 5)
455 Z_PARAM_OBJ_OF_CLASS_OR_LONG(o_round
, ce_Decimal_Context_Rounding
, round
)
457 ZEND_PARSE_PARAMETERS_END();
460 round
= Z_LVAL_P(zend_enum_fetch_case_value(o_round
));
462 php_ion_decimal_ctx_init(&obj
->ctx
, digits
, emax
, emin
, round
, clamp
); // NOLINT(cppcoreguidelines-narrowing-conversions)
463 php_ion_decimal_ctx_ctor(obj
, o_round
);
465 static inline void make_decimal_ctx(INTERNAL_FUNCTION_PARAMETERS
, int kind
)
467 ZEND_PARSE_PARAMETERS_NONE();
469 object_init_ex(return_value
, ce_Decimal_Context
);
470 php_ion_decimal_ctx
*obj
= php_ion_obj(decimal_ctx
, Z_OBJ_P(return_value
));
471 decContextDefault(&obj
->ctx
, kind
);
472 php_ion_decimal_ctx_ctor(obj
, NULL
);
474 static ZEND_METHOD(ion_Decimal_Context
, Dec32
)
476 make_decimal_ctx(INTERNAL_FUNCTION_PARAM_PASSTHRU
, DEC_INIT_DECIMAL32
);
478 static ZEND_METHOD(ion_Decimal_Context
, Dec64
)
480 make_decimal_ctx(INTERNAL_FUNCTION_PARAM_PASSTHRU
, DEC_INIT_DECIMAL64
);
482 static ZEND_METHOD(ion_Decimal_Context
, Dec128
)
484 make_decimal_ctx(INTERNAL_FUNCTION_PARAM_PASSTHRU
, DEC_INIT_DECIMAL128
);
486 static ZEND_METHOD(ion_Decimal_Context
, DecMax
)
488 zend_object
*o_round
= NULL
;
489 zend_long round
= DEC_ROUND_HALF_EVEN
;
490 ZEND_PARSE_PARAMETERS_START(0, 1)
492 Z_PARAM_OBJ_OF_CLASS_OR_LONG(o_round
, ce_Decimal_Context_Rounding
, round
)
493 ZEND_PARSE_PARAMETERS_END();
496 round
= Z_LVAL_P(zend_enum_fetch_case_value(o_round
));
498 object_init_ex(return_value
, ce_Decimal_Context
);
499 php_ion_decimal_ctx
*obj
= php_ion_obj(decimal_ctx
, Z_OBJ_P(return_value
));
500 php_ion_decimal_ctx_init_max(&obj
->ctx
, round
);
501 php_ion_decimal_ctx_ctor(obj
, o_round
);
503 static ZEND_METHOD(ion_Decimal
, __construct
)
505 php_ion_decimal
*obj
= php_ion_obj(decimal
, Z_OBJ_P(ZEND_THIS
));
510 ZEND_PARSE_PARAMETERS_START(1, 2)
511 Z_PARAM_STR_OR_LONG(zstr
, num
)
513 Z_PARAM_OBJ_OF_CLASS_OR_NULL(obj
->ctx
, ce_Decimal_Context
)
514 ZEND_PARSE_PARAMETERS_END();
520 object_init_ex(&zdc
, ce_Decimal_Context
);
521 obj
->ctx
= Z_OBJ(zdc
);
522 php_ion_decimal_ctx_ctor(php_ion_obj(decimal_ctx
, obj
->ctx
), NULL
);
525 decContext
*ctx
= &php_ion_obj(decimal_ctx
, obj
->ctx
)->ctx
;
528 ION_CHECK(ion_decimal_from_string(&obj
->dec
, zstr
->val
, ctx
), OBJ_RELEASE(obj
->ctx
));
530 php_ion_decimal_from_zend_long(&obj
->dec
, ctx
, num
);
533 php_ion_decimal_ctor(obj
);
534 OBJ_RELEASE(obj
->ctx
);
536 static ZEND_METHOD(ion_Decimal
, equals
)
538 php_ion_decimal
*obj
= php_ion_obj(decimal
, Z_OBJ_P(ZEND_THIS
));
541 zend_object
*dec_obj
;
542 ZEND_PARSE_PARAMETERS_START(1, 1)
543 Z_PARAM_OBJ_OF_CLASS(dec_obj
, ce_Decimal
)
544 ZEND_PARSE_PARAMETERS_END();
547 ION_CHECK(ion_decimal_equals(&obj
->dec
, &php_ion_obj(decimal
, dec_obj
)->dec
,
548 obj
->ctx
? &php_ion_obj(decimal_ctx
, obj
->ctx
)->ctx
: NULL
, &is
));
551 static ZEND_METHOD(ion_Decimal
, __toString
)
553 php_ion_decimal
*obj
= php_ion_obj(decimal
, Z_OBJ_P(ZEND_THIS
));
556 ZEND_PARSE_PARAMETERS_NONE();
558 RETURN_STR(php_ion_decimal_to_string(&obj
->dec
));
560 static ZEND_METHOD(ion_Decimal
, toInt
)
562 php_ion_decimal
*obj
= php_ion_obj(decimal
, Z_OBJ_P(ZEND_THIS
));
565 ZEND_PARSE_PARAMETERS_NONE();
568 php_ion_decimal_to_zend_long(&obj
->dec
, &php_ion_obj(decimal_ctx
, obj
->ctx
)->ctx
, &l
);
571 static ZEND_METHOD(ion_Decimal
, isInt
)
573 php_ion_decimal
*obj
= php_ion_obj(decimal
, Z_OBJ_P(ZEND_THIS
));
576 ZEND_PARSE_PARAMETERS_NONE();
578 RETURN_BOOL(ion_decimal_is_integer(&obj
->dec
));
580 static ZEND_METHOD(ion_LOB
, __construct
)
583 zend_object
*type
= NULL
;
584 ZEND_PARSE_PARAMETERS_START(1, 2)
587 Z_PARAM_OBJ_OF_CLASS(type
, ce_Type
)
588 ZEND_PARSE_PARAMETERS_END();
591 type
= zend_enum_get_case_cstr(ce_Type
, "CLob");
593 update_property_obj(Z_OBJ_P(ZEND_THIS
), ZEND_STRL("type"), type
);
594 zend_update_property_str(Z_OBJCE_P(ZEND_THIS
), Z_OBJ_P(ZEND_THIS
), ZEND_STRL("value"), value
);
596 static ZEND_METHOD(ion_Reader_Options
, __construct
)
598 php_ion_reader_options
*opt
= php_ion_obj(reader_options
, Z_OBJ_P(ZEND_THIS
));
599 zend_bool ret_sys_val
= false, skip_validation
= false;
600 zend_long ch_nl
= 0xa, max_depth
= 10, max_ann
= 10, max_ann_buf
= 512,
601 sym_thr
= 0x4000, uval_thr
= 0x4000, chunk_thr
= 0x4000, alloc_pgsz
= 0x10000;
605 ZEND_PARSE_PARAMETERS_START(0, 13)
607 // public readonly ?\ion\Catalog $catalog = null,
608 Z_PARAM_OBJ_OF_CLASS_OR_NULL(opt
->cat
, ce_Catalog
)
609 // public readonly ?\ion\Decimal\Context $decimalContext = null,
610 Z_PARAM_OBJ_OF_CLASS_OR_NULL(opt
->dec_ctx
, ce_Decimal_Context
)
611 // public readonly ?\Closure $onContextChange = null,
612 Z_PARAM_OBJ_OF_CLASS_OR_NULL(opt
->cb
, zend_ce_closure
);
613 // public readonly bool $returnSystemValues = false,
614 Z_PARAM_BOOL(ret_sys_val
)
615 // public readonly int $newLine = 0xa,
617 // public readonly int $maxContainerDepth = 10,
618 Z_PARAM_LONG(max_depth
)
619 // public readonly int $maxAnnotations = 10,
620 Z_PARAM_LONG(max_ann
)
621 // public readonly int $maxAnnotationBuffered = 512,
622 Z_PARAM_LONG(max_ann_buf
)
623 // public readonly int $symbolThreshold = 0x4000,
624 Z_PARAM_LONG(sym_thr
)
625 // public readonly int $userValueThreshold = 0x4000,
626 Z_PARAM_LONG(uval_thr
)
627 // public readonly int $chunkThreshold = 0x4000,
628 Z_PARAM_LONG(chunk_thr
)
629 // public readonly int $allocationPageSize = 0x10000,
630 Z_PARAM_LONG(alloc_pgsz
)
631 // public readonly bool $skipCharacterValidation = false,
632 Z_PARAM_BOOL(skip_validation
)
633 ZEND_PARSE_PARAMETERS_END();
637 ZVAL_OBJ(&zcb
, opt
->cb
);
638 zend_fcall_info_init(&zcb
, 0, &opt
->ccn
.fci
, &opt
->ccn
.fcc
, NULL
, NULL
);
639 opt
->opt
.context_change_notifier
.context
= &opt
->ccn
;
640 update_property_obj(&opt
->std
, ZEND_STRL("onContextChange"), opt
->cb
);
642 zend_update_property_null(NULL
, &opt
->std
, ZEND_STRL("onContextChange"));
645 update_property_obj(&opt
->std
, ZEND_STRL("catalog"), opt
->cat
);
646 opt
->opt
.pcatalog
= php_ion_obj(catalog
, opt
->cat
)->cat
;
648 zend_update_property_null(NULL
, &opt
->std
, ZEND_STRL("catalog"));
651 update_property_obj(&opt
->std
, ZEND_STRL("decimalContext"), opt
->dec_ctx
);
652 opt
->opt
.decimal_context
= &php_ion_obj(decimal_ctx
, opt
->dec_ctx
)->ctx
;
654 zend_update_property_null(NULL
, &opt
->std
, ZEND_STRL("decimalContext"));
656 zend_update_property_bool(opt
->std
.ce
, &opt
->std
, ZEND_STRL("returnSystemValues"),
657 opt
->opt
.return_system_values
= ret_sys_val
);
658 zend_update_property_long(opt
->std
.ce
, &opt
->std
, ZEND_STRL("newLine"),
659 opt
->opt
.new_line_char
= (int) ch_nl
);
660 zend_update_property_long(opt
->std
.ce
, &opt
->std
, ZEND_STRL("maxContainerDepth"),
661 opt
->opt
.max_container_depth
= (SIZE
) max_depth
);
662 zend_update_property_long(opt
->std
.ce
, &opt
->std
, ZEND_STRL("maxAnnotations"),
663 opt
->opt
.max_annotation_count
= (SIZE
) max_ann
);
664 zend_update_property_long(opt
->std
.ce
, &opt
->std
, ZEND_STRL("maxAnnotationBuffered"),
665 opt
->opt
.max_annotation_buffered
= (SIZE
) max_ann_buf
);
666 zend_update_property_long(opt
->std
.ce
, &opt
->std
, ZEND_STRL("symbolThreshold"),
667 opt
->opt
.symbol_threshold
= (SIZE
) sym_thr
);
668 zend_update_property_long(opt
->std
.ce
, &opt
->std
, ZEND_STRL("userValueThreshold"),
669 opt
->opt
.user_value_threshold
= (SIZE
) uval_thr
);
670 zend_update_property_long(opt
->std
.ce
, &opt
->std
, ZEND_STRL("chunkThreshold"),
671 opt
->opt
.chunk_threshold
= (SIZE
) chunk_thr
);
672 zend_update_property_long(opt
->std
.ce
, &opt
->std
, ZEND_STRL("allocationPageSize"),
673 opt
->opt
.allocation_page_size
= (SIZE
) alloc_pgsz
);
674 zend_update_property_long(opt
->std
.ce
, &opt
->std
, ZEND_STRL("skipCharacterValidation"),
675 opt
->opt
.skip_character_validation
= (SIZE
) skip_validation
);
677 static ZEND_METHOD(ion_Reader_Reader
, hasChildren
)
679 php_ion_reader
*obj
= php_ion_obj(reader
, Z_OBJ_P(ZEND_THIS
));
682 ZEND_PARSE_PARAMETERS_NONE();
685 ION_CHECK(ion_reader_get_type(obj
->reader
, &t
));
686 switch (ION_TYPE_INT(t
)) {
697 static ZEND_METHOD(ion_Reader_Reader
, getChildren
)
699 php_ion_reader
*obj
= php_ion_obj(reader
, Z_OBJ_P(ZEND_THIS
));
702 ZEND_PARSE_PARAMETERS_NONE();
704 ION_CHECK(ion_reader_step_in(obj
->reader
));
706 RETURN_ZVAL(ZEND_THIS
, 1, 0);
708 static ZEND_METHOD(ion_Reader_Reader
, rewind
)
710 php_ion_reader
*obj
= php_ion_obj(reader
, Z_OBJ_P(ZEND_THIS
));
713 ZEND_PARSE_PARAMETERS_NONE();
715 ION_CHECK(ion_reader_next(obj
->reader
, &obj
->state
));
717 static ZEND_METHOD(ion_Reader_Reader
, next
)
719 php_ion_reader
*obj
= php_ion_obj(reader
, Z_OBJ_P(ZEND_THIS
));
722 ZEND_PARSE_PARAMETERS_NONE();
724 if (obj
->state
== tid_EOF
) {
726 ION_CHECK(ion_reader_get_depth(obj
->reader
, &depth
));
728 ION_CHECK(ion_reader_step_out(obj
->reader
));
731 ION_CHECK(ion_reader_next(obj
->reader
, &obj
->state
));
733 static ZEND_METHOD(ion_Reader_Reader
, valid
)
735 php_ion_reader
*obj
= php_ion_obj(reader
, Z_OBJ_P(ZEND_THIS
));
738 ZEND_PARSE_PARAMETERS_NONE();
739 RETURN_BOOL(obj
->state
!= tid_none
&& obj
->state
!= tid_EOF
);
741 static ZEND_METHOD(ion_Reader_Reader
, key
)
743 php_ion_reader
*obj
= php_ion_obj(reader
, Z_OBJ_P(ZEND_THIS
));
746 ZEND_PARSE_PARAMETERS_NONE();
747 RETURN_IONTYPE(obj
->state
);
749 static ZEND_METHOD(ion_Reader_Reader
, current
)
751 ZEND_PARSE_PARAMETERS_NONE();
752 RETURN_ZVAL(ZEND_THIS
, 1, 0);
754 static ZEND_METHOD(ion_Reader_Reader
, getType
)
756 php_ion_reader
*obj
= php_ion_obj(reader
, Z_OBJ_P(ZEND_THIS
));
759 ZEND_PARSE_PARAMETERS_NONE();
762 ION_CHECK(ion_reader_get_type(obj
->reader
, &typ
));
765 static ZEND_METHOD(ion_Reader_Reader
, hasAnnotations
)
767 php_ion_reader
*obj
= php_ion_obj(reader
, Z_OBJ_P(ZEND_THIS
));
770 ZEND_PARSE_PARAMETERS_NONE();
773 ION_CHECK(ion_reader_has_any_annotations(obj
->reader
, &has
));
776 static ZEND_METHOD(ion_Reader_Reader
, hasAnnotation
)
778 php_ion_reader
*obj
= php_ion_obj(reader
, Z_OBJ_P(ZEND_THIS
));
781 zend_string
*ann_zstr
;
782 ZEND_PARSE_PARAMETERS_START(1, 1);
783 Z_PARAM_STR(ann_zstr
);
784 ZEND_PARSE_PARAMETERS_END();
788 ION_CHECK(ion_reader_has_annotation(obj
->reader
, ion_string_from_zend(&ann_istr
, ann_zstr
), &has
));
791 static ZEND_METHOD(ion_Reader_Reader
, isNull
)
793 php_ion_reader
*obj
= php_ion_obj(reader
, Z_OBJ_P(ZEND_THIS
));
796 ZEND_PARSE_PARAMETERS_NONE();
799 ION_CHECK(ion_reader_is_null(obj
->reader
, &is
));
802 static ZEND_METHOD(ion_Reader_Reader
, isInStruct
)
804 php_ion_reader
*obj
= php_ion_obj(reader
, Z_OBJ_P(ZEND_THIS
));
807 ZEND_PARSE_PARAMETERS_NONE();
810 ION_CHECK(ion_reader_is_in_struct(obj
->reader
, &is
));
813 static ZEND_METHOD(ion_Reader_Reader
, getFieldName
)
815 php_ion_reader
*obj
= php_ion_obj(reader
, Z_OBJ_P(ZEND_THIS
));
818 ZEND_PARSE_PARAMETERS_NONE();
821 ION_CHECK(ion_reader_get_field_name(obj
->reader
, &name
));
822 RETURN_STRINGL((char *) name
.value
, name
.length
);
824 static ZEND_METHOD(ion_Reader_Reader
, getFieldNameSymbol
)
826 php_ion_reader
*obj
= php_ion_obj(reader
, Z_OBJ_P(ZEND_THIS
));
829 ZEND_PARSE_PARAMETERS_NONE();
832 ION_CHECK(ion_reader_get_field_name_symbol(obj
->reader
, &sym_ptr
));
834 php_ion_symbol_zval(sym_ptr
, return_value
);
836 static ZEND_METHOD(ion_Reader_Reader
, getAnnotations
)
838 php_ion_reader
*obj
= php_ion_obj(reader
, Z_OBJ_P(ZEND_THIS
));
841 ZEND_PARSE_PARAMETERS_NONE();
845 max
= php_ion_obj(reader_options
, obj
->opt
)->opt
.max_annotation_count
;
849 ION_STRING
*ptr
= ecalloc(sizeof(*ptr
), max
);
850 iERR err
= ion_reader_get_annotations(obj
->reader
, ptr
, max
, &count
);
852 array_init_size(return_value
, count
);
853 for (int32_t i
= 0; i
< count
; ++i
) {
854 add_next_index_str(return_value
, zend_string_from_ion(&ptr
[i
]));
860 static ZEND_METHOD(ion_Reader_Reader
, getAnnotationSymbols
)
862 php_ion_reader
*obj
= php_ion_obj(reader
, Z_OBJ_P(ZEND_THIS
));
865 ZEND_PARSE_PARAMETERS_NONE();
869 max
= php_ion_obj(reader_options
, obj
->opt
)->opt
.max_annotation_count
;
873 ION_SYMBOL
*ptr
= ecalloc(sizeof(*ptr
), max
);
874 iERR err
= ion_reader_get_annotation_symbols(obj
->reader
, ptr
, max
, &count
);
876 array_init_size(return_value
, count
);
877 for (int32_t i
= 0; i
< count
; ++i
) {
879 php_ion_symbol_zval(&ptr
[i
], &zsym
);
880 add_next_index_zval(return_value
, &zsym
);
886 static ZEND_METHOD(ion_Reader_Reader
, countAnnotations
)
888 php_ion_reader
*obj
= php_ion_obj(reader
, Z_OBJ_P(ZEND_THIS
));
891 ZEND_PARSE_PARAMETERS_NONE();
894 ION_CHECK(ion_reader_get_annotation_count(obj
->reader
, &sz
));
897 static ZEND_METHOD(ion_Reader_Reader
, getAnnotation
)
899 php_ion_reader
*obj
= php_ion_obj(reader
, Z_OBJ_P(ZEND_THIS
));
903 ZEND_PARSE_PARAMETERS_START(1, 1)
905 ZEND_PARSE_PARAMETERS_END();
908 ION_CHECK(ion_reader_get_an_annotation(obj
->reader
, idx
, &ann
));
909 RETURN_STRINGL((char *) ann
.value
, ann
.length
);
911 static ZEND_METHOD(ion_Reader_Reader
, getAnnotationSymbol
)
913 php_ion_reader
*obj
= php_ion_obj(reader
, Z_OBJ_P(ZEND_THIS
));
917 ZEND_PARSE_PARAMETERS_START(1, 1)
919 ZEND_PARSE_PARAMETERS_END();
922 ION_CHECK(ion_reader_get_an_annotation_symbol(obj
->reader
, idx
, &sym
));
923 php_ion_symbol_zval(&sym
, return_value
);
925 static ZEND_METHOD(ion_Reader_Reader
, readNull
)
927 php_ion_reader
*obj
= php_ion_obj(reader
, Z_OBJ_P(ZEND_THIS
));
930 ZEND_PARSE_PARAMETERS_NONE();
933 ION_CHECK(ion_reader_read_null(obj
->reader
, &typ
));
936 static ZEND_METHOD(ion_Reader_Reader
, readBool
)
938 php_ion_reader
*obj
= php_ion_obj(reader
, Z_OBJ_P(ZEND_THIS
));
941 ZEND_PARSE_PARAMETERS_NONE();
944 ION_CHECK(ion_reader_read_bool(obj
->reader
, &b
));
947 static ZEND_METHOD(ion_Reader_Reader
, readInt
)
949 php_ion_reader
*obj
= php_ion_obj(reader
, Z_OBJ_P(ZEND_THIS
));
952 ZEND_PARSE_PARAMETERS_NONE();
954 php_ion_reader_read_int(obj
->reader
, return_value
);
956 static ZEND_METHOD(ion_Reader_Reader
, readFloat
)
958 php_ion_reader
*obj
= php_ion_obj(reader
, Z_OBJ_P(ZEND_THIS
));
961 ZEND_PARSE_PARAMETERS_NONE();
964 ION_CHECK(ion_reader_read_double(obj
->reader
, &dval
));
967 static ZEND_METHOD(ion_Reader_Reader
, readDecimal
)
969 php_ion_reader
*obj
= php_ion_obj(reader
, Z_OBJ_P(ZEND_THIS
));
972 ZEND_PARSE_PARAMETERS_NONE();
974 object_init_ex(return_value
, ce_Decimal
);
975 php_ion_decimal
*dec
= php_ion_obj(decimal
, Z_OBJ_P(return_value
));
976 ION_CHECK(ion_reader_read_ion_decimal(obj
->reader
, &dec
->dec
));
977 php_ion_decimal_ctor(dec
);
979 static ZEND_METHOD(ion_Reader_Reader
, readTimestamp
)
981 php_ion_reader
*obj
= php_ion_obj(reader
, Z_OBJ_P(ZEND_THIS
));
984 ZEND_PARSE_PARAMETERS_NONE();
986 php_ion_reader_read_timestamp(obj
->reader
, obj
->opt
? &php_ion_obj(reader_options
, obj
->opt
)->opt
: NULL
, return_value
);
988 static ZEND_METHOD(ion_Reader_Reader
, readSymbol
)
990 php_ion_reader
*obj
= php_ion_obj(reader
, Z_OBJ_P(ZEND_THIS
));
993 ZEND_PARSE_PARAMETERS_NONE();
996 ION_CHECK(ion_reader_read_ion_symbol(obj
->reader
, &sym
));
997 php_ion_symbol_zval(&sym
, return_value
);
999 static ZEND_METHOD(ion_Reader_Reader
, readString
)
1001 php_ion_reader
*obj
= php_ion_obj(reader
, Z_OBJ_P(ZEND_THIS
));
1004 ZEND_PARSE_PARAMETERS_NONE();
1007 ION_CHECK(ion_reader_read_string(obj
->reader
, &str
));
1008 RETURN_STRINGL((char *) str
.value
, str
.length
);
1011 typedef iERR (*read_part_fn
)(ION_READER
*, BYTE
*, SIZE
, SIZE
*);
1012 static void read_part(INTERNAL_FUNCTION_PARAMETERS
, read_part_fn fn
)
1014 php_ion_reader
*obj
= php_ion_obj(reader
, Z_OBJ_P(ZEND_THIS
));
1019 zend_long len
= 0x1000;
1020 ZEND_PARSE_PARAMETERS_START(1, 1)
1024 ZEND_PARSE_PARAMETERS_END();
1028 if (Z_TYPE_P(ref
) == IS_STRING
&& Z_STRLEN_P(ref
) == len
) {
1030 zstr
= Z_STR_P(ref
);
1033 zstr
= zend_string_alloc(len
, 0);
1037 ION_CHECK(fn(obj
->reader
, (BYTE
*) zstr
->val
, zstr
->len
, &read
), goto fail
);
1039 if (read
< zstr
->len
) {
1040 zstr
= zend_string_truncate(zstr
, read
, 0);
1042 ZVAL_STR(ref
, zstr
);
1046 zend_string_release(zstr
);
1047 ZVAL_EMPTY_STRING(ref
);
1050 static ZEND_METHOD(ion_Reader_Reader
, readStringPart
)
1052 read_part(INTERNAL_FUNCTION_PARAM_PASSTHRU
, ion_reader_read_partial_string
);
1054 static ZEND_METHOD(ion_Reader_Reader
, readLob
)
1056 php_ion_reader
*obj
= php_ion_obj(reader
, Z_OBJ_P(ZEND_THIS
));
1059 ZEND_PARSE_PARAMETERS_NONE();
1061 php_ion_reader_read_lob(obj
->reader
, return_value
);
1063 static ZEND_METHOD(ion_Reader_Reader
, readLobPart
)
1065 read_part(INTERNAL_FUNCTION_PARAM_PASSTHRU
, ion_reader_read_lob_partial_bytes
);
1067 static ZEND_METHOD(ion_Reader_Reader
, getPosition
)
1069 php_ion_reader
*obj
= php_ion_obj(reader
, Z_OBJ_P(ZEND_THIS
));
1072 ZEND_PARSE_PARAMETERS_NONE();
1076 ION_CHECK(ion_reader_get_position(obj
->reader
, &bytes
, &dummy
, &dummy
));
1079 static ZEND_METHOD(ion_Reader_Reader
, getDepth
)
1081 php_ion_reader
*obj
= php_ion_obj(reader
, Z_OBJ_P(ZEND_THIS
));
1084 ZEND_PARSE_PARAMETERS_NONE();
1087 ION_CHECK(ion_reader_get_depth(obj
->reader
, &depth
));
1090 static ZEND_METHOD(ion_Reader_Reader
, seek
)
1092 php_ion_reader
*obj
= php_ion_obj(reader
, Z_OBJ_P(ZEND_THIS
));
1095 zend_long off
, len
= -1;
1096 ZEND_PARSE_PARAMETERS_START(1, 2)
1100 ZEND_PARSE_PARAMETERS_END();
1102 ION_CHECK(ion_reader_seek(obj
->reader
, off
, len
));
1104 static ZEND_METHOD(ion_Reader_Reader
, getValueOffset
)
1106 php_ion_reader
*obj
= php_ion_obj(reader
, Z_OBJ_P(ZEND_THIS
));
1109 ZEND_PARSE_PARAMETERS_NONE();
1112 ION_CHECK(ion_reader_get_value_offset(obj
->reader
, &off
));
1115 static ZEND_METHOD(ion_Reader_Reader
, getValueLength
)
1117 php_ion_reader
*obj
= php_ion_obj(reader
, Z_OBJ_P(ZEND_THIS
));
1120 ZEND_PARSE_PARAMETERS_NONE();
1123 ION_CHECK(ion_reader_get_value_length(obj
->reader
, &len
));
1126 static ZEND_METHOD(ion_Reader_Buffer_Reader
, __construct
)
1128 php_ion_reader
*obj
= php_ion_obj(reader
, Z_OBJ_P(ZEND_THIS
));
1132 ZEND_PARSE_PARAMETERS_START(1, 2)
1135 Z_PARAM_OBJ_OF_CLASS_OR_NULL(obj
->opt
, ce_Reader_Options
)
1136 ZEND_PARSE_PARAMETERS_END();
1138 obj
->type
= BUFFER_READER
;
1139 obj
->buffer
= zend_string_copy(zstr
);
1141 php_ion_reader_ctor(obj
);
1143 static ZEND_METHOD(ion_Reader_Buffer_Reader
, getBuffer
)
1145 php_ion_reader
*obj
= php_ion_obj(reader
, Z_OBJ_P(ZEND_THIS
));
1148 ZEND_PARSE_PARAMETERS_NONE();
1149 RETURN_STR_COPY(obj
->buffer
);
1152 static ZEND_METHOD(ion_Reader_Stream_Reader
, __construct
)
1154 php_ion_reader
*obj
= php_ion_obj(reader
, Z_OBJ_P(ZEND_THIS
));
1158 ZEND_PARSE_PARAMETERS_START(1, 2)
1159 Z_PARAM_RESOURCE(zstream
)
1161 Z_PARAM_OBJ_OF_CLASS_OR_NULL(obj
->opt
, ce_Reader_Options
)
1162 ZEND_PARSE_PARAMETERS_END();
1164 obj
->type
= STREAM_READER
;
1165 php_stream_from_zval_no_verify(obj
->stream
.ptr
, zstream
);
1167 php_ion_reader_ctor(obj
);
1169 static ZEND_METHOD(ion_Reader_Stream_Reader
, getStream
)
1171 php_ion_reader
*obj
= php_ion_obj(reader
, Z_OBJ_P(ZEND_THIS
));
1174 ZEND_PARSE_PARAMETERS_NONE();
1175 PTR_CHECK(obj
->stream
.ptr
);
1177 GC_ADDREF(obj
->stream
.ptr
->res
);
1178 RETURN_RES(obj
->stream
.ptr
->res
);
1180 static ZEND_METHOD(ion_Reader_Stream_Reader
, resetStream
)
1182 php_ion_reader
*obj
= php_ion_obj(reader
, Z_OBJ_P(ZEND_THIS
));
1186 ZEND_PARSE_PARAMETERS_START(1, 1);
1187 Z_PARAM_RESOURCE(zstream
);
1188 ZEND_PARSE_PARAMETERS_END();
1190 ION_CHECK(ion_reader_reset_stream(&obj
->reader
, obj
, php_ion_reader_stream_handler
));
1192 if (obj
->stream
.ptr
) {
1193 zend_list_delete(obj
->stream
.ptr
->res
);
1195 php_stream_from_zval_no_verify(obj
->stream
.ptr
, zstream
);
1196 PTR_CHECK(obj
->stream
.ptr
);
1197 Z_ADDREF_P(zstream
);
1199 static ZEND_METHOD(ion_Reader_Stream_Reader
, resetStreamWithLength
)
1201 php_ion_reader
*obj
= php_ion_obj(reader
, Z_OBJ_P(ZEND_THIS
));
1206 ZEND_PARSE_PARAMETERS_START(2, 2);
1207 Z_PARAM_RESOURCE(zstream
);
1208 Z_PARAM_LONG(length
)
1209 ZEND_PARSE_PARAMETERS_END();
1211 ION_CHECK(ion_reader_reset_stream_with_length(&obj
->reader
, obj
, php_ion_reader_stream_handler
, length
));
1213 if (obj
->stream
.ptr
) {
1214 zend_list_delete(obj
->stream
.ptr
->res
);
1216 php_stream_from_zval_no_verify(obj
->stream
.ptr
, zstream
);
1217 PTR_CHECK(obj
->stream
.ptr
);
1218 Z_ADDREF_P(zstream
);
1220 static ZEND_METHOD(ion_Writer_Options
, __construct
)
1222 php_ion_writer_options
*obj
= php_ion_obj(writer_options
, Z_OBJ_P(ZEND_THIS
));
1225 zend_bool binary
= false, compact_floats
= false, escape
= false, pretty
= false,
1226 tabs
= true, small_cntr_inl
= true, suppress_sys
= false, flush
= false;
1227 zend_long indent
= 2, max_depth
= 10, max_ann
= 10, temp
= 0x4000, alloc
= 0x10000;
1228 ZEND_PARSE_PARAMETERS_START(0, 15)
1230 //public readonly ?\ion\Catalog $catalog = null,
1231 Z_PARAM_OBJ_OF_CLASS_OR_NULL(obj
->cat
, ce_Catalog
)
1232 //public readonly ?\ion\Decimal\Context $decimalContext = null,
1233 Z_PARAM_OBJ_OF_CLASS_OR_NULL(obj
->dec_ctx
, ce_Decimal_Context
)
1234 //public readonly bool $outputBinary = false,
1235 Z_PARAM_BOOL(binary
)
1236 //public readonly bool $compactFloats = false,
1237 Z_PARAM_BOOL(compact_floats
)
1238 //public readonly bool $escapeNonAscii = false,
1239 Z_PARAM_BOOL(escape
)
1240 //public readonly bool $prettyPrint = false,
1241 Z_PARAM_BOOL(pretty
)
1242 //public readonly bool $indentTabs = true,
1244 //public readonly int $indentSize = 2,
1245 Z_PARAM_LONG(indent
)
1246 //public readonly bool $smallContainersInline = true,
1247 Z_PARAM_BOOL(small_cntr_inl
)
1248 //public readonly bool $suppressSystemValues = false,
1249 Z_PARAM_BOOL(suppress_sys
)
1250 //public readonly bool $flushEveryValue = false,
1252 //public readonly int $maxContainerDepth = 10,
1253 Z_PARAM_LONG(max_depth
)
1254 //public readonly int $maxAnnotations = 10,
1255 Z_PARAM_LONG(max_ann
)
1256 //public readonly int $tempBufferSize = 0x4000,
1258 //public readonly int $allocationPageSize = 0x10000,
1260 ZEND_PARSE_PARAMETERS_END();
1263 update_property_obj(&obj
->std
, ZEND_STRL("catalog"), obj
->cat
);
1264 obj
->opt
.pcatalog
= php_ion_obj(catalog
, obj
->cat
)->cat
;
1266 zend_update_property_null(NULL
, &obj
->std
, ZEND_STRL("catalog"));
1269 update_property_obj(&obj
->std
, ZEND_STRL("decimalContext"), obj
->dec_ctx
);
1270 obj
->opt
.decimal_context
= &php_ion_obj(decimal_ctx
, obj
->dec_ctx
)->ctx
;
1272 zend_update_property_null(NULL
, &obj
->std
, ZEND_STRL("decimalContext"));
1274 zend_update_property_bool(obj
->std
.ce
, &obj
->std
, ZEND_STRL("outputBinary"),
1275 obj
->opt
.output_as_binary
= binary
);
1276 zend_update_property_bool(obj
->std
.ce
, &obj
->std
, ZEND_STRL("compactFloats"),
1277 obj
->opt
.compact_floats
= compact_floats
);
1278 zend_update_property_bool(obj
->std
.ce
, &obj
->std
, ZEND_STRL("escapeNonAscii"),
1279 obj
->opt
.escape_all_non_ascii
= escape
);
1280 zend_update_property_bool(obj
->std
.ce
, &obj
->std
, ZEND_STRL("prettyPrint"),
1281 obj
->opt
.pretty_print
= pretty
);
1282 zend_update_property_bool(obj
->std
.ce
, &obj
->std
, ZEND_STRL("indentTabs"),
1283 obj
->opt
.indent_with_tabs
= tabs
);
1284 zend_update_property_long(obj
->std
.ce
, &obj
->std
, ZEND_STRL("indentSize"),
1285 obj
->opt
.indent_size
= (SIZE
) indent
);
1286 zend_update_property_bool(obj
->std
.ce
, &obj
->std
, ZEND_STRL("smallContainersInline"),
1287 obj
->opt
.small_containers_in_line
= small_cntr_inl
);
1288 zend_update_property_bool(obj
->std
.ce
, &obj
->std
, ZEND_STRL("suppressSystemValues"),
1289 obj
->opt
.supress_system_values
= suppress_sys
);
1290 zend_update_property_bool(obj
->std
.ce
, &obj
->std
, ZEND_STRL("flushEveryValue"),
1291 obj
->opt
.flush_every_value
= flush
);
1292 zend_update_property_long(obj
->std
.ce
, &obj
->std
, ZEND_STRL("maxContainerDepth"),
1293 obj
->opt
.max_container_depth
= (SIZE
) max_depth
);
1294 zend_update_property_long(obj
->std
.ce
, &obj
->std
, ZEND_STRL("maxAnnotations"),
1295 obj
->opt
.max_annotation_count
= (SIZE
) max_ann
);
1296 zend_update_property_long(obj
->std
.ce
, &obj
->std
, ZEND_STRL("tempBufferSize"),
1297 obj
->opt
.temp_buffer_size
= (SIZE
) temp
);
1298 zend_update_property_long(obj
->std
.ce
, &obj
->std
, ZEND_STRL("allocationPageSize"),
1299 obj
->opt
.allocation_page_size
= (SIZE
) alloc
);
1301 static ZEND_METHOD(ion_Writer_Writer
, writeNull
)
1303 php_ion_writer
*obj
= php_ion_obj(writer
, Z_OBJ_P(ZEND_THIS
));
1306 ZEND_PARSE_PARAMETERS_NONE();
1308 ION_CHECK(ion_writer_write_null(obj
->writer
));
1310 static ZEND_METHOD(ion_Writer_Writer
, writeTypedNull
)
1312 php_ion_writer
*obj
= php_ion_obj(writer
, Z_OBJ_P(ZEND_THIS
));
1315 zend_object
*typ_obj
;
1316 ZEND_PARSE_PARAMETERS_START(1, 1)
1317 Z_PARAM_OBJ_OF_CLASS(typ_obj
, ce_Type
)
1318 ZEND_PARSE_PARAMETERS_END();
1320 ION_CHECK(ion_writer_write_typed_null(obj
->writer
, ion_type_from_enum(typ_obj
)));
1322 static ZEND_METHOD(ion_Writer_Writer
, writeBool
)
1324 php_ion_writer
*obj
= php_ion_obj(writer
, Z_OBJ_P(ZEND_THIS
));
1328 ZEND_PARSE_PARAMETERS_START(1, 1)
1330 ZEND_PARSE_PARAMETERS_END();
1332 ION_CHECK(ion_writer_write_bool(obj
->writer
, b
));
1334 static ZEND_METHOD(ion_Writer_Writer
, writeInt
)
1336 php_ion_writer
*obj
= php_ion_obj(writer
, Z_OBJ_P(ZEND_THIS
));
1341 ZEND_PARSE_PARAMETERS_START(1, 1)
1342 Z_PARAM_STR_OR_LONG(s
, l
)
1343 ZEND_PARSE_PARAMETERS_END();
1347 ION_CHECK(ion_int_alloc(obj
->writer
, &i
));
1348 ION_CHECK(ion_int_from_chars(i
, s
->val
, s
->len
));
1349 ION_CHECK(ion_writer_write_ion_int(obj
->writer
, i
));
1352 ION_CHECK(ion_writer_write_int64(obj
->writer
, l
));
1355 static ZEND_METHOD(ion_Writer_Writer
, writeFloat
)
1357 php_ion_writer
*obj
= php_ion_obj(writer
, Z_OBJ_P(ZEND_THIS
));
1361 ZEND_PARSE_PARAMETERS_START(1, 1)
1363 ZEND_PARSE_PARAMETERS_END();
1365 ION_CHECK(ion_writer_write_double(obj
->writer
, d
));
1367 static ZEND_METHOD(ion_Writer_Writer
, writeDecimal
)
1369 php_ion_writer
*obj
= php_ion_obj(writer
, Z_OBJ_P(ZEND_THIS
));
1372 zend_object
*dec_obj
;
1373 zend_string
*dec_str
;
1374 ZEND_PARSE_PARAMETERS_START(1, 1)
1375 Z_PARAM_OBJ_OF_CLASS_OR_STR(dec_obj
, ce_Decimal
, dec_str
)
1376 ZEND_PARSE_PARAMETERS_END();
1379 decContext
*ctx
= &php_ion_globals
.decimal
.ctx
;
1380 ION_DECIMAL dec
= {0};
1383 php_ion_writer_options
*opt_obj
= php_ion_obj(writer_options
, obj
->opt
);
1384 if (opt_obj
->opt
.decimal_context
) {
1385 ctx
= opt_obj
->opt
.decimal_context
;
1388 ION_CHECK(ion_decimal_from_string(&dec
, dec_str
->val
, ctx
));
1389 ION_CHECK(ion_writer_write_ion_decimal(obj
->writer
, &dec
));
1391 php_ion_decimal
*dec
= php_ion_obj(decimal
, dec_obj
);
1392 ION_CHECK(ion_writer_write_ion_decimal(obj
->writer
, &dec
->dec
));
1395 static ZEND_METHOD(ion_Writer_Writer
, writeTimestamp
)
1397 php_ion_writer
*obj
= php_ion_obj(writer
, Z_OBJ_P(ZEND_THIS
));
1400 zend_object
*ts_obj
;
1401 zend_string
*ts_str
;
1402 ZEND_PARSE_PARAMETERS_START(1, 1)
1403 Z_PARAM_OBJ_OF_CLASS_OR_STR(ts_obj
, ce_Timestamp
, ts_str
)
1404 ZEND_PARSE_PARAMETERS_END();
1406 decContext
*ctx
= NULL
;
1408 ctx
= php_ion_obj(reader_options
, obj
->opt
)->opt
.decimal_context
;
1411 ION_TIMESTAMP tmp
= {0};
1414 ION_CHECK(ion_timestamp_parse(&tmp
, ts_str
->val
, ts_str
->len
, &used
, ctx
));
1416 php_ion_timestamp
*ts
= php_ion_obj(timestamp
, ts_obj
);
1418 ion_timestamp_from_php(&tmp
, ts
, ctx
);
1420 ION_CHECK(ion_writer_write_timestamp(obj
->writer
, &tmp
));
1422 static ZEND_METHOD(ion_Writer_Writer
, writeSymbol
)
1424 php_ion_writer
*obj
= php_ion_obj(writer
, Z_OBJ_P(ZEND_THIS
));
1427 zend_object
*sym_obj
;
1428 zend_string
*sym_str
;
1429 ZEND_PARSE_PARAMETERS_START(1, 1)
1430 Z_PARAM_OBJ_OF_CLASS_OR_STR(sym_obj
, ce_Symbol
, sym_str
);
1431 ZEND_PARSE_PARAMETERS_END();
1435 ION_CHECK(ion_writer_write_symbol(obj
->writer
, ion_string_from_zend(&is
, sym_str
)));
1437 php_ion_symbol
*sym
= php_ion_obj(symbol
, sym_obj
);
1439 ION_CHECK(ion_writer_write_ion_symbol(obj
->writer
, &sym
->sym
));
1442 static ZEND_METHOD(ion_Writer_Writer
, writeString
)
1444 php_ion_writer
*obj
= php_ion_obj(writer
, Z_OBJ_P(ZEND_THIS
));
1448 ZEND_PARSE_PARAMETERS_START(1, 1)
1450 ZEND_PARSE_PARAMETERS_END();
1453 ION_CHECK(ion_writer_write_string(obj
->writer
, ion_string_from_zend(&is
, str
)));
1455 static ZEND_METHOD(ion_Writer_Writer
, writeCLob
)
1457 php_ion_writer
*obj
= php_ion_obj(writer
, Z_OBJ_P(ZEND_THIS
));
1461 ZEND_PARSE_PARAMETERS_START(1, 1)
1463 ZEND_PARSE_PARAMETERS_END();
1465 ION_CHECK(ion_writer_write_clob(obj
->writer
, (BYTE
*) str
->val
, str
->len
));
1467 static ZEND_METHOD(ion_Writer_Writer
, writeBLob
)
1469 php_ion_writer
*obj
= php_ion_obj(writer
, Z_OBJ_P(ZEND_THIS
));
1473 ZEND_PARSE_PARAMETERS_START(1, 1)
1475 ZEND_PARSE_PARAMETERS_END();
1477 ION_CHECK(ion_writer_write_blob(obj
->writer
, (BYTE
*) str
->val
, str
->len
));
1479 static ZEND_METHOD(ion_Writer_Writer
, startLob
)
1481 php_ion_writer
*obj
= php_ion_obj(writer
, Z_OBJ_P(ZEND_THIS
));
1484 zend_object
*typ_obj
;
1485 ZEND_PARSE_PARAMETERS_START(1, 1)
1486 Z_PARAM_OBJ_OF_CLASS(typ_obj
, ce_Type
)
1487 ZEND_PARSE_PARAMETERS_END();
1489 ION_CHECK(ion_writer_start_lob(obj
->writer
, ion_type_from_enum(typ_obj
)));
1491 static ZEND_METHOD(ion_Writer_Writer
, appendLob
)
1493 php_ion_writer
*obj
= php_ion_obj(writer
, Z_OBJ_P(ZEND_THIS
));
1497 ZEND_PARSE_PARAMETERS_START(1, 1)
1499 ZEND_PARSE_PARAMETERS_END();
1501 ION_CHECK(ion_writer_append_lob(obj
->writer
, (BYTE
*) str
->val
, str
->len
));
1503 static ZEND_METHOD(ion_Writer_Writer
, finishLob
)
1505 php_ion_writer
*obj
= php_ion_obj(writer
, Z_OBJ_P(ZEND_THIS
));
1508 ZEND_PARSE_PARAMETERS_NONE();
1510 ION_CHECK(ion_writer_finish_lob(obj
->writer
));
1512 static ZEND_METHOD(ion_Writer_Writer
, startContainer
)
1514 php_ion_writer
*obj
= php_ion_obj(writer
, Z_OBJ_P(ZEND_THIS
));
1517 zend_object
*typ_obj
;
1518 ZEND_PARSE_PARAMETERS_START(1, 1)
1519 Z_PARAM_OBJ_OF_CLASS(typ_obj
, ce_Type
)
1520 ZEND_PARSE_PARAMETERS_END();
1522 ION_CHECK(ion_writer_start_container(obj
->writer
, ion_type_from_enum(typ_obj
)));
1524 static ZEND_METHOD(ion_Writer_Writer
, finishContainer
)
1526 php_ion_writer
*obj
= php_ion_obj(writer
, Z_OBJ_P(ZEND_THIS
));
1529 ZEND_PARSE_PARAMETERS_NONE();
1531 ION_CHECK(ion_writer_finish_container(obj
->writer
));
1533 static ZEND_METHOD(ion_Writer_Writer
, writeFieldName
)
1535 php_ion_writer
*obj
= php_ion_obj(writer
, Z_OBJ_P(ZEND_THIS
));
1538 zend_object
*sym_obj
;
1539 zend_string
*sym_str
;
1540 ZEND_PARSE_PARAMETERS_START(1, 1)
1541 Z_PARAM_OBJ_OF_CLASS_OR_STR(sym_obj
, ce_Symbol
, sym_str
);
1542 ZEND_PARSE_PARAMETERS_END();
1546 ION_CHECK(ion_writer_write_field_name(obj
->writer
, ion_string_from_zend(&is
, sym_str
)));
1548 php_ion_symbol
*sym
= php_ion_obj(symbol
, sym_obj
);
1550 ION_CHECK(ion_writer_write_field_name_symbol(obj
->writer
, &sym
->sym
));
1553 static ZEND_METHOD(ion_Writer_Writer
, writeAnnotation
)
1555 php_ion_writer
*obj
= php_ion_obj(writer
, Z_OBJ_P(ZEND_THIS
));
1560 ZEND_PARSE_PARAMETERS_START(1, -1)
1561 Z_PARAM_VARIADIC('+', args
, argc
);
1562 ZEND_PARSE_PARAMETERS_END();
1564 for (unsigned i
= 0; i
< argc
; ++i
) {
1565 switch (Z_TYPE(args
[i
])) {
1568 ION_CHECK(ion_writer_add_annotation(obj
->writer
, ion_string_from_zend(&is
, Z_STR(args
[i
]))));
1572 ION_CHECK(ion_writer_add_annotation_symbol(obj
->writer
, &php_ion_obj(symbol
, Z_OBJ(args
[i
]))->sym
));
1577 static ZEND_METHOD(ion_Writer_Writer
, getDepth
)
1579 php_ion_writer
*obj
= php_ion_obj(writer
, Z_OBJ_P(ZEND_THIS
));
1582 ZEND_PARSE_PARAMETERS_NONE();
1585 ION_CHECK(ion_writer_get_depth(obj
->writer
, &depth
));
1588 static ZEND_METHOD(ion_Writer_Writer
, flush
)
1590 php_ion_writer
*obj
= php_ion_obj(writer
, Z_OBJ_P(ZEND_THIS
));
1593 ZEND_PARSE_PARAMETERS_NONE();
1596 ION_CHECK(ion_writer_flush(obj
->writer
, &flushed
));
1597 RETURN_LONG(flushed
);
1599 static ZEND_METHOD(ion_Writer_Writer
, finish
)
1601 php_ion_writer
*obj
= php_ion_obj(writer
, Z_OBJ_P(ZEND_THIS
));
1604 ZEND_PARSE_PARAMETERS_NONE();
1607 ION_CHECK(ion_writer_finish(obj
->writer
, &flushed
));
1608 RETURN_LONG(flushed
);
1610 static ZEND_METHOD(ion_Writer_Buffer_Writer
, __construct
)
1612 php_ion_writer
*obj
= php_ion_obj(writer
, Z_OBJ_P(ZEND_THIS
));
1615 ZEND_PARSE_PARAMETERS_START(0, 1)
1617 Z_PARAM_OBJ_OF_CLASS_OR_NULL(obj
->opt
, ce_Writer_Options
)
1618 ZEND_PARSE_PARAMETERS_END();
1620 obj
->type
= BUFFER_WRITER
;
1621 php_ion_writer_ctor(obj
);
1623 static ZEND_METHOD(ion_Writer_Buffer_Writer
, getBuffer
)
1625 php_ion_writer
*obj
= php_ion_obj(writer
, Z_OBJ_P(ZEND_THIS
));
1628 ZEND_PARSE_PARAMETERS_NONE();
1630 RETVAL_STR(php_ion_writer_buffer_copy(obj
));
1632 static ZEND_METHOD(ion_Writer_Buffer_Writer
, resetBuffer
)
1634 php_ion_writer
*obj
= php_ion_obj(writer
, Z_OBJ_P(ZEND_THIS
));
1637 ZEND_PARSE_PARAMETERS_NONE();
1639 php_ion_writer_buffer_reset(obj
);
1641 static ZEND_METHOD(ion_Writer_Stream_Writer
, __construct
)
1643 php_ion_writer
*obj
= php_ion_obj(writer
, Z_OBJ_P(ZEND_THIS
));
1647 ZEND_PARSE_PARAMETERS_START(1, 2)
1648 Z_PARAM_RESOURCE(zstream
)
1650 Z_PARAM_OBJ_OF_CLASS_OR_NULL(obj
->opt
, ce_Writer_Options
)
1651 ZEND_PARSE_PARAMETERS_END();
1653 obj
->type
= STREAM_WRITER
;
1654 php_stream_from_zval_no_verify(obj
->stream
.ptr
, zstream
);
1656 php_ion_writer_ctor(obj
);
1658 static ZEND_METHOD(ion_Writer_Stream_Writer
, getStream
)
1660 php_ion_writer
*obj
= php_ion_obj(writer
, Z_OBJ_P(ZEND_THIS
));
1663 ZEND_PARSE_PARAMETERS_NONE();
1664 PTR_CHECK(obj
->stream
.ptr
);
1666 GC_ADDREF(obj
->stream
.ptr
->res
);
1667 RETURN_RES(obj
->stream
.ptr
->res
);
1670 static ZEND_METHOD(ion_Serializer_PHP
, __construct
)
1672 php_ion_serializer_php
*obj
= php_ion_obj(serializer_php
, Z_OBJ_P(ZEND_THIS
));
1675 obj
->serializer
.call_magic
= true;
1677 ZEND_PARSE_PARAMETERS_START(0, 4)
1679 Z_PARAM_OBJ_OF_CLASS_OR_NULL(obj
->opt
, ce_Writer_Options
)
1680 Z_PARAM_BOOL(obj
->serializer
.multi_seq
)
1681 Z_PARAM_BOOL(obj
->serializer
.call_magic
)
1682 Z_PARAM_STR_OR_NULL(obj
->serializer
.call_custom
)
1683 ZEND_PARSE_PARAMETERS_END();
1685 php_ion_serializer_php_ctor(obj
);
1687 static ZEND_METHOD(ion_Serializer_PHP
, serialize
)
1689 zend_object
*obj
= Z_OBJ_P(ZEND_THIS
);
1692 ZEND_PARSE_PARAMETERS_START(1, 1)
1694 ZEND_PARSE_PARAMETERS_END();
1696 php_ion_serialize(&php_ion_obj(serializer_php
, obj
)->serializer
, data
, return_value
);
1698 static ZEND_FUNCTION(ion_serialize
)
1701 zend_object
*zo_ser
= NULL
;
1702 ZEND_PARSE_PARAMETERS_START(1, 2)
1705 Z_PARAM_OBJ_OF_CLASS_OR_NULL(zo_ser
, ce_Serializer
)
1706 ZEND_PARSE_PARAMETERS_END();
1708 if (!zo_ser
|| zo_ser
->ce
== ce_Serializer_PHP
) {
1709 // default, fast path
1710 php_ion_serializer
*ser
= zo_ser
? &php_ion_obj(serializer_php
, zo_ser
)->serializer
: NULL
;
1711 php_ion_serialize(ser
, data
, return_value
);
1713 zend_call_method_with_1_params(zo_ser
, NULL
, NULL
, "serialize", return_value
, data
);
1717 static ZEND_METHOD(ion_Unserializer_PHP
, __construct
)
1719 php_ion_unserializer_php
*obj
= php_ion_obj(unserializer_php
, Z_OBJ_P(ZEND_THIS
));
1722 obj
->unserializer
.call_magic
= true;
1724 ZEND_PARSE_PARAMETERS_START(0, 4)
1726 Z_PARAM_OBJ_OF_CLASS_OR_NULL(obj
->opt
, ce_Reader_Options
)
1727 Z_PARAM_BOOL(obj
->unserializer
.multi_seq
)
1728 Z_PARAM_BOOL(obj
->unserializer
.call_magic
)
1729 Z_PARAM_STR_OR_NULL(obj
->unserializer
.call_custom
)
1730 ZEND_PARSE_PARAMETERS_END();
1732 php_ion_unserializer_php_ctor(obj
);
1734 static ZEND_METHOD(ion_Unserializer_PHP
, unserialize
)
1736 zend_object
*obj
= Z_OBJ_P(ZEND_THIS
);
1739 ZEND_PARSE_PARAMETERS_START(1, 1)
1741 ZEND_PARSE_PARAMETERS_END();
1743 php_ion_unserialize(&php_ion_obj(unserializer_php
, obj
)->unserializer
, data
, return_value
);
1745 static ZEND_FUNCTION(ion_unserialize
)
1748 zend_object
*zo_ser
= NULL
;
1749 ZEND_PARSE_PARAMETERS_START(1, 2)
1752 Z_PARAM_OBJ_OF_CLASS_OR_NULL(zo_ser
, ce_Unserializer
)
1753 ZEND_PARSE_PARAMETERS_END();
1755 if (!zo_ser
|| zo_ser
->ce
== ce_Unserializer_PHP
) {
1756 // default, fast path
1757 php_ion_unserializer
*ser
= zo_ser
? &php_ion_obj(unserializer_php
, zo_ser
)->unserializer
: NULL
;
1758 php_ion_unserialize(ser
, data
, return_value
);
1760 zend_call_method_with_1_params(zo_ser
, NULL
, NULL
, "__invoke", return_value
, data
);
1764 PHP_RINIT_FUNCTION(ion
)
1766 #if defined(ZTS) && defined(COMPILE_DL_ION)
1767 ZEND_TSRMLS_CACHE_UPDATE();
1770 php_ion_globals_symbols_init();
1771 php_ion_globals_serializer_init();
1772 php_ion_globals_unserializer_init();
1776 PHP_RSHUTDOWN_FUNCTION(ion
)
1778 php_ion_globals_unserializer_dtor();
1779 php_ion_globals_serializer_dtor();
1780 php_ion_globals_symbols_dtor();
1784 #define ZEND_ARG_VARIADIC_OBJ_TYPE_MASK(pass_by_ref, name, classname, type_mask, default_value) \
1785 { #name, ZEND_TYPE_INIT_CLASS_CONST_MASK(#classname, ((type_mask) | _ZEND_ARG_INFO_FLAGS(pass_by_ref, 1, 0))), default_value },
1786 #include "ion_arginfo.h"
1788 // spl_iterators.h includes ext/pcre/php_pcre.h which might not find pcre2.h
1789 extern PHPAPI zend_class_entry
*spl_ce_RecursiveIterator
;
1791 PHP_MINIT_FUNCTION(ion
)
1794 if (SUCCESS
!= g_sym_init()) {
1797 g_intern_str_init();
1800 php_ion_register(catalog
, Catalog
, zend_ce_countable
);
1803 php_ion_register(decimal
, Decimal
);
1804 php_ion_register(decimal_ctx
, Decimal_Context
);
1805 ce_Decimal_Context_Rounding
= register_class_ion_Decimal_Context_Rounding();
1808 ce_LOB
= register_class_ion_LOB();
1811 ce_Reader
= register_class_ion_Reader(spl_ce_RecursiveIterator
);
1812 php_ion_register(reader_options
, Reader_Options
);
1813 php_ion_register(reader
, Reader_Reader
, ce_Reader
);
1814 ce_Reader_Buffer
= register_class_ion_Reader_Buffer(ce_Reader
);
1815 ce_Reader_Buffer_Reader
= register_class_ion_Reader_Buffer_Reader(ce_Reader_Reader
, ce_Reader_Buffer
);
1816 ce_Reader_Stream
= register_class_ion_Reader_Stream(ce_Reader
);
1817 ce_Reader_Stream_Reader
= register_class_ion_Reader_Stream_Reader(ce_Reader_Reader
, ce_Reader_Stream
);
1820 ce_Serializer
= register_class_ion_Serializer();
1821 php_ion_register(serializer_php
, Serializer_PHP
, ce_Serializer
);
1824 php_ion_register(symbol
, Symbol
);
1825 oh_Symbol
.compare
= php_ion_symbol_zval_compare
;
1826 php_ion_register(symbol_iloc
, Symbol_ImportLocation
);
1827 php_ion_register(symbol_table
, Symbol_Table
);
1828 ce_Symbol_Table
->create_object
= NULL
;
1829 ce_Symbol_Table_Local
= register_class_ion_Symbol_Table_Local(ce_Symbol_Table
);
1830 ce_Symbol_Table_Local
->create_object
= create_ion_Symbol_Table
;
1831 ce_Symbol_Table_Shared
= register_class_ion_Symbol_Table_Shared(ce_Symbol_Table
);
1832 ce_Symbol_Table_Shared
->create_object
= create_ion_Symbol_Table
;
1833 ce_Symbol_Enum
= register_class_ion_Symbol_Enum();
1834 ce_Symbol_Table_System
= register_class_ion_Symbol_Table_System(ce_Symbol_Enum
);
1835 ce_Symbol_Table_PHP
= register_class_ion_Symbol_Table_PHP(ce_Symbol_Enum
);
1838 ce_Timestamp
= register_class_ion_Timestamp(php_date_get_date_ce());
1839 ce_Timestamp_Format
= register_class_ion_Timestamp_Format();
1840 ce_Timestamp_Precision
= register_class_ion_Timestamp_Precision();
1843 ce_Type
= register_class_ion_Type();
1846 ce_Writer
= register_class_ion_Writer();
1847 php_ion_register(writer_options
, Writer_Options
);
1848 php_ion_register(writer
, Writer_Writer
, ce_Writer
);
1849 ce_Writer_Buffer
= register_class_ion_Writer_Buffer(ce_Writer
);
1850 ce_Writer_Buffer_Writer
= register_class_ion_Writer_Buffer_Writer(ce_Writer_Writer
, ce_Writer_Buffer
);
1851 ce_Writer_Stream
= register_class_ion_Writer_Stream(ce_Writer
);
1852 ce_Writer_Stream_Writer
= register_class_ion_Writer_Stream_Writer(ce_Writer_Writer
, ce_Writer_Stream
);
1855 ce_Unserializer
= register_class_ion_Unserializer();
1856 php_ion_register(unserializer_php
, Unserializer_PHP
, ce_Unserializer
);
1861 PHP_MSHUTDOWN_FUNCTION(ion
)
1863 if (g_sym_tab_php
) {
1864 ion_symbol_table_close(g_sym_tab_php
);
1866 zend_hash_destroy(&g_sym_hash
);
1870 PHP_MINFO_FUNCTION(ion
)
1872 php_info_print_table_start();
1873 php_info_print_table_header(2, "ion support", "enabled");
1874 php_info_print_table_end();
1877 PHP_GINIT_FUNCTION(ion
)
1879 memset(ion_globals
, 0, sizeof(*ion_globals
));
1881 php_ion_decimal_ctx_init_max(&ion_globals
->decimal
.ctx
, DEC_ROUND_HALF_EVEN
);
1882 php_ion_decimal_from_zend_long(&ion_globals
->decimal
.zend_max
, &ion_globals
->decimal
.ctx
, ZEND_LONG_MAX
);
1883 php_ion_decimal_from_zend_long(&ion_globals
->decimal
.zend_min
, &ion_globals
->decimal
.ctx
, ZEND_LONG_MIN
);
1886 PHP_GSHUTDOWN_FUNCTION(ion
)
1890 static zend_module_dep ion_module_deps
[] = {
1891 ZEND_MOD_REQUIRED("date")
1892 ZEND_MOD_REQUIRED("spl")
1896 zend_module_entry ion_module_entry
= {
1897 STANDARD_MODULE_HEADER_EX
,
1900 "ion", /* Extension name */
1901 ext_functions
, /* zend_function_entry */
1902 PHP_MINIT(ion
), /* PHP_MINIT - Module initialization */
1903 PHP_MSHUTDOWN(ion
), /* PHP_MSHUTDOWN - Module shutdown */
1904 PHP_RINIT(ion
), /* PHP_RINIT - Request initialization */
1905 PHP_RSHUTDOWN(ion
), /* PHP_RSHUTDOWN - Request shutdown */
1906 PHP_MINFO(ion
), /* PHP_MINFO - Module info */
1907 PHP_ION_VERSION
, /* Version */
1908 ZEND_MODULE_GLOBALS(ion
),
1909 PHP_GINIT(ion
), /* PHP_GINIT */
1910 PHP_GSHUTDOWN(ion
), /* PHP_GSHUTDOWN */
1912 STANDARD_MODULE_PROPERTIES_EX
1915 #ifdef COMPILE_DL_ION
1917 ZEND_TSRMLS_CACHE_DEFINE()
1919 ZEND_GET_MODULE(ion
)