coverage++
[awesomized/ext-ion] / ion.c
diff --git a/ion.c b/ion.c
index e8fa657ea5e1af382569310f48c98791e1d706bc..28d5a5cdc3356a15198b7248e02361e5c83bec64 100644 (file)
--- a/ion.c
+++ b/ion.c
@@ -25,7 +25,6 @@
 
 #include "ext/date/php_date.h"
 #include "ext/spl/spl_exceptions.h"
-#include "ext/spl/spl_iterators.h"
 
 #include "php_ion.h"
 #include "ion_private.h"
@@ -41,7 +40,7 @@ static ZEND_METHOD(ion_Symbol_ImportLocation, __construct)
                Z_PARAM_LONG(location)
        ZEND_PARSE_PARAMETERS_END();
 
-       obj->loc.location = location;
+       obj->loc.location = (SID) location;
        php_ion_symbol_iloc_ctor(obj);
 }
 static ZEND_METHOD(ion_Symbol, __construct)
@@ -57,7 +56,7 @@ static ZEND_METHOD(ion_Symbol, __construct)
                Z_PARAM_OBJ_OF_CLASS_OR_NULL(obj->iloc, ce_Symbol_ImportLocation)
        ZEND_PARSE_PARAMETERS_END();
 
-       obj->sym.sid = sid;
+       obj->sym.sid = (SID) sid;
        php_ion_symbol_ctor(obj);
 }
 static ZEND_METHOD(ion_Symbol, equals)
@@ -410,13 +409,13 @@ static ZEND_METHOD(ion_Timestamp, __construct)
        PTR_CHECK(obj);
 
        zend_long precision;
-       zend_object *precision_obj;
+       zend_object *precision_obj = NULL, *format_obj = NULL;
        zend_string *fmt = NULL, *dt = NULL;
        zval *tz = NULL;
        ZEND_PARSE_PARAMETERS_START(1, 4)
                Z_PARAM_OBJ_OF_CLASS_OR_LONG(precision_obj, ce_Timestamp_Precision, precision)
                Z_PARAM_OPTIONAL
-               Z_PARAM_STR_OR_NULL(fmt)
+               Z_PARAM_OBJ_OF_CLASS_OR_STR_OR_NULL(format_obj, ce_Timestamp_Format, fmt)
                Z_PARAM_STR_OR_NULL(dt)
                Z_PARAM_ZVAL(tz)
        ZEND_PARSE_PARAMETERS_END();
@@ -424,6 +423,9 @@ static ZEND_METHOD(ion_Timestamp, __construct)
        if (precision_obj) {
                precision = Z_LVAL_P(zend_enum_fetch_case_value(precision_obj));
        }
+       if (format_obj) {
+               fmt = Z_STR_P(zend_enum_fetch_case_value(format_obj));
+       }
        php_ion_timestamp_ctor(obj, precision, fmt, dt, tz);
 }
 static ZEND_METHOD(ion_Timestamp, __toString)
@@ -457,7 +459,7 @@ static ZEND_METHOD(ion_Decimal_Context, __construct)
        if (o_round) {
                round = Z_LVAL_P(zend_enum_fetch_case_value(o_round));
        }
-       php_ion_decimal_ctx_init(&obj->ctx, digits, emax, emin, round, clamp);
+       php_ion_decimal_ctx_init(&obj->ctx, digits, emax, emin, round, clamp); // NOLINT(cppcoreguidelines-narrowing-conversions)
        php_ion_decimal_ctx_ctor(obj, o_round);
 }
 static inline void make_decimal_ctx(INTERNAL_FUNCTION_PARAMETERS, int kind)
