6482c97edfe337a568e4b7c6143949c492faa431
[gedcom-parse.git] / include / gedcom.h.in
1 /* External header for the Gedcom parser library.
2    Copyright (C) 2001,2002 The Genes Development Team
3    This file is part of the Gedcom parser library.
4    Contributed by Peter Verthez <Peter.Verthez@advalvas.be>, 2001.
5
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.
10
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.
15
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
19    02111-1307 USA.  */
20
21 /* $Id$ */
22 /* $Name$ */
23
24 #ifndef __GEDCOM_H
25 #define __GEDCOM_H
26
27 #include <stdio.h>
28 #include <stdarg.h>
29
30 __BEGIN_DECLS
31
32 #ifndef GEDCOM_INTERNAL
33 #include <gedcom-tags.h>
34 #endif
35
36 #define GEDCOM_PARSE_VERSION_MAJOR @VERSION_MAJOR@
37 #define GEDCOM_PARSE_VERSION_MINOR @VERSION_MINOR@
38 #define GEDCOM_PARSE_VERSION \
39   (GEDCOM_PARSE_VERSION_MAJOR * 1000 + GEDCOM_PARSE_VERSION_MINOR)
40
41 /**************************************************************************/
42 /***  First the records and elements to subscribe upon                  ***/
43 /**************************************************************************/
44                                                                            
45 typedef enum _REC {
46   REC_HEAD,
47   REC_FAM,
48   REC_INDI,
49   REC_OBJE,
50   REC_NOTE,
51   REC_REPO,
52   REC_SOUR,
53   REC_SUBN,
54   REC_SUBM,
55   REC_USER,
56   NR_OF_RECS     /* Just a final value to be used in array boundaries */
57 } Gedcom_rec;
58
59 typedef enum _ELT {
60   ELT_HEAD_SOUR = NR_OF_RECS + 1,
61   ELT_HEAD_SOUR_VERS,
62   ELT_HEAD_SOUR_NAME,
63   ELT_HEAD_SOUR_CORP,
64   ELT_HEAD_SOUR_DATA,
65   ELT_HEAD_SOUR_DATA_DATE,
66   ELT_HEAD_SOUR_DATA_COPR,
67   ELT_HEAD_DEST,
68   ELT_HEAD_DATE,
69   ELT_HEAD_DATE_TIME,
70   ELT_HEAD_SUBM,
71   ELT_HEAD_SUBN,
72   ELT_HEAD_FILE,
73   ELT_HEAD_COPR,
74   ELT_HEAD_GEDC,
75   ELT_HEAD_GEDC_VERS,
76   ELT_HEAD_GEDC_FORM,
77   ELT_HEAD_CHAR,
78   ELT_HEAD_CHAR_VERS,
79   ELT_HEAD_LANG,
80   ELT_HEAD_PLAC,
81   ELT_HEAD_PLAC_FORM,
82   ELT_HEAD_NOTE,
83   
84   ELT_FAM_HUSB,
85   ELT_FAM_WIFE,
86   ELT_FAM_CHIL,
87   ELT_FAM_NCHI,
88   ELT_FAM_SUBM,
89   
90   ELT_INDI_RESN,
91   ELT_INDI_SEX,
92   ELT_INDI_SUBM,
93   ELT_INDI_ALIA,
94   ELT_INDI_ANCI,
95   ELT_INDI_DESI,
96   ELT_INDI_RFN,
97   ELT_INDI_AFN,
98   
99   ELT_OBJE_FORM,
100   ELT_OBJE_TITL,
101   ELT_OBJE_BLOB,
102   ELT_OBJE_BLOB_CONT,
103   ELT_OBJE_OBJE,
104   
105   ELT_REPO_NAME,
106
107   ELT_SOUR_DATA,
108   ELT_SOUR_DATA_EVEN,
109   ELT_SOUR_DATA_EVEN_DATE,
110   ELT_SOUR_DATA_EVEN_PLAC,
111   ELT_SOUR_DATA_AGNC,
112   ELT_SOUR_AUTH,
113   ELT_SOUR_TITL,
114   ELT_SOUR_ABBR,
115   ELT_SOUR_PUBL,
116   ELT_SOUR_TEXT,
117
118   ELT_SUBN_SUBM,
119   ELT_SUBN_FAMF,
120   ELT_SUBN_TEMP,
121   ELT_SUBN_ANCE,
122   ELT_SUBN_DESC,
123   ELT_SUBN_ORDI,
124   ELT_SUBN_RIN,
125
126   ELT_SUBM_NAME,
127   ELT_SUBM_LANG,
128   ELT_SUBM_RFN,
129   ELT_SUBM_RIN,
130
131   ELT_SUB_ADDR,
132   ELT_SUB_ADDR_CONT,
133   ELT_SUB_ADDR_ADR1,
134   ELT_SUB_ADDR_ADR2,
135   ELT_SUB_ADDR_CITY,
136   ELT_SUB_ADDR_STAE,
137   ELT_SUB_ADDR_POST,
138   ELT_SUB_ADDR_CTRY,
139   
140   ELT_SUB_PHON,
141
142   ELT_SUB_ASSO,
143   ELT_SUB_ASSO_TYPE,
144   ELT_SUB_ASSO_RELA,
145
146   ELT_SUB_CHAN,
147   ELT_SUB_CHAN_DATE,
148   ELT_SUB_CHAN_TIME,
149
150   ELT_SUB_FAMC,
151   ELT_SUB_FAMC_PEDI,
152
153   ELT_SUB_CONT,
154   ELT_SUB_CONC,
155
156   ELT_SUB_EVT_TYPE,
157   ELT_SUB_EVT_DATE,
158   ELT_SUB_EVT_AGE,
159   ELT_SUB_EVT_AGNC,
160   ELT_SUB_EVT_CAUS,
161
162   ELT_SUB_FAM_EVT,
163   ELT_SUB_FAM_EVT_HUSB,
164   ELT_SUB_FAM_EVT_WIFE,
165   ELT_SUB_FAM_EVT_AGE,
166   ELT_SUB_FAM_EVT_EVEN,
167
168   ELT_SUB_IDENT_REFN,
169   ELT_SUB_IDENT_REFN_TYPE,
170   ELT_SUB_IDENT_RIN,
171
172   ELT_SUB_INDIV_ATTR,
173   ELT_SUB_INDIV_RESI,
174   ELT_SUB_INDIV_BIRT,
175   ELT_SUB_INDIV_BIRT_FAMC,
176   ELT_SUB_INDIV_GEN,
177   ELT_SUB_INDIV_ADOP,
178   ELT_SUB_INDIV_ADOP_FAMC,
179   ELT_SUB_INDIV_ADOP_FAMC_ADOP,
180   ELT_SUB_INDIV_EVEN,
181
182   ELT_SUB_LIO_BAPL,
183   ELT_SUB_LIO_BAPL_STAT,
184   ELT_SUB_LIO_BAPL_DATE,
185   ELT_SUB_LIO_BAPL_TEMP,
186   ELT_SUB_LIO_BAPL_PLAC,
187   ELT_SUB_LIO_SLGC,
188   ELT_SUB_LIO_SLGC_FAMC,
189
190   ELT_SUB_LSS_SLGS,
191   ELT_SUB_LSS_SLGS_STAT,
192   ELT_SUB_LSS_SLGS_DATE,
193   ELT_SUB_LSS_SLGS_TEMP,
194   ELT_SUB_LSS_SLGS_PLAC,
195
196   ELT_SUB_MULTIM_OBJE,
197   ELT_SUB_MULTIM_OBJE_FORM,
198   ELT_SUB_MULTIM_OBJE_TITL,
199   ELT_SUB_MULTIM_OBJE_FILE,
200
201   ELT_SUB_NOTE,
202
203   ELT_SUB_PERS_NAME,
204   ELT_SUB_PERS_NAME_NPFX,
205   ELT_SUB_PERS_NAME_GIVN,
206   ELT_SUB_PERS_NAME_NICK,
207   ELT_SUB_PERS_NAME_SPFX,
208   ELT_SUB_PERS_NAME_SURN,
209   ELT_SUB_PERS_NAME_NSFX,
210
211   ELT_SUB_PLAC,
212   ELT_SUB_PLAC_FORM,
213
214   ELT_SUB_SOUR,
215   ELT_SUB_SOUR_PAGE,
216   ELT_SUB_SOUR_EVEN,
217   ELT_SUB_SOUR_EVEN_ROLE,
218   ELT_SUB_SOUR_DATA,
219   ELT_SUB_SOUR_DATA_DATE,
220   ELT_SUB_SOUR_TEXT,
221   ELT_SUB_SOUR_QUAY,
222
223   ELT_SUB_REPO,
224   ELT_SUB_REPO_CALN,
225   ELT_SUB_REPO_CALN_MEDI,
226
227   ELT_SUB_FAMS,
228   
229   ELT_USER,
230   
231   NR_OF_ELTS     /* Just a final value to be used in array boundaries */
232 } Gedcom_elt;
233
234 /**************************************************************************/
235 /***  Definition of some auxiliary types                                ***/
236 /**************************************************************************/
237                                                                            
238 typedef enum _MECH {
239   IMMED_FAIL,
240   DEFER_FAIL,
241   IGNORE_ERRORS
242 } Gedcom_err_mech;
243
244 typedef enum _MSG {
245   ERROR,
246   WARNING,
247   MESSAGE
248 } Gedcom_msg_type;
249
250 typedef enum _DATE_TYPE {
251   DATE_UNRECOGNIZED,   /* Neither jday1 as jday2 are significant */
252   DATE_EXACT,          /* Only jday1 is significant */
253   DATE_BOUNDED         /* Both jday1 and jday2 are significant */
254 } Date_type;
255
256 typedef enum _CALENDAR_TYPE {
257   CAL_GREGORIAN,
258   CAL_JULIAN,
259   CAL_HEBREW,
260   CAL_FRENCH_REV,
261   CAL_UNKNOWN
262 } Calendar_type;
263
264 typedef enum _YEAR_TYPE {
265   YEAR_SINGLE,
266   YEAR_DOUBLE     /* In this case, the 'year' indicates the last value */
267 } Year_type;
268
269 typedef enum _DATE_VAL_MOD {
270   /* Simple date */
271   DV_NO_MODIFIER,
272   /* Range values */
273   DV_BEFORE,
274   DV_AFTER,
275   DV_BETWEEN,       /* Two dates are given */
276   /* Period values */
277   DV_FROM,
278   DV_TO,
279   DV_FROM_TO,       /* Two dates are given */
280   /* Approx values */
281   DV_ABOUT,
282   DV_CALCULATED,
283   DV_ESTIMATED,
284   /* Other */
285   DV_INTERPRETED,   /* One date and a phrase is given */
286   DV_PHRASE         /* Only phrase is given */
287 } Date_value_type;
288
289 /* All Unicode characters between U+0000 and U+FFFF can be encoded in
290    UTF-8 with 3 or less bytes */
291 #define UTF_FACTOR 3
292
293 #define MAX_DAY_LEN    2
294 #define MAX_MONTH_LEN  4
295 #define MAX_YEAR_LEN   7
296 #define MAX_PHRASE_LEN 35 * UTF_FACTOR
297
298 struct date {
299   Calendar_type cal;
300   char day_str[MAX_DAY_LEN + 1];
301   char month_str[MAX_MONTH_LEN + 1];
302   char year_str[MAX_YEAR_LEN + 1];
303   int day;    /* starts at 1 */
304   int month;  /* starts at 1 */
305   int year;   /* the highest value for double years */
306   Year_type year_type;
307   Date_type type;
308   long int sdn1;
309   long int sdn2;
310 };
311
312 struct date_value {
313   Date_value_type type;
314   struct date date1;
315   struct date date2;
316   char phrase[MAX_PHRASE_LEN + 1];
317 };
318
319 /* Type for context handling, meant to be opaque */
320 typedef void* Gedcom_ctxt;
321
322 typedef enum _XREF_TYPE {
323   XREF_NONE,
324   XREF_FAM,
325   XREF_INDI,
326   XREF_NOTE,
327   XREF_OBJE,
328   XREF_REPO,
329   XREF_SOUR,
330   XREF_SUBM,
331   XREF_SUBN,
332   XREF_USER,
333   XREF_ANY
334 } Xref_type;
335
336 struct xref_value {
337   Xref_type type;
338   char *string;
339   Gedcom_ctxt object;
340 };
341
342 typedef enum _AGE_TYPE {
343   AGE_UNRECOGNIZED,
344   AGE_CHILD,
345   AGE_INFANT,
346   AGE_STILLBORN,
347   AGE_NUMERIC
348 } Age_type;
349
350 typedef enum _AGE_MODIFIER {
351   AGE_NO_MODIFIER,
352   AGE_LESS_THAN,
353   AGE_GREATER_THAN
354 } Age_modifier;
355
356 struct age_value {
357   Age_type type;
358   Age_modifier mod;
359   int years;
360   int months;
361   int days;
362   char phrase[MAX_PHRASE_LEN + 1];
363 };
364
365 /**************************************************************************/
366 /***  Things meant to be internal, susceptible to changes               ***/
367 /***  Use the GEDCOM_STRING/GEDCOM_DATE interface instead of relying    ***/
368 /***  on this !!                                                        ***/
369 /**************************************************************************/
370                                                                            
371 typedef enum _GEDCOM_VAL_TYPE {
372   GV_NULL,
373   GV_CHAR_PTR,
374   GV_DATE_VALUE,
375   GV_AGE_VALUE,
376   GV_XREF_PTR
377 } Gedcom_val_type;
378
379 union _Gedcom_val_union {
380   char* string_val;
381   struct date_value date_val;
382   struct age_value age_val;
383   struct xref_value *xref_val;
384 };
385
386 typedef struct _Gedcom_val_struct {
387   Gedcom_val_type type;
388   union _Gedcom_val_union value;
389 } Gedcom_val_struct;
390
391 void gedcom_cast_error(const char* file, int line,
392                        Gedcom_val_type tried_type,
393                        Gedcom_val_type real_type);
394
395 extern struct date_value def_date_val;
396 extern struct age_value  def_age_val;
397 extern struct xref_value def_xref_val;
398
399 #define GV_CHECK_CAST(VAL, TYPE, MEMBER, DEFVAL)                              \
400    ((VAL->type == TYPE) ?                                                     \
401     VAL->value.MEMBER :                                                       \
402     (gedcom_cast_error(__FILE__,__LINE__, TYPE, VAL->type), DEFVAL))
403
404 #define GV_IS_TYPE(VAL, TYPE)                                                 \
405    (VAL->type == TYPE)
406
407 /**************************************************************************/
408 /***  Function interface                                                ***/
409 /**************************************************************************/
410
411 /* Type for parsed values, meant to be opaque */
412 typedef Gedcom_val_struct* Gedcom_val;
413
414 /* Check to determine whether there is a parsed value or not */
415 #define GEDCOM_IS_NULL(VAL) \
416    GV_IS_TYPE(VAL, GV_NULL)
417
418 /* This returns the char* from a Gedcom_val, if appropriate */
419 /* It gives a gedcom_warning if the cast is not correct     */
420 #define GEDCOM_STRING(VAL) \
421    GV_CHECK_CAST(VAL, GV_CHAR_PTR, string_val, "<error>")
422 #define GEDCOM_IS_STRING(VAL) \
423    GV_IS_TYPE(VAL, GV_CHAR_PTR)
424
425 /* This returns the struct date_value from a Gedcom_val, if appropriate */
426 /* It gives a gedcom_warning if the cast is not correct                 */
427 #define GEDCOM_DATE(VAL) \
428    GV_CHECK_CAST(VAL, GV_DATE_VALUE, date_val, def_date_val)
429 #define GEDCOM_IS_DATE(VAL) \
430    GV_IS_TYPE(VAL, GV_DATE_VALUE)
431
432 /* This returns the struct age_value from a Gedcom_val, if appropriate  */
433 /* It gives a gedcom_warning if the cast is not correct                 */
434 #define GEDCOM_AGE(VAL) \
435    GV_CHECK_CAST(VAL, GV_AGE_VALUE, age_val, def_age_val)
436 #define GEDCOM_IS_AGE(VAL) \
437    GV_IS_TYPE(VAL, GV_AGE_VALUE)
438
439 /* This returns the (struct xref_value *) from a Gedcom_val, if appropriate */
440 /* It gives a gedcom_warning if the cast is not correct                     */
441 #define GEDCOM_XREF_PTR(VAL) \
442    GV_CHECK_CAST(VAL, GV_XREF_PTR, xref_val, &def_xref_val)
443 #define GEDCOM_IS_XREF_PTR(VAL) \
444    GV_IS_TYPE(VAL, GV_XREF_PTR)
445
446 typedef void
447         (*Gedcom_msg_handler)
448         (Gedcom_msg_type type, char *msg);
449
450 typedef Gedcom_ctxt
451         (*Gedcom_rec_start_cb)
452         (Gedcom_rec rec, int level, Gedcom_val xref, char *tag,
453          char *raw_value, int tag_value, Gedcom_val parsed_value);
454 typedef void
455         (*Gedcom_rec_end_cb)
456         (Gedcom_rec rec, Gedcom_ctxt self);
457
458 typedef Gedcom_ctxt
459         (*Gedcom_elt_start_cb)
460         (Gedcom_elt elt, Gedcom_ctxt parent,
461          int level, char *tag, char *raw_value,
462          int tag_value, Gedcom_val parsed_value);
463 typedef void
464         (*Gedcom_elt_end_cb)
465         (Gedcom_elt elt, Gedcom_ctxt parent, Gedcom_ctxt self,
466          Gedcom_val parsed_value);
467
468 typedef void
469         (*Gedcom_def_cb)
470         (Gedcom_elt elt, Gedcom_ctxt parent, int level, char *tag,
471          char *raw_value, int tag_value);
472
473 void    gedcom_init();
474 int     gedcom_parse_file(const char* file_name);
475 int     gedcom_new_model();
476 void    gedcom_set_debug_level(int level, FILE* trace_output);
477 void    gedcom_set_error_handling(Gedcom_err_mech mechanism);
478 void    gedcom_set_compat_handling(int enable_compat);
479 void    gedcom_set_message_handler(Gedcom_msg_handler func);
480 void    gedcom_set_default_callback(Gedcom_def_cb func);
481
482 void    gedcom_subscribe_to_record(Gedcom_rec rec,
483                                    Gedcom_rec_start_cb cb_start,
484                                    Gedcom_rec_end_cb cb_end);
485 void    gedcom_subscribe_to_element(Gedcom_elt elt,
486                                     Gedcom_elt_start_cb cb_start,
487                                     Gedcom_elt_end_cb cb_end);
488
489 /* Separate value parsing functions */
490 struct date_value gedcom_parse_date(const char* line_value);
491 struct age_value  gedcom_parse_age(const char* line_value);
492
493 /* Handling cross-references */
494 struct xref_value *gedcom_get_by_xref(const char *key);
495 struct xref_value *gedcom_add_xref(Xref_type type, const char* xrefstr,
496                                    Gedcom_ctxt object);
497 struct xref_value *gedcom_link_xref(Xref_type type, const char* xrefstr);
498 struct xref_value *gedcom_unlink_xref(Xref_type type, const char* xrefstr);
499 int                gedcom_delete_xref(const char* xrefstr);
500
501 /* For use in gom */
502 int        gedcom_error(const char* s, ...);
503 int        gedcom_warning(const char* s, ...);
504 int        gedcom_message(const char* s, ...);
505 int        gedcom_debug_print(const char* s, ...);
506
507 __END_DECLS
508
509 #endif /* __GEDCOM_H */