1 /* General header for the Gedcom object model.
2 Copyright (C) 2002 The Genes Development Team
3 This file is part of the Gedcom parser library.
4 Contributed by Peter Verthez <Peter.Verthez@advalvas.be>, 2002.
6 The Gedcom parser library is free software; you can redistribute it
7 and/or modify it under the terms of the GNU Lesser General Public
8 License as published by the Free Software Foundation; either
9 version 2.1 of the License, or (at your option) any later version.
11 The Gedcom parser library is distributed in the hope that it will be
12 useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Lesser General Public License for more details.
16 You should have received a copy of the GNU Lesser General Public
17 License along with the Gedcom parser library; if not, write to the
18 Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
24 #ifndef __GOM_INTERNAL_H
25 #define __GOM_INTERNAL_H
36 #define _(string) gettext(string)
37 #define N_(string) (string)
39 #define UNUSED __attribute__((unused))
44 T_header, T_submission, T_submitter, T_family, T_individual,
45 T_multimedia, T_note, T_repository, T_source, T_user_rec,
47 T_address, T_event, T_place, T_source_citation, T_text,
48 T_note_sub, T_multimedia_link, T_lds_event, T_user_ref_number,
49 T_change_date, T_personal_name, T_family_link, T_pedigree,
50 T_association, T_source_event, T_source_description
53 /* Assumptions for context:
54 - In case of error, NULL is passed as context
55 - If not NULL, the ctxt_ptr of the context is not NULL also
56 - UNEXPECTED_CONTEXT is not treated as an error, but as a warning
59 struct Gom_ctxt_struct {
65 typedef struct Gom_ctxt_struct *Gom_ctxt;
67 Gom_ctxt make_gom_ctxt(int ctxt_type, OBJ_TYPE obj_type, void *ctxt_ptr);
68 void destroy_gom_ctxt(Gom_ctxt ctxt);
69 void gom_cast_error(const char* file, int line,
70 OBJ_TYPE expected, OBJ_TYPE found);
71 void gom_no_context(const char* file, int line);
72 void gom_unexpected_context(const char* file, int line, OBJ_TYPE found);
74 #define MAKE_GOM_CTXT(CTXT_TYPE, STRUCTTYPE, CTXT_PTR) \
75 make_gom_ctxt(CTXT_TYPE, T_ ## STRUCTTYPE, CTXT_PTR)
77 #define SAFE_CTXT_CAST(STRUCTTYPE, VAL) \
78 (((VAL)->obj_type == T_ ## STRUCTTYPE) ? \
80 (gom_cast_error(__FILE__, __LINE__, T_ ## STRUCTTYPE, (VAL)->obj_type), \
83 #define SAFE_FREE(PTR) \
89 #define UNEXPECTED_CONTEXT(CTXT_TYPE) \
90 gom_unexpected_context(__FILE__, __LINE__, CTXT_TYPE)
93 gom_no_context(__FILE__, __LINE__)
95 void gom_mem_error(const char *filename, int line);
97 #define MEMORY_ERROR gom_mem_error(__FILE__, __LINE__)
99 void def_rec_end(Gedcom_rec rec, Gedcom_ctxt self);
100 void def_elt_end(Gedcom_elt elt, Gedcom_ctxt parent,
101 Gedcom_ctxt self, Gedcom_val parsed_value);
102 void set_xref_type(struct xref_value *xr, const char* str);
109 char* concat_strings(NL_TYPE type, char *str1, const char *str2);
110 struct date_value* dup_date(struct date_value dv);
111 struct age_value* dup_age(struct age_value age);
113 /* Doubly-linked list, but last rec->next is NULL (doesn't go to first rec) */
114 #define LINK_CHAIN_ELT(STRUCTTYPE, FIRSTVAL, VAL) \
116 struct STRUCTTYPE *_local_obj = VAL; \
119 VAL->previous = _local_obj; \
124 FIRSTVAL->previous->next = VAL; \
125 VAL->previous = FIRSTVAL->previous; \
126 FIRSTVAL->previous = VAL; \
130 #define MAKE_CHAIN_ELT(STRUCTTYPE, FIRSTVAL, VAL) \
132 VAL = (struct STRUCTTYPE*) malloc(sizeof(struct STRUCTTYPE)); \
136 memset (VAL, 0, sizeof(struct STRUCTTYPE)); \
137 LINK_CHAIN_ELT(STRUCTTYPE, FIRSTVAL, VAL) \
141 void NULL_DESTROY(void* anything);
143 #define DESTROY_CHAIN_ELTS(STRUCTTYPE, FIRSTVAL, DESTROYFUNC) \
146 struct STRUCTTYPE *runner, *next; \
149 next = runner->next; \
150 DESTROYFUNC(runner); \
157 #define _REC_PARAMS_ Gedcom_rec rec UNUSED, int level UNUSED, \
158 Gedcom_val xref UNUSED, char *tag UNUSED, \
159 char *raw_value UNUSED, int parsed_tag UNUSED, \
160 Gedcom_val parsed_value UNUSED
162 #define _ELT_PARAMS_ Gedcom_elt elt UNUSED, Gedcom_ctxt parent UNUSED, \
163 int level UNUSED, char *tag UNUSED, \
164 char *raw_value UNUSED, int parsed_tag UNUSED, \
165 Gedcom_val parsed_value UNUSED
167 #define REC_CB(STRUCTTYPE,CB_NAME,FUNC) \
168 Gedcom_ctxt CB_NAME(_REC_PARAMS_) \
170 struct xref_value* xr = GEDCOM_XREF_PTR(xref); \
172 xr->object = (Gedcom_ctxt) FUNC(xr->string); \
174 return (Gedcom_ctxt) MAKE_GOM_CTXT(rec, STRUCTTYPE, xr->object); \
179 #define GET_REC_BY_XREF(STRUCTTYPE,XREF_TYPE,FUNC_NAME) \
180 struct STRUCTTYPE *FUNC_NAME(const char *xrefstr) \
182 struct xref_value* xr = gedcom_get_by_xref(xrefstr); \
183 if (xr && (xr->type == XREF_TYPE) && xr->object) \
184 return (struct STRUCTTYPE*)(xr->object); \
189 #define STRING_CB(STRUCTTYPE,CB_NAME,FIELD) \
190 Gedcom_ctxt CB_NAME(_ELT_PARAMS_) \
192 Gom_ctxt result = NULL; \
196 struct STRUCTTYPE *obj \
197 = SAFE_CTXT_CAST(STRUCTTYPE, (Gom_ctxt)parent); \
199 char *str = GEDCOM_STRING(parsed_value); \
200 obj->FIELD = strdup(str); \
204 result = MAKE_GOM_CTXT(elt, STRUCTTYPE, obj); \
207 return (Gedcom_ctxt)result; \
210 #define DATE_CB(STRUCTTYPE,CB_NAME,FIELD) \
211 Gedcom_ctxt CB_NAME(_ELT_PARAMS_) \
213 Gom_ctxt result = NULL; \
217 struct STRUCTTYPE *obj \
218 = SAFE_CTXT_CAST(STRUCTTYPE, (Gom_ctxt)parent); \
220 struct date_value dv = GEDCOM_DATE(parsed_value); \
221 obj->FIELD = dup_date(dv); \
225 result = MAKE_GOM_CTXT(elt, STRUCTTYPE, obj); \
228 return (Gedcom_ctxt)result; \
231 #define AGE_CB(STRUCTTYPE,CB_NAME,FIELD) \
232 Gedcom_ctxt CB_NAME(_ELT_PARAMS_) \
234 Gom_ctxt result = NULL; \
238 struct STRUCTTYPE *obj \
239 = SAFE_CTXT_CAST(STRUCTTYPE, (Gom_ctxt)parent); \
241 struct age_value age = GEDCOM_AGE(parsed_value); \
242 obj->FIELD = dup_age(age); \
246 result = MAKE_GOM_CTXT(elt, STRUCTTYPE, obj); \
249 return (Gedcom_ctxt)result; \
252 #define XREF_CB(STRUCTTYPE,CB_NAME,FIELD,FUNC) \
253 Gedcom_ctxt CB_NAME(_ELT_PARAMS_) \
255 Gom_ctxt result = NULL; \
259 struct STRUCTTYPE *obj \
260 = SAFE_CTXT_CAST(STRUCTTYPE, (Gom_ctxt)parent); \
261 struct xref_value *xr = GEDCOM_XREF_PTR(parsed_value); \
263 xr->object = (Gedcom_ctxt) FUNC(xr->string); \
266 result = MAKE_GOM_CTXT(elt, STRUCTTYPE, obj); \
269 return (Gedcom_ctxt)result; \
272 #define XREF_LIST_CB(STRUCTTYPE,CB_NAME,FIELD,FUNC) \
273 Gedcom_ctxt CB_NAME(_ELT_PARAMS_) \
275 Gom_ctxt result = NULL; \
279 struct STRUCTTYPE *obj \
280 = SAFE_CTXT_CAST(STRUCTTYPE, (Gom_ctxt)parent); \
281 struct xref_value *xr = GEDCOM_XREF_PTR(parsed_value); \
282 struct xref_list *xrl; \
284 xr->object = (Gedcom_ctxt) FUNC(xr->string); \
286 MAKE_CHAIN_ELT(xref_list, obj->FIELD, xrl); \
289 result = MAKE_GOM_CTXT(elt, STRUCTTYPE, obj); \
293 return (Gedcom_ctxt)result; \
296 #define NULL_CB(STRUCTTYPE,CB_NAME) \
297 Gedcom_ctxt CB_NAME(_ELT_PARAMS_) \
299 Gom_ctxt result = NULL; \
303 struct STRUCTTYPE *obj \
304 = SAFE_CTXT_CAST(STRUCTTYPE, (Gom_ctxt)parent); \
306 result = MAKE_GOM_CTXT(elt, STRUCTTYPE, obj); \
308 return (Gedcom_ctxt)result; \
311 #endif /* __GOM_INTERNAL_H */