Improved context handling, to allow elements out of context.
authorPeter Verthez <Peter.Verthez@advalvas.be>
Sun, 9 Feb 2003 14:19:46 +0000 (14:19 +0000)
committerPeter Verthez <Peter.Verthez@advalvas.be>
Sun, 9 Feb 2003 14:19:46 +0000 (14:19 +0000)
22 files changed:
gom/Makefile.am
gom/address.c
gom/association.c
gom/change_date.c
gom/event.c
gom/family_link.c
gom/func_template.h
gom/gom.c
gom/gom_internal.c
gom/gom_internal.h
gom/lds_event.c
gom/multimedia.c
gom/multimedia_link.c
gom/note.c
gom/note_sub.c
gom/personal_name.c
gom/place.c
gom/source_citation.c
gom/source_description.c
gom/source_event.c
gom/user_rec.c
gom/user_ref.c

index 13156a80cfc9e7705914047b042b7aa2db0081bf..227a9c2860cfdfd4090fe648c4045b8718ed7a12 100644 (file)
@@ -31,7 +31,8 @@ libgedcom_gom_la_SOURCES = gom.c \
                           source_event.c \
                           source_description.c \
                           user_rec.c \
-                          gom_modify.c
+                          gom_modify.c \
+                          gom_internal.c
 noinst_HEADERS = header.h \
                 submission.h \
                 submitter.h \
