/* External header for the Gedcom parser library.
- Copyright (C) 2001 The Genes Development Team
+ Copyright (C) 2001,2002 The Genes Development Team
This file is part of the Gedcom parser library.
Contributed by Peter Verthez <Peter.Verthez@advalvas.be>, 2001.
__BEGIN_DECLS
+#ifndef GEDCOM_INTERNAL
+#include <gedcom-tags.h>
+#endif
+
/**************************************************************************/
/*** First the records and elements to subscribe upon ***/
/**************************************************************************/
ELT_SUB_ADDR_CTRY,
ELT_SUB_PHON,
+
+ ELT_SUB_ASSO,
+ ELT_SUB_ASSO_TYPE,
+ ELT_SUB_ASSO_RELA,
+
+ ELT_SUB_CHAN,
+ ELT_SUB_CHAN_DATE,
+ ELT_SUB_CHAN_TIME,
+
+ ELT_SUB_FAMC,
+ ELT_SUB_FAMC_PEDI,
+
+ ELT_SUB_CONT,
+ ELT_SUB_CONC,
+
+ ELT_SUB_EVT_TYPE,
+ ELT_SUB_EVT_DATE,
+ ELT_SUB_EVT_AGE,
+ ELT_SUB_EVT_AGNC,
+ ELT_SUB_EVT_CAUS,
+
+ ELT_SUB_FAM_EVT,
+ ELT_SUB_FAM_EVT_HUSB,
+ ELT_SUB_FAM_EVT_WIFE,
+ ELT_SUB_FAM_EVT_AGE,
+ ELT_SUB_FAM_EVT_EVEN,
+
+ ELT_SUB_IDENT_REFN,
+ ELT_SUB_IDENT_REFN_TYPE,
+ ELT_SUB_IDENT_RIN,
+
+ ELT_SUB_INDIV_ATTR,
+ ELT_SUB_INDIV_RESI,
+ ELT_SUB_INDIV_BIRT,
+ ELT_SUB_INDIV_BIRT_FAMC,
+ ELT_SUB_INDIV_GEN,
+ ELT_SUB_INDIV_ADOP,
+ ELT_SUB_INDIV_ADOP_FAMC,
+ ELT_SUB_INDIV_ADOP_FAMC_ADOP,
+ ELT_SUB_INDIV_EVEN,
+
+ ELT_SUB_LIO_BAPL,
+ ELT_SUB_LIO_BAPL_STAT,
+ ELT_SUB_LIO_BAPL_DATE,
+ ELT_SUB_LIO_BAPL_TEMP,
+ ELT_SUB_LIO_BAPL_PLAC,
+ ELT_SUB_LIO_SLGC,
+ ELT_SUB_LIO_SLGC_FAMC,
+
+ ELT_SUB_LSS_SLGS,
+ ELT_SUB_LSS_SLGS_STAT,
+ ELT_SUB_LSS_SLGS_DATE,
+ ELT_SUB_LSS_SLGS_TEMP,
+ ELT_SUB_LSS_SLGS_PLAC,
+
+ ELT_SUB_MULTIM_OBJE,
+ ELT_SUB_MULTIM_OBJE_FORM,
+ ELT_SUB_MULTIM_OBJE_TITL,
+ ELT_SUB_MULTIM_OBJE_FILE,
+
+ ELT_SUB_NOTE,
+
+ ELT_SUB_PERS_NAME,
+ ELT_SUB_PERS_NAME_NPFX,
+ ELT_SUB_PERS_NAME_GIVN,
+ ELT_SUB_PERS_NAME_NICK,
+ ELT_SUB_PERS_NAME_SPFX,
+ ELT_SUB_PERS_NAME_SURN,
+ ELT_SUB_PERS_NAME_NSFX,
+
+ ELT_SUB_PLAC,
+ ELT_SUB_PLAC_FORM,
+
+ ELT_SUB_SOUR,
+ ELT_SUB_SOUR_PAGE,
+ ELT_SUB_SOUR_EVEN,
+ ELT_SUB_SOUR_EVEN_ROLE,
+ ELT_SUB_SOUR_DATA,
+ ELT_SUB_SOUR_DATA_DATE,
+ ELT_SUB_SOUR_TEXT,
+ ELT_SUB_SOUR_QUAY,
+
+ ELT_SUB_REPO,
+ ELT_SUB_REPO_CALN,
+ ELT_SUB_REPO_CALN_MEDI,
+
+ ELT_SUB_FAMS,
ELT_USER,
DV_PHRASE /* Only phrase is given */
} Date_value_type;
+/* All Unicode characters between U+0000 and U+FFFF can be encoded in
+ UTF-8 with 3 or less bytes */
+#define UTF_FACTOR 3
+
#define MAX_DAY_LEN 2
#define MAX_MONTH_LEN 4
#define MAX_YEAR_LEN 7
-#define MAX_PHRASE_LEN 35
+#define MAX_PHRASE_LEN 35 * UTF_FACTOR
struct date {
Calendar_type cal;
char phrase[MAX_PHRASE_LEN + 1];
};
+/* Type for context handling, meant to be opaque */
+typedef void* Gedcom_ctxt;
+
+typedef enum _XREF_TYPE {
+ XREF_NONE,
+ XREF_FAM,
+ XREF_INDI,
+ XREF_NOTE,
+ XREF_OBJE,
+ XREF_REPO,
+ XREF_SOUR,
+ XREF_SUBM,
+ XREF_SUBN,
+ XREF_USER
+} Xref_type;
+
+struct xref_value {
+ Xref_type type;
+ char *string;
+ Gedcom_ctxt object;
+};
+
/**************************************************************************/
/*** Things meant to be internal, susceptible to changes ***/
/*** Use the GEDCOM_STRING/GEDCOM_DATE interface instead of relying ***/
/**************************************************************************/
typedef enum _GEDCOM_VAL_TYPE {
+ GV_NULL,
GV_CHAR_PTR,
- GV_DATE_VALUE
+ GV_DATE_VALUE,
+ GV_XREF_PTR
} Gedcom_val_type;
union _Gedcom_val_union {
char* string_val;
struct date_value date_val;
+ struct xref_value *xref_val;
};
typedef struct _Gedcom_val_struct {
union _Gedcom_val_union value;
} Gedcom_val_struct;
-void gedcom_cast_error(char* file, int line);
+void gedcom_cast_error(char* file, int line,
+ Gedcom_val_type tried_type,
+ Gedcom_val_type real_type);
+
extern struct date_value def_date_val;
+extern struct xref_value def_xref_val;
#define GV_CHECK_CAST(VAL, TYPE, MEMBER, DEFVAL) \
((VAL->type == TYPE) ? \
VAL->value.MEMBER : \
- (gedcom_cast_error(__FILE__,__LINE__), DEFVAL))
+ (gedcom_cast_error(__FILE__,__LINE__, TYPE, VAL->type), DEFVAL))
+
+#define GV_IS_TYPE(VAL, TYPE) \
+ (VAL->type == TYPE)
/**************************************************************************/
/*** Function interface ***/
/**************************************************************************/
-/* Type for context handling, meant to be opaque */
-typedef void* Gedcom_ctxt;
-
/* Type for parsed values, meant to be opaque */
typedef Gedcom_val_struct* Gedcom_val;
+/* Check to determine whether there is a parsed value or not */
+#define GEDCOM_IS_NULL(VAL) \
+ GV_IS_TYPE(VAL, GV_NULL)
+
/* This returns the char* from a Gedcom_val, if appropriate */
/* It gives a gedcom_warning if the cast is not correct */
#define GEDCOM_STRING(VAL) \
- GV_CHECK_CAST(VAL, GV_CHAR_PTR, string_val, "")
+ GV_CHECK_CAST(VAL, GV_CHAR_PTR, string_val, "<error>")
+#define GEDCOM_IS_STRING(VAL) \
+ GV_IS_TYPE(VAL, GV_CHAR_PTR)
/* This returns the struct date_value from a Gedcom_val, if appropriate */
/* It gives a gedcom_warning if the cast is not correct */
#define GEDCOM_DATE(VAL) \
GV_CHECK_CAST(VAL, GV_DATE_VALUE, date_val, def_date_val)
+#define GEDCOM_IS_DATE(VAL) \
+ GV_IS_TYPE(VAL, GV_DATE_VALUE)
+
+/* This returns the (struct xref_value *) from a Gedcom_val, if appropriate */
+/* It gives a gedcom_warning if the cast is not correct */
+#define GEDCOM_XREF_PTR(VAL) \
+ GV_CHECK_CAST(VAL, GV_XREF_PTR, xref_val, &def_xref_val)
+#define GEDCOM_IS_XREF_PTR(VAL) \
+ GV_IS_TYPE(VAL, GV_XREF_PTR)
typedef void
(*Gedcom_msg_handler)
typedef Gedcom_ctxt
(*Gedcom_rec_start_cb)
- (int level, char *xref, char *tag);
+ (int level, Gedcom_val xref, char *tag, char *raw_value,
+ int tag_value, Gedcom_val parsed_value);
typedef void
(*Gedcom_rec_end_cb)
(Gedcom_ctxt self);
typedef Gedcom_ctxt
(*Gedcom_elt_start_cb)
(Gedcom_ctxt parent,
- int level, char *tag, char *raw_value, Gedcom_val parsed_value);
+ int level, char *tag, char *raw_value,
+ int tag_value, Gedcom_val parsed_value);
typedef void
(*Gedcom_elt_end_cb)
(Gedcom_ctxt parent, Gedcom_ctxt self, Gedcom_val parsed_value);
typedef void
(*Gedcom_def_cb)
- (Gedcom_ctxt parent, int level, char *tag, char *raw_value);
+ (Gedcom_ctxt parent, int level, char *tag, char *raw_value,
+ int tag_value);
int gedcom_parse_file(char* file_name);
void gedcom_set_debug_level(int level, FILE* trace_output);