X-Git-Url: https://git.dlugolecki.net.pl/?a=blobdiff_plain;f=include%2Fgedcom.h;h=2b962dae797ec2e452c7f63bf87530452320611f;hb=dde5ff95f7459886b623527394df4fd352b2552d;hp=c64815d59387bf5f113dba80bae0d2f654d22ea2;hpb=afe308e9fee8026682b7261a7348211ebda8231a;p=gedcom-parse.git diff --git a/include/gedcom.h b/include/gedcom.h index c64815d..2b962da 100644 --- a/include/gedcom.h +++ b/include/gedcom.h @@ -1,5 +1,5 @@ /* 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 , 2001. @@ -28,6 +28,10 @@ __BEGIN_DECLS +#ifndef GEDCOM_INTERNAL +#include +#endif + /**************************************************************************/ /*** First the records and elements to subscribe upon ***/ /**************************************************************************/ @@ -128,6 +132,93 @@ typedef enum _ELT { 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, @@ -189,10 +280,14 @@ typedef enum _DATE_VAL_MOD { 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; @@ -215,6 +310,28 @@ struct date_value { 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 ***/ @@ -222,13 +339,16 @@ struct date_value { /**************************************************************************/ 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 { @@ -236,33 +356,52 @@ 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, "") +#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) @@ -270,7 +409,8 @@ typedef void 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); @@ -278,14 +418,16 @@ typedef void 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);