X-Git-Url: https://git.dlugolecki.net.pl/?a=blobdiff_plain;f=gom%2Fsource_description.c;h=b03e3973541501fe176a7f0c9ee12644e6ad5f2e;hb=4946f8418bfa1c41bb410995dbc9c5ac272c4c74;hp=6dea145e0d6ad846e4e5ef05168d9a24e30432b9;hpb=7ea4ef8cae7b52f2bf66371a5e7b493cbd12900e;p=gedcom-parse.git diff --git a/gom/source_description.c b/gom/source_description.c index 6dea145..b03e397 100644 --- a/gom/source_description.c +++ b/gom/source_description.c @@ -33,23 +33,36 @@ Gedcom_ctxt sub_sour_caln_start(_ELT_PARAMS_) { Gom_ctxt ctxt = (Gom_ctxt)parent; - struct source_description *desc = NULL; + Gom_ctxt result = NULL; - if (ctxt) { - desc + if (! ctxt) + NO_CONTEXT; + else { + struct source_description *desc = (struct source_description *)malloc(sizeof(struct source_description)); - memset (desc, 0, sizeof(struct source_description)); - desc->call_number = strdup(GEDCOM_STRING(parsed_value)); - - switch (ctxt->ctxt_type) { - case ELT_SUB_REPO: - source_add_description(ctxt, desc); break; - default: - UNEXPECTED_CONTEXT(ctxt->ctxt_type); + if (! desc) + MEMORY_ERROR; + else { + memset (desc, 0, sizeof(struct source_description)); + desc->call_number = strdup(GEDCOM_STRING(parsed_value)); + + if (! desc->call_number) { + MEMORY_ERROR; + free(desc); + } + else { + switch (ctxt->ctxt_type) { + case ELT_SUB_REPO: + source_add_description(ctxt, desc); break; + default: + UNEXPECTED_CONTEXT(ctxt->ctxt_type); + } + result = MAKE_GOM_CTXT(elt, source_description, desc); + } } } - return (Gedcom_ctxt) MAKE_GOM_CTXT(elt, source_description, desc); + return (Gedcom_ctxt)result; } STRING_CB(source_description, sub_sour_caln_medi_start, media) @@ -65,7 +78,8 @@ void source_description_subscribe() void source_description_add_user_data(Gom_ctxt ctxt, struct user_data* data) { struct source_description *obj = SAFE_CTXT_CAST(source_description, ctxt); - LINK_CHAIN_ELT(user_data, obj->extra, data) + if (obj) + LINK_CHAIN_ELT(user_data, obj->extra, data); } void source_description_cleanup(struct source_description* desc) @@ -73,6 +87,27 @@ void source_description_cleanup(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, user_data_cleanup); + } +} + +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; }