X-Git-Url: https://git.dlugolecki.net.pl/?a=blobdiff_plain;f=gom%2Faddress.c;h=58d11758b41b284ac1467dd6bd916afcd9c684cb;hb=8073f669d16f11bfd50d42bb2cf6fdb79d358565;hp=f8972e616f73f7dc290a728bfaf496ba5fcc733f;hpb=bdf47fdee469d5a1d7ddfd06a0e4b26f3b40b0f4;p=gedcom-parse.git diff --git a/gom/address.c b/gom/address.c index f8972e6..58d1175 100644 --- a/gom/address.c +++ b/gom/address.c @@ -41,40 +41,29 @@ Gedcom_ctxt sub_addr_start(_ELT_PARAMS_) if (!ctxt) NO_CONTEXT; else { - struct address *addr = (struct address *)malloc(sizeof(struct address)); - if (!addr) - MEMORY_ERROR; - else { - char *str = GEDCOM_STRING(parsed_value); - memset (addr, 0, sizeof(struct address)); - addr->full_label = strdup(str); - - if (! addr->full_label) { - MEMORY_ERROR; - free(addr); - } - else { - 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); + struct address *addr = SUB_MAKEFUNC(address)(); + if (addr) { + int type = ctxt_type(ctxt); + switch (type) { + case ELT_HEAD_SOUR_CORP: + ADDFUNC2_NOLIST(header,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: + ADDFUNC2_NOLIST(event,address)(ctxt, addr); break; + case REC_REPO: + ADDFUNC2_NOLIST(repository,address)(ctxt, addr); break; + case REC_SUBM: + ADDFUNC2_NOLIST(submitter,address)(ctxt, addr); break; + default: + UNEXPECTED_CONTEXT(type); } + result = MAKE_GOM_CTXT(elt, address, addr); } } @@ -88,27 +77,24 @@ Gedcom_ctxt sub_addr_cont_start(_ELT_PARAMS_) if (! ctxt) NO_CONTEXT; else { - struct address *addr = SAFE_CTXT_CAST(address, ctxt); - if (addr) { - char *str = GEDCOM_STRING(parsed_value); - char *newvalue = concat_strings (WITH_NL, addr->full_label, str); - if (! newvalue) - MEMORY_ERROR; - else { - addr->full_label = newvalue; - result = MAKE_GOM_CTXT(elt, address, addr); - } - } + result = dup_gom_ctxt(ctxt, elt); } return (Gedcom_ctxt)result; } -STRING_CB(address, sub_addr_adr1_start, line1) -STRING_CB(address, sub_addr_adr2_start, line2) -STRING_CB(address, sub_addr_city_start, city) -STRING_CB(address, sub_addr_stae_start, state) -STRING_CB(address, sub_addr_post_start, postal) -STRING_CB(address, sub_addr_ctry_start, country) +DEFINE_SUB_MAKEFUNC(address) +DEFINE_SUB_SETFUNC(address) +DEFINE_SUB_DELETEFUNC(address) + +DEFINE_STRING_END_CB(address, sub_addr_end, full_label) +DEFINE_STRING_CB(address, sub_addr_adr1_start, line1) +DEFINE_STRING_CB(address, sub_addr_adr2_start, line2) +DEFINE_STRING_CB(address, sub_addr_city_start, city) +DEFINE_STRING_CB(address, sub_addr_stae_start, state) +DEFINE_STRING_CB(address, sub_addr_post_start, postal) +DEFINE_STRING_CB(address, sub_addr_ctry_start, country) + +DEFINE_ADDFUNC2(address, user_data, extra) Gedcom_ctxt sub_phon_start(_ELT_PARAMS_) { @@ -119,7 +105,8 @@ Gedcom_ctxt sub_phon_start(_ELT_PARAMS_) NO_CONTEXT; else { char *str = GEDCOM_STRING(parsed_value); - switch (ctxt->ctxt_type) { + int type = ctxt_type(ctxt); + switch (type) { case ELT_HEAD_SOUR_CORP: header_add_phone(ctxt, str); break; case ELT_SUB_FAM_EVT: @@ -135,16 +122,16 @@ Gedcom_ctxt sub_phon_start(_ELT_PARAMS_) case REC_SUBM: submitter_add_phone(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; } 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, @@ -162,14 +149,14 @@ void address_subscribe() gedcom_subscribe_to_element(ELT_SUB_PHON, sub_phon_start, def_elt_end); } -void address_add_user_data(Gom_ctxt ctxt, struct user_data* data) +void UNREFALLFUNC(address)(struct address *address) { - struct address *obj = SAFE_CTXT_CAST(address, ctxt); - if (obj) - LINK_CHAIN_ELT(user_data, obj->extra, data); + if (address) { + UNREFALLFUNC(user_data)(address->extra); + } } -void address_cleanup(struct address *address) +void CLEANFUNC(address)(struct address *address) { if (address) { SAFE_FREE(address->full_label); @@ -179,7 +166,40 @@ 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); } SAFE_FREE(address); } + +int write_address(Gedcom_write_hndl hndl, int parent, struct address *address) +{ + int result = 0; + + if (!address) return 1; + + if (address->full_label) + result |= gedcom_write_element_str(hndl, ELT_SUB_ADDR, 0, parent, + address->full_label); + if (address->line1) + result |= gedcom_write_element_str(hndl, ELT_SUB_ADDR_ADR1, 0, + ELT_SUB_ADDR, address->line1); + if (address->line2) + result |= gedcom_write_element_str(hndl, ELT_SUB_ADDR_ADR2, 0, + ELT_SUB_ADDR, address->line2); + if (address->city) + result |= gedcom_write_element_str(hndl, ELT_SUB_ADDR_CITY, 0, + ELT_SUB_ADDR, address->city); + if (address->state) + result |= gedcom_write_element_str(hndl, ELT_SUB_ADDR_STAE, 0, + ELT_SUB_ADDR, address->state); + if (address->postal) + result |= gedcom_write_element_str(hndl, ELT_SUB_ADDR_POST, 0, + ELT_SUB_ADDR, address->postal); + if (address->country) + result |= gedcom_write_element_str(hndl, ELT_SUB_ADDR_CTRY, 0, + ELT_SUB_ADDR, address->country); + if (address->extra) + result |= write_user_data(hndl, address->extra); + + return result; +}