X-Git-Url: https://git.dlugolecki.net.pl/?a=blobdiff_plain;f=gom%2Fsubmission.c;h=3aed081f0da239d8ffcc99dd58ae7f105b8aadb2;hb=3155d964e15a3c49121c01d2808e5a846779b812;hp=fcd3c862492be25a90778fc4b1df6997928534d2;hpb=4c445928c8f7d30731a66522ffb9747fe13a3243;p=gedcom-parse.git diff --git a/gom/submission.c b/gom/submission.c index fcd3c86..3aed081 100644 --- a/gom/submission.c +++ b/gom/submission.c @@ -32,14 +32,16 @@ struct submission* gom_submission = NULL; -REC_CB(submission, subn_start, make_submission_record) -XREF_CB(submission, subn_subm_start, submitter, make_submitter_record) -STRING_CB(submission, subn_famf_start, family_file) -STRING_CB(submission, subn_temp_start, temple_code) -STRING_CB(submission, subn_ance_start, nr_of_ancestor_gens) -STRING_CB(submission, subn_desc_start, nr_of_descendant_gens) -STRING_CB(submission, subn_ordi_start, ordinance_process_flag) -STRING_CB(submission, subn_rin_start, record_id) +DEFINE_REC_CB(submission, subn_start) +DEFINE_XREF_CB(submission, subn_subm_start, submitter, submitter) +DEFINE_STRING_CB(submission, subn_famf_start, family_file) +DEFINE_STRING_CB(submission, subn_temp_start, temple_code) +DEFINE_STRING_CB(submission, subn_ance_start, nr_of_ancestor_gens) +DEFINE_STRING_CB(submission, subn_desc_start, nr_of_descendant_gens) +DEFINE_STRING_CB(submission, subn_ordi_start, ordinance_process_flag) +DEFINE_STRING_CB(submission, subn_rin_start, record_id) + +DEFINE_ADDFUNC2(submission, user_data, extra) void submission_subscribe() { @@ -53,14 +55,15 @@ void submission_subscribe() gedcom_subscribe_to_element(ELT_SUBN_RIN, subn_rin_start, def_elt_end); } -void submission_add_user_data(Gom_ctxt ctxt, struct user_data* data) +void UNREFALLFUNC(submission)() { - struct submission *obj = SAFE_CTXT_CAST(submission, ctxt); - if (obj) - LINK_CHAIN_ELT(user_data, obj->extra, data); + if (gom_submission) { + unref_xref_value(gom_submission->submitter); + UNREFALLFUNC(user_data)(gom_submission->extra); + } } -void submission_cleanup() +void CLEANFUNC(submission)() { if (gom_submission) { SAFE_FREE(gom_submission->xrefstr); @@ -70,8 +73,7 @@ void submission_cleanup() SAFE_FREE(gom_submission->nr_of_descendant_gens); SAFE_FREE(gom_submission->ordinance_process_flag); SAFE_FREE(gom_submission->record_id); - DESTROY_CHAIN_ELTS(user_data, gom_submission->extra, user_data_cleanup); - SAFE_FREE(gom_submission); + DESTROY_CHAIN_ELTS(user_data, gom_submission->extra); } } @@ -80,7 +82,7 @@ struct submission* gom_get_submission() return gom_submission; } -struct submission* make_submission_record(const char* xref) +struct submission* MAKEFUNC(submission)(const char* xref) { if (! gom_submission) { gom_submission = (struct submission*)malloc(sizeof(struct submission)); @@ -95,3 +97,81 @@ struct submission* make_submission_record(const char* xref) return gom_submission; } + +void DESTROYFUNC(submission)() +{ + if (gom_submission) { + submission_cleanup(); + SAFE_FREE(gom_submission); + } +} + +struct submission* ADDFUNC(submission)(const char* xrefstr) +{ + if (!gom_submission) { + struct xref_value* xrv = gedcom_get_by_xref(xrefstr); + if (xrv) + gom_xref_already_in_use(xrefstr); + else { + gom_submission = MAKEFUNC(submission)(xrefstr); + if (gom_submission) { + xrv = gedcom_add_xref(XREF_SUBN, xrefstr, gom_submission); + if (!xrv) { + DESTROYFUNC(submission)(gom_submission); + gom_submission = NULL; + } + } + } + return gom_submission; + } + else + return NULL; +} + +int DELETEFUNC(submission)() +{ + int result = 1; + if (gom_submission) { + result = gedcom_delete_xref(gom_submission->xrefstr); + if (result == 0) { + UNREFALLFUNC(submission)(); + DESTROYFUNC(submission)(); + } + } + return result; +} + +int write_submission(Gedcom_write_hndl hndl) +{ + int result = 0; + + if (gom_submission) { + result |= gedcom_write_record_str(hndl, REC_SUBN, + gom_submission->xrefstr, NULL); + if (gom_submission->submitter) + result |= gedcom_write_element_xref(hndl, ELT_SUBN_SUBM, 0, + REC_SUBN, gom_submission->submitter); + if (gom_submission->family_file) + result |= gedcom_write_element_str(hndl, ELT_SUBN_FAMF, 0, REC_SUBN, + gom_submission->family_file); + if (gom_submission->temple_code) + result |= gedcom_write_element_str(hndl, ELT_SUBN_TEMP, 0, REC_SUBN, + gom_submission->temple_code); + if (gom_submission->nr_of_ancestor_gens) + result |= gedcom_write_element_str(hndl, ELT_SUBN_ANCE, 0, REC_SUBN, + gom_submission->nr_of_ancestor_gens); + if (gom_submission->nr_of_descendant_gens) + result |= gedcom_write_element_str(hndl, ELT_SUBN_DESC, 0, REC_SUBN, + gom_submission->nr_of_descendant_gens); + if (gom_submission->ordinance_process_flag) + result |= gedcom_write_element_str(hndl, ELT_SUBN_ORDI, 0, REC_SUBN, + gom_submission->ordinance_process_flag); + if (gom_submission->record_id) + result |= gedcom_write_element_str(hndl, ELT_SUBN_RIN, 0, REC_SUBN, + gom_submission->record_id); + if (gom_submission->extra) + result |= write_user_data(hndl, gom_submission->extra); + } + + return result; +}