index 553fa12cb835d01773f36556efba2fa81c345776..58d11758b41b284ac1467dd6bd916afcd9c684cb 100644 (file)
@@ -43,7 +43,8 @@ Gedcom_ctxt sub_addr_start(_ELT_PARAMS_)
   else {
     struct address *addr = SUB_MAKEFUNC(address)();
     if (addr) {
-      switch (ctxt->ctxt_type) {
+      int type = ctxt_type(ctxt);
+      switch (type) {
        case ELT_HEAD_SOUR_CORP:
          ADDFUNC2_NOLIST(header,address)(ctxt, addr); break;
        case ELT_SUB_FAM_EVT:
@@ -60,7 +61,7 @@ Gedcom_ctxt sub_addr_start(_ELT_PARAMS_)
        case REC_SUBM:
          ADDFUNC2_NOLIST(submitter,address)(ctxt, addr); break;
        default:
-         UNEXPECTED_CONTEXT(ctxt->ctxt_type);
+         UNEXPECTED_CONTEXT(type);
       }
       result = MAKE_GOM_CTXT(elt, address, addr);
     }
@@ -76,7 +77,7 @@ Gedcom_ctxt sub_addr_cont_start(_ELT_PARAMS_)
   if (! ctxt)
     NO_CONTEXT;
   else {
-    result = make_gom_ctxt(elt, ctxt->ctxt_type, ctxt->ctxt_ptr);
+    result = dup_gom_ctxt(ctxt, elt);
   }
   return (Gedcom_ctxt)result;
 }
@@ -104,7 +105,8 @@ Gedcom_ctxt sub_phon_start(_ELT_PARAMS_)
     NO_CONTEXT;
   else {
     char *str = GEDCOM_STRING(parsed_value);
-    switch (ctxt->ctxt_type) {
+    int type = ctxt_type(ctxt);
+    switch (type) {
       case ELT_HEAD_SOUR_CORP:
        header_add_phone(ctxt, str); break;
       case ELT_SUB_FAM_EVT:
@@ -120,9 +122,9 @@ Gedcom_ctxt sub_phon_start(_ELT_PARAMS_)
       case REC_SUBM:
        submitter_add_phone(ctxt, str); break;
       default:
-       UNEXPECTED_CONTEXT(ctxt->ctxt_type);
+       UNEXPECTED_CONTEXT(type);
     }
-    result = make_gom_ctxt(elt, ctxt->obj_type, ctxt->ctxt_ptr);
+    result = dup_gom_ctxt(ctxt, elt);
   }
   return (Gedcom_ctxt)result;
 }
index 9e392099c5fe73daed06146a375ed7e339952c11..dc45c06324fa32a810c80a542d8270155e3dac56 100644 (file)
@@ -42,13 +42,14 @@ Gedcom_ctxt sub_assoc_start(_ELT_PARAMS_)
   else {
     struct association *assoc = SUB_MAKEFUNC(association)();
     if (assoc) {
+      int type = ctxt_type(ctxt);
       assoc->to = GEDCOM_XREF_PTR(parsed_value);
-      
-      switch (ctxt->ctxt_type) {
+
+      switch (type) {
        case REC_INDI:
          ADDFUNC2(individual,association)(ctxt, assoc);
        default:
-         UNEXPECTED_CONTEXT(ctxt->ctxt_type);
+         UNEXPECTED_CONTEXT(type);
       }
       result = MAKE_GOM_CTXT(elt, association, assoc);
     }
index 417dbf0523400e13e2f535832f7ee7150be3d0eb..605039d8d2b28ea7f0f460c0beef51c660ce123a 100644 (file)
@@ -48,7 +48,8 @@ Gedcom_ctxt sub_chan_start(_ELT_PARAMS_)
   else {
     struct change_date *chan = SUB_MAKEFUNC(change_date)();
     if (chan) {
-      switch (ctxt->ctxt_type) {
+      int type = ctxt_type(ctxt);
+      switch (type) {
        case REC_FAM:
          ADDFUNC2_NOLIST(family,change_date)(ctxt, chan); break;
        case REC_INDI:
@@ -64,7 +65,7 @@ Gedcom_ctxt sub_chan_start(_ELT_PARAMS_)
        case REC_SUBM:
          ADDFUNC2_NOLIST(submitter,change_date)(ctxt, chan); break;
        default:
-         UNEXPECTED_CONTEXT(ctxt->ctxt_type);
+         UNEXPECTED_CONTEXT(type);
       }
       result = MAKE_GOM_CTXT(elt, change_date, chan);
     }
index 3b45643c06265bcd735d176cf1e25010009533f5..b585a688abca91f686c7e5ac5d840e85ff0ff8fa 100644 (file)
@@ -65,13 +65,14 @@ Gedcom_ctxt sub_evt_start(_ELT_PARAMS_)
        }
 
        if (! err) {
-         switch (ctxt->ctxt_type) {
+         int type = ctxt_type(ctxt);
+         switch (type) {
            case REC_FAM:
              ADDFUNC2(family,event)(ctxt, evt); break;
            case REC_INDI:
              ADDFUNC2(individual,event)(ctxt, evt); break;
            default:
-             UNEXPECTED_CONTEXT(ctxt->ctxt_type);
+             UNEXPECTED_CONTEXT(type);
          }
          result = MAKE_GOM_CTXT(elt, event, evt);
        }
@@ -111,11 +112,12 @@ Gedcom_ctxt sub_attr_start(_ELT_PARAMS_)
        }
 
        if (! err) {
-         switch (ctxt->ctxt_type) {
+         int type = ctxt_type(ctxt);
+         switch (type) {
            case REC_INDI:
              ADDFUNC2_TOVAR(individual,event,attribute)(ctxt, evt); break;
            default:
-             UNEXPECTED_CONTEXT(ctxt->ctxt_type);
+             UNEXPECTED_CONTEXT(type);
          }
          result = MAKE_GOM_CTXT(elt, event, evt);
        }
@@ -160,7 +162,8 @@ Gedcom_ctxt sub_fam_evt_age_start(_ELT_PARAMS_)
     if (evt) {
       int err = 0;
       struct age_value age = GEDCOM_AGE(parsed_value);
-      switch (ctxt->ctxt_type) {
+      int type = ctxt_type(ctxt);
+      switch (type) {
        case ELT_SUB_FAM_EVT_HUSB:
          evt->husband_age = gedcom_new_age_value(&age);
          if (! evt->husband_age) {
@@ -176,7 +179,7 @@ Gedcom_ctxt sub_fam_evt_age_start(_ELT_PARAMS_)
          }
          break;
        default:
-         UNEXPECTED_CONTEXT(ctxt->ctxt_type);
+         UNEXPECTED_CONTEXT(type);
       }
       if (! err)
        result = MAKE_GOM_CTXT(elt, event, evt);
index 4ea3fc1c1bd1911504a671a15dbfacaf8668be0b..fe3f67997aa1f5d9872a25ff555ecc984d74d4de 100644 (file)
@@ -41,13 +41,14 @@ Gedcom_ctxt sub_fam_link_start(_ELT_PARAMS_)
   else {
     struct family_link *link = SUB_MAKEFUNC(family_link)();
     if (link) {
+      int type = ctxt_type(ctxt);
       link->family = GEDCOM_XREF_PTR(parsed_value);
       
-      switch (ctxt->ctxt_type) {
+      switch (type) {
        case REC_INDI:
          ADDFUNC2(individual,family_link)(ctxt, elt, link); break;
        default:
-         UNEXPECTED_CONTEXT(ctxt->ctxt_type);
+         UNEXPECTED_CONTEXT(type);
       }
       result = MAKE_GOM_CTXT(elt, family_link, link);
     }
index d5b22c5e21032d177283f20259362807b59b8020..dd17527302192260eff670fe246dad7d325aa514 100644 (file)
@@ -438,7 +438,7 @@ void ADDFUNC2_STRN(STRUCTTYPE,FIELD)(Gom_ctxt ctxt, const char *str)          \
        else                                                                  \
          obj->FIELD = newvalue;                                              \
       }                                                                       \
-      destroy_gom_ctxt(ctxt);                                                 \
+      def_elt_end(elt, parent, self, parsed_value);                           \
     }                                                                         \
   }
 
@@ -458,7 +458,7 @@ void ADDFUNC2_STRN(STRUCTTYPE,FIELD)(Gom_ctxt ctxt, const char *str)          \
        else                                                                  \
          obj->FIELD = newvalue;                                              \
       }                                                                       \
-      destroy_gom_ctxt(ctxt);                                                 \
+      def_rec_end(rec, self, parsed_value);                                   \
     }                                                                         \
   }
 
index 3e604159bc9f5a7849e88d003204c72e20302cad..6e27ab7bbf26b8949b6ce580874026b9ab14f8db 100644 (file)
--- a/gom/gom.c
+++ b/gom/gom.c
@@ -174,6 +174,26 @@ void gom_default_callback (Gedcom_elt elt UNUSED, Gedcom_ctxt parent UNUSED,
                  level, tag, raw_value);
 }
 
+void gom_mem_error(const char *filename, int line)
+{
+  gedcom_error(_("Could not allocate memory at %s, %d"), filename, line);
+}
+
+void gom_xref_already_in_use(const char *xrefstr)
+{
+  gedcom_error(_("Cross-reference key '%s' is already in use"), xrefstr);
+}
+
+void gom_move_error(const char* type)
+{
+  gedcom_warning(_("Could not move struct of type %s"), type);
+}
+
+void gom_find_error(const char* type)
+{
+  gedcom_warning(_("Could not find struct of type %s in chain"), type);
+}
+
 void set_xref_type(struct xref_value* xr, const char *str)
 {
   if (!strcasecmp(str, "FAM"))
index 359ec871a00a36307aca591b0e4b690f977de396..48e9d62e581280053a2c54dd7794502004f7e5a0 100644 (file)
@@ -37,6 +37,24 @@ const char* ctxt_names[] =
   "association", "source_event", "source_description"
 };
 
+/* Assumptions for context:
+    - In case of error, NULL is passed as context
+    - If not NULL, the ctxt_ptr of the context is not NULL also
+    - UNEXPECTED_CONTEXT is not treated as an error, but as a warning
+
+   The context chain keeps contexts until the end of the record, so that
+   elements out of context can be handled.
+*/
+
+struct Gom_ctxt_struct {
+  int ctxt_type;
+  OBJ_TYPE obj_type;
+  void* ctxt_ptr;
+  struct Gom_ctxt_struct* next;
+};
+
+struct Gom_ctxt_struct* ctxt_chain = NULL;
+
 Gom_ctxt make_gom_ctxt(int ctxt_type, OBJ_TYPE obj_type, void *ctxt_ptr)
 {
   Gom_ctxt ctxt   = (Gom_ctxt)malloc(sizeof(struct Gom_ctxt_struct));
@@ -46,10 +64,35 @@ Gom_ctxt make_gom_ctxt(int ctxt_type, OBJ_TYPE obj_type, void *ctxt_ptr)
     ctxt->ctxt_type = ctxt_type;
     ctxt->obj_type  = obj_type;
     ctxt->ctxt_ptr  = ctxt_ptr;
+    ctxt->next      = ctxt_chain;
+    ctxt_chain      = ctxt;
   }
   return ctxt;
 }
 
+Gom_ctxt dup_gom_ctxt(Gom_ctxt ctxt, int ctxt_type)
+{
+  return make_gom_ctxt(ctxt_type, ctxt->obj_type, ctxt->ctxt_ptr);
+}
+
+int ctxt_type(Gom_ctxt ctxt)
+{
+  return ctxt->ctxt_type;
+}
+
+OBJ_TYPE ctxt_obj_type(Gom_ctxt ctxt)
+{
+  return ctxt->obj_type;
+}
+
+void* safe_ctxt_cast(Gom_ctxt ctxt, OBJ_TYPE type, const char* file, int line)
+{
+  if (ctxt->obj_type != type) {
+    gom_cast_error(file, line, type, ctxt->obj_type);
+  }
+  return ctxt->ctxt_ptr;
+}
+
 void NULL_DESTROY(void* anything UNUSED)
 {
 }
@@ -74,16 +117,6 @@ void gom_cast_error(const char* file, int line,
   abort();
 }
 
-void gom_mem_error(const char *filename, int line)
-{
-  gedcom_error(_("Could not allocate memory at %s, %d"), filename, line);
-}
-
-void gom_xref_already_in_use(const char *xrefstr)
-{
-  gedcom_error(_("Cross-reference key '%s' is already in use"), xrefstr);
-}
-
 void gom_unexpected_context(const char* file, int line, OBJ_TYPE found)
 {
   const char* found_name    = "<out-of-bounds>";
@@ -99,27 +132,18 @@ void gom_no_context(const char* file, int line)
                 file, line);
 }
 