@@ -654,23 +656,23 @@ static ZEND_METHOD(ion_Reader_Options, __construct)
        zend_update_property_bool(opt->std.ce, &opt->std, ZEND_STRL("returnSystemValues"),
                opt->opt.return_system_values = ret_sys_val);
        zend_update_property_long(opt->std.ce, &opt->std, ZEND_STRL("newLine"),
-               opt->opt.new_line_char = ch_nl);
+               opt->opt.new_line_char = (int) ch_nl);
        zend_update_property_long(opt->std.ce, &opt->std, ZEND_STRL("maxContainerDepth"),
-               opt->opt.max_container_depth = max_depth);
+               opt->opt.max_container_depth = (SIZE) max_depth);
        zend_update_property_long(opt->std.ce, &opt->std, ZEND_STRL("maxAnnotations"),
-               opt->opt.max_annotation_count = max_ann);
+               opt->opt.max_annotation_count = (SIZE) max_ann);
        zend_update_property_long(opt->std.ce, &opt->std, ZEND_STRL("maxAnnotationBuffered"),
-               opt->opt.max_annotation_buffered = max_ann_buf);
+               opt->opt.max_annotation_buffered = (SIZE) max_ann_buf);
        zend_update_property_long(opt->std.ce, &opt->std, ZEND_STRL("symbolThreshold"),
-               opt->opt.symbol_threshold = sym_thr);
+               opt->opt.symbol_threshold = (SIZE) sym_thr);
        zend_update_property_long(opt->std.ce, &opt->std, ZEND_STRL("userValueThreshold"),
-               opt->opt.user_value_threshold = uval_thr);
+               opt->opt.user_value_threshold = (SIZE) uval_thr);
        zend_update_property_long(opt->std.ce, &opt->std, ZEND_STRL("chunkThreshold"),
-               opt->opt.chunk_threshold = chunk_thr);
+               opt->opt.chunk_threshold = (SIZE) chunk_thr);
        zend_update_property_long(opt->std.ce, &opt->std, ZEND_STRL("allocationPageSize"),
-               opt->opt.allocation_page_size = alloc_pgsz);
+               opt->opt.allocation_page_size = (SIZE) alloc_pgsz);
        zend_update_property_long(opt->std.ce, &opt->std, ZEND_STRL("skipCharacterValidation"),
-               opt->opt.skip_character_validation = skip_validation);
+               opt->opt.skip_character_validation = (SIZE) skip_validation);
 }
 static ZEND_METHOD(ion_Reader_Reader, hasChildren)
 {
@@ -862,7 +864,12 @@ static ZEND_METHOD(ion_Reader_Reader, getAnnotationSymbols)
 
        ZEND_PARSE_PARAMETERS_NONE();
 
-       int32_t count, max = php_ion_obj(reader_options, obj->opt)->opt.max_annotation_count;
+       int32_t count, max;
+       if (obj->opt) {
+               max = php_ion_obj(reader_options, obj->opt)->opt.max_annotation_count;
+       } else {
+               max = 10;
+       }
        ION_SYMBOL *ptr = ecalloc(sizeof(*ptr), max);
        iERR err = ion_reader_get_annotation_symbols(obj->reader, ptr, max, &count);
        if (!err) {
@@ -953,7 +960,9 @@ static ZEND_METHOD(ion_Reader_Reader, readFloat)
 
        ZEND_PARSE_PARAMETERS_NONE();
 
-       ION_CHECK(ion_reader_read_double(obj->reader, &Z_DVAL_P(return_value)));
+       double dval;
+       ION_CHECK(ion_reader_read_double(obj->reader, &dval));
+       RETURN_DOUBLE(dval);
 }
 static ZEND_METHOD(ion_Reader_Reader, readDecimal)
 {
@@ -1034,9 +1043,7 @@ static void read_part(INTERNAL_FUNCTION_PARAMETERS, read_part_fn fn)
                RETURN_TRUE;
        }
 fail:
-       if (zstr != Z_STR_P(ref)) {
-               zend_string_release(zstr);
-       }
+       zend_string_release(zstr);
        ZVAL_EMPTY_STRING(ref);
        RETURN_FALSE;
 }
@@ -1196,7 +1203,7 @@ static ZEND_METHOD(ion_Reader_Stream_Reader, resetStreamWithLength)
 
        zval *zstream;
        zend_long length;
-       ZEND_PARSE_PARAMETERS_START(1, 2);
+       ZEND_PARSE_PARAMETERS_START(2, 2);
                Z_PARAM_RESOURCE(zstream);
                Z_PARAM_LONG(length)
        ZEND_PARSE_PARAMETERS_END();
@@ -1275,7 +1282,7 @@ static ZEND_METHOD(ion_Writer_Options, __construct)
        zend_update_property_bool(obj->std.ce, &obj->std, ZEND_STRL("indentTabs"),
                        obj->opt.indent_with_tabs = tabs);
        zend_update_property_long(obj->std.ce, &obj->std, ZEND_STRL("indentSize"),
-                       obj->opt.indent_size = indent);
+                       obj->opt.indent_size = (SIZE) indent);
        zend_update_property_bool(obj->std.ce, &obj->std, ZEND_STRL("smallContainersInline"),
                        obj->opt.small_containers_in_line = small_cntr_inl);
        zend_update_property_bool(obj->std.ce, &obj->std, ZEND_STRL("suppressSystemValues"),
@@ -1283,13 +1290,13 @@ static ZEND_METHOD(ion_Writer_Options, __construct)
        zend_update_property_bool(obj->std.ce, &obj->std, ZEND_STRL("flushEveryValue"),
                        obj->opt.flush_every_value = flush);
        zend_update_property_long(obj->std.ce, &obj->std, ZEND_STRL("maxContainerDepth"),
-                       obj->opt.max_container_depth = max_depth);
+                       obj->opt.max_container_depth = (SIZE) max_depth);
        zend_update_property_long(obj->std.ce, &obj->std, ZEND_STRL("maxAnnotations"),
-                       obj->opt.max_annotation_count = max_ann);
+                       obj->opt.max_annotation_count = (SIZE) max_ann);
        zend_update_property_long(obj->std.ce, &obj->std, ZEND_STRL("tempBufferSize"),
-                       obj->opt.temp_buffer_size = temp);
+                       obj->opt.temp_buffer_size = (SIZE) temp);
        zend_update_property_long(obj->std.ce, &obj->std, ZEND_STRL("allocationPageSize"),
-                       obj->opt.allocation_page_size = alloc);
+                       obj->opt.allocation_page_size = (SIZE) alloc);
 }
 static ZEND_METHOD(ion_Writer_Writer, writeNull)
 {
@@ -1578,9 +1585,6 @@ static ZEND_METHOD(ion_Writer_Writer, flush)
 
        SIZE flushed;
        ION_CHECK(ion_writer_flush(obj->writer, &flushed));
-       if (obj->type == BUFFER_WRITER) {
-               smart_str_0(&obj->buffer.str);
-       }
        RETURN_LONG(flushed);
 }
 static ZEND_METHOD(ion_Writer_Writer, finish)
