X-Git-Url: https://git.dlugolecki.net.pl/?a=blobdiff_plain;f=gom%2Fsource_description.c;h=87f34abad7390f04267f583dde6e78b0534b8fc3;hb=d2d823fd4fe80162765029e5bc29f9b4f6f968f5;hp=ecec1dc30cb187bcd5f5427c79257ff3ba1b9502;hpb=bdf47fdee469d5a1d7ddfd06a0e4b26f3b40b0f4;p=gedcom-parse.git diff --git a/gom/source_description.c b/gom/source_description.c index ecec1dc..87f34ab 100644 --- a/gom/source_description.c +++ b/gom/source_description.c @@ -38,12 +38,8 @@ Gedcom_ctxt sub_sour_caln_start(_ELT_PARAMS_) if (! ctxt) NO_CONTEXT; else { - struct source_description *desc - = (struct source_description *)malloc(sizeof(struct source_description)); - if (! desc) - MEMORY_ERROR; - else { - memset (desc, 0, sizeof(struct source_description)); + struct source_description *desc = SUB_MAKEFUNC(source_description)(); + if (desc) { desc->call_number = strdup(GEDCOM_STRING(parsed_value)); if (! desc->call_number) { @@ -53,7 +49,7 @@ Gedcom_ctxt sub_sour_caln_start(_ELT_PARAMS_) else { switch (ctxt->ctxt_type) { case ELT_SUB_REPO: - source_add_description(ctxt, desc); break; + ADDFUNC2(source,source_description)(ctxt, desc); break; default: UNEXPECTED_CONTEXT(ctxt->ctxt_type); } @@ -65,7 +61,11 @@ Gedcom_ctxt sub_sour_caln_start(_ELT_PARAMS_) return (Gedcom_ctxt)result; } -STRING_CB(source_description, sub_sour_caln_medi_start, media) +DEFINE_SUB_MAKEFUNC(source_description) + +DEFINE_STRING_CB(source_description, sub_sour_caln_medi_start, media) + +DEFINE_ADDFUNC2(source_description, user_data, extra) void source_description_subscribe() { @@ -75,18 +75,32 @@ void source_description_subscribe() sub_sour_caln_medi_start, def_elt_end); } -void source_description_add_user_data(Gom_ctxt ctxt, struct user_data* data) -{ - struct source_description *obj = SAFE_CTXT_CAST(source_description, ctxt); - if (obj) - LINK_CHAIN_ELT(user_data, obj->extra, data); -} - -void source_description_cleanup(struct source_description* desc) +void CLEANFUNC(source_description)(struct source_description* desc) { if (desc) { SAFE_FREE(desc->call_number); SAFE_FREE(desc->media); - DESTROY_CHAIN_ELTS(user_data, desc->extra, user_data_cleanup); + DESTROY_CHAIN_ELTS(user_data, desc->extra); + } +} + +int write_source_descriptions(Gedcom_write_hndl hndl, int parent, + struct source_description *desc) +{ + int result = 0; + struct source_description* obj; + + if (!desc) return 1; + + for (obj = desc; obj; obj = obj->next) { + result |= gedcom_write_element_str(hndl, ELT_SUB_REPO_CALN, 0, + parent, obj->call_number); + if (obj->media) + result |= gedcom_write_element_str(hndl, ELT_SUB_REPO_CALN_MEDI, 0, + ELT_SUB_REPO_CALN, obj->media); + if (obj->extra) + result |= write_user_data(hndl, obj->extra); } + + return result; }