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