Forgot variable declaration...
[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_USER,
133   
134   NR_OF_ELTS     /* Just a final value to be used in array boundaries */
135 } Gedcom_elt;
136
137 /**************************************************************************/
138 /***  Definition of some auxiliary types                                ***/
139 /**************************************************************************/
140                                                                            
141 typedef enum _MECH {
142   IMMED_FAIL,
143   DEFER_FAIL,
144   IGNORE_ERRORS
145 } Gedcom_err_mech;
146
147 typedef enum _MSG {
148   ERROR,
149   WARNING,
150   MESSAGE
151 } Gedcom_msg_type;
152
153 typedef enum _DATE_TYPE {
154   DATE_UNRECOGNIZED,   /* Neither jday1 as jday2 are significant */
155   DATE_EXACT,          /* Only jday1 is significant */
156   DATE_BOUNDED         /* Both jday1 and jday2 are significant */
157 } Date_type;
158
159 typedef enum _CALENDAR_TYPE {
160   CAL_GREGORIAN,
161   CAL_JULIAN,
162   CAL_HEBREW,
163   CAL_FRENCH_REV,
164   CAL_UNKNOWN
165 } Calendar_type;
166
167 typedef enum _YEAR_TYPE {
168   YEAR_SINGLE,
169   YEAR_DOUBLE     /* In this case, the 'year' indicates the last value */
170 } Year_type;
171
172 typedef enum _DATE_VAL_MOD {
173   /* Simple date */
174   DV_NO_MODIFIER,
175   /* Range values */
176   DV_BEFORE,
177   DV_AFTER,
178   DV_BETWEEN,       /* Two dates are given */
179   /* Period values */
180   DV_FROM,
181   DV_TO,
182   DV_FROM_TO,       /* Two dates are given */
183   /* Approx values */
184   DV_ABOUT,
185   DV_CALCULATED,
186   DV_ESTIMATED,
187   /* Other */
188   DV_INTERPRETED,   /* One date and a phrase is given */
189   DV_PHRASE         /* Only phrase is given */
190 } Date_value_type;
191
192 #define MAX_DAY_LEN    2
193 #define MAX_MONTH_LEN  4
194 #define MAX_YEAR_LEN   7
195 #define MAX_PHRASE_LEN 35
196
197 struct date {
198   Calendar_type cal;
199   char day_str[MAX_DAY_LEN + 1];
200   char month_str[MAX_MONTH_LEN + 1];
201   char year_str[MAX_YEAR_LEN + 1];
202   int day;    /* starts at 1 */
203   int month;  /* starts at 1 */
204   int year;   /* the highest value for double years */
205   Year_type year_type;
206   Date_type type;
207   long int sdn1;
208   long int sdn2;
209 };
210
211 struct date_value {
212   Date_value_type type;
213   struct date date1;
214   struct date date2;
215   char phrase[MAX_PHRASE_LEN + 1];
216 };
217
218 /**************************************************************************/
219 /***  Things meant to be internal, susceptible to changes               ***/
220 /***  Use the GEDCOM_STRING/GEDCOM_DATE interface instead of relying    ***/
221 /***  on this !!                                                        ***/
222 /**************************************************************************/
223                                                                            
224 typedef enum _GEDCOM_VAL_TYPE {
225   GV_CHAR_PTR,
226   GV_DATE_VALUE
227 } Gedcom_val_type;
228
229 union _Gedcom_val_union {
230   char* string_val;
231   struct date_value date_val;
232 };
233
234 typedef struct _Gedcom_val_struct {
235   Gedcom_val_type type;
236   union _Gedcom_val_union value;
237 } Gedcom_val_struct;
238
239 void gedcom_cast_error(char* file, int line);
240 extern struct date_value def_date_val;
241
242 #define GV_CHECK_CAST(VAL, TYPE, MEMBER, DEFVAL)                              \
243    ((VAL->type == TYPE) ?                                                     \
244     VAL->value.MEMBER :                                                       \
245     (gedcom_cast_error(__FILE__,__LINE__), DEFVAL))
246
247 /**************************************************************************/
248 /***  Function interface                                                ***/
249 /**************************************************************************/
250
251 /* Type for context handling, meant to be opaque */
252 typedef void* Gedcom_ctxt;
253
254 /* Type for parsed values, meant to be opaque */
255 typedef Gedcom_val_struct* Gedcom_val;
256
257 /* This returns the char* from a Gedcom_val, if appropriate */
258 /* It gives a gedcom_warning if the cast is not correct     */
259 #define GEDCOM_STRING(VAL) \
260    GV_CHECK_CAST(VAL, GV_CHAR_PTR, string_val, "")
261
262 /* This returns the struct date_value from a Gedcom_val, if appropriate */
263 /* It gives a gedcom_warning if the cast is not correct                 */
264 #define GEDCOM_DATE(VAL) \
265    GV_CHECK_CAST(VAL, GV_DATE_VALUE, date_val, def_date_val)
266
267 typedef void
268         (*Gedcom_msg_handler)
269         (Gedcom_msg_type type, char *msg);
270
271 typedef Gedcom_ctxt
272         (*Gedcom_rec_start_cb)
273         (int level, char *xref, char *tag);
274 typedef void
275         (*Gedcom_rec_end_cb)
276         (Gedcom_ctxt self);
277
278 typedef Gedcom_ctxt
279         (*Gedcom_elt_start_cb)
280         (Gedcom_ctxt parent,
281          int level, char *tag, char *raw_value, Gedcom_val parsed_value);
282 typedef void
283         (*Gedcom_elt_end_cb)
284         (Gedcom_ctxt parent, Gedcom_ctxt self, Gedcom_val parsed_value);
285
286 typedef void
287         (*Gedcom_def_cb)
288         (Gedcom_ctxt parent, int level, char *tag, char *raw_value);
289
290 int     gedcom_parse_file(char* file_name);
291 void    gedcom_set_debug_level(int level, FILE* trace_output);
292 void    gedcom_set_error_handling(Gedcom_err_mech mechanism);
293 void    gedcom_set_compat_handling(int enable_compat);
294 void    gedcom_set_message_handler(Gedcom_msg_handler func);
295 void    gedcom_set_default_callback(Gedcom_def_cb func);
296
297 void    gedcom_subscribe_to_record(Gedcom_rec rec,
298                                    Gedcom_rec_start_cb cb_start,
299                                    Gedcom_rec_end_cb cb_end);
300 void    gedcom_subscribe_to_element(Gedcom_elt elt,
301                                     Gedcom_elt_start_cb cb_start,
302                                     Gedcom_elt_end_cb cb_end);
303
304 /* Separate value parsing functions */
305 struct date_value gedcom_parse_date(char* line_value);
306
307 __END_DECLS
308
309 #endif /* __GEDCOM_H */