Definition of SUB_MAKEFUNC, SUB_ADDFUNC and SUB_DELETEFUNC.
[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
45       = (struct lds_event*)malloc(sizeof(struct lds_event));
46     if (! lds_evt)
47       MEMORY_ERROR;
48     else {
49       memset (lds_evt, 0, sizeof(struct lds_event));
50       lds_evt->event = parsed_tag;
51       lds_evt->event_name = strdup(tag);
52       if (! lds_evt->event_name) {
53         MEMORY_ERROR;
54         free(lds_evt);
55       }
56       else {
57         switch (ctxt->ctxt_type) {
58           case REC_FAM:
59             ADDFUNC2(family,lds_event)(ctxt, lds_evt); break;
60           case REC_INDI:
61             ADDFUNC2(individual,lds_event)(ctxt, lds_evt); break;
62           default:
63             UNEXPECTED_CONTEXT(ctxt->ctxt_type);
64         }
65         result = MAKE_GOM_CTXT(elt, lds_event, lds_evt);
66       }
67     }
68   }
69
70   return (Gedcom_ctxt)result;
71 }
72
73 DEFINE_STRING_CB(lds_event, sub_lds_event_stat_start, date_status)
74 DEFINE_DATE_CB(lds_event, sub_lds_event_date_start, date)
75 DEFINE_STRING_CB(lds_event, sub_lds_event_temp_start, temple_code)
76 DEFINE_STRING_CB(lds_event, sub_lds_event_plac_start, place_living_ordinance)
77 DEFINE_XREF_CB(lds_event, sub_lds_event_famc_start, family, family)
78
79 DEFINE_ADDFUNC2(lds_event, note_sub, note)
80 DEFINE_ADDFUNC2(lds_event, source_citation, citation)
81 DEFINE_ADDFUNC2(lds_event, user_data, extra)
82      
83 void lds_event_subscribe()
84 {
85   gedcom_subscribe_to_element(ELT_SUB_LSS_SLGS,
86                               sub_lds_event_start, def_elt_end);
87   gedcom_subscribe_to_element(ELT_SUB_LIO_BAPL,
88                               sub_lds_event_start, def_elt_end);
89   gedcom_subscribe_to_element(ELT_SUB_LIO_SLGC,
90                               sub_lds_event_start, def_elt_end);
91   gedcom_subscribe_to_element(ELT_SUB_LSS_SLGS_STAT,
92                               sub_lds_event_stat_start, def_elt_end);
93   gedcom_subscribe_to_element(ELT_SUB_LIO_BAPL_STAT,
94                               sub_lds_event_stat_start, def_elt_end);
95   gedcom_subscribe_to_element(ELT_SUB_LSS_SLGS_DATE,
96                               sub_lds_event_date_start, def_elt_end);
97   gedcom_subscribe_to_element(ELT_SUB_LIO_BAPL_DATE,
98                               sub_lds_event_date_start, def_elt_end);
99   gedcom_subscribe_to_element(ELT_SUB_LSS_SLGS_TEMP,
100                               sub_lds_event_temp_start, def_elt_end);
101   gedcom_subscribe_to_element(ELT_SUB_LIO_BAPL_TEMP,
102                               sub_lds_event_temp_start, def_elt_end);
103   gedcom_subscribe_to_element(ELT_SUB_LSS_SLGS_PLAC,
104                               sub_lds_event_plac_start, def_elt_end);
105   gedcom_subscribe_to_element(ELT_SUB_LIO_BAPL_PLAC,
106                               sub_lds_event_plac_start, def_elt_end);
107   gedcom_subscribe_to_element(ELT_SUB_LIO_SLGC_FAMC,
108                               sub_lds_event_famc_start, def_elt_end);
109 }
110
111 void CLEANFUNC(lds_event)(struct lds_event* lds)
112 {
113   if (lds) {
114     SAFE_FREE(lds->event_name);
115     SAFE_FREE(lds->date_status);
116     SAFE_FREE(lds->date);
117     SAFE_FREE(lds->temple_code);
118     SAFE_FREE(lds->place_living_ordinance);
119     DESTROY_CHAIN_ELTS(source_citation, lds->citation);  
120     DESTROY_CHAIN_ELTS(note_sub, lds->note);
121     DESTROY_CHAIN_ELTS(user_data, lds->extra);
122   }
123 }
124
125 static int get_gedcom_elt(int parsed_tag)
126 {
127   int obj_elt = 0;
128   switch (parsed_tag) {
129     case TAG_BAPL: case TAG_CONL: case TAG_ENDL:
130       obj_elt = ELT_SUB_LIO_BAPL; break;
131     case TAG_SLGC:
132       obj_elt = ELT_SUB_LIO_SLGC; break;
133     default:
134       gedcom_warning(_("Internal error: unknown evt tag %d"), parsed_tag);
135   }
136   return obj_elt;
137 }
138   
139 int write_lds_events(Gedcom_write_hndl hndl, int parent, struct lds_event *lds)
140 {
141   int result = 0;
142   struct lds_event* obj;
143
144   if (!lds) return 1;
145
146   for (obj = lds; obj; obj = obj->next) {
147     int obj_elt = get_gedcom_elt(obj->event);
148     result |= gedcom_write_element_str(hndl, obj_elt, obj->event,
149                                        parent, NULL);
150     if (obj->date_status)
151       result |= gedcom_write_element_str(hndl, ELT_SUB_LIO_BAPL_STAT, 0,
152                                          obj_elt, obj->date_status);
153     if (obj->date)
154       result |= gedcom_write_element_date(hndl, ELT_SUB_LIO_BAPL_DATE, 0,
155                                           obj_elt, obj->date);
156     if (obj->temple_code)
157       result |= gedcom_write_element_str(hndl, ELT_SUB_LIO_BAPL_TEMP, 0,
158                                          obj_elt, obj->temple_code);
159     if (obj->place_living_ordinance)
160       result |= gedcom_write_element_str(hndl, ELT_SUB_LIO_BAPL_PLAC, 0,
161                                          obj_elt, obj->place_living_ordinance);
162     if (obj->family)
163       result |= gedcom_write_element_xref(hndl, ELT_SUB_LIO_SLGC_FAMC, 0,
164                                           obj_elt, obj->family);
165     if (obj->citation)
166       result |= write_citations(hndl, obj_elt, obj->citation);
167     if (obj->note)
168       result |= write_note_subs(hndl, obj_elt, obj->note);
169     if (obj->extra)
170       result |= write_user_data(hndl, obj->extra);
171   }
172
173   return result;
174 }