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