-void gom_move_error(const char* type)
-{
-  gedcom_warning(_("Could not move struct of type %s"), type);
-}
-
-void gom_find_error(const char* type)
-{
-  gedcom_warning(_("Could not find struct of type %s in chain"), type);
-}
-
-void def_rec_end(Gedcom_rec rec UNUSED, Gedcom_ctxt self,
+void def_rec_end(Gedcom_rec rec UNUSED, Gedcom_ctxt self UNUSED,
                 Gedcom_val parsed_value UNUSED)
 {
-  Gom_ctxt ctxt = (Gom_ctxt)self;
-  destroy_gom_ctxt(ctxt);
+  Gom_ctxt ctxt;
+  while (ctxt_chain) {
+    ctxt = ctxt_chain;
+    ctxt_chain = ctxt->next;
+    destroy_gom_ctxt(ctxt);
+  }
 }
 
-/* TODO: do this in a way so that elements out of context can be handled */
 void def_elt_end(Gedcom_elt elt UNUSED, Gedcom_ctxt parent UNUSED,
-                Gedcom_ctxt self, Gedcom_val parsed_value UNUSED)
+                Gedcom_ctxt self UNUSED, Gedcom_val parsed_value UNUSED)
 {
-  Gom_ctxt ctxt = (Gom_ctxt)self;
-  destroy_gom_ctxt(ctxt);
 }
