X-Git-Url: https://git.dlugolecki.net.pl/?a=blobdiff_plain;f=gom%2Fuser_ref.c;h=c43874f829d2561d277540d4fc30ccef28774ec9;hb=473f146038f88434e3edd070dfa42390bd0df60f;hp=27f32bb88818c105892842ccdb06e7e7f3412adc;hpb=082066d0c776403b70c366f9a7d1333c7a9fac15;p=gedcom-parse.git diff --git a/gom/user_ref.c b/gom/user_ref.c index 27f32bb..c43874f 100644 --- a/gom/user_ref.c +++ b/gom/user_ref.c @@ -43,34 +43,30 @@ Gedcom_ctxt sub_user_ref_start(_ELT_PARAMS_) if (! ctxt) NO_CONTEXT; else { - struct user_ref_number *refn - = (struct user_ref_number *)malloc(sizeof(struct user_ref_number)); - - if (! refn) - MEMORY_ERROR; - else { - memset (refn, 0, sizeof(struct user_ref_number)); + struct user_ref_number *refn = SUB_MAKEFUNC(user_ref_number)(); + if (refn) { refn->value = strdup(GEDCOM_STRING(parsed_value)); if (! refn->value) { MEMORY_ERROR; free(refn); } else { - switch (ctxt->ctxt_type) { + int type = ctxt_type(ctxt); + switch (type) { case REC_FAM: - family_add_user_ref(ctxt, refn); break; + ADDFUNC2(family,user_ref_number)(ctxt, refn); break; case REC_INDI: - individual_add_user_ref(ctxt, refn); break; + ADDFUNC2(individual,user_ref_number)(ctxt, refn); break; case REC_OBJE: - multimedia_add_user_ref(ctxt, refn); break; + ADDFUNC2(multimedia,user_ref_number)(ctxt, refn); break; case REC_NOTE: - note_add_user_ref(ctxt, refn); break; + ADDFUNC2(note,user_ref_number)(ctxt, refn); break; case REC_REPO: - repository_add_user_ref(ctxt, refn); break; + ADDFUNC2(repository,user_ref_number)(ctxt, refn); break; case REC_SOUR: - source_add_user_ref(ctxt, refn); break; + ADDFUNC2(source,user_ref_number)(ctxt, refn); break; default: - UNEXPECTED_CONTEXT(ctxt->ctxt_type); + UNEXPECTED_CONTEXT(type); } result = MAKE_GOM_CTXT(elt, user_ref_number, refn); @@ -81,7 +77,15 @@ Gedcom_ctxt sub_user_ref_start(_ELT_PARAMS_) return (Gedcom_ctxt)result; } -STRING_CB(user_ref_number, sub_user_ref_type_start, type) +DEFINE_SUB_MAKEFUNC(user_ref_number) +DEFINE_SUB_ADDFUNC(user_ref_number) +DEFINE_SUB_FINDFUNC(user_ref_number) +DEFINE_SUB_REMOVEFUNC(user_ref_number) +DEFINE_SUB_MOVEFUNC(user_ref_number) + +DEFINE_STRING_CB(user_ref_number, sub_user_ref_type_start, type) + +DEFINE_ADDFUNC2(user_ref_number, user_data, extra) Gedcom_ctxt sub_user_rin_start(_ELT_PARAMS_) { @@ -92,24 +96,25 @@ Gedcom_ctxt sub_user_rin_start(_ELT_PARAMS_) NO_CONTEXT; else { char *str = GEDCOM_STRING(parsed_value); + int type = ctxt_type(ctxt); - switch (ctxt->ctxt_type) { + switch (type) { case REC_FAM: - family_set_record_id(ctxt, str); break; + ADDFUNC2_STR(family,record_id)(ctxt, str); break; case REC_INDI: - individual_set_record_id(ctxt, str); break; + ADDFUNC2_STR(individual,record_id)(ctxt, str); break; case REC_OBJE: - multimedia_set_record_id(ctxt, str); break; + ADDFUNC2_STR(multimedia,record_id)(ctxt, str); break; case REC_NOTE: - note_set_record_id(ctxt, str); break; + ADDFUNC2_STR(note,record_id)(ctxt, str); break; case REC_REPO: - repository_set_record_id(ctxt, str); break; + ADDFUNC2_STR(repository,record_id)(ctxt, str); break; case REC_SOUR: - source_set_record_id(ctxt, str); break; + ADDFUNC2_STR(source,record_id)(ctxt, str); break; default: - UNEXPECTED_CONTEXT(ctxt->ctxt_type); + UNEXPECTED_CONTEXT(type); } - result = make_gom_ctxt(elt, ctxt->obj_type, ctxt->ctxt_ptr); + result = dup_gom_ctxt(ctxt, elt); } return (Gedcom_ctxt)result; } @@ -124,19 +129,21 @@ void user_ref_subscribe() def_elt_end); } -void user_ref_add_user_data(Gom_ctxt ctxt, struct user_data* data) +void UNREFALLFUNC(user_ref_number)(struct user_ref_number* obj) { - struct user_ref_number *obj = SAFE_CTXT_CAST(user_ref_number, ctxt); - if (obj) - LINK_CHAIN_ELT(user_data, obj->extra, data); + if (obj) { + struct user_ref_number* runner; + for (runner = obj; runner; runner = runner->next) + UNREFALLFUNC(user_data)(runner->extra); + } } -void user_ref_cleanup(struct user_ref_number* refn) +void CLEANFUNC(user_ref_number)(struct user_ref_number* refn) { if (refn) { SAFE_FREE(refn->value); SAFE_FREE(refn->type); - DESTROY_CHAIN_ELTS(user_data, refn->extra, user_data_cleanup); + DESTROY_CHAIN_ELTS(user_data, refn->extra); } }