Put common code in gom_internal.h
[gedcom-parse.git] / gom / source_citation.c
1 /* Source citation 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 "source_citation.h"
27 #include "place.h"
28 #include "event.h"
29 #include "note_sub.h"
30 #include "multimedia_link.h"
31 #include "lds_event.h"
32 #include "family.h"
33 #include "personal_name.h"
34 #include "individual.h"
35 #include "association.h"
36 #include "note.h"
37 #include "user_rec.h"
38 #include "gom.h"
39 #include "gedcom.h"
40 #include "gom_internal.h"
41
42 Gedcom_ctxt sub_citation_start(_ELT_PARAMS_)
43 {
44   Gom_ctxt ctxt = (Gom_ctxt)parent;
45   Gom_ctxt result = NULL;
46
47   if (! ctxt)
48     NO_CONTEXT;
49   else {
50     struct source_citation *cit
51       = (struct source_citation *)malloc(sizeof(struct source_citation));
52
53     if (! cit)
54       MEMORY_ERROR;
55     else {
56       memset (cit, 0, sizeof(struct source_citation));
57       if (GEDCOM_IS_XREF_PTR(parsed_value))
58         cit->reference = GEDCOM_XREF_PTR(parsed_value);
59
60       switch (ctxt->ctxt_type) {
61         case ELT_SUB_PLAC:
62           place_add_citation(ctxt, cit); break;
63         case ELT_SUB_FAM_EVT:
64         case ELT_SUB_FAM_EVT_EVEN:
65         case ELT_SUB_INDIV_ATTR:
66         case ELT_SUB_INDIV_RESI:
67         case ELT_SUB_INDIV_BIRT:
68         case ELT_SUB_INDIV_GEN:
69         case ELT_SUB_INDIV_ADOP:
70         case ELT_SUB_INDIV_EVEN:
71           event_add_citation(ctxt, cit); break;
72         case ELT_SUB_NOTE:
73           note_sub_add_citation(ctxt, cit); break;
74         case ELT_SUB_LSS_SLGS:
75         case ELT_SUB_LIO_BAPL:
76         case ELT_SUB_LIO_SLGC:
77           lds_event_add_citation(ctxt, cit); break;
78         case REC_FAM:
79           family_add_citation(ctxt, cit); break;
80         case ELT_SUB_PERS_NAME:
81           name_add_citation(ctxt, cit); break;
82         case REC_INDI:
83           individual_add_citation(ctxt, cit); break;
84         case ELT_SUB_ASSO:
85           association_add_citation(ctxt, cit); break;
86         case REC_NOTE:
87           note_add_citation(ctxt, cit); break;
88         default:
89           UNEXPECTED_CONTEXT(ctxt->ctxt_type);
90       }
91       result = MAKE_GOM_CTXT(elt, source_citation, cit);
92     }
93   }
94
95   return (Gedcom_ctxt)result;
96 }
97
98 void sub_citation_end(_ELT_END_PARAMS_)
99 {
100   Gom_ctxt ctxt = (Gom_ctxt)self;
101
102   if (! ctxt)
103     NO_CONTEXT;
104   else {
105     if (GEDCOM_IS_STRING(parsed_value)) {
106       struct source_citation *cit = SAFE_CTXT_CAST(source_citation, ctxt);
107       if (cit) {
108         char *str = GEDCOM_STRING(parsed_value);
109         char *newvalue = strdup(str);
110         if (! newvalue)
111           MEMORY_ERROR;
112         else
113           cit->description = newvalue;
114       }
115     }
116     destroy_gom_ctxt(ctxt);
117   }
118 }
119
120 Gedcom_ctxt sub_cit_text_start(_ELT_PARAMS_)
121 {
122   Gom_ctxt ctxt = (Gom_ctxt)parent;
123   Gom_ctxt result = NULL;
124
125   if (! ctxt)
126     NO_CONTEXT;
127   else {
128     struct source_citation *cit = SAFE_CTXT_CAST(source_citation, ctxt);
129     if (cit) {
130       struct text *t = NULL;
131       MAKE_CHAIN_ELT(text, cit->text, t);
132       if (t)
133         result = MAKE_GOM_CTXT(elt, text, t);
134     }
135   }
136   
137   return (Gedcom_ctxt)result;
138 }
139
140 STRING_CB(source_citation, sub_cit_page_start, page)
141 STRING_CB(source_citation, sub_cit_even_start, event)
142 STRING_CB(source_citation, sub_cit_even_role_start, role)
143 NULL_CB(source_citation, sub_cit_data_start)
144 DATE_CB(source_citation, sub_cit_data_date_start, date)
145 STRING_CB(source_citation, sub_cit_quay_start, quality)
146 STRING_END_CB(text, sub_cit_text_end, text)
147      
148 void citation_subscribe()
149 {
150   gedcom_subscribe_to_element(ELT_SUB_SOUR, sub_citation_start,
151                               sub_citation_end);
152   gedcom_subscribe_to_element(ELT_SUB_SOUR_PAGE, sub_cit_page_start,
153                               def_elt_end);
154   gedcom_subscribe_to_element(ELT_SUB_SOUR_EVEN, sub_cit_even_start,
155                               def_elt_end);
156   gedcom_subscribe_to_element(ELT_SUB_SOUR_EVEN_ROLE, sub_cit_even_role_start,
157                               def_elt_end);
158   gedcom_subscribe_to_element(ELT_SUB_SOUR_DATA, sub_cit_data_start,
159                               def_elt_end);
160   gedcom_subscribe_to_element(ELT_SUB_SOUR_DATA_DATE, sub_cit_data_date_start,
161                               def_elt_end);
162   gedcom_subscribe_to_element(ELT_SUB_SOUR_TEXT, sub_cit_text_start,
163                               sub_cit_text_end);
164   gedcom_subscribe_to_element(ELT_SUB_SOUR_QUAY, sub_cit_quay_start,
165                               def_elt_end);
166 }
167
168 void citation_add_note(Gom_ctxt ctxt, struct note_sub* note)
169 {
170   struct source_citation *cit = SAFE_CTXT_CAST(source_citation, ctxt);
171   if (cit)
172     LINK_CHAIN_ELT(note_sub, cit->note, note);    
173 }
174
175 void citation_add_mm_link(Gom_ctxt ctxt, struct multimedia_link* mm)
176 {
177   struct source_citation *cit = SAFE_CTXT_CAST(source_citation, ctxt);
178   if (cit)
179     LINK_CHAIN_ELT(multimedia_link, cit->mm_link, mm);    
180 }
181
182 void citation_add_user_data(Gom_ctxt ctxt, struct user_data* data)
183 {
184   struct source_citation *obj = SAFE_CTXT_CAST(source_citation, ctxt);
185   if (obj)
186     LINK_CHAIN_ELT(user_data, obj->extra, data);
187 }
188
189 void text_cleanup(struct text* t)
190 {
191   if (t) {
192     SAFE_FREE(t->text);
193   }
194 }
195
196 void citation_cleanup(struct source_citation* cit)
197 {
198   if (cit) {
199     SAFE_FREE(cit->description);
200     SAFE_FREE(cit->page);
201     SAFE_FREE(cit->event);
202     SAFE_FREE(cit->role);
203     SAFE_FREE(cit->date);
204     DESTROY_CHAIN_ELTS(text, cit->text, text_cleanup);
205     SAFE_FREE(cit->quality);
206     DESTROY_CHAIN_ELTS(multimedia_link, cit->mm_link, multimedia_link_cleanup);
207     DESTROY_CHAIN_ELTS(note_sub, cit->note, note_sub_cleanup);
208     DESTROY_CHAIN_ELTS(user_data, cit->extra, user_data_cleanup);
209   }
210 }