-#define DESTROY_CHAIN_ELTS(STRUCTTYPE, FIRSTVAL, DESTROYFUNC) \
- { \
- if (FIRSTVAL) { \
- struct STRUCTTYPE *runner, *next; \
- runner = FIRSTVAL; \
- while (runner) { \
- next = runner->next; \
- DESTROYFUNC(runner); \
- SAFE_FREE(runner); \
- runner = next; \
- } \
- } \
- }
-
-#define _REC_PARAMS_ Gedcom_rec rec, int level, Gedcom_val xref, char *tag, \
- char *raw_value, int parsed_tag, Gedcom_val parsed_value
-
-#define _ELT_PARAMS_ Gedcom_elt elt, Gedcom_ctxt parent, int level, char *tag,\
- char *raw_value, int parsed_tag, Gedcom_val parsed_value
-
-#define REC_CB(STRUCTTYPE,CB_NAME,FUNC) \
- Gedcom_ctxt CB_NAME(_REC_PARAMS_) \
- { \
- struct xref_value* xr = GEDCOM_XREF_PTR(xref); \
- if (! xr->object) \
- xr->object = (Gedcom_ctxt) FUNC(xr->string); \
- if (xr->object) \
- return (Gedcom_ctxt) MAKE_GOM_CTXT(rec, STRUCTTYPE, xr->object); \
- else \
- return NULL; \
- }
-
-#define GET_REC_BY_XREF(STRUCTTYPE,XREF_TYPE,FUNC_NAME) \
- struct STRUCTTYPE *FUNC_NAME(char *xrefstr) \
- { \
- struct xref_value* xr = gedcom_get_by_xref(xrefstr); \
- if (xr && (xr->type == XREF_TYPE) && xr->object) \
- return (struct STRUCTTYPE*)(xr->object); \
- else \
- return NULL; \
- }
-
-#define STRING_CB(STRUCTTYPE,CB_NAME,FIELD) \
- Gedcom_ctxt CB_NAME(_ELT_PARAMS_) \
- { \
- Gom_ctxt result = NULL; \
- if (! parent) \
- NO_CONTEXT; \
- else { \
- struct STRUCTTYPE *obj \
- = SAFE_CTXT_CAST(STRUCTTYPE, (Gom_ctxt)parent); \
- if (obj) { \
- char *str = GEDCOM_STRING(parsed_value); \
- obj->FIELD = strdup(str); \
- if (! obj->FIELD) \
- MEMORY_ERROR; \
- else \
- result = MAKE_GOM_CTXT(elt, STRUCTTYPE, obj); \
- } \
- } \
- return (Gedcom_ctxt)result; \
- }
-
-#define DATE_CB(STRUCTTYPE,CB_NAME,FIELD) \
- Gedcom_ctxt CB_NAME(_ELT_PARAMS_) \
- { \
- Gom_ctxt result = NULL; \
- if (! parent) \
- NO_CONTEXT; \
- else { \
- struct STRUCTTYPE *obj \
- = SAFE_CTXT_CAST(STRUCTTYPE, (Gom_ctxt)parent); \
- if (obj) { \
- struct date_value dv = GEDCOM_DATE(parsed_value); \
- obj->FIELD = dup_date(dv); \
- if (! obj->FIELD) \
- MEMORY_ERROR; \
- else \
- result = MAKE_GOM_CTXT(elt, STRUCTTYPE, obj); \
- } \
- } \
- return (Gedcom_ctxt)result; \
- }
-
-#define AGE_CB(STRUCTTYPE,CB_NAME,FIELD) \
- Gedcom_ctxt CB_NAME(_ELT_PARAMS_) \
- { \
- Gom_ctxt result = NULL; \
- if (! parent) \
- NO_CONTEXT; \
- else { \
- struct STRUCTTYPE *obj \
- = SAFE_CTXT_CAST(STRUCTTYPE, (Gom_ctxt)parent); \
- if (obj) { \
- struct age_value age = GEDCOM_AGE(parsed_value); \
- obj->FIELD = dup_age(age); \
- if (! obj->FIELD) \
- MEMORY_ERROR; \
- else \
- result = MAKE_GOM_CTXT(elt, STRUCTTYPE, obj); \
- } \
- } \
- return (Gedcom_ctxt)result; \
- }
-
-#define XREF_CB(STRUCTTYPE,CB_NAME,FIELD,FUNC) \
- Gedcom_ctxt CB_NAME(_ELT_PARAMS_) \
- { \
- Gom_ctxt result = NULL; \
- if (! parent) \
- NO_CONTEXT; \
- else { \
- struct STRUCTTYPE *obj \
- = SAFE_CTXT_CAST(STRUCTTYPE, (Gom_ctxt)parent); \
- struct xref_value *xr = GEDCOM_XREF_PTR(parsed_value); \
- if (! xr->object) \
- xr->object = (Gedcom_ctxt) FUNC(xr->string); \
- if (obj) { \
- obj->FIELD = xr; \
- result = MAKE_GOM_CTXT(elt, STRUCTTYPE, obj); \
- } \
- } \
- return (Gedcom_ctxt)result; \
- }
-
-#define XREF_LIST_CB(STRUCTTYPE,CB_NAME,FIELD,FUNC) \
- Gedcom_ctxt CB_NAME(_ELT_PARAMS_) \
- { \
- Gom_ctxt result = NULL; \
- if (! parent) \
- NO_CONTEXT; \
- else { \
- struct STRUCTTYPE *obj \
- = SAFE_CTXT_CAST(STRUCTTYPE, (Gom_ctxt)parent); \
- struct xref_value *xr = GEDCOM_XREF_PTR(parsed_value); \
- struct xref_list *xrl; \
- if (! xr->object) \
- xr->object = (Gedcom_ctxt) FUNC(xr->string); \
- if (obj) { \
- MAKE_CHAIN_ELT(xref_list, obj->FIELD, xrl); \
- if (xrl) { \
- xrl->xref = xr; \
- result = MAKE_GOM_CTXT(elt, STRUCTTYPE, obj); \
- } \
- } \
- } \
- return (Gedcom_ctxt)result; \
- }
-
-#define NULL_CB(STRUCTTYPE,CB_NAME) \
- Gedcom_ctxt CB_NAME(_ELT_PARAMS_) \
- { \
- Gom_ctxt result = NULL; \
- if (! parent) \
- NO_CONTEXT; \
- else { \
- struct STRUCTTYPE *obj \
- = SAFE_CTXT_CAST(STRUCTTYPE, (Gom_ctxt)parent); \
- if (obj) \
- result = MAKE_GOM_CTXT(elt, STRUCTTYPE, obj); \
- } \
- return (Gedcom_ctxt)result; \
- }