Corrections...
[gedcom-parse.git] / include / gedcom.h
index b2f7e69908508afa7aa9adcfa22c20ddaf3b5ab7..2b962dae797ec2e452c7f63bf87530452320611f 100644 (file)
@@ -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 <Peter.Verthez@advalvas.be>, 2001.
 
 
 __BEGIN_DECLS
 
+#ifndef GEDCOM_INTERNAL
+#include <gedcom-tags.h>
+#endif
+
 /**************************************************************************/
 /***  First the records and elements to subscribe upon                  ***/
 /**************************************************************************/
@@ -276,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;
@@ -302,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    ***/
@@ -311,12 +341,14 @@ 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 {
@@ -327,7 +359,9 @@ typedef struct _Gedcom_val_struct {
 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) ?                                                     \
@@ -341,9 +375,6 @@ extern struct date_value def_date_val;
 /***  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;
 
@@ -354,7 +385,7 @@ typedef Gedcom_val_struct* Gedcom_val;
 /* 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)
 
@@ -365,13 +396,21 @@ typedef Gedcom_val_struct* Gedcom_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)
         (Gedcom_msg_type type, char *msg);
 
 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);
@@ -379,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);