X-Git-Url: https://git.dlugolecki.net.pl/?a=blobdiff_plain;f=gom%2Fsource_event.c;h=ce2f873a2944ecea1bd9602bb65e38dd1211e4d3;hb=89ff39aaedee4aa65dec40032686e8b2f8ca272a;hp=c3513847219f0b7a1841764d46f09e7d15830543;hpb=7ea4ef8cae7b52f2bf66371a5e7b493cbd12900e;p=gedcom-parse.git diff --git a/gom/source_event.c b/gom/source_event.c index c351384..ce2f873 100644 --- a/gom/source_event.c +++ b/gom/source_event.c @@ -33,22 +33,36 @@ Gedcom_ctxt sub_sour_even_start(_ELT_PARAMS_) { Gom_ctxt ctxt = (Gom_ctxt)parent; - struct source_event *evt = NULL; - - if (ctxt) { - evt = (struct source_event *)malloc(sizeof(struct source_event)); - memset (evt, 0, sizeof(struct source_event)); - evt->recorded_events = strdup(GEDCOM_STRING(parsed_value)); - - switch (ctxt->ctxt_type) { - case ELT_SOUR_DATA: - source_add_event(ctxt, evt); break; - default: - UNEXPECTED_CONTEXT(ctxt->ctxt_type); + Gom_ctxt result = NULL; + + if (! ctxt) + NO_CONTEXT; + else { + struct source_event *evt + = (struct source_event *)malloc(sizeof(struct source_event)); + if (! evt) + MEMORY_ERROR; + else { + memset (evt, 0, sizeof(struct source_event)); + evt->recorded_events = strdup(GEDCOM_STRING(parsed_value)); + + if (! evt->recorded_events) { + MEMORY_ERROR; + free(evt); + } + else { + switch (ctxt->ctxt_type) { + case ELT_SOUR_DATA: + source_add_event(ctxt, evt); break; + default: + UNEXPECTED_CONTEXT(ctxt->ctxt_type); + } + result = MAKE_GOM_CTXT(elt, source_event, evt); + } } } - return (Gedcom_ctxt) MAKE_GOM_CTXT(elt, source_event, evt); + return (Gedcom_ctxt)result; } DATE_CB(source_event, sub_sour_even_date_start, date_period) @@ -67,7 +81,8 @@ void source_event_subscribe() void source_event_add_user_data(Gom_ctxt ctxt, struct user_data* data) { struct source_event *obj = SAFE_CTXT_CAST(source_event, ctxt); - LINK_CHAIN_ELT(user_data, obj->extra, data) + if (obj) + LINK_CHAIN_ELT(user_data, obj->extra, data); } void source_event_cleanup(struct source_event* evt) @@ -76,6 +91,30 @@ void source_event_cleanup(struct source_event* evt) SAFE_FREE(evt->recorded_events); SAFE_FREE(evt->date_period); SAFE_FREE(evt->jurisdiction); - DESTROY_CHAIN_ELTS(user_data, evt->extra, user_data_cleanup) + DESTROY_CHAIN_ELTS(user_data, evt->extra, user_data_cleanup); } } + +int write_source_events(Gedcom_write_hndl hndl, int parent, + struct source_event *evt) +{ + int result = 0; + struct source_event* obj; + + if (!evt) return 1; + + for (obj = evt; obj; obj = obj->next) { + result |= gedcom_write_element_str(hndl, ELT_SOUR_DATA_EVEN, 0, + parent, obj->recorded_events); + if (obj->date_period) + result |= gedcom_write_element_date(hndl, ELT_SOUR_DATA_EVEN_DATE, 0, + ELT_SOUR_DATA_EVEN, obj->date_period); + if (obj->jurisdiction) + result |= gedcom_write_element_str(hndl, ELT_SOUR_DATA_EVEN_PLAC, 0, + ELT_SOUR_DATA_EVEN, obj->jurisdiction); + if (obj->extra) + result |= write_user_data(hndl, obj->extra); + } + + return result; +}