X-Git-Url: https://git.dlugolecki.net.pl/?a=blobdiff_plain;f=gom%2Ffamily.c;h=9d4a4e562f5c46822409dcb24f9a09af06580646;hb=8073f669d16f11bfd50d42bb2cf6fdb79d358565;hp=83ad0b1e6d05b0e926c8feeca16cf0c84bf32547;hpb=4c445928c8f7d30731a66522ffb9747fe13a3243;p=gedcom-parse.git diff --git a/gom/family.c b/gom/family.c index 83ad0b1..9d4a4e5 100644 --- a/gom/family.c +++ b/gom/family.c @@ -40,13 +40,28 @@ struct family* gom_first_family = NULL; -REC_CB(family, fam_start, make_family_record) -GET_REC_BY_XREF(family, XREF_FAM, gom_get_family_by_xref) -XREF_CB(family, fam_husb_start, husband, make_individual_record) -XREF_CB(family, fam_wife_start, wife, make_individual_record) -STRING_CB(family, fam_nchi_start, nr_of_children) -XREF_LIST_CB(family, fam_chil_start, children, make_individual_record) -XREF_LIST_CB(family, fam_subm_start, submitters, make_submitter_record) +DEFINE_MAKEFUNC(family, gom_first_family) +DEFINE_DESTROYFUNC(family, gom_first_family) +DEFINE_ADDFUNC(family, XREF_FAM) +DEFINE_DELETEFUNC(family) +DEFINE_GETXREFFUNC(family, XREF_FAM) + +DEFINE_REC_CB(family, fam_start) +DEFINE_XREF_CB(family, fam_husb_start, husband, individual) +DEFINE_XREF_CB(family, fam_wife_start, wife, individual) +DEFINE_STRING_CB(family, fam_nchi_start, nr_of_children) +DEFINE_XREF_LIST_CB(family, fam_chil_start, children, individual) +DEFINE_XREF_LIST_CB(family, fam_subm_start, submitters, submitter) + +DEFINE_ADDFUNC2(family, event, event) +DEFINE_ADDFUNC2(family, lds_event, lds_spouse_sealing) +DEFINE_ADDFUNC2(family, source_citation, citation) +DEFINE_ADDFUNC2(family, multimedia_link, mm_link) +DEFINE_ADDFUNC2(family, note_sub, note) +DEFINE_ADDFUNC2(family, user_ref_number, ref) +DEFINE_ADDFUNC2(family, user_data, extra) +DEFINE_ADDFUNC2_NOLIST(family, change_date, change_date) +DEFINE_ADDFUNC2_STR(family, record_id) void family_subscribe() { @@ -58,93 +73,46 @@ void family_subscribe() gedcom_subscribe_to_element(ELT_FAM_SUBM, fam_subm_start, def_elt_end); } -void family_add_event(Gom_ctxt ctxt, struct event* evt) +void UNREFALLFUNC(family)(struct family *fam) { - struct family *fam = SAFE_CTXT_CAST(family, ctxt); - if (fam) - LINK_CHAIN_ELT(event, fam->event, evt); -} - -void family_add_lss(Gom_ctxt ctxt, struct lds_event* lss) -{ - struct family *fam = SAFE_CTXT_CAST(family, ctxt); - if (fam) - LINK_CHAIN_ELT(lds_event, fam->lds_spouse_sealing, lss); -} - -void family_add_citation(Gom_ctxt ctxt, struct source_citation* cit) -{ - struct family *fam = SAFE_CTXT_CAST(family, ctxt); - if (fam) - LINK_CHAIN_ELT(source_citation, fam->citation, cit); -} - -void family_add_mm_link(Gom_ctxt ctxt, struct multimedia_link* link) -{ - struct family *fam = SAFE_CTXT_CAST(family, ctxt); - if (fam) - LINK_CHAIN_ELT(multimedia_link, fam->mm_link, link); -} - -void family_add_note(Gom_ctxt ctxt, struct note_sub* note) -{ - struct family *fam = SAFE_CTXT_CAST(family, ctxt); - if (fam) - LINK_CHAIN_ELT(note_sub, fam->note, note); -} - -void family_add_user_ref(Gom_ctxt ctxt, struct user_ref_number* ref) -{ - struct family *fam = SAFE_CTXT_CAST(family, ctxt); - if (fam) - LINK_CHAIN_ELT(user_ref_number, fam->ref, ref); -} - -void family_set_record_id(Gom_ctxt ctxt, const char *rin) -{ - struct family *fam = SAFE_CTXT_CAST(family, ctxt); if (fam) { - fam->record_id = strdup(rin); - if (! fam->record_id) MEMORY_ERROR; + UNREFALLFUNC(event)(fam->event); + unref_xref_value(fam->husband); + unref_xref_value(fam->wife); + UNREFALLFUNC(xref_list)(fam->children); + UNREFALLFUNC(xref_list)(fam->submitters); + UNREFALLFUNC(lds_event)(fam->lds_spouse_sealing); + UNREFALLFUNC(source_citation)(fam->citation); + UNREFALLFUNC(multimedia_link)(fam->mm_link); + UNREFALLFUNC(note_sub)(fam->note); + UNREFALLFUNC(user_ref_number)(fam->ref); + UNREFALLFUNC(change_date)(fam->change_date); + UNREFALLFUNC(user_data)(fam->extra); } } -void family_set_change_date(Gom_ctxt ctxt, struct change_date* chan) -{ - struct family *fam = SAFE_CTXT_CAST(family, ctxt); - if (fam) - fam->change_date = chan; -} - -void family_add_user_data(Gom_ctxt ctxt, struct user_data* data) -{ - struct family *obj = SAFE_CTXT_CAST(family, ctxt); - if (obj) - LINK_CHAIN_ELT(user_data, obj->extra, data); -} - -void family_cleanup(struct family* fam) +void CLEANFUNC(family)(struct family* fam) { if (fam) { SAFE_FREE(fam->xrefstr); - DESTROY_CHAIN_ELTS(event, fam->event, event_cleanup); - DESTROY_CHAIN_ELTS(xref_list, fam->children, NULL_DESTROY); + DESTROY_CHAIN_ELTS(event, fam->event); + DESTROY_CHAIN_ELTS(xref_list, fam->children); SAFE_FREE(fam->nr_of_children); - DESTROY_CHAIN_ELTS(xref_list, fam->submitters, NULL_DESTROY); - DESTROY_CHAIN_ELTS(lds_event, fam->lds_spouse_sealing, lds_event_cleanup); - DESTROY_CHAIN_ELTS(source_citation, fam->citation, citation_cleanup); - DESTROY_CHAIN_ELTS(multimedia_link, fam->mm_link, multimedia_link_cleanup); - DESTROY_CHAIN_ELTS(note_sub, fam->note, note_sub_cleanup); - DESTROY_CHAIN_ELTS(user_ref_number, fam->ref, user_ref_cleanup); + DESTROY_CHAIN_ELTS(xref_list, fam->submitters); + DESTROY_CHAIN_ELTS(lds_event, fam->lds_spouse_sealing); + DESTROY_CHAIN_ELTS(source_citation, fam->citation); + DESTROY_CHAIN_ELTS(multimedia_link, fam->mm_link); + DESTROY_CHAIN_ELTS(note_sub, fam->note); + DESTROY_CHAIN_ELTS(user_ref_number, fam->ref); SAFE_FREE(fam->record_id); - change_date_cleanup(fam->change_date); - DESTROY_CHAIN_ELTS(user_data, fam->extra, user_data_cleanup); + CLEANFUNC(change_date)(fam->change_date); + DESTROY_CHAIN_ELTS(user_data, fam->extra); } } void families_cleanup() { - DESTROY_CHAIN_ELTS(family, gom_first_family, family_cleanup); + DESTROY_CHAIN_ELTS(family, gom_first_family); } struct family* gom_get_first_family() @@ -152,13 +120,47 @@ struct family* gom_get_first_family() return gom_first_family; } -struct family* make_family_record(const char* xrefstr) +int write_families(Gedcom_write_hndl hndl) { - struct family* fam = NULL; - MAKE_CHAIN_ELT(family, gom_first_family, fam); - if (fam) { - fam->xrefstr = strdup(xrefstr); - if (! fam->xrefstr) MEMORY_ERROR; + int result = 0; + struct family* obj; + + for (obj = gom_first_family; obj; obj = obj->next) { + result |= gedcom_write_record_str(hndl, REC_FAM, obj->xrefstr, NULL); + if (obj->event) + result |= write_events(hndl, REC_FAM, EVT_TYPE_FAMILY, obj->event); + if (obj->husband) + result |= gedcom_write_element_xref(hndl, ELT_FAM_HUSB, 0, + REC_FAM, obj->husband); + if (obj->wife) + result |= gedcom_write_element_xref(hndl, ELT_FAM_WIFE, 0, + REC_FAM, obj->wife); + result |= gom_write_xref_list(hndl, ELT_FAM_CHIL, 0, + REC_FAM, obj->children); + if (obj->nr_of_children) + result |= gedcom_write_element_str(hndl, ELT_FAM_NCHI, 0, + REC_FAM, obj->nr_of_children); + result |= gom_write_xref_list(hndl, ELT_FAM_SUBM, 0, + REC_FAM, obj->submitters); + if (obj->lds_spouse_sealing) + result |= write_lds_events(hndl, REC_FAM, obj->lds_spouse_sealing); + if (obj->citation) + result |= write_citations(hndl, REC_FAM, obj->citation); + if (obj->mm_link) + result |= write_multimedia_links(hndl, REC_FAM, obj->mm_link); + if (obj->note) + result |= write_note_subs(hndl, REC_FAM, obj->note); + if (obj->ref) + result |= write_user_refs(hndl, REC_FAM, obj->ref); + if (obj->record_id) + result |= gedcom_write_element_str(hndl, ELT_SUB_IDENT_RIN, 0, + REC_FAM, obj->record_id); + if (obj->change_date) + result |= write_change_date(hndl, REC_FAM, obj->change_date); + if (obj->extra) + result |= write_user_data(hndl, obj->extra); } - return fam; + + return result; } +