X-Git-Url: https://git.dlugolecki.net.pl/?a=blobdiff_plain;f=gom%2Fsource.c;h=7ecb9777cf402834596d730e3ac679e5a307b0b3;hb=5b045164f4a11b1f4d709820e784e1ca77b61b3f;hp=edf53eddaa1edad01736f18d2aa179a9481529e2;hpb=4c445928c8f7d30731a66522ffb9747fe13a3243;p=gedcom-parse.git diff --git a/gom/source.c b/gom/source.c index edf53ed..7ecb977 100644 --- a/gom/source.c +++ b/gom/source.c @@ -42,24 +42,100 @@ 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 */ +NULL_CB(source, sour_titl_start) /* value set by end callback */ 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 */ +NULL_CB(source, sour_text_start) /* value set by end callback */ XREF_CB(source, sour_repo_start, repository.link, make_repository_record) +void sour_auth_end(_ELT_END_PARAMS_) +{ + Gom_ctxt ctxt = (Gom_ctxt)self; + + if (! ctxt) + NO_CONTEXT; + else { + struct source *sour = SAFE_CTXT_CAST(source, ctxt); + if (sour) { + char *str = GEDCOM_STRING(parsed_value); + char *newvalue = strdup(str); + if (! newvalue) + MEMORY_ERROR; + else + sour->author = newvalue; + } + } +} + +void sour_titl_end(_ELT_END_PARAMS_) +{ + Gom_ctxt ctxt = (Gom_ctxt)self; + + if (! ctxt) + NO_CONTEXT; + else { + struct source *sour = SAFE_CTXT_CAST(source, ctxt); + if (sour) { + char *str = GEDCOM_STRING(parsed_value); + char *newvalue = strdup(str); + if (! newvalue) + MEMORY_ERROR; + else + sour->title = newvalue; + } + } +} + +void sour_publ_end(_ELT_END_PARAMS_) +{ + Gom_ctxt ctxt = (Gom_ctxt)self; + + if (! ctxt) + NO_CONTEXT; + else { + struct source *sour = SAFE_CTXT_CAST(source, ctxt); + if (sour) { + char *str = GEDCOM_STRING(parsed_value); + char *newvalue = strdup(str); + if (! newvalue) + MEMORY_ERROR; + else + sour->publication = newvalue; + } + } +} + +void sour_text_end(_ELT_END_PARAMS_) +{ + Gom_ctxt ctxt = (Gom_ctxt)self; + + if (! ctxt) + NO_CONTEXT; + else { + struct source *sour = SAFE_CTXT_CAST(source, ctxt); + if (sour) { + char *str = GEDCOM_STRING(parsed_value); + char *newvalue = strdup(str); + if (! newvalue) + MEMORY_ERROR; + else + sour->text = newvalue; + } + } +} + void source_subscribe() { gedcom_subscribe_to_record(REC_SOUR, sour_start, def_rec_end); 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 +167,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, const 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);