Only try to delete address if present.
[gedcom-parse.git] / gom / lds_event.c
1 /* LDS spouse sealing sub-structure in the gedcom object model.
2    Copyright (C) 2002 The Genes Development Team
3    This file is part of the Gedcom parser library.
4    Contributed by Peter Verthez <Peter.Verthez@advalvas.be>, 2002.
5
6    The Gedcom parser library is free software; you can redistribute it
7    and/or modify it under the terms of the GNU Lesser General Public
8    License as published by the Free Software Foundation; either
9    version 2.1 of the License, or (at your option) any later version.
10
11    The Gedcom parser library is distributed in the hope that it will be
12    useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14    Lesser General Public License for more details.
15
16    You should have received a copy of the GNU Lesser General Public
17    License along with the Gedcom parser library; if not, write to the
18    Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
19    02111-1307 USA.  */
20
21 /* $Id$ */
22 /* $Name$ */
23
24 #include <stdlib.h>
25 #include <string.h>
26 #include "lds_event.h"
27 #include "family.h"
28 #include "individual.h"
29 #include "note_sub.h"
30 #include "source_citation.h"
31 #include "user_rec.h"
32 #include "gom.h"
33 #include "gedcom.h"
34 #include "gom_internal.h"
35
36 Gedcom_ctxt sub_lds_event_start(_ELT_PARAMS_)
37 {
38   Gom_ctxt ctxt = (Gom_ctxt)parent;
39   Gom_ctxt result = NULL;
40
41   if (! ctxt)
42     NO_CONTEXT;
43   else {
44     struct lds_event *lds_evt = SUB_MAKEFUNC(lds_event)();
45     if (lds_evt) {
46       lds_evt->event = parsed_tag;
47       lds_evt->event_name = strdup(tag);
48       if (! lds_evt->event_name) {
49         MEMORY_ERROR;
50         free(lds_evt);
51       }
52       else {
53         switch (ctxt->ctxt_type) {
54           case REC_FAM:
55             ADDFUNC2(family,lds_event)(ctxt, lds_evt); break;
56           case REC_INDI:
57             ADDFUNC2(individual,lds_event)(ctxt, lds_evt); break;
58           default:
59             UNEXPECTED_CONTEXT(ctxt->ctxt_type);
60         }
61         result = MAKE_GOM_CTXT(elt, lds_event, lds_evt);
62       }
63     }
64   }
65
66   return (Gedcom_ctxt)result;
67 }
68
69 DEFINE_SUB_MAKEFUNC(lds_event)
70 DEFINE_SUB_ADDFUNC(lds_event)
71 DEFINE_SUB_FINDFUNC(lds_event)
72 DEFINE_SUB_REMOVEFUNC(lds_event)
73 DEFINE_SUB_MOVEFUNC(lds_event)
74      
75 DEFINE_STRING_CB(lds_event, sub_lds_event_stat_start, date_status)
76 DEFINE_DATE_CB(lds_event, sub_lds_event_date_start, date)
77 DEFINE_STRING_CB(lds_event, sub_lds_event_temp_start, temple_code)
78 DEFINE_STRING_CB(lds_event, sub_lds_event_plac_start, place_living_ordinance)
79 DEFINE_XREF_CB(lds_event, sub_lds_event_famc_start, family, family)
80
81 DEFINE_ADDFUNC2(lds_event, note_sub, note)
82 DEFINE_ADDFUNC2(lds_event, source_citation, citation)
83 DEFINE_ADDFUNC2(lds_event, user_data, extra)
84      
85 void lds_event_subscribe()
86 {
87   gedcom_subscribe_to_element(ELT_SUB_LSS_SLGS,
88                               sub_lds_event_start, def_elt_end);
89   gedcom_subscribe_to_element(ELT_SUB_LIO_BAPL,
90                               sub_lds_event_start, def_elt_end);
91   gedcom_subscribe_to_element(ELT_SUB_LIO_SLGC,
92                               sub_lds_event_start, def_elt_end);
93   gedcom_subscribe_to_element(ELT_SUB_LSS_SLGS_STAT,
94                               sub_lds_event_stat_start, def_elt_end);
95   gedcom_subscribe_to_element(ELT_SUB_LIO_BAPL_STAT,
96                               sub_lds_event_stat_start, def_elt_end);
97   gedcom_subscribe_to_element(ELT_SUB_LSS_SLGS_DATE,
98                               sub_lds_event_date_start, def_elt_end);
99   gedcom_subscribe_to_element(ELT_SUB_LIO_BAPL_DATE,
100                               sub_lds_event_date_start, def_elt_end);
101   gedcom_subscribe_to_element(ELT_SUB_LSS_SLGS_TEMP,
102                               sub_lds_event_temp_start, def_elt_end);
103   gedcom_subscribe_to_element(ELT_SUB_LIO_BAPL_TEMP,
104                               sub_lds_event_temp_start, def_elt_end);
105   gedcom_subscribe_to_element(ELT_SUB_LSS_SLGS_PLAC,
106                               sub_lds_event_plac_start, def_elt_end);
107   gedcom_subscribe_to_element(ELT_SUB_LIO_BAPL_PLAC,
108                               sub_lds_event_plac_start, def_elt_end);
109   gedcom_subscribe_to_element(ELT_SUB_LIO_SLGC_FAMC,
110                               sub_lds_event_famc_start, def_elt_end);
111 }
112
113 void UNREFALLFUNC(lds_event)(struct lds_event* obj)
114 {
115   if (obj) {
116     struct lds_event* runner;
117     for (runner = obj; runner; runner = runner->next) {
118       unref_xref_value(runner->family);
119       UNREFALLFUNC(source_citation)(runner->citation);
120       UNREFALLFUNC(note_sub)(runner->note);
121       UNREFALLFUNC(user_data)(runner->extra);
122     }
123   }
124 }
125
126 void CLEANFUNC(lds_event)(struct lds_event* lds)
127 {
128   if (lds) {
129     SAFE_FREE(lds->event_name);
130     SAFE_FREE(lds->date_status);
131     SAFE_FREE(lds->date);
132     SAFE_FREE(lds->temple_code);
133     SAFE_FREE(lds->place_living_ordinance);
134     DESTROY_CHAIN_ELTS(source_citation, lds->citation);  
135     DESTROY_CHAIN_ELTS(note_sub, lds->note);
136     DESTROY_CHAIN_ELTS(user_data, lds->extra);
137   }
138 }
139
140 static int get_gedcom_elt(int parsed_tag)
141 {
142   int obj_elt = 0;
143   switch (parsed_tag) {
144     case TAG_BAPL: case TAG_CONL: case TAG_ENDL:
145       obj_elt = ELT_SUB_LIO_BAPL; break;
146     case TAG_SLGC:
147       obj_elt = ELT_SUB_LIO_SLGC; break;
148     case TAG_SLGS:
149       obj_elt = ELT_SUB_LSS_SLGS; break;
150     default:
151       gedcom_warning(_("Internal error: unknown evt tag %d"), parsed_tag);
152   }
153   return obj_elt;
154 }
155   
156 int write_lds_events(Gedcom_write_hndl hndl, int parent, struct lds_event *lds)
157 {
158   int result = 0;
159   struct lds_event* obj;
160
161   if (!lds) return 1;
162
163   for (obj = lds; obj; obj = obj->next) {
164     int obj_elt = get_gedcom_elt(obj->event);
165     int lss = (obj_elt == ELT_SUB_LSS_SLGS);
166     result |= gedcom_write_element_str(hndl, obj_elt, obj->event,
167                                        parent, NULL);
168     if (obj->date_status)
169       result |= gedcom_write_element_str(hndl,
170                                          (lss ? ELT_SUB_LSS_SLGS_STAT :
171                                           ELT_SUB_LIO_BAPL_STAT), 0,
172                                          obj_elt, obj->date_status);
173     if (obj->date)
174       result |= gedcom_write_element_date(hndl,
175                                           (lss ? ELT_SUB_LSS_SLGS_DATE :
176                                            ELT_SUB_LIO_BAPL_DATE), 0,
177                                           obj_elt, obj->date);
178     if (obj->temple_code)
179       result |= gedcom_write_element_str(hndl,
180                                          (lss ? ELT_SUB_LSS_SLGS_TEMP :
181                                           ELT_SUB_LIO_BAPL_TEMP), 0,
182                                          obj_elt, obj->temple_code);
183     if (obj->place_living_ordinance)
184       result |= gedcom_write_element_str(hndl,
185                                          (lss ? ELT_SUB_LSS_SLGS_PLAC :
186                                           ELT_SUB_LIO_BAPL_PLAC), 0,
187                                          obj_elt, obj->place_living_ordinance);
188     if (obj->family)
189       result |= gedcom_write_element_xref(hndl, ELT_SUB_LIO_SLGC_FAMC, 0,
190                                           obj_elt, obj->family);
191     if (obj->citation)
192       result |= write_citations(hndl, obj_elt, obj->citation);
193     if (obj->note)
194       result |= write_note_subs(hndl, obj_elt, obj->note);
195     if (obj->extra)
196       result |= write_user_data(hndl, obj->extra);
197   }
198
199   return result;
200 }