index 9f1e6ea03c9556bc4826129352295ae643cdf259..3c604a2eb653ce4656b3adda2c92a39c9acceb58 100644 (file)
@@ -57,22 +57,15 @@ typedef enum {
   T_LAST
 } OBJ_TYPE;
 
-/* Assumptions for context:
-    - In case of error, NULL is passed as context
-    - If not NULL, the ctxt_ptr of the context is not NULL also
-    - UNEXPECTED_CONTEXT is not treated as an error, but as a warning
-*/
-
-struct Gom_ctxt_struct {
-  int ctxt_type;
-  OBJ_TYPE obj_type;
-  void* ctxt_ptr;
-};
-
+struct Gom_ctxt_struct;
 typedef struct Gom_ctxt_struct *Gom_ctxt;
 
 Gom_ctxt make_gom_ctxt(int ctxt_type, OBJ_TYPE obj_type, void *ctxt_ptr);
-void destroy_gom_ctxt(Gom_ctxt ctxt);
+Gom_ctxt dup_gom_ctxt(Gom_ctxt ctxt, int ctxt_type);
+void* safe_ctxt_cast(Gom_ctxt ctxt, OBJ_TYPE type, const char* file, int line);
+int ctxt_type(Gom_ctxt ctxt);
+OBJ_TYPE ctxt_obj_type(Gom_ctxt ctxt);
+
 void gom_cast_error(const char* file, int line,
                    OBJ_TYPE expected, OBJ_TYPE found);
 void gom_no_context(const char* file, int line);
