X-Git-Url: https://git.dlugolecki.net.pl/?a=blobdiff_plain;f=gom%2Fsource.c;h=2f353973d18fae5b840862ac9fca801f8cff23a0;hb=5684a3ce93e11c887cbf3c237fd007d517cb2c30;hp=34a7c9eeda711e7f8592d6331efb2c12e7d4f8c3;hpb=bdf47fdee469d5a1d7ddfd06a0e4b26f3b40b0f4;p=gedcom-parse.git diff --git a/gom/source.c b/gom/source.c index 34a7c9e..2f35397 100644 --- a/gom/source.c +++ b/gom/source.c @@ -42,11 +42,15 @@ REC_CB(source, sour_start, make_source_record) GET_REC_BY_XREF(source, XREF_SOUR, gom_get_source_by_xref) NULL_CB(source, sour_data_start) STRING_CB(source, sour_data_agnc_start, data.agency) -STRING_CB(source, sour_auth_start, author) -STRING_CB(source, sour_titl_start, title) +NULL_CB(source, sour_auth_start) /* value set by end callback */ +STRING_END_CB(source, sour_auth_end, author) +NULL_CB(source, sour_titl_start) /* value set by end callback */ +STRING_END_CB(source, sour_titl_end, title) STRING_CB(source, sour_abbr_start, abbreviation) -STRING_CB(source, sour_publ_start, publication) -STRING_CB(source, sour_text_start, text) +NULL_CB(source, sour_publ_start) /* value set by end callback */ +STRING_END_CB(source, sour_publ_end, publication) +NULL_CB(source, sour_text_start) /* value set by end callback */ +STRING_END_CB(source, sour_text_end, text) XREF_CB(source, sour_repo_start, repository.link, make_repository_record) void source_subscribe() @@ -55,11 +59,11 @@ void source_subscribe() gedcom_subscribe_to_element(ELT_SOUR_DATA, sour_data_start, def_elt_end); gedcom_subscribe_to_element(ELT_SOUR_DATA_AGNC, sour_data_agnc_start, def_elt_end); - gedcom_subscribe_to_element(ELT_SOUR_AUTH, sour_auth_start, def_elt_end); - gedcom_subscribe_to_element(ELT_SOUR_TITL, sour_titl_start, def_elt_end); + gedcom_subscribe_to_element(ELT_SOUR_AUTH, sour_auth_start, sour_auth_end); + gedcom_subscribe_to_element(ELT_SOUR_TITL, sour_titl_start, sour_titl_end); gedcom_subscribe_to_element(ELT_SOUR_ABBR, sour_abbr_start, def_elt_end); - gedcom_subscribe_to_element(ELT_SOUR_PUBL, sour_publ_start, def_elt_end); - gedcom_subscribe_to_element(ELT_SOUR_TEXT, sour_text_start, def_elt_end); + gedcom_subscribe_to_element(ELT_SOUR_PUBL, sour_publ_start, sour_publ_end); + gedcom_subscribe_to_element(ELT_SOUR_TEXT, sour_text_start, sour_text_end); gedcom_subscribe_to_element(ELT_SUB_REPO, sour_repo_start, def_elt_end); } @@ -91,46 +95,6 @@ void source_add_description(Gom_ctxt ctxt, struct source_description* desc) LINK_CHAIN_ELT(source_description, sour->repository.description, desc); } -void source_add_to_value(NL_TYPE type, Gom_ctxt ctxt, char* str) -{ - struct source *sour = SAFE_CTXT_CAST(source, ctxt); - if (sour) { - switch (ctxt->ctxt_type) { - char *newvalue; - case ELT_SOUR_AUTH: - newvalue = concat_strings (type, sour->author, str); - if (newvalue) - sour->author = newvalue; - else - MEMORY_ERROR; - break; - case ELT_SOUR_TITL: - newvalue = concat_strings (type, sour->title, str); - if (newvalue) - sour->title = newvalue; - else - MEMORY_ERROR; - break; - case ELT_SOUR_PUBL: - newvalue = concat_strings (type, sour->publication, str); - if (newvalue) - sour->publication = newvalue; - else - MEMORY_ERROR; - break; - case ELT_SOUR_TEXT: - newvalue = concat_strings (type, sour->text, str); - if (newvalue) - sour->text = newvalue; - else - MEMORY_ERROR; - break; - default: - UNEXPECTED_CONTEXT(ctxt->ctxt_type); - } - } -} - void source_add_mm_link(Gom_ctxt ctxt, struct multimedia_link* link) { struct source *sour = SAFE_CTXT_CAST(source, ctxt); @@ -152,7 +116,7 @@ void source_add_user_ref(Gom_ctxt ctxt, struct user_ref_number* ref) LINK_CHAIN_ELT(user_ref_number, sour->ref, ref); } -void source_set_record_id(Gom_ctxt ctxt, char *rin) +void source_set_record_id(Gom_ctxt ctxt, const char *rin) { struct source *sour = SAFE_CTXT_CAST(source, ctxt); if (sour) { @@ -209,7 +173,7 @@ struct source* gom_get_first_source() return gom_first_source; } -struct source* make_source_record(char* xrefstr) +struct source* make_source_record(const char* xrefstr) { struct source* src = NULL; MAKE_CHAIN_ELT(source, gom_first_source, src); @@ -219,3 +183,65 @@ struct source* make_source_record(char* xrefstr) } return src; } + +int write_sources(Gedcom_write_hndl hndl) +{ + int result = 0; + struct source* obj; + + for (obj = gom_first_source; obj; obj = obj->next) { + result |= gedcom_write_record_str(hndl, REC_SOUR, 0, + obj->xrefstr, NULL); + if (obj->data.event || obj->data.agency || obj->data.note) + result |= gedcom_write_element_str(hndl, ELT_SOUR_DATA, 0, + REC_SOUR, NULL); + if (obj->data.event) + result |= write_source_events(hndl, ELT_SOUR_DATA, obj->data.event); + if (obj->data.agency) + result |= gedcom_write_element_str(hndl, ELT_SOUR_DATA_AGNC, 0, + ELT_SOUR_DATA, obj->data.agency); + if (obj->data.note) + result |= write_note_subs(hndl, ELT_SOUR_DATA, obj->data.note); + if (obj->author) + result |= gedcom_write_element_str(hndl, ELT_SOUR_AUTH, 0, + REC_SOUR, obj->author); + if (obj->title) + result |= gedcom_write_element_str(hndl, ELT_SOUR_TITL, 0, + REC_SOUR, obj->title); + if (obj->abbreviation) + result |= gedcom_write_element_str(hndl, ELT_SOUR_ABBR, 0, + REC_SOUR, obj->abbreviation); + if (obj->publication) + result |= gedcom_write_element_str(hndl, ELT_SOUR_PUBL, 0, + REC_SOUR, obj->publication); + if (obj->text) + result |= gedcom_write_element_str(hndl, ELT_SOUR_TEXT, 0, + REC_SOUR, obj->text); + if (obj->repository.link || obj->repository.note + || obj->repository.description) { + result |= gedcom_write_element_xref(hndl, ELT_SUB_REPO, 0, + REC_SOUR, obj->repository.link); + } + if (obj->repository.note) + result |= write_note_subs(hndl, ELT_SUB_REPO, obj->repository.note); + if (obj->repository.description) + result |= write_source_descriptions(hndl, ELT_SUB_REPO, + obj->repository.description); + if (obj->mm_link) + result |= write_multimedia_links(hndl, REC_SOUR, obj->mm_link); + if (obj->note) + result |= write_note_subs(hndl, REC_SOUR, obj->note); + if (obj->ref) + result |= write_user_refs(hndl, REC_SOUR, obj->ref); + if (obj->record_id) + result |= gedcom_write_element_str(hndl, ELT_SUB_IDENT_RIN, 0, + REC_SOUR, obj->record_id); + if (obj->change_date) + result |= write_change_date(hndl, REC_SOUR, obj->change_date); + if (obj->extra) + result |= write_user_data(hndl, obj->extra); + } + + return result; +} +