X-Git-Url: https://git.dlugolecki.net.pl/?a=blobdiff_plain;f=gom%2Fsource_event.c;h=a7756c38968e59c95a03584f03b52599f09a80c3;hb=8073f669d16f11bfd50d42bb2cf6fdb79d358565;hp=f7c7a8d2a1072dab43f799408fcaa59adbaec56f;hpb=bdf47fdee469d5a1d7ddfd06a0e4b26f3b40b0f4;p=gedcom-parse.git diff --git a/gom/source_event.c b/gom/source_event.c index f7c7a8d..a7756c3 100644 --- a/gom/source_event.c +++ b/gom/source_event.c @@ -38,12 +38,8 @@ Gedcom_ctxt sub_sour_even_start(_ELT_PARAMS_) 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)); + struct source_event *evt = SUB_MAKEFUNC(source_event)(); + if (evt) { evt->recorded_events = strdup(GEDCOM_STRING(parsed_value)); if (! evt->recorded_events) { @@ -51,11 +47,12 @@ Gedcom_ctxt sub_sour_even_start(_ELT_PARAMS_) free(evt); } else { - switch (ctxt->ctxt_type) { + int type = ctxt_type(ctxt); + switch (type) { case ELT_SOUR_DATA: - source_add_event(ctxt, evt); break; + ADDFUNC2(source,source_event)(ctxt, evt); break; default: - UNEXPECTED_CONTEXT(ctxt->ctxt_type); + UNEXPECTED_CONTEXT(type); } result = MAKE_GOM_CTXT(elt, source_event, evt); } @@ -65,8 +62,16 @@ Gedcom_ctxt sub_sour_even_start(_ELT_PARAMS_) return (Gedcom_ctxt)result; } -DATE_CB(source_event, sub_sour_even_date_start, date_period) -STRING_CB(source_event, sub_sour_even_plac_start, jurisdiction) +DEFINE_SUB_MAKEFUNC(source_event) +DEFINE_SUB_ADDFUNC(source_event) +DEFINE_SUB_FINDFUNC(source_event) +DEFINE_SUB_REMOVEFUNC(source_event) +DEFINE_SUB_MOVEFUNC(source_event) + +DEFINE_DATE_CB(source_event, sub_sour_even_date_start, date_period) +DEFINE_STRING_CB(source_event, sub_sour_even_plac_start, jurisdiction) + +DEFINE_ADDFUNC2(source_event, user_data, extra) void source_event_subscribe() { @@ -78,19 +83,46 @@ void source_event_subscribe() sub_sour_even_plac_start, def_elt_end); } -void source_event_add_user_data(Gom_ctxt ctxt, struct user_data* data) +void UNREFALLFUNC(source_event)(struct source_event* obj) { - struct source_event *obj = SAFE_CTXT_CAST(source_event, ctxt); - if (obj) - LINK_CHAIN_ELT(user_data, obj->extra, data); + if (obj) { + struct source_event* runner; + for (runner = obj; runner; runner = runner->next) { + UNREFALLFUNC(user_data)(runner->extra); + } + } } -void source_event_cleanup(struct source_event* evt) +void CLEANFUNC(source_event)(struct source_event* evt) { if (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); } } + +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; +}