1 /* External header for the Gedcom parser library.
2 Copyright (C) 2001 The Genes Development Team
3 This file is part of the Gedcom parser library.
4 Contributed by Peter Verthez <Peter.Verthez@advalvas.be>, 2001.
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
31 /**************************************************************************/
32 /*** First the records and elements to subscribe upon ***/
33 /**************************************************************************/
46 NR_OF_RECS /* Just a final value to be used in array boundaries */
55 ELT_HEAD_SOUR_DATA_DATE,
56 ELT_HEAD_SOUR_DATA_COPR,
99 ELT_SOUR_DATA_EVEN_DATE,
100 ELT_SOUR_DATA_EVEN_PLAC,
153 ELT_SUB_FAM_EVT_HUSB,
154 ELT_SUB_FAM_EVT_WIFE,
156 ELT_SUB_FAM_EVT_EVEN,
159 ELT_SUB_IDENT_REFN_TYPE,
165 ELT_SUB_INDIV_BIRT_FAMC,
168 ELT_SUB_INDIV_ADOP_FAMC,
169 ELT_SUB_INDIV_ADOP_FAMC_ADOP,
173 ELT_SUB_LIO_BAPL_STAT,
174 ELT_SUB_LIO_BAPL_DATE,
175 ELT_SUB_LIO_BAPL_TEMP,
176 ELT_SUB_LIO_BAPL_PLAC,
178 ELT_SUB_LIO_SLGC_FAMC,
181 ELT_SUB_LSS_SLGS_STAT,
182 ELT_SUB_LSS_SLGS_DATE,
183 ELT_SUB_LSS_SLGS_TEMP,
184 ELT_SUB_LSS_SLGS_PLAC,
187 ELT_SUB_MULTIM_OBJE_FORM,
188 ELT_SUB_MULTIM_OBJE_TITL,
189 ELT_SUB_MULTIM_OBJE_FILE,
194 ELT_SUB_PERS_NAME_NPFX,
195 ELT_SUB_PERS_NAME_GIVN,
196 ELT_SUB_PERS_NAME_NICK,
197 ELT_SUB_PERS_NAME_SPFX,
198 ELT_SUB_PERS_NAME_SURN,
199 ELT_SUB_PERS_NAME_NSFX,
207 ELT_SUB_SOUR_EVEN_ROLE,
209 ELT_SUB_SOUR_DATA_DATE,
215 ELT_SUB_REPO_CALN_MEDI,
221 NR_OF_ELTS /* Just a final value to be used in array boundaries */
224 /**************************************************************************/
225 /*** Definition of some auxiliary types ***/
226 /**************************************************************************/
240 typedef enum _DATE_TYPE {
241 DATE_UNRECOGNIZED, /* Neither jday1 as jday2 are significant */
242 DATE_EXACT, /* Only jday1 is significant */
243 DATE_BOUNDED /* Both jday1 and jday2 are significant */
246 typedef enum _CALENDAR_TYPE {
254 typedef enum _YEAR_TYPE {
256 YEAR_DOUBLE /* In this case, the 'year' indicates the last value */
259 typedef enum _DATE_VAL_MOD {
265 DV_BETWEEN, /* Two dates are given */
269 DV_FROM_TO, /* Two dates are given */
275 DV_INTERPRETED, /* One date and a phrase is given */
276 DV_PHRASE /* Only phrase is given */
279 #define MAX_DAY_LEN 2
280 #define MAX_MONTH_LEN 4
281 #define MAX_YEAR_LEN 7
282 #define MAX_PHRASE_LEN 35
286 char day_str[MAX_DAY_LEN + 1];
287 char month_str[MAX_MONTH_LEN + 1];
288 char year_str[MAX_YEAR_LEN + 1];
289 int day; /* starts at 1 */
290 int month; /* starts at 1 */
291 int year; /* the highest value for double years */
299 Date_value_type type;
302 char phrase[MAX_PHRASE_LEN + 1];
305 /**************************************************************************/
306 /*** Things meant to be internal, susceptible to changes ***/
307 /*** Use the GEDCOM_STRING/GEDCOM_DATE interface instead of relying ***/
309 /**************************************************************************/
311 typedef enum _GEDCOM_VAL_TYPE {
317 union _Gedcom_val_union {
319 struct date_value date_val;
322 typedef struct _Gedcom_val_struct {
323 Gedcom_val_type type;
324 union _Gedcom_val_union value;
327 void gedcom_cast_error(char* file, int line,
328 Gedcom_val_type tried_type,
329 Gedcom_val_type real_type);
330 extern struct date_value def_date_val;
332 #define GV_CHECK_CAST(VAL, TYPE, MEMBER, DEFVAL) \
333 ((VAL->type == TYPE) ? \
334 VAL->value.MEMBER : \
335 (gedcom_cast_error(__FILE__,__LINE__, TYPE, VAL->type), DEFVAL))
337 #define GV_IS_TYPE(VAL, TYPE) \
340 /**************************************************************************/
341 /*** Function interface ***/
342 /**************************************************************************/
344 /* Type for context handling, meant to be opaque */
345 typedef void* Gedcom_ctxt;
347 /* Type for parsed values, meant to be opaque */
348 typedef Gedcom_val_struct* Gedcom_val;
350 /* Check to determine whether there is a parsed value or not */
351 #define GEDCOM_IS_NULL(VAL) \
352 GV_IS_TYPE(VAL, GV_NULL)
354 /* This returns the char* from a Gedcom_val, if appropriate */
355 /* It gives a gedcom_warning if the cast is not correct */
356 #define GEDCOM_STRING(VAL) \
357 GV_CHECK_CAST(VAL, GV_CHAR_PTR, string_val, "")
358 #define GEDCOM_IS_STRING(VAL) \
359 GV_IS_TYPE(VAL, GV_CHAR_PTR)
361 /* This returns the struct date_value from a Gedcom_val, if appropriate */
362 /* It gives a gedcom_warning if the cast is not correct */
363 #define GEDCOM_DATE(VAL) \
364 GV_CHECK_CAST(VAL, GV_DATE_VALUE, date_val, def_date_val)
365 #define GEDCOM_IS_DATE(VAL) \
366 GV_IS_TYPE(VAL, GV_DATE_VALUE)
369 (*Gedcom_msg_handler)
370 (Gedcom_msg_type type, char *msg);
373 (*Gedcom_rec_start_cb)
374 (int level, char *xref, char *tag);
380 (*Gedcom_elt_start_cb)
382 int level, char *tag, char *raw_value, Gedcom_val parsed_value);
385 (Gedcom_ctxt parent, Gedcom_ctxt self, Gedcom_val parsed_value);
389 (Gedcom_ctxt parent, int level, char *tag, char *raw_value);
391 int gedcom_parse_file(char* file_name);
392 void gedcom_set_debug_level(int level, FILE* trace_output);
393 void gedcom_set_error_handling(Gedcom_err_mech mechanism);
394 void gedcom_set_compat_handling(int enable_compat);
395 void gedcom_set_message_handler(Gedcom_msg_handler func);
396 void gedcom_set_default_callback(Gedcom_def_cb func);
398 void gedcom_subscribe_to_record(Gedcom_rec rec,
399 Gedcom_rec_start_cb cb_start,
400 Gedcom_rec_end_cb cb_end);
401 void gedcom_subscribe_to_element(Gedcom_elt elt,
402 Gedcom_elt_start_cb cb_start,
403 Gedcom_elt_end_cb cb_end);
405 /* Separate value parsing functions */
406 struct date_value gedcom_parse_date(char* line_value);
410 #endif /* __GEDCOM_H */