@@ -1592,9 +1596,6 @@ static ZEND_METHOD(ion_Writer_Writer, finish)
 
        SIZE flushed;
        ION_CHECK(ion_writer_finish(obj->writer, &flushed));
-       if (obj->type == BUFFER_WRITER) {
-               smart_str_0(&obj->buffer.str);
-       }
        RETURN_LONG(flushed);
 }
 static ZEND_METHOD(ion_Writer_Writer, writeOne)
@@ -1608,17 +1609,12 @@ static ZEND_METHOD(ion_Writer_Buffer_Writer, __construct)
        php_ion_writer *obj = php_ion_obj(writer, Z_OBJ_P(ZEND_THIS));
        PTR_CHECK(obj);
 
-       zval *ref;
-       ZEND_PARSE_PARAMETERS_START(1, 2)
-               Z_PARAM_ZVAL(ref)
+       ZEND_PARSE_PARAMETERS_START(0, 1)
                Z_PARAM_OPTIONAL
                Z_PARAM_OBJ_OF_CLASS_OR_NULL(obj->opt, ce_Writer_Options)
        ZEND_PARSE_PARAMETERS_END();
 
        obj->type = BUFFER_WRITER;
-       ZVAL_COPY(&obj->buffer.val, ref);
-       zval_dtor(Z_REFVAL_P(ref));
-
        php_ion_writer_ctor(obj);
 }
 static ZEND_METHOD(ion_Writer_Buffer_Writer, getBuffer)
@@ -1628,7 +1624,16 @@ static ZEND_METHOD(ion_Writer_Buffer_Writer, getBuffer)
 
        ZEND_PARSE_PARAMETERS_NONE();
 
-       RETVAL_STR(zend_string_dup(obj->buffer.str.s, 0));
+       RETVAL_STR(php_ion_writer_buffer_copy(obj));
+}
+static ZEND_METHOD(ion_Writer_Buffer_Writer, resetBuffer)
+{
+       php_ion_writer *obj = php_ion_obj(writer, Z_OBJ_P(ZEND_THIS));
+       OBJ_CHECK(obj);
+
+       ZEND_PARSE_PARAMETERS_NONE();
+
+       php_ion_writer_buffer_reset(obj);
 }
 static ZEND_METHOD(ion_Writer_Stream_Writer, __construct)
 {
@@ -1774,15 +1779,19 @@ PHP_RSHUTDOWN_FUNCTION(ion)
 }
 
 #define ZEND_ARG_VARIADIC_OBJ_TYPE_MASK(pass_by_ref, name, classname, type_mask, default_value) \
-       { #name, ZEND_TYPE_INIT_CLASS_CONST_MASK(#classname, type_mask | _ZEND_ARG_INFO_FLAGS(pass_by_ref, 1, 0)), default_value },
+       { #name, ZEND_TYPE_INIT_CLASS_CONST_MASK(#classname, ((type_mask) | _ZEND_ARG_INFO_FLAGS(pass_by_ref, 1, 0))), default_value },
 #include "ion_arginfo.h"
 
+// spl_iterators.h includes ext/pcre/php_pcre.h which might not find pcre2.h
+extern PHPAPI zend_class_entry *spl_ce_RecursiveIterator;
+
 PHP_MINIT_FUNCTION(ion)
 {
        // true globals
        if (SUCCESS != g_sym_init())  {
                return FAILURE;
        }
+       g_intern_str_init();
 
        // Catalog
        php_ion_register(catalog, Catalog, zend_ce_countable);
@@ -1824,6 +1833,7 @@ PHP_MINIT_FUNCTION(ion)
 
        // Timestamp
        ce_Timestamp = register_class_ion_Timestamp(php_date_get_date_ce());
+       ce_Timestamp_Format = register_class_ion_Timestamp_Format();
        ce_Timestamp_Precision = register_class_ion_Timestamp_Precision();
 
        // Type