X-Git-Url: https://git.dlugolecki.net.pl/?a=blobdiff_plain;f=gom%2Fpersonal_name.c;h=686422fc3b88f2e8a228ee95e464fd2d9d72ca29;hb=1b7536d78e236978e83fbf8acc9f90e2141e13b0;hp=b859ba7cb2d35776d1292cb23a5566a3e3ff2857;hpb=7ea4ef8cae7b52f2bf66371a5e7b493cbd12900e;p=gedcom-parse.git diff --git a/gom/personal_name.c b/gom/personal_name.c index b859ba7..686422f 100644 --- a/gom/personal_name.c +++ b/gom/personal_name.c @@ -35,48 +35,48 @@ Gedcom_ctxt sub_name_start(_ELT_PARAMS_) { Gom_ctxt ctxt = (Gom_ctxt)parent; - struct personal_name *name = NULL; + Gom_ctxt result = NULL; if (ctxt) { - name = (struct personal_name *)malloc(sizeof(struct personal_name)); - memset (name, 0, sizeof(struct personal_name)); - name->name = strdup(GEDCOM_STRING(parsed_value)); - - switch (ctxt->ctxt_type) { - case REC_INDI: - individual_add_name(ctxt, name); break; - default: - UNEXPECTED_CONTEXT(ctxt->ctxt_type); + struct personal_name *name = SUB_MAKEFUNC(personal_name)(); + if (name) { + name->name = strdup(GEDCOM_STRING(parsed_value)); + + if (! name->name) { + MEMORY_ERROR; + free(name); + } + else { + switch (ctxt->ctxt_type) { + case REC_INDI: + ADDFUNC2(individual,personal_name)(ctxt, name); break; + default: + UNEXPECTED_CONTEXT(ctxt->ctxt_type); + } + result = MAKE_GOM_CTXT(elt, personal_name, name); + } } } - return (Gedcom_ctxt) MAKE_GOM_CTXT(elt, personal_name, name); + return (Gedcom_ctxt)result; } -STRING_CB(personal_name, sub_name_npfx_start, prefix) -STRING_CB(personal_name, sub_name_givn_start, given) -STRING_CB(personal_name, sub_name_nick_start, nickname) -STRING_CB(personal_name, sub_name_spfx_start, surname_prefix) -STRING_CB(personal_name, sub_name_surn_start, surname) -STRING_CB(personal_name, sub_name_nsfx_start, suffix) - -void name_add_citation(Gom_ctxt ctxt, struct source_citation* cit) -{ - struct personal_name *name = SAFE_CTXT_CAST(personal_name, ctxt); - LINK_CHAIN_ELT(source_citation, name->citation, cit) -} +DEFINE_SUB_MAKEFUNC(personal_name) +DEFINE_SUB_ADDFUNC(personal_name) +DEFINE_SUB_FINDFUNC(personal_name) +DEFINE_SUB_REMOVEFUNC(personal_name) +DEFINE_SUB_MOVEFUNC(personal_name) + +DEFINE_STRING_CB(personal_name, sub_name_npfx_start, prefix) +DEFINE_STRING_CB(personal_name, sub_name_givn_start, given) +DEFINE_STRING_CB(personal_name, sub_name_nick_start, nickname) +DEFINE_STRING_CB(personal_name, sub_name_spfx_start, surname_prefix) +DEFINE_STRING_CB(personal_name, sub_name_surn_start, surname) +DEFINE_STRING_CB(personal_name, sub_name_nsfx_start, suffix) -void name_add_note(Gom_ctxt ctxt, struct note_sub* note) -{ - struct personal_name *name = SAFE_CTXT_CAST(personal_name, ctxt); - LINK_CHAIN_ELT(note_sub, name->note, note) -} - -void name_add_user_data(Gom_ctxt ctxt, struct user_data* data) -{ - struct personal_name *obj = SAFE_CTXT_CAST(personal_name, ctxt); - LINK_CHAIN_ELT(user_data, obj->extra, data) -} +DEFINE_ADDFUNC2(personal_name, source_citation, citation) +DEFINE_ADDFUNC2(personal_name, note_sub, note) +DEFINE_ADDFUNC2(personal_name, user_data, extra) void name_subscribe() { @@ -95,7 +95,19 @@ void name_subscribe() def_elt_end); } -void name_cleanup(struct personal_name* name) +void UNREFALLFUNC(personal_name)(struct personal_name* obj) +{ + if (obj) { + struct personal_name* runner; + for (runner = obj; runner; runner = runner->next) { + UNREFALLFUNC(source_citation)(runner->citation); + UNREFALLFUNC(note_sub)(runner->note); + UNREFALLFUNC(user_data)(runner->extra); + } + } +} + +void CLEANFUNC(personal_name)(struct personal_name* name) { if (name) { SAFE_FREE(name->name); @@ -105,8 +117,49 @@ void name_cleanup(struct personal_name* name) SAFE_FREE(name->surname_prefix); SAFE_FREE(name->surname); SAFE_FREE(name->suffix); - DESTROY_CHAIN_ELTS(source_citation, name->citation, citation_cleanup) - DESTROY_CHAIN_ELTS(note_sub, name->note, note_sub_cleanup) - DESTROY_CHAIN_ELTS(user_data, name->extra, user_data_cleanup) + DESTROY_CHAIN_ELTS(source_citation, name->citation); + DESTROY_CHAIN_ELTS(note_sub, name->note); + DESTROY_CHAIN_ELTS(user_data, name->extra); + } +} + +int write_names(Gedcom_write_hndl hndl, int parent, + struct personal_name *name) +{ + int result = 0; + struct personal_name* obj; + + if (!name) return 1; + + for (obj = name; obj; obj = obj->next) { + result |= gedcom_write_element_str(hndl, ELT_SUB_PERS_NAME, 0, + parent, obj->name); + if (obj->prefix) + result |= gedcom_write_element_str(hndl, ELT_SUB_PERS_NAME_NPFX, 0, + ELT_SUB_PERS_NAME, obj->prefix); + if (obj->given) + result |= gedcom_write_element_str(hndl, ELT_SUB_PERS_NAME_GIVN, 0, + ELT_SUB_PERS_NAME, obj->given); + if (obj->nickname) + result |= gedcom_write_element_str(hndl, ELT_SUB_PERS_NAME_NICK, 0, + ELT_SUB_PERS_NAME, obj->nickname); + if (obj->surname_prefix) + result |= gedcom_write_element_str(hndl, ELT_SUB_PERS_NAME_SPFX, 0, + ELT_SUB_PERS_NAME, + obj->surname_prefix); + if (obj->surname) + result |= gedcom_write_element_str(hndl, ELT_SUB_PERS_NAME_SURN, 0, + ELT_SUB_PERS_NAME, obj->surname); + if (obj->suffix) + result |= gedcom_write_element_str(hndl, ELT_SUB_PERS_NAME_NSFX, 0, + ELT_SUB_PERS_NAME, obj->suffix); + if (obj->citation) + result |= write_citations(hndl, ELT_SUB_PERS_NAME, obj->citation); + if (obj->note) + result |= write_note_subs(hndl, ELT_SUB_PERS_NAME, obj->note); + if (obj->extra) + result |= write_user_data(hndl, obj->extra); } + + return result; }