X-Git-Url: https://git.dlugolecki.net.pl/?a=blobdiff_plain;f=gom%2Fsource_citation.c;h=406972a7b57a5df92eceee4765bb2e44fe8b2f7f;hb=8073f669d16f11bfd50d42bb2cf6fdb79d358565;hp=8e186cc15d5030c6a36deeae1aa7e39d4f0a3caf;hpb=72689522e287ca3b2231e7d8881f0fe5bea48f15;p=gedcom-parse.git diff --git a/gom/source_citation.c b/gom/source_citation.c index 8e186cc..406972a 100644 --- a/gom/source_citation.c +++ b/gom/source_citation.c @@ -47,17 +47,13 @@ Gedcom_ctxt sub_citation_start(_ELT_PARAMS_) if (! ctxt) NO_CONTEXT; else { - struct source_citation *cit - = (struct source_citation *)malloc(sizeof(struct source_citation)); - - if (! cit) - MEMORY_ERROR; - else { - memset (cit, 0, sizeof(struct source_citation)); + struct source_citation *cit = SUB_MAKEFUNC(source_citation)(); + if (cit) { + int type = ctxt_type(ctxt); if (GEDCOM_IS_XREF_PTR(parsed_value)) cit->reference = GEDCOM_XREF_PTR(parsed_value); - switch (ctxt->ctxt_type) { + switch (type) { case ELT_SUB_PLAC: ADDFUNC2(place,source_citation)(ctxt, cit); break; case ELT_SUB_FAM_EVT: @@ -86,7 +82,7 @@ Gedcom_ctxt sub_citation_start(_ELT_PARAMS_) case REC_NOTE: ADDFUNC2(note,source_citation)(ctxt, cit); break; default: - UNEXPECTED_CONTEXT(ctxt->ctxt_type); + UNEXPECTED_CONTEXT(type); } result = MAKE_GOM_CTXT(elt, source_citation, cit); } @@ -113,7 +109,7 @@ void sub_citation_end(_ELT_END_PARAMS_) cit->description = newvalue; } } - destroy_gom_ctxt(ctxt); + def_elt_end(elt, parent, self, parsed_value); } } @@ -137,6 +133,12 @@ Gedcom_ctxt sub_cit_text_start(_ELT_PARAMS_) return (Gedcom_ctxt)result; } +DEFINE_SUB_MAKEFUNC(source_citation) +DEFINE_SUB_ADDFUNC(source_citation) +DEFINE_SUB_FINDFUNC(source_citation) +DEFINE_SUB_REMOVEFUNC(source_citation) +DEFINE_SUB_MOVEFUNC(source_citation) + DEFINE_STRING_CB(source_citation, sub_cit_page_start, page) DEFINE_STRING_CB(source_citation, sub_cit_even_start, event) DEFINE_STRING_CB(source_citation, sub_cit_even_role_start, role) @@ -169,6 +171,15 @@ void citation_subscribe() def_elt_end); } +void UNREFALLFUNC(text)(struct text* obj) +{ + if (obj) { + struct text* runner; + for (runner = obj; runner; runner = runner->next) + UNREFALLFUNC(user_data)(runner->extra); + } +} + void CLEANFUNC(text)(struct text* t) { if (t) { @@ -176,6 +187,26 @@ void CLEANFUNC(text)(struct text* t) } } +DEFINE_SUB_MAKEFUNC(text) +DEFINE_SUB_ADDFUNC(text) +DEFINE_SUB_FINDFUNC(text) +DEFINE_SUB_REMOVEFUNC(text) +DEFINE_SUB_MOVEFUNC(text) + +void UNREFALLFUNC(source_citation)(struct source_citation* obj) +{ + if (obj) { + struct source_citation* runner; + for (runner = obj; runner; runner = runner->next) { + unref_xref_value(runner->reference); + UNREFALLFUNC(text)(runner->text); + UNREFALLFUNC(multimedia_link)(runner->mm_link); + UNREFALLFUNC(note_sub)(runner->note); + UNREFALLFUNC(user_data)(runner->extra); + } + } +} + void CLEANFUNC(source_citation)(struct source_citation* cit) { if (cit) {