/* Builds the C-level configuration and state struct. * Automatically freed at scope boundary. */ ddl_encoder_t * build_encoder_struct(pTHX_ HV *opt) { ddl_encoder_t *enc; SV **svp; Newx(enc, 1, ddl_encoder_t); /* Register our structure for destruction on scope exit */ SAVEDESTRUCTOR(&ddl_destructor_hook, (void *)enc); /* Init struct */ Newx(enc->buf_start, INITIALIZATION_SIZE, char); enc->buf_end = enc->buf_start + INITIALIZATION_SIZE; enc->pos = enc->buf_start; enc->depth = 0; enc->flags = 0; /* TODO: We could do this lazily: Only if there's references with high refcount/weakrefs */ enc->seenhash = PTABLE_new(); /* load options */ if (opt != NULL) { if ( (svp = hv_fetchs(opt, "undef_blessed", 0)) && SvTRUE(*svp)) enc->flags |= F_UNDEF_BLESSED; if ( (svp = hv_fetchs(opt, "disallow_multi", 0)) && SvTRUE(*svp)) enc->flags |= F_DISALLOW_MULTI_OCCURRENCE; if ( (svp = hv_fetchs(opt, "objects_as_unblessed", 0)) && SvTRUE(*svp)) enc->flags |= F_DUMP_OBJECTS_AS_UNBLESSED; if ( (svp = hv_fetchs(opt, "dump_objects", 0)) && SvTRUE(*svp)) enc->flags |= F_DUMP_OBJECTS_AS_BLESSED; } /* option vlaidation */ /* FIXME my bit field fu is weak, apparently. Needs replacing with proper idiom */ if ( (enc->flags & F_UNDEF_BLESSED ? 1 : 0) + (enc->flags & F_DUMP_OBJECTS_AS_UNBLESSED ? 1 : 0) + (enc->flags & F_DUMP_OBJECTS_AS_BLESSED ? 1 : 0) > 1) { croak("Can only have one of 'undef_blessed', " "'objects_as_unblessed', and 'dump_objects' options at a time."); } return enc; }
/* Builds the C-level configuration and state struct. * Automatically freed at scope boundary. */ srl_decoder_t * srl_build_decoder_struct(pTHX_ HV *opt) { srl_decoder_t *dec; SV **svp; Newxz(dec, 1, srl_decoder_t); dec->ref_seenhash = PTABLE_new(); dec->max_recursion_depth = DEFAULT_MAX_RECUR_DEPTH; dec->max_num_hash_entries = 0; /* 0 == any number */ /* load options */ if (opt != NULL) { if ( (svp = hv_fetchs(opt, "refuse_snappy", 0)) && SvTRUE(*svp)) SRL_DEC_SET_OPTION(dec, SRL_F_DECODER_REFUSE_SNAPPY); if ( (svp = hv_fetchs(opt, "refuse_objects", 0)) && SvTRUE(*svp)) SRL_DEC_SET_OPTION(dec, SRL_F_DECODER_REFUSE_OBJECTS); if ( (svp = hv_fetchs(opt, "no_bless_objects", 0)) && SvTRUE(*svp)) SRL_DEC_SET_OPTION(dec, SRL_F_DECODER_NO_BLESS_OBJECTS); if ( (svp = hv_fetchs(opt, "validate_utf8", 0)) && SvTRUE(*svp)) SRL_DEC_SET_OPTION(dec, SRL_F_DECODER_VALIDATE_UTF8); if ( (svp = hv_fetchs(opt, "max_recursion_depth", 0)) && SvTRUE(*svp)) dec->max_recursion_depth = SvUV(*svp); if ( (svp = hv_fetchs(opt, "max_num_hash_entries", 0)) && SvTRUE(*svp)) dec->max_num_hash_entries = SvUV(*svp); if ( (svp = hv_fetchs(opt, "incremental", 0)) && SvTRUE(*svp)) SRL_DEC_SET_OPTION(dec,SRL_F_DECODER_DESTRUCTIVE_INCREMENTAL); } return dec; }
SRL_STATIC_INLINE ptable_ptr srl_init_tracked_offsets_tbl(pTHX_ srl_merger_t *mrg) { mrg->tracked_offsets_tbl = PTABLE_new(); return mrg->tracked_offsets_tbl; }