Add a function to retrieve an xref by its key.
[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_ANY
333 } Xref_type;
334
335 struct xref_value {
336   Xref_type type;
337   char *string;
338   Gedcom_ctxt object;
339 };
340
341 typedef enum _AGE_TYPE {
342   AGE_UNRECOGNIZED,
343   AGE_CHILD,
344   AGE_INFANT,
345   AGE_STILLBORN,
346   AGE_NUMERIC
347 } Age_type;
348
349 typedef enum _AGE_MODIFIER {
350   AGE_NO_MODIFIER,
351   AGE_LESS_THAN,
352   AGE_GREATER_THAN
353 } Age_modifier;
354
355 struct age_value {
356   Age_type type;
357   Age_modifier mod;
358   int years;
359   int months;
360   int days;
361   char phrase[MAX_PHRASE_LEN + 1];
362 };
363
364 /**************************************************************************/
365 /***  Things meant to be internal, susceptible to changes               ***/
366 /***  Use the GEDCOM_STRING/GEDCOM_DATE interface instead of relying    ***/
367 /***  on this !!                                                        ***/
368 /**************************************************************************/
369                                                                            
370 typedef enum _GEDCOM_VAL_TYPE {
371   GV_NULL,
372   GV_CHAR_PTR,
373   GV_DATE_VALUE,
374   GV_AGE_VALUE,
375   GV_XREF_PTR
376 } Gedcom_val_type;
377
378 union _Gedcom_val_union {
379   char* string_val;
380   struct date_value date_val;
381   struct age_value age_val;
382   struct xref_value *xref_val;
383 };
384
385 typedef struct _Gedcom_val_struct {
386   Gedcom_val_type type;
387   union _Gedcom_val_union value;
388 } Gedcom_val_struct;
389
390 void gedcom_cast_error(char* file, int line,
391                        Gedcom_val_type tried_type,
392                        Gedcom_val_type real_type);
393
394 extern struct date_value def_date_val;
395 extern struct age_value  def_age_val;
396 extern struct xref_value def_xref_val;
397
398 #define GV_CHECK_CAST(VAL, TYPE, MEMBER, DEFVAL)                              \
399    ((VAL->type == TYPE) ?                                                     \
400     VAL->value.MEMBER :                                                       \
401     (gedcom_cast_error(__FILE__,__LINE__, TYPE, VAL->type), DEFVAL))
402
403 #define GV_IS_TYPE(VAL, TYPE)                                                 \
404    (VAL->type == TYPE)
405
406 /**************************************************************************/
407 /***  Function interface                                                ***/
408 /**************************************************************************/
409
410 /* Type for parsed values, meant to be opaque */
411 typedef Gedcom_val_struct* Gedcom_val;
412
413 /* Check to determine whether there is a parsed value or not */
414 #define GEDCOM_IS_NULL(VAL) \
415    GV_IS_TYPE(VAL, GV_NULL)
416
417 /* This returns the char* from a Gedcom_val, if appropriate */
418 /* It gives a gedcom_warning if the cast is not correct     */
419 #define GEDCOM_STRING(VAL) \
420    GV_CHECK_CAST(VAL, GV_CHAR_PTR, string_val, "<error>")
421 #define GEDCOM_IS_STRING(VAL) \
422    GV_IS_TYPE(VAL, GV_CHAR_PTR)
423
424 /* This returns the struct date_value from a Gedcom_val, if appropriate */
425 /* It gives a gedcom_warning if the cast is not correct                 */
426 #define GEDCOM_DATE(VAL) \
427    GV_CHECK_CAST(VAL, GV_DATE_VALUE, date_val, def_date_val)
428 #define GEDCOM_IS_DATE(VAL) \
429    GV_IS_TYPE(VAL, GV_DATE_VALUE)
430
431 /* This returns the struct age_value from a Gedcom_val, if appropriate  */
432 /* It gives a gedcom_warning if the cast is not correct                 */
433 #define GEDCOM_AGE(VAL) \
434    GV_CHECK_CAST(VAL, GV_AGE_VALUE, age_val, def_age_val)
435 #define GEDCOM_IS_AGE(VAL) \
436    GV_IS_TYPE(VAL, GV_AGE_VALUE)
437
438 /* This returns the (struct xref_value *) from a Gedcom_val, if appropriate */
439 /* It gives a gedcom_warning if the cast is not correct                     */
440 #define GEDCOM_XREF_PTR(VAL) \
441    GV_CHECK_CAST(VAL, GV_XREF_PTR, xref_val, &def_xref_val)
442 #define GEDCOM_IS_XREF_PTR(VAL) \
443    GV_IS_TYPE(VAL, GV_XREF_PTR)
444
445 typedef void
446         (*Gedcom_msg_handler)
447         (Gedcom_msg_type type, char *msg);
448
449 typedef Gedcom_ctxt
450         (*Gedcom_rec_start_cb)
451         (Gedcom_rec rec, int level, Gedcom_val xref, char *tag,
452          char *raw_value, int tag_value, Gedcom_val parsed_value);
453 typedef void
454         (*Gedcom_rec_end_cb)
455         (Gedcom_rec rec, Gedcom_ctxt self);
456
457 typedef Gedcom_ctxt
458         (*Gedcom_elt_start_cb)
459         (Gedcom_elt elt, Gedcom_ctxt parent,
460          int level, char *tag, char *raw_value,
461          int tag_value, Gedcom_val parsed_value);
462 typedef void
463         (*Gedcom_elt_end_cb)
464         (Gedcom_elt elt, Gedcom_ctxt parent, Gedcom_ctxt self,
465          Gedcom_val parsed_value);
466
467 typedef void
468         (*Gedcom_def_cb)
469         (Gedcom_elt elt, Gedcom_ctxt parent, int level, char *tag,
470          char *raw_value, int tag_value);
471
472 void    gedcom_init();
473 int     gedcom_parse_file(char* file_name);
474 void    gedcom_set_debug_level(int level, FILE* trace_output);
475 void    gedcom_set_error_handling(Gedcom_err_mech mechanism);
476 void    gedcom_set_compat_handling(int enable_compat);
477 void    gedcom_set_message_handler(Gedcom_msg_handler func);
478 void    gedcom_set_default_callback(Gedcom_def_cb func);
479
480 void    gedcom_subscribe_to_record(Gedcom_rec rec,
481                                    Gedcom_rec_start_cb cb_start,
482                                    Gedcom_rec_end_cb cb_end);
483 void    gedcom_subscribe_to_element(Gedcom_elt elt,
484                                     Gedcom_elt_start_cb cb_start,
485                                     Gedcom_elt_end_cb cb_end);
486
487 /* Separate value parsing functions */
488 struct date_value gedcom_parse_date(char* line_value);
489 struct age_value  gedcom_parse_age(char* line_value);
490 struct xref_value *gedcom_get_by_xref(char *key);
491
492 __END_DECLS
493
494 #endif /* __GEDCOM_H */