@@ -90,10 +83,7 @@ int gom_write_xref_list(Gedcom_write_hndl hndl,
   make_gom_ctxt(CTXT_TYPE, T_ ## STRUCTTYPE, CTXT_PTR)
 
 #define SAFE_CTXT_CAST(STRUCTTYPE, VAL)                                       \
-  (((VAL)->obj_type == T_ ## STRUCTTYPE) ?                                    \
-   (VAL)->ctxt_ptr :                                                          \
-   (gom_cast_error(__FILE__, __LINE__, T_ ## STRUCTTYPE, (VAL)->obj_type),    \
-    (VAL)->ctxt_ptr))
+  safe_ctxt_cast(VAL, T_ ## STRUCTTYPE, __FILE__, __LINE__)
 
 #define SAFE_FREE(PTR)                                                        \
   if (PTR) {                                                                  \
index 799e23d75431b257447e8c96030ceea8530b3f28..5e287e46ef9ed2256682d9fbbddac50e3584a91f 100644 (file)
@@ -50,13 +50,14 @@ Gedcom_ctxt sub_lds_event_start(_ELT_PARAMS_)
        free(lds_evt);
       }
       else {
-       switch (ctxt->ctxt_type) {
+       int type = ctxt_type(ctxt);
+       switch (type) {
          case REC_FAM:
            ADDFUNC2(family,lds_event)(ctxt, lds_evt); break;
          case REC_INDI:
            ADDFUNC2(individual,lds_event)(ctxt, lds_evt); break;
          default:
-           UNEXPECTED_CONTEXT(ctxt->ctxt_type);
+           UNEXPECTED_CONTEXT(type);
        }
        result = MAKE_GOM_CTXT(elt, lds_event, lds_evt);
       }
index 9dbf90b5ee390d22015181cc7b534a05cfc14ac8..b7514e48d8f6022b7a88fdecf545163cd126ea92 100644 (file)
@@ -61,7 +61,7 @@ Gedcom_ctxt obje_blob_cont_start(_ELT_PARAMS_)
   if (! ctxt)
     NO_CONTEXT;
   else
-    result = make_gom_ctxt(elt, ctxt->obj_type, ctxt->ctxt_ptr);
+    result = dup_gom_ctxt(ctxt, elt);
   
   return (Gedcom_ctxt)result;
 }
index fda4feb20018bc098d78711b433da34071b61538..b2ee55925918c681fb28f201232de2affc275138 100644 (file)
@@ -46,10 +46,11 @@ Gedcom_ctxt sub_obje_start(_ELT_PARAMS_)
   else {
     struct multimedia_link *mm = SUB_MAKEFUNC(multimedia_link)();
     if (mm) {
+      int type = ctxt_type(ctxt);
       if (GEDCOM_IS_XREF_PTR(parsed_value))
        mm->reference = GEDCOM_XREF_PTR(parsed_value);
       
-      switch (ctxt->ctxt_type) {
+      switch (type) {
        case ELT_SUB_FAM_EVT:
        case ELT_SUB_FAM_EVT_EVEN:
        case ELT_SUB_INDIV_ATTR:
@@ -70,7 +71,7 @@ Gedcom_ctxt sub_obje_start(_ELT_PARAMS_)
        case REC_SUBM:
          ADDFUNC2(submitter,multimedia_link)(ctxt, mm); break;
        default:
-         UNEXPECTED_CONTEXT(ctxt->ctxt_type);
+         UNEXPECTED_CONTEXT(type);
       }
       result = MAKE_GOM_CTXT(elt, multimedia_link, mm);
     }
index 6d0dc8aa32ec7909dca13b3837199a86994c5408..2f1cba243ca61bd00efb4bb07bbf483608d62e30 100644 (file)
@@ -73,7 +73,7 @@ Gedcom_ctxt sub_cont_conc_start(_ELT_PARAMS_)
   if (! ctxt)
     NO_CONTEXT;
   else
-    result = make_gom_ctxt(elt, ctxt->obj_type, ctxt->ctxt_ptr);
+    result = dup_gom_ctxt(ctxt, elt);
   
   return (Gedcom_ctxt)result;
 }
index 7facc415060bb3786be424a282952525be452b3b..f8dedefa46ff1496b7a7d6ee1d48e2060dbe0f08 100644 (file)
@@ -54,10 +54,11 @@ Gedcom_ctxt sub_note_start(_ELT_PARAMS_)
   else {
     struct note_sub *note = SUB_MAKEFUNC(note_sub)();
     if (note) {
+      int type = ctxt_type(ctxt);
       if (GEDCOM_IS_XREF_PTR(parsed_value))
        note->reference = GEDCOM_XREF_PTR(parsed_value);
 
-      switch (ctxt->ctxt_type) {
+      switch (type) {
        case ELT_SUB_PLAC:
          ADDFUNC2(place,note_sub)(ctxt, note); break;
        case ELT_SUB_FAM_EVT:
@@ -101,7 +102,7 @@ Gedcom_ctxt sub_note_start(_ELT_PARAMS_)
        case REC_SOUR:
          ADDFUNC2(source,note_sub)(ctxt, note); break;
        default:
-         UNEXPECTED_CONTEXT(ctxt->ctxt_type);
+         UNEXPECTED_CONTEXT(type);
       }
       result = MAKE_GOM_CTXT(elt, note_sub, note);
     }
index 686422fc3b88f2e8a228ee95e464fd2d9d72ca29..02de333272d2f58cbcb171eb7c726ec554093c67 100644 (file)
@@ -47,11 +47,12 @@ Gedcom_ctxt sub_name_start(_ELT_PARAMS_)
        free(name);
       }
       else {
-       switch (ctxt->ctxt_type) {
+       int type = ctxt_type(ctxt);
+       switch (type) {
          case REC_INDI:
            ADDFUNC2(individual,personal_name)(ctxt, name); break;
          default:
-           UNEXPECTED_CONTEXT(ctxt->ctxt_type);
+           UNEXPECTED_CONTEXT(type);
        }
        result = MAKE_GOM_CTXT(elt, personal_name, name);
       }
index 38ff377481d2330b1caef10a37bceac70addb1b4..779ea87881591a1c558d9fd06df7efe53aeb7840 100644 (file)
@@ -50,7 +50,8 @@ Gedcom_ctxt sub_place_start(_ELT_PARAMS_)
        free(place);
       }
       else {
-       switch (ctxt->ctxt_type) {
+       int type = ctxt_type(ctxt);
+       switch (type) {
          case ELT_SUB_FAM_EVT:
          case ELT_SUB_FAM_EVT_EVEN:
          case ELT_SUB_INDIV_ATTR:
@@ -61,7 +62,7 @@ Gedcom_ctxt sub_place_start(_ELT_PARAMS_)
          case ELT_SUB_INDIV_EVEN:
            ADDFUNC2_NOLIST(event,place)(ctxt, place); break;
          default:
-           UNEXPECTED_CONTEXT(ctxt->ctxt_type);
+           UNEXPECTED_CONTEXT(type);
        }
        result = MAKE_GOM_CTXT(elt, place, place);
       }
index 45dc8428a28ecfeeea8255fafe31de26247d06ff..406972a7b57a5df92eceee4765bb2e44fe8b2f7f 100644 (file)
@@ -49,10 +49,11 @@ Gedcom_ctxt sub_citation_start(_ELT_PARAMS_)
   else {
     struct source_citation *cit = SUB_MAKEFUNC(source_citation)();
     if (cit) {
+      int type = ctxt_type(ctxt);
       if (GEDCOM_IS_XREF_PTR(parsed_value))
        cit->reference = GEDCOM_XREF_PTR(parsed_value);
 
-      switch (ctxt->ctxt_type) {
+      switch (type) {
        case ELT_SUB_PLAC:
          ADDFUNC2(place,source_citation)(ctxt, cit); break;
        case ELT_SUB_FAM_EVT:
@@ -81,7 +82,7 @@ Gedcom_ctxt sub_citation_start(_ELT_PARAMS_)
        case REC_NOTE:
          ADDFUNC2(note,source_citation)(ctxt, cit); break;
        default:
-         UNEXPECTED_CONTEXT(ctxt->ctxt_type);
+         UNEXPECTED_CONTEXT(type);
       }
       result = MAKE_GOM_CTXT(elt, source_citation, cit);
     }
index 65e98ac92e99bf72cb82e1cdcef40106063c490e..02d093fbeb0cd6707e71e055fa06e55c921fa4e2 100644 (file)
@@ -47,11 +47,12 @@ Gedcom_ctxt sub_sour_caln_start(_ELT_PARAMS_)
        free(desc);
       }
       else {
-       switch (ctxt->ctxt_type) {
+       int type = ctxt_type(ctxt);
+       switch (type) {
          case ELT_SUB_REPO:
            ADDFUNC2(source,source_description)(ctxt, desc); break;
          default:
-           UNEXPECTED_CONTEXT(ctxt->ctxt_type);
+           UNEXPECTED_CONTEXT(type);
        }
        result = MAKE_GOM_CTXT(elt, source_description, desc);
       }
index 319dbb7f8c0b854d2d2fe9d26bbca7ca709e5633..a7756c38968e59c95a03584f03b52599f09a80c3 100644 (file)
@@ -47,11 +47,12 @@ Gedcom_ctxt sub_sour_even_start(_ELT_PARAMS_)
        free(evt);
       }
       else {
-       switch (ctxt->ctxt_type) {
+       int type = ctxt_type(ctxt);
+       switch (type) {
          case ELT_SOUR_DATA:
            ADDFUNC2(source,source_event)(ctxt, evt); break;
          default:
-           UNEXPECTED_CONTEXT(ctxt->ctxt_type);
+           UNEXPECTED_CONTEXT(type);
        }
        result = MAKE_GOM_CTXT(elt, source_event, evt);
       }
index ba1dc5eca4145b42a2f5b0b1714bd5072ad27043..9531cf144f58fd4cc28a34224c587daf53e81dec 100644 (file)
@@ -181,7 +181,7 @@ Gedcom_ctxt user_elt_start(_ELT_PARAMS_)
        data->xref_value = GEDCOM_XREF_PTR(parsed_value);
 
       if (! err) {
-       switch (ctxt->obj_type) {
+       switch (ctxt_obj_type(ctxt)) {
          case T_header:
            ADDFUNC2(header,user_data)(ctxt, data); break;
          case T_submission:
@@ -231,9 +231,9 @@ Gedcom_ctxt user_elt_start(_ELT_PARAMS_)
          case T_source_description:
            ADDFUNC2(source_description,user_data)(ctxt, data); break;
          default:
-           UNEXPECTED_CONTEXT(ctxt->ctxt_type);
+           UNEXPECTED_CONTEXT(ctxt_type(ctxt));
        }
-       result = make_gom_ctxt(elt, ctxt->obj_type, ctxt->ctxt_ptr);
+       result = dup_gom_ctxt(ctxt, elt);
       }
     }
   }
index 1dac775aba5eb8cc633704ceb3a247b7c634fc71..c43874f829d2561d277540d4fc30ccef28774ec9 100644 (file)
@@ -51,7 +51,8 @@ Gedcom_ctxt sub_user_ref_start(_ELT_PARAMS_)
        free(refn);
       }
       else {
-       switch (ctxt->ctxt_type) {
+       int type = ctxt_type(ctxt);
+       switch (type) {
          case REC_FAM:
            ADDFUNC2(family,user_ref_number)(ctxt, refn); break;
          case REC_INDI:
@@ -65,7 +66,7 @@ Gedcom_ctxt sub_user_ref_start(_ELT_PARAMS_)
          case REC_SOUR:
            ADDFUNC2(source,user_ref_number)(ctxt, refn); break;
          default:
-           UNEXPECTED_CONTEXT(ctxt->ctxt_type);
+           UNEXPECTED_CONTEXT(type);
        }
        
        result = MAKE_GOM_CTXT(elt, user_ref_number, refn);
@@ -95,8 +96,9 @@ Gedcom_ctxt sub_user_rin_start(_ELT_PARAMS_)
     NO_CONTEXT;
   else {
     char *str = GEDCOM_STRING(parsed_value);
+    int type = ctxt_type(ctxt);
 
-    switch (ctxt->ctxt_type) {
+    switch (type) {
       case REC_FAM:
        ADDFUNC2_STR(family,record_id)(ctxt, str); break;
       case REC_INDI:
@@ -110,9 +112,9 @@ Gedcom_ctxt sub_user_rin_start(_ELT_PARAMS_)
       case REC_SOUR:
        ADDFUNC2_STR(source,record_id)(ctxt, str); break;
       default:
-       UNEXPECTED_CONTEXT(ctxt->ctxt_type);
+       UNEXPECTED_CONTEXT(type);
     }
-    result = make_gom_ctxt(elt, ctxt->obj_type, ctxt->ctxt_ptr);
+    result = dup_gom_ctxt(ctxt, elt);
   }
   return (Gedcom_ctxt)result;
 }