Further doxygen conversion of docs (error handling).
[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 #include <stdarg.h>
29
30 #ifdef __cplusplus
31 extern "C" {
32 #endif
33
34 #ifndef GEDCOM_INTERNAL
35 #include <gedcom-tags.h>
36 #endif
37
38 #define GEDCOM_PARSE_VERSION_MAJOR @VERSION_MAJOR@
39 #define GEDCOM_PARSE_VERSION_MINOR @VERSION_MINOR@
40 #define GEDCOM_PARSE_VERSION_PATCH @VERSION_PATCH@
41 #define GEDCOM_PARSE_VERSION \
42   (GEDCOM_PARSE_VERSION_MAJOR * 1000 + GEDCOM_PARSE_VERSION_MINOR)
43
44 int gedcom_check_version(int major, int minor, int patch);
45
46 /**************************************************************************/
47 /***  First the records and elements to subscribe upon                  ***/
48 /**************************************************************************/
49                                                                            
50 typedef enum Gedcom_rec {
51   REC_HEAD,
52   REC_FAM,
53   REC_INDI,
54   REC_OBJE,
55   REC_NOTE,
56   REC_REPO,
57   REC_SOUR,
58   REC_SUBN,
59   REC_SUBM,
60   REC_USER,
61   NR_OF_RECS     /* Just a final value to be used in array boundaries */
62 } Gedcom_rec;
63
64 typedef enum Gedcom_elt {
65   ELT_HEAD_SOUR = NR_OF_RECS,
66   ELT_HEAD_SOUR_VERS,
67   ELT_HEAD_SOUR_NAME,
68   ELT_HEAD_SOUR_CORP,
69   ELT_HEAD_SOUR_DATA,
70   ELT_HEAD_SOUR_DATA_DATE,
71   ELT_HEAD_SOUR_DATA_COPR,
72   ELT_HEAD_DEST,
73   ELT_HEAD_DATE,
74   ELT_HEAD_DATE_TIME,
75   ELT_HEAD_SUBM,
76   ELT_HEAD_SUBN,
77   ELT_HEAD_FILE,
78   ELT_HEAD_COPR,
79   ELT_HEAD_GEDC,
80   ELT_HEAD_GEDC_VERS,
81   ELT_HEAD_GEDC_FORM,
82   ELT_HEAD_CHAR,
83   ELT_HEAD_CHAR_VERS,
84   ELT_HEAD_LANG,
85   ELT_HEAD_PLAC,
86   ELT_HEAD_PLAC_FORM,
87   ELT_HEAD_NOTE,
88   
89   ELT_FAM_HUSB,
90   ELT_FAM_WIFE,
91   ELT_FAM_CHIL,
92   ELT_FAM_NCHI,
93   ELT_FAM_SUBM,
94   
95   ELT_INDI_RESN,
96   ELT_INDI_SEX,
97   ELT_INDI_SUBM,
98   ELT_INDI_ALIA,
99   ELT_INDI_ANCI,
100   ELT_INDI_DESI,
101   ELT_INDI_RFN,
102   ELT_INDI_AFN,
103   
104   ELT_OBJE_FORM,
105   ELT_OBJE_TITL,
106   ELT_OBJE_BLOB,
107   ELT_OBJE_BLOB_CONT,
108   ELT_OBJE_OBJE,
109   
110   ELT_REPO_NAME,
111
112   ELT_SOUR_DATA,
113   ELT_SOUR_DATA_EVEN,
114   ELT_SOUR_DATA_EVEN_DATE,
115   ELT_SOUR_DATA_EVEN_PLAC,
116   ELT_SOUR_DATA_AGNC,
117   ELT_SOUR_AUTH,
118   ELT_SOUR_TITL,
119   ELT_SOUR_ABBR,
120   ELT_SOUR_PUBL,
121   ELT_SOUR_TEXT,
122
123   ELT_SUBN_SUBM,
124   ELT_SUBN_FAMF,
125   ELT_SUBN_TEMP,
126   ELT_SUBN_ANCE,
127   ELT_SUBN_DESC,
128   ELT_SUBN_ORDI,
129   ELT_SUBN_RIN,
130
131   ELT_SUBM_NAME,
132   ELT_SUBM_LANG,
133   ELT_SUBM_RFN,
134   ELT_SUBM_RIN,
135
136   ELT_SUB_ADDR,
137   ELT_SUB_ADDR_CONT,
138   ELT_SUB_ADDR_ADR1,
139   ELT_SUB_ADDR_ADR2,
140   ELT_SUB_ADDR_CITY,
141   ELT_SUB_ADDR_STAE,
142   ELT_SUB_ADDR_POST,
143   ELT_SUB_ADDR_CTRY,
144   
145   ELT_SUB_PHON,
146
147   ELT_SUB_ASSO,
148   ELT_SUB_ASSO_TYPE,
149   ELT_SUB_ASSO_RELA,
150
151   ELT_SUB_CHAN,
152   ELT_SUB_CHAN_DATE,
153   ELT_SUB_CHAN_TIME,
154
155   ELT_SUB_FAMC,
156   ELT_SUB_FAMC_PEDI,
157
158   ELT_SUB_CONT,
159   ELT_SUB_CONC,
160
161   ELT_SUB_EVT_TYPE,
162   ELT_SUB_EVT_DATE,
163   ELT_SUB_EVT_AGE,
164   ELT_SUB_EVT_AGNC,
165   ELT_SUB_EVT_CAUS,
166
167   ELT_SUB_FAM_EVT,
168   ELT_SUB_FAM_EVT_HUSB,
169   ELT_SUB_FAM_EVT_WIFE,
170   ELT_SUB_FAM_EVT_AGE,
171   ELT_SUB_FAM_EVT_EVEN,
172
173   ELT_SUB_IDENT_REFN,
174   ELT_SUB_IDENT_REFN_TYPE,
175   ELT_SUB_IDENT_RIN,
176
177   ELT_SUB_INDIV_ATTR,
178   ELT_SUB_INDIV_RESI,
179   ELT_SUB_INDIV_BIRT,
180   ELT_SUB_INDIV_BIRT_FAMC,
181   ELT_SUB_INDIV_GEN,
182   ELT_SUB_INDIV_ADOP,
183   ELT_SUB_INDIV_ADOP_FAMC,
184   ELT_SUB_INDIV_ADOP_FAMC_ADOP,
185   ELT_SUB_INDIV_EVEN,
186
187   ELT_SUB_LIO_BAPL,
188   ELT_SUB_LIO_BAPL_STAT,
189   ELT_SUB_LIO_BAPL_DATE,
190   ELT_SUB_LIO_BAPL_TEMP,
191   ELT_SUB_LIO_BAPL_PLAC,
192   ELT_SUB_LIO_SLGC,
193   ELT_SUB_LIO_SLGC_FAMC,
194
195   ELT_SUB_LSS_SLGS,
196   ELT_SUB_LSS_SLGS_STAT,
197   ELT_SUB_LSS_SLGS_DATE,
198   ELT_SUB_LSS_SLGS_TEMP,
199   ELT_SUB_LSS_SLGS_PLAC,
200
201   ELT_SUB_MULTIM_OBJE,
202   ELT_SUB_MULTIM_OBJE_FORM,
203   ELT_SUB_MULTIM_OBJE_TITL,
204   ELT_SUB_MULTIM_OBJE_FILE,
205
206   ELT_SUB_NOTE,
207
208   ELT_SUB_PERS_NAME,
209   ELT_SUB_PERS_NAME_NPFX,
210   ELT_SUB_PERS_NAME_GIVN,
211   ELT_SUB_PERS_NAME_NICK,
212   ELT_SUB_PERS_NAME_SPFX,
213   ELT_SUB_PERS_NAME_SURN,
214   ELT_SUB_PERS_NAME_NSFX,
215
216   ELT_SUB_PLAC,
217   ELT_SUB_PLAC_FORM,
218
219   ELT_SUB_SOUR,
220   ELT_SUB_SOUR_PAGE,
221   ELT_SUB_SOUR_EVEN,
222   ELT_SUB_SOUR_EVEN_ROLE,
223   ELT_SUB_SOUR_DATA,
224   ELT_SUB_SOUR_DATA_DATE,
225   ELT_SUB_SOUR_TEXT,
226   ELT_SUB_SOUR_QUAY,
227
228   ELT_SUB_REPO,
229   ELT_SUB_REPO_CALN,
230   ELT_SUB_REPO_CALN_MEDI,
231
232   ELT_SUB_FAMS,
233   
234   ELT_USER,
235   
236   NR_OF_ELTS     /* Just a final value to be used in array boundaries */
237 } Gedcom_elt;
238
239 /**************************************************************************/
240 /***  Definition of some auxiliary types                                ***/
241 /**************************************************************************/
242
243   /** \addtogroup error */
244   /** @{ */
245   /** \brief Error handling mechanisms.
246       
247       These are the possible error handling mechanisms.
248       See \ref gedcom_set_error_handling.
249   */
250 enum _Gedcom_err_mech {
251   IMMED_FAIL,    /**< immediately fail the parsing on an error (this is
252                        the default) */
253   DEFER_FAIL,    /**< continue parsing after an error, but return a failure
254                        code eventually */
255   IGNORE_ERRORS  /**< continue parsing after an error, return success always */
256 };
257
258   /** \brief Error handling mechanisms. */
259 typedef enum _Gedcom_err_mech Gedcom_err_mech;
260
261   /** \brief Message type in message handler callbacks
262       
263       This will be passed to the message callback to indicate the message type.
264       See \ref gedcom_set_message_handler.
265   */
266 enum _Gedcom_msg_type {
267   ERROR,               /**< An error message */
268   WARNING,             /**< A warning message */
269   MESSAGE              /**< Just a message */
270 };
271
272   /** \brief Message type in message handler callbacks */
273 typedef enum _Gedcom_msg_type Gedcom_msg_type;
274   /** @} */
275
276 typedef enum Date_type {
277   DATE_UNRECOGNIZED,   /* Neither jday1 as jday2 are significant */
278   DATE_EXACT,          /* Only jday1 is significant */
279   DATE_BOUNDED         /* Both jday1 and jday2 are significant */
280 } Date_type;
281
282 typedef enum Calendar_type {
283   CAL_GREGORIAN,
284   CAL_JULIAN,
285   CAL_HEBREW,
286   CAL_FRENCH_REV,
287   CAL_UNKNOWN
288 } Calendar_type;
289
290 typedef enum Year_type {
291   YEAR_SINGLE,
292   YEAR_DOUBLE     /* In this case, the 'year' indicates the last value */
293 } Year_type;
294
295 typedef enum Date_value_type {
296   /* Simple date */
297   DV_NO_MODIFIER,
298   /* Range values */
299   DV_BEFORE,
300   DV_AFTER,
301   DV_BETWEEN,       /* Two dates are given */
302   /* Period values */
303   DV_FROM,
304   DV_TO,
305   DV_FROM_TO,       /* Two dates are given */
306   /* Approx values */
307   DV_ABOUT,
308   DV_CALCULATED,
309   DV_ESTIMATED,
310   /* Other */
311   DV_INTERPRETED,   /* One date and a phrase is given */
312   DV_PHRASE         /* Only phrase is given */
313 } Date_value_type;
314
315 /* All Unicode characters between U+0000 and U+FFFF can be encoded in
316    UTF-8 with 3 or less bytes */
317 #define UTF_FACTOR 3
318
319 #define MAX_DAY_LEN    2
320 #define MAX_MONTH_LEN  4
321 #define MAX_YEAR_LEN   7
322 #define MAX_PHRASE_LEN 35 * UTF_FACTOR
323
324 struct date {
325   Calendar_type cal;
326   char day_str[MAX_DAY_LEN + 1];
327   char month_str[MAX_MONTH_LEN + 1];
328   char year_str[MAX_YEAR_LEN + 1];
329   int day;    /* starts at 1 */
330   int month;  /* starts at 1 */
331   int year;   /* the highest value for double years */
332   Year_type year_type;
333   Date_type type;
334   long int sdn1;
335   long int sdn2;
336 };
337
338 struct date_value {
339   Date_value_type type;
340   struct date date1;
341   struct date date2;
342   char phrase[MAX_PHRASE_LEN + 1];
343 };
344
345 /* Type for context handling, meant to be opaque */
346 typedef void* Gedcom_ctxt;
347
348 typedef enum Xref_type {
349   XREF_NONE,
350   XREF_FAM,
351   XREF_INDI,
352   XREF_NOTE,
353   XREF_OBJE,
354   XREF_REPO,
355   XREF_SOUR,
356   XREF_SUBM,
357   XREF_SUBN,
358   XREF_USER,
359   XREF_ANY
360 } Xref_type;
361
362 struct xref_value {
363   Xref_type type;
364   char *string;
365   Gedcom_ctxt object;
366 };
367
368 typedef enum Age_type {
369   AGE_UNRECOGNIZED,
370   AGE_CHILD,
371   AGE_INFANT,
372   AGE_STILLBORN,
373   AGE_NUMERIC
374 } Age_type;
375
376 typedef enum Age_modifier {
377   AGE_NO_MODIFIER,
378   AGE_LESS_THAN,
379   AGE_GREATER_THAN
380 } Age_modifier;
381
382 struct age_value {
383   Age_type type;
384   Age_modifier mod;
385   int years;
386   int months;
387   int days;
388   char phrase[MAX_PHRASE_LEN + 1];
389 };
390
391 typedef enum Encoding {
392   ONE_BYTE      = 0x00,
393   TWO_BYTE_HILO = 0x01,
394   TWO_BYTE_LOHI = 0x02
395 } Encoding;
396
397 typedef enum Enc_bom {
398   WITHOUT_BOM = 0x00,
399   WITH_BOM    = 0x10
400 } Enc_bom;
401
402 typedef enum Enc_line_end {
403   END_CR    = 0,
404   END_LF    = 1,
405   END_CR_LF = 2,
406   END_LF_CR = 3
407 } Enc_line_end;
408
409 typedef enum Enc_from {
410   ENC_FROM_FILE = 0,
411   ENC_FROM_SYS  = 1,
412   ENC_MANUAL    = 2
413 } Enc_from;
414
415 struct encoding_state;
416
417 typedef enum Date_input {
418   DI_FROM_STRINGS,
419   DI_FROM_NUMBERS,
420   DI_FROM_SDN
421 } Date_input;
422
423 typedef enum Gedcom_compat {
424   COMPAT_ALLOW_OUT_OF_CONTEXT = 0x01
425 } Gedcom_compat;
426
427 /**************************************************************************/
428 /***  Things meant to be internal, susceptible to changes               ***/
429 /***  Use the GEDCOM_STRING/GEDCOM_DATE interface instead of relying    ***/
430 /***  on this !!                                                        ***/
431 /**************************************************************************/
432
433 /* Update strings in interface.c if this changes */
434 typedef enum _GEDCOM_VAL_TYPE {
435   GV_NULL       = 0x01,
436   GV_CHAR_PTR   = 0x02,
437   GV_DATE_VALUE = 0x04,
438   GV_AGE_VALUE  = 0x08,
439   GV_XREF_PTR   = 0x10
440 } Gedcom_val_type;
441
442 union _Gedcom_val_union {
443   char* string_val;
444   struct date_value date_val;
445   struct age_value age_val;
446   struct xref_value *xref_val;
447 };
448
449 typedef struct _Gedcom_val_struct {
450   Gedcom_val_type type;
451   union _Gedcom_val_union value;
452 } Gedcom_val_struct;
453
454 void gedcom_cast_error(const char* file, int line,
455                        Gedcom_val_type tried_type,
456                        Gedcom_val_type real_type);
457
458 extern struct date_value def_date_val;
459 extern struct age_value  def_age_val;
460 extern struct xref_value def_xref_val;
461
462 #define GV_CHECK_CAST(VAL, TYPE, MEMBER, DEFVAL)                              \
463    (((VAL)->type == TYPE) ?                                                   \
464     (VAL)->value.MEMBER :                                                     \
465     (gedcom_cast_error(__FILE__,__LINE__, TYPE, (VAL)->type), DEFVAL))
466
467 #define GV_IS_TYPE(VAL, TYPE)                                                 \
468    ((VAL)->type == TYPE)
469
470 /**************************************************************************/
471 /***  Function interface                                                ***/
472 /**************************************************************************/
473
474 /* Type for parsed values, meant to be opaque */
475 typedef Gedcom_val_struct* Gedcom_val;
476
477 /* Type for write handle, meant to be opaque */
478 struct Gedcom_write_struct;
479 typedef struct Gedcom_write_struct* Gedcom_write_hndl;
480
481 /* Check to determine whether there is a parsed value or not */
482 #define GEDCOM_IS_NULL(VAL) \
483    GV_IS_TYPE(VAL, GV_NULL)
484
485 /* This returns the char* from a Gedcom_val, if appropriate */
486 /* It gives a gedcom_warning if the cast is not correct     */
487 #define GEDCOM_STRING(VAL) \
488    GV_CHECK_CAST(VAL, GV_CHAR_PTR, string_val, "<error>")
489 #define GEDCOM_IS_STRING(VAL) \
490    GV_IS_TYPE(VAL, GV_CHAR_PTR)
491
492 /* This returns the struct date_value from a Gedcom_val, if appropriate */
493 /* It gives a gedcom_warning if the cast is not correct                 */
494 #define GEDCOM_DATE(VAL) \
495    GV_CHECK_CAST(VAL, GV_DATE_VALUE, date_val, def_date_val)
496 #define GEDCOM_IS_DATE(VAL) \
497    GV_IS_TYPE(VAL, GV_DATE_VALUE)
498
499 /* This returns the struct age_value from a Gedcom_val, if appropriate  */
500 /* It gives a gedcom_warning if the cast is not correct                 */
501 #define GEDCOM_AGE(VAL) \
502    GV_CHECK_CAST(VAL, GV_AGE_VALUE, age_val, def_age_val)
503 #define GEDCOM_IS_AGE(VAL) \
504    GV_IS_TYPE(VAL, GV_AGE_VALUE)
505
506 /* This returns the (struct xref_value *) from a Gedcom_val, if appropriate */
507 /* It gives a gedcom_warning if the cast is not correct                     */
508 #define GEDCOM_XREF_PTR(VAL) \
509    GV_CHECK_CAST(VAL, GV_XREF_PTR, xref_val, &def_xref_val)
510 #define GEDCOM_IS_XREF_PTR(VAL) \
511    GV_IS_TYPE(VAL, GV_XREF_PTR)
512
513   /** \brief Message handler callback
514       \ingroup error
515       See description of \ref gedcom_set_message_handler().
516   */
517 typedef void
518         (*Gedcom_msg_handler)
519         (Gedcom_msg_type type, char *msg);
520
521 typedef Gedcom_ctxt
522         (*Gedcom_rec_start_cb)
523         (Gedcom_rec rec, int level, Gedcom_val xref, char *tag,
524          char *raw_value, int tag_value, Gedcom_val parsed_value);
525 typedef void
526         (*Gedcom_rec_end_cb)
527         (Gedcom_rec rec, Gedcom_ctxt self, Gedcom_val parsed_value);
528
529 typedef Gedcom_ctxt
530         (*Gedcom_elt_start_cb)
531         (Gedcom_elt elt, Gedcom_ctxt parent,
532          int level, char *tag, char *raw_value,
533          int tag_value, Gedcom_val parsed_value);
534 typedef void
535         (*Gedcom_elt_end_cb)
536         (Gedcom_elt elt, Gedcom_ctxt parent, Gedcom_ctxt self,
537          Gedcom_val parsed_value);
538
539 typedef void
540         (*Gedcom_def_cb)
541         (Gedcom_elt elt, Gedcom_ctxt parent, int level, char *tag,
542          char *raw_value, int tag_value);
543
544   /** \addtogroup main */
545   /** @{ */
546   /** \brief Initializes the Gedcom parser library */
547 int     gedcom_init();
548   /** \brief Parses an existing Gedcom file */
549 int     gedcom_parse_file(const char* file_name);
550   /** \brief Starts a new Gedcom model */
551 int     gedcom_new_model();
552   /** @} */
553
554   /** \addtogroup error */
555   /** @{ */
556   /** \brief Sets the error handler callback */
557 void    gedcom_set_message_handler(Gedcom_msg_handler func);
558   /** \brief Determine what happens on an error */
559 void    gedcom_set_error_handling(Gedcom_err_mech mechanism);
560   /** @} */
561   
562 void    gedcom_set_debug_level(int level, FILE* trace_output);
563 void    gedcom_set_compat_handling(int enable_compat);
564 void    gedcom_set_compat_options(Gedcom_compat options);
565 void    gedcom_set_default_callback(Gedcom_def_cb func);
566
567 void    gedcom_subscribe_to_record(Gedcom_rec rec,
568                                    Gedcom_rec_start_cb cb_start,
569                                    Gedcom_rec_end_cb cb_end);
570 void    gedcom_subscribe_to_element(Gedcom_elt elt,
571                                     Gedcom_elt_start_cb cb_start,
572                                     Gedcom_elt_end_cb cb_end);
573
574 /* Separate value parsing functions */
575 struct date_value  gedcom_parse_date(const char* line_value);
576 char*              gedcom_date_to_string(const struct date_value* val);
577 struct date_value* gedcom_new_date_value(const struct date_value* copy_from);
578 int   gedcom_normalize_date(Date_input compute_from, struct date_value *val);
579
580 struct age_value  gedcom_parse_age(const char* line_value);
581 struct age_value* gedcom_new_age_value(const struct age_value* copy_from);
582 char*             gedcom_age_to_string(const struct age_value* val);
583
584 /* Handling cross-references */
585 struct xref_value *gedcom_get_by_xref(const char *key);
586 struct xref_value *gedcom_add_xref(Xref_type type, const char* xrefstr,
587                                    Gedcom_ctxt object);
588 struct xref_value *gedcom_link_xref(Xref_type type, const char* xrefstr);
589 struct xref_value *gedcom_unlink_xref(Xref_type type, const char* xrefstr);
590 int                gedcom_delete_xref(const char* xrefstr);
591
592 /* Writing support */
593 Gedcom_write_hndl  gedcom_write_open(const char* filename);
594 int  gedcom_write_close(Gedcom_write_hndl hndl, int *total_conv_fails);
595 int  gedcom_write_set_encoding(Enc_from from,
596                                const char* charset, Encoding width,
597                                Enc_bom bom);
598 int  gedcom_write_set_line_terminator(Enc_from from, Enc_line_end end);
599
600 int  gedcom_write_record_str(Gedcom_write_hndl hndl,
601                              Gedcom_rec rec, const char* xrefstr,
602                              const char* val);
603   
604 int gedcom_write_element_str(Gedcom_write_hndl hndl, Gedcom_elt elt,
605                              int parsed_tag, int parent_rec_or_elt,
606                              const char* val);
607 int gedcom_write_element_xref(Gedcom_write_hndl hndl, Gedcom_elt elt,
608                               int parsed_tag, int parent_rec_or_elt,
609                               const struct xref_value* val);
610
611 int gedcom_write_element_date(Gedcom_write_hndl hndl,
612                               Gedcom_elt elt, int tag, int parent_rec_or_elt,
613                               const struct date_value* val);
614 int gedcom_write_element_age(Gedcom_write_hndl hndl,
615                              Gedcom_elt elt, int tag, int parent_rec_or_elt,
616                              const struct age_value* val);
617
618 int gedcom_write_user_str(Gedcom_write_hndl hndl, int level, const char* tag,
619                           const char* xrefstr, const char* value);
620 int gedcom_write_user_xref(Gedcom_write_hndl hndl, int level, const char* tag,
621                            const char* xrefstr, const struct xref_value* val);
622
623 /* For use in gom */
624 int        gedcom_error(const char* s, ...);
625 int        gedcom_warning(const char* s, ...);
626 int        gedcom_message(const char* s, ...);
627 int        gedcom_debug_print(const char* s, ...);
628
629 #ifdef __cplusplus
630 }
631 #endif
632
633 #endif /* __GEDCOM_H */