Allow elements out of context in GOM.
[gedcom-parse.git] / gom / individual.c
index 07e69b1b9af1550d1565446c8c6b9a0b6972095f..b9652ef87ca28e557bb3a464059af1ec0b217f94 100644 (file)
 
 struct individual* gom_first_individual = NULL;
 
-REC_CB(individual, indi_start, make_individual_record)
-GET_REC_BY_XREF(individual, XREF_INDI, gom_get_individual_by_xref)
-STRING_CB(individual, indi_resn_start, restriction_notice)
-STRING_CB(individual, indi_sex_start, sex)
-XREF_LIST_CB(individual, indi_subm_start, submitters, make_submitter_record)
-XREF_LIST_CB(individual, indi_alia_start, alias, make_individual_record)
-XREF_LIST_CB(individual, indi_anci_start, ancestor_interest,
-            make_submitter_record)
-XREF_LIST_CB(individual, indi_desi_start, descendant_interest,
-            make_submitter_record)
-STRING_CB(individual, indi_rfn_start, record_file_nr)
-STRING_CB(individual, indi_afn_start, ancestral_file_nr)
+DEFINE_MAKEFUNC(individual, gom_first_individual)
+DEFINE_DESTROYFUNC(individual, gom_first_individual)
+DEFINE_ADDFUNC(individual, XREF_INDI)
+DEFINE_DELETEFUNC(individual)
+DEFINE_GETXREFFUNC(individual, XREF_INDI)
+     
+DEFINE_REC_CB(individual, indi_start)
+DEFINE_STRING_CB(individual, indi_resn_start, restriction_notice)
+DEFINE_STRING_CB(individual, indi_sex_start, sex)
+DEFINE_XREF_LIST_CB(individual, indi_subm_start, submitters, submitter)
+DEFINE_XREF_LIST_CB(individual, indi_alia_start, alias, individual)
+DEFINE_XREF_LIST_CB(individual, indi_anci_start, ancestor_interest, submitter)
+DEFINE_XREF_LIST_CB(individual, indi_desi_start, descendant_interest,submitter)
+DEFINE_STRING_CB(individual, indi_rfn_start, record_file_nr)
+DEFINE_STRING_CB(individual, indi_afn_start, ancestral_file_nr)
+
+DEFINE_ADDFUNC2(individual, event, event)
+DEFINE_ADDFUNC2_TOVAR(individual, event, attribute)
+DEFINE_ADDFUNC2(individual, personal_name, name)
+DEFINE_ADDFUNC2(individual, lds_event, lds_individual_ordinance)
+DEFINE_ADDFUNC2(individual, association, association)
+DEFINE_ADDFUNC2(individual, source_citation, citation)
+DEFINE_ADDFUNC2(individual, multimedia_link, mm_link)
+DEFINE_ADDFUNC2(individual, note_sub, note)
+DEFINE_ADDFUNC2(individual, user_ref_number, ref)
+DEFINE_ADDFUNC2(individual, user_data, extra)
+DEFINE_ADDFUNC2_NOLIST(individual, change_date, change_date)
+DEFINE_ADDFUNC2_STR(individual, record_id)
 
 void individual_subscribe()
 {
@@ -68,34 +84,6 @@ void individual_subscribe()
   gedcom_subscribe_to_element(ELT_INDI_AFN, indi_afn_start, def_elt_end);
 }
 
-void individual_add_event(Gom_ctxt ctxt, struct event* evt)
-{
-  struct individual *indiv = SAFE_CTXT_CAST(individual, ctxt);
-  if (indiv)
-    LINK_CHAIN_ELT(event, indiv->event, evt);
-}
-
-void individual_add_attribute(Gom_ctxt ctxt, struct event* evt)
-{
-  struct individual *indiv = SAFE_CTXT_CAST(individual, ctxt);
-  if (indiv)
-    LINK_CHAIN_ELT(event, indiv->attribute, evt);
-}
-
-void individual_add_name(Gom_ctxt ctxt, struct personal_name* name)
-{
-  struct individual *indiv = SAFE_CTXT_CAST(individual, ctxt);
-  if (indiv)
-    LINK_CHAIN_ELT(personal_name, indiv->name, name);
-}
-
-void individual_add_lio(Gom_ctxt ctxt, struct lds_event* evt)
-{
-  struct individual *indiv = SAFE_CTXT_CAST(individual, ctxt);
-  if (indiv)
-    LINK_CHAIN_ELT(lds_event, indiv->lds_individual_ordinance, evt);
-}
-
 void individual_add_family_link(Gom_ctxt ctxt, int ctxt_type,
                                struct family_link* link)
 {
@@ -114,98 +102,61 @@ void individual_add_family_link(Gom_ctxt ctxt, int ctxt_type,
   }
 }
 
-void individual_add_association(Gom_ctxt ctxt, struct association* assoc)
-{
-  struct individual *indiv = SAFE_CTXT_CAST(individual, ctxt);
-  if (indiv)
-    LINK_CHAIN_ELT(association, indiv->association, assoc);
-}
-
-void individual_add_citation(Gom_ctxt ctxt, struct source_citation* cit)
-{
-  struct individual *indiv = SAFE_CTXT_CAST(individual, ctxt);
-  if (indiv)
-    LINK_CHAIN_ELT(source_citation, indiv->citation, cit);
-}
-
-void individual_add_mm_link(Gom_ctxt ctxt, struct multimedia_link* link)
-{
-  struct individual *indiv = SAFE_CTXT_CAST(individual, ctxt);
-  if (indiv)
-    LINK_CHAIN_ELT(multimedia_link, indiv->mm_link, link);
-}
-
-void individual_add_note(Gom_ctxt ctxt, struct note_sub* note)
-{
-  struct individual *indiv = SAFE_CTXT_CAST(individual, ctxt);
-  if (indiv)
-    LINK_CHAIN_ELT(note_sub, indiv->note, note);
-}
-
-void individual_add_user_ref(Gom_ctxt ctxt, struct user_ref_number* ref)
-{
-  struct individual *indiv = SAFE_CTXT_CAST(individual, ctxt);
-  if (indiv)
-    LINK_CHAIN_ELT(user_ref_number, indiv->ref, ref);
-}
-
-void individual_set_record_id(Gom_ctxt ctxt, const char *rin)
-{
-  struct individual *indiv = SAFE_CTXT_CAST(individual, ctxt);
-  if (indiv) {
-    indiv->record_id = strdup(rin);
-    if (! indiv->record_id) MEMORY_ERROR;
+void UNREFALLFUNC(individual)(struct individual *obj)
+{
+  if (obj) {
+    UNREFALLFUNC(personal_name)(obj->name);
+    UNREFALLFUNC(event)(obj->event);
+    UNREFALLFUNC(event)(obj->attribute);
+    UNREFALLFUNC(lds_event)(obj->lds_individual_ordinance);
+    UNREFALLFUNC(family_link)(obj->child_to_family);
+    UNREFALLFUNC(family_link)(obj->spouse_to_family);
+    UNREFALLFUNC(xref_list)(obj->submitters);
+    UNREFALLFUNC(association)(obj->association);
+    UNREFALLFUNC(xref_list)(obj->alias);
+    UNREFALLFUNC(xref_list)(obj->ancestor_interest);
+    UNREFALLFUNC(xref_list)(obj->descendant_interest);
+    UNREFALLFUNC(source_citation)(obj->citation);
+    UNREFALLFUNC(multimedia_link)(obj->mm_link);
+    UNREFALLFUNC(note_sub)(obj->note);
+    UNREFALLFUNC(user_ref_number)(obj->ref);
+    UNREFALLFUNC(change_date)(obj->change_date);
+    UNREFALLFUNC(user_data)(obj->extra);
   }
 }
 
-void individual_set_change_date(Gom_ctxt ctxt, struct change_date* chan)
-{
-  struct individual *indiv = SAFE_CTXT_CAST(individual, ctxt);
-  if (indiv)
-    indiv->change_date = chan;
-}
-
-void individual_add_user_data(Gom_ctxt ctxt, struct user_data* data)
-{
-  struct individual *obj = SAFE_CTXT_CAST(individual, ctxt);
-  if (obj)
-    LINK_CHAIN_ELT(user_data, obj->extra, data);
-}
-
-void individual_cleanup(struct individual* indiv)
+void CLEANFUNC(individual)(struct individual* indiv)
 {
   if (indiv) {
     SAFE_FREE(indiv->xrefstr);
     SAFE_FREE(indiv->restriction_notice);
-    DESTROY_CHAIN_ELTS(personal_name, indiv->name, name_cleanup);
+    DESTROY_CHAIN_ELTS(personal_name, indiv->name);
     SAFE_FREE(indiv->sex);
-    DESTROY_CHAIN_ELTS(event, indiv->event, event_cleanup);
-    DESTROY_CHAIN_ELTS(event, indiv->attribute, event_cleanup);
-    DESTROY_CHAIN_ELTS(lds_event, indiv->lds_individual_ordinance,
-                      lds_event_cleanup);
-    DESTROY_CHAIN_ELTS(family_link,indiv->child_to_family,family_link_cleanup);
-    DESTROY_CHAIN_ELTS(family_link,indiv->spouse_to_family,
-                      family_link_cleanup);
-    DESTROY_CHAIN_ELTS(xref_list, indiv->submitters, NULL_DESTROY);
-    DESTROY_CHAIN_ELTS(association, indiv->association, association_cleanup);  
-    DESTROY_CHAIN_ELTS(xref_list, indiv->alias, NULL_DESTROY);
-    DESTROY_CHAIN_ELTS(xref_list, indiv->ancestor_interest, NULL_DESTROY);
-    DESTROY_CHAIN_ELTS(xref_list, indiv->descendant_interest, NULL_DESTROY);
-    DESTROY_CHAIN_ELTS(source_citation, indiv->citation, citation_cleanup);
-    DESTROY_CHAIN_ELTS(multimedia_link,indiv->mm_link,multimedia_link_cleanup);
-    DESTROY_CHAIN_ELTS(note_sub, indiv->note, note_sub_cleanup);
+    DESTROY_CHAIN_ELTS(event, indiv->event);
+    DESTROY_CHAIN_ELTS(event, indiv->attribute);
+    DESTROY_CHAIN_ELTS(lds_event, indiv->lds_individual_ordinance);
+    DESTROY_CHAIN_ELTS(family_link, indiv->child_to_family);
+    DESTROY_CHAIN_ELTS(family_link, indiv->spouse_to_family);
+    DESTROY_CHAIN_ELTS(xref_list, indiv->submitters);
+    DESTROY_CHAIN_ELTS(association, indiv->association);  
+    DESTROY_CHAIN_ELTS(xref_list, indiv->alias);
+    DESTROY_CHAIN_ELTS(xref_list, indiv->ancestor_interest);
+    DESTROY_CHAIN_ELTS(xref_list, indiv->descendant_interest);
+    DESTROY_CHAIN_ELTS(source_citation, indiv->citation);
+    DESTROY_CHAIN_ELTS(multimedia_link, indiv->mm_link);
+    DESTROY_CHAIN_ELTS(note_sub, indiv->note);
     SAFE_FREE(indiv->record_file_nr);
     SAFE_FREE(indiv->ancestral_file_nr);
-    DESTROY_CHAIN_ELTS(user_ref_number, indiv->ref, user_ref_cleanup);
+    DESTROY_CHAIN_ELTS(user_ref_number, indiv->ref);
     SAFE_FREE(indiv->record_id);
-    change_date_cleanup(indiv->change_date);
-    DESTROY_CHAIN_ELTS(user_data, indiv->extra, user_data_cleanup);
+    CLEANFUNC(change_date)(indiv->change_date);
+    DESTROY_CHAIN_ELTS(user_data, indiv->extra);
   }
 }
 
 void individuals_cleanup()
 {
-  DESTROY_CHAIN_ELTS(individual, gom_first_individual, individual_cleanup);
+  DESTROY_CHAIN_ELTS(individual, gom_first_individual);
 }
 
 struct individual* gom_get_first_individual()
@@ -213,13 +164,68 @@ struct individual* gom_get_first_individual()
   return gom_first_individual;
 }
 
-struct individual* make_individual_record(const char* xrefstr)
-{
-  struct individual* indiv = NULL;
-  MAKE_CHAIN_ELT(individual, gom_first_individual, indiv);
-  if (indiv) {
-    indiv->xrefstr = strdup(xrefstr);
-    if (! indiv->xrefstr) MEMORY_ERROR;
+int write_individuals(Gedcom_write_hndl hndl)
+{
+  int result = 0;
+  struct individual* obj;
+
+  for (obj = gom_first_individual; obj; obj = obj->next) {
+    result |= gedcom_write_record_str(hndl, REC_INDI, obj->xrefstr, NULL);
+    if (obj->restriction_notice)
+      result |= gedcom_write_element_str(hndl, ELT_INDI_RESN, 0,
+                                        REC_INDI, obj->restriction_notice);
+    if (obj->name)
+      result |= write_names(hndl, REC_INDI, obj->name);
+    if (obj->sex)
+      result |= gedcom_write_element_str(hndl, ELT_INDI_SEX, 0,
+                                        REC_INDI, obj->sex);
+    if (obj->event)
+      result |= write_events(hndl, REC_INDI, EVT_TYPE_INDIV_EVT, obj->event);
+    if (obj->attribute)
+      result |= write_events(hndl, REC_INDI, EVT_TYPE_INDIV_ATTR,
+                            obj->attribute);
+    if (obj->lds_individual_ordinance)
+      result |= write_lds_events(hndl, REC_INDI,
+                                obj->lds_individual_ordinance);
+    if (obj->child_to_family)
+      result |= write_family_links(hndl, REC_INDI, LINK_TYPE_CHILD,
+                                  obj->child_to_family);
+    if (obj->spouse_to_family)
+      result |= write_family_links(hndl, REC_INDI, LINK_TYPE_SPOUSE,
+                                  obj->spouse_to_family);
+    result |= gom_write_xref_list(hndl, ELT_INDI_SUBM, 0,
+                                 REC_INDI, obj->submitters);
+    if (obj->association)
+      result |= write_associations(hndl, REC_INDI, obj->association);
+    result |= gom_write_xref_list(hndl, ELT_INDI_ALIA, 0,
+                                 REC_INDI, obj->alias);
+    result |= gom_write_xref_list(hndl, ELT_INDI_ANCI, 0,
+                                 REC_INDI, obj->ancestor_interest);
+    result |= gom_write_xref_list(hndl, ELT_INDI_DESI, 0,
+                                 REC_INDI, obj->descendant_interest);
+    if (obj->citation)
+      result |= write_citations(hndl, REC_INDI, obj->citation);
+    if (obj->mm_link)
+      result |= write_multimedia_links(hndl, REC_INDI, obj->mm_link);
+    if (obj->note)
+      result |= write_note_subs(hndl, REC_INDI, obj->note);
+    if (obj->record_file_nr)
+      result |= gedcom_write_element_str(hndl, ELT_INDI_RFN, 0,
+                                        REC_INDI, obj->record_file_nr);
+    if (obj->ancestral_file_nr)
+      result |= gedcom_write_element_str(hndl, ELT_INDI_AFN, 0,
+                                        REC_INDI, obj->ancestral_file_nr);
+    if (obj->ref)
+      result |= write_user_refs(hndl, REC_INDI, obj->ref);
+    if (obj->record_id)
+      result |= gedcom_write_element_str(hndl, ELT_SUB_IDENT_RIN, 0,
+                                        REC_INDI, obj->record_id);
+    if (obj->change_date)
+      result |= write_change_date(hndl, REC_INDI, obj->change_date);
+    if (obj->extra)
+      result |= write_user_data(hndl, obj->extra);
   }
-  return indiv;
+  
+  return result;
 }
+