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