X-Git-Url: https://git.dlugolecki.net.pl/?a=blobdiff_plain;f=gom%2Faddress.c;h=1766d937164677dc659b34dcbddfd9a9b157e896;hb=f8536669a2c38054a067bfe1596f90744b6c58da;hp=03da991b1cdc8c2390e7eb6470eb52b62ebf8f33;hpb=7ea4ef8cae7b52f2bf66371a5e7b493cbd12900e;p=gedcom-parse.git diff --git a/gom/address.c b/gom/address.c index 03da991..1766d93 100644 --- a/gom/address.c +++ b/gom/address.c @@ -36,46 +36,55 @@ Gedcom_ctxt sub_addr_start(_ELT_PARAMS_) { Gom_ctxt ctxt = (Gom_ctxt)parent; - struct address *addr = (struct address *)malloc(sizeof(struct address)); - char *str = GEDCOM_STRING(parsed_value); - - memset (addr, 0, sizeof(struct address)); - addr->full_label = strdup(str); + Gom_ctxt result = NULL; - if (ctxt) { - switch (ctxt->ctxt_type) { - case ELT_HEAD_SOUR_CORP: - header_add_address(ctxt, addr); break; - case ELT_SUB_FAM_EVT: - case ELT_SUB_FAM_EVT_EVEN: - case ELT_SUB_INDIV_ATTR: - case ELT_SUB_INDIV_RESI: - case ELT_SUB_INDIV_BIRT: - case ELT_SUB_INDIV_GEN: - case ELT_SUB_INDIV_ADOP: - case ELT_SUB_INDIV_EVEN: - event_add_address(ctxt, addr); break; - case REC_REPO: - repository_add_address(ctxt, addr); break; - case REC_SUBM: - submitter_add_address(ctxt, addr); break; - default: - UNEXPECTED_CONTEXT(ctxt->ctxt_type); + if (!ctxt) + NO_CONTEXT; + else { + struct address *addr = (struct address *)malloc(sizeof(struct address)); + if (!addr) + MEMORY_ERROR; + else { + memset (addr, 0, sizeof(struct address)); + switch (ctxt->ctxt_type) { + case ELT_HEAD_SOUR_CORP: + header_add_address(ctxt, addr); break; + case ELT_SUB_FAM_EVT: + case ELT_SUB_FAM_EVT_EVEN: + case ELT_SUB_INDIV_ATTR: + case ELT_SUB_INDIV_RESI: + case ELT_SUB_INDIV_BIRT: + case ELT_SUB_INDIV_GEN: + case ELT_SUB_INDIV_ADOP: + case ELT_SUB_INDIV_EVEN: + event_add_address(ctxt, addr); break; + case REC_REPO: + repository_add_address(ctxt, addr); break; + case REC_SUBM: + submitter_add_address(ctxt, addr); break; + default: + UNEXPECTED_CONTEXT(ctxt->ctxt_type); + } + result = MAKE_GOM_CTXT(elt, address, addr); } } - return (Gedcom_ctxt) MAKE_GOM_CTXT(elt, address, addr); + return (Gedcom_ctxt)result; } Gedcom_ctxt sub_addr_cont_start(_ELT_PARAMS_) { Gom_ctxt ctxt = (Gom_ctxt)parent; - struct address *addr = SAFE_CTXT_CAST(address, ctxt); - char *str = GEDCOM_STRING(parsed_value); - addr->full_label = concat_strings (WITH_NL, addr->full_label, str); - return (Gedcom_ctxt) MAKE_GOM_CTXT(elt, address, addr); + Gom_ctxt result = NULL; + if (! ctxt) + NO_CONTEXT; + else { + result = make_gom_ctxt(elt, ctxt->ctxt_type, ctxt->ctxt_ptr); + } + return (Gedcom_ctxt)result; } +STRING_END_CB(address, sub_addr_end, full_label) STRING_CB(address, sub_addr_adr1_start, line1) STRING_CB(address, sub_addr_adr2_start, line2) STRING_CB(address, sub_addr_city_start, city) @@ -86,8 +95,11 @@ STRING_CB(address, sub_addr_ctry_start, country) Gedcom_ctxt sub_phon_start(_ELT_PARAMS_) { Gom_ctxt ctxt = (Gom_ctxt)parent; + Gom_ctxt result = NULL; - if (ctxt) { + if (! ctxt) + NO_CONTEXT; + else { char *str = GEDCOM_STRING(parsed_value); switch (ctxt->ctxt_type) { case ELT_HEAD_SOUR_CORP: @@ -107,15 +119,14 @@ Gedcom_ctxt sub_phon_start(_ELT_PARAMS_) default: UNEXPECTED_CONTEXT(ctxt->ctxt_type); } - return (Gedcom_ctxt) make_gom_ctxt(elt, ctxt->obj_type, ctxt->ctxt_ptr); + result = make_gom_ctxt(elt, ctxt->obj_type, ctxt->ctxt_ptr); } - else - return (Gedcom_ctxt) MAKE_GOM_CTXT(elt, NULL, NULL); + return (Gedcom_ctxt)result; } void address_subscribe() { - gedcom_subscribe_to_element(ELT_SUB_ADDR, sub_addr_start, def_elt_end); + gedcom_subscribe_to_element(ELT_SUB_ADDR, sub_addr_start, sub_addr_end); gedcom_subscribe_to_element(ELT_SUB_ADDR_CONT, sub_addr_cont_start, def_elt_end); gedcom_subscribe_to_element(ELT_SUB_ADDR_ADR1, @@ -136,7 +147,8 @@ void address_subscribe() void address_add_user_data(Gom_ctxt ctxt, struct user_data* data) { struct address *obj = SAFE_CTXT_CAST(address, ctxt); - LINK_CHAIN_ELT(user_data, obj->extra, data) + if (obj) + LINK_CHAIN_ELT(user_data, obj->extra, data); } void address_cleanup(struct address *address) @@ -149,7 +161,7 @@ void address_cleanup(struct address *address) SAFE_FREE(address->state); SAFE_FREE(address->postal); SAFE_FREE(address->country); - DESTROY_CHAIN_ELTS(user_data, address->extra, user_data_cleanup) + DESTROY_CHAIN_ELTS(user_data, address->extra, user_data_cleanup); } SAFE_FREE(address); }