+LOCAL ION_COLLECTION *php_ion_catalog_collection(php_ion_catalog *cat)
+{
+ /* do not look too close */
+ struct {
+ void *owner;
+ ION_SYMBOL_TABLE *sys;
+ ION_COLLECTION collection;
+ } *cat_ptr = (void *) cat->cat;
+ return &cat_ptr->collection;
+}
+// see https://github.com/amzn/ion-c/issues/269
+#ifndef IPCN_pNODE_TO_pDATA
+# define IPCN_pNODE_TO_pDATA(x) (&((x)->_data[0]))
+#endif
+
+LOCAL void php_ion_catalog_copy(php_ion_catalog *new_obj, php_ion_catalog *old_obj)
+{
+ // do not clone cache members
+ php_ion_catalog_ctor(new_obj);
+ OBJ_CHECK(new_obj);
+
+ ION_COLLECTION *col = php_ion_catalog_collection(old_obj);
+ if (!ION_COLLECTION_IS_EMPTY(col)) {
+ ION_COLLECTION_CURSOR cur;
+ ION_COLLECTION_OPEN(col, cur);
+ while (cur) {
+ ION_SYMBOL_TABLE **ptr;
+ ION_COLLECTION_NEXT(cur, ptr);
+ if (*ptr) {
+ ION_CHECK(ion_catalog_add_symbol_table(new_obj->cat, *ptr));
+ }
+ }
+ }
+}
+
+LOCAL zend_string *ion_symbol_table_to_key(ION_SYMBOL_TABLE *tab)