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