1 /* Source object 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.
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.
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.
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
27 #include "source_event.h"
29 #include "source_description.h"
30 #include "repository.h"
31 #include "multimedia_link.h"
33 #include "change_date.h"
37 #include "gom_internal.h"
39 struct source* gom_first_source = NULL;
41 REC_CB(source, sour_start, make_source_record)
42 GET_REC_BY_XREF(source, XREF_SOUR, gom_get_source_by_xref)
43 NULL_CB(source, sour_data_start)
44 STRING_CB(source, sour_data_agnc_start, data.agency)
45 NULL_CB(source, sour_auth_start) /* value set by end callback */
46 NULL_CB(source, sour_titl_start) /* value set by end callback */
47 STRING_CB(source, sour_abbr_start, abbreviation)
48 NULL_CB(source, sour_publ_start) /* value set by end callback */
49 NULL_CB(source, sour_text_start) /* value set by end callback */
50 XREF_CB(source, sour_repo_start, repository.link, make_repository_record)
52 void sour_auth_end(_ELT_END_PARAMS_)
54 Gom_ctxt ctxt = (Gom_ctxt)self;
59 struct source *sour = SAFE_CTXT_CAST(source, ctxt);
61 char *str = GEDCOM_STRING(parsed_value);
62 char *newvalue = strdup(str);
66 sour->author = newvalue;
71 void sour_titl_end(_ELT_END_PARAMS_)
73 Gom_ctxt ctxt = (Gom_ctxt)self;
78 struct source *sour = SAFE_CTXT_CAST(source, ctxt);
80 char *str = GEDCOM_STRING(parsed_value);
81 char *newvalue = strdup(str);
85 sour->title = newvalue;
90 void sour_publ_end(_ELT_END_PARAMS_)
92 Gom_ctxt ctxt = (Gom_ctxt)self;
97 struct source *sour = SAFE_CTXT_CAST(source, ctxt);
99 char *str = GEDCOM_STRING(parsed_value);
100 char *newvalue = strdup(str);
104 sour->publication = newvalue;
109 void sour_text_end(_ELT_END_PARAMS_)
111 Gom_ctxt ctxt = (Gom_ctxt)self;
116 struct source *sour = SAFE_CTXT_CAST(source, ctxt);
118 char *str = GEDCOM_STRING(parsed_value);
119 char *newvalue = strdup(str);
123 sour->text = newvalue;
128 void source_subscribe()
130 gedcom_subscribe_to_record(REC_SOUR, sour_start, def_rec_end);
131 gedcom_subscribe_to_element(ELT_SOUR_DATA, sour_data_start, def_elt_end);
132 gedcom_subscribe_to_element(ELT_SOUR_DATA_AGNC, sour_data_agnc_start,
134 gedcom_subscribe_to_element(ELT_SOUR_AUTH, sour_auth_start, sour_auth_end);
135 gedcom_subscribe_to_element(ELT_SOUR_TITL, sour_titl_start, sour_titl_end);
136 gedcom_subscribe_to_element(ELT_SOUR_ABBR, sour_abbr_start, def_elt_end);
137 gedcom_subscribe_to_element(ELT_SOUR_PUBL, sour_publ_start, sour_publ_end);
138 gedcom_subscribe_to_element(ELT_SOUR_TEXT, sour_text_start, sour_text_end);
139 gedcom_subscribe_to_element(ELT_SUB_REPO, sour_repo_start, def_elt_end);
142 void source_add_event(Gom_ctxt ctxt, struct source_event* evt)
144 struct source *sour = SAFE_CTXT_CAST(source, ctxt);
146 LINK_CHAIN_ELT(source_event, sour->data.event, evt);
149 void source_add_note_to_data(Gom_ctxt ctxt, struct note_sub* note)
151 struct source *sour = SAFE_CTXT_CAST(source, ctxt);
153 LINK_CHAIN_ELT(note_sub, sour->data.note, note);
156 void source_add_note_to_repo(Gom_ctxt ctxt, struct note_sub* note)
158 struct source *sour = SAFE_CTXT_CAST(source, ctxt);
160 LINK_CHAIN_ELT(note_sub, sour->repository.note, note);
163 void source_add_description(Gom_ctxt ctxt, struct source_description* desc)
165 struct source *sour = SAFE_CTXT_CAST(source, ctxt);
167 LINK_CHAIN_ELT(source_description, sour->repository.description, desc);
170 void source_add_mm_link(Gom_ctxt ctxt, struct multimedia_link* link)
172 struct source *sour = SAFE_CTXT_CAST(source, ctxt);
174 LINK_CHAIN_ELT(multimedia_link, sour->mm_link, link);
177 void source_add_note(Gom_ctxt ctxt, struct note_sub* note)
179 struct source *sour = SAFE_CTXT_CAST(source, ctxt);
181 LINK_CHAIN_ELT(note_sub, sour->note, note);
184 void source_add_user_ref(Gom_ctxt ctxt, struct user_ref_number* ref)
186 struct source *sour = SAFE_CTXT_CAST(source, ctxt);
188 LINK_CHAIN_ELT(user_ref_number, sour->ref, ref);
191 void source_set_record_id(Gom_ctxt ctxt, const char *rin)
193 struct source *sour = SAFE_CTXT_CAST(source, ctxt);
195 sour->record_id = strdup(rin);
196 if (! sour->record_id) MEMORY_ERROR;
200 void source_set_change_date(Gom_ctxt ctxt, struct change_date* chan)
202 struct source *sour = SAFE_CTXT_CAST(source, ctxt);
204 sour->change_date = chan;
207 void source_add_user_data(Gom_ctxt ctxt, struct user_data* data)
209 struct source *obj = SAFE_CTXT_CAST(source, ctxt);
211 LINK_CHAIN_ELT(user_data, obj->extra, data);
214 void source_cleanup(struct source* sour)
217 SAFE_FREE(sour->xrefstr);
218 DESTROY_CHAIN_ELTS(source_event, sour->data.event, source_event_cleanup);
219 SAFE_FREE(sour->data.agency)
220 DESTROY_CHAIN_ELTS(note_sub, sour->data.note, note_sub_cleanup);
221 SAFE_FREE(sour->author);
222 SAFE_FREE(sour->title);
223 SAFE_FREE(sour->abbreviation);
224 SAFE_FREE(sour->publication);
225 SAFE_FREE(sour->text);
226 DESTROY_CHAIN_ELTS(note_sub, sour->repository.note, note_sub_cleanup);
227 DESTROY_CHAIN_ELTS(source_description, sour->repository.description,
228 source_description_cleanup);
229 DESTROY_CHAIN_ELTS(multimedia_link, sour->mm_link,multimedia_link_cleanup);
230 DESTROY_CHAIN_ELTS(note_sub, sour->note, note_sub_cleanup);
231 DESTROY_CHAIN_ELTS(user_ref_number, sour->ref, user_ref_cleanup);
232 SAFE_FREE(sour->record_id);
233 change_date_cleanup(sour->change_date);
234 DESTROY_CHAIN_ELTS(user_data, sour->extra, user_data_cleanup);
238 void sources_cleanup()
240 DESTROY_CHAIN_ELTS(source, gom_first_source, source_cleanup);
243 struct source* gom_get_first_source()
245 return gom_first_source;
248 struct source* make_source_record(const char* xrefstr)
250 struct source* src = NULL;
251 MAKE_CHAIN_ELT(source, gom_first_source, src);
253 src->xrefstr = strdup(xrefstr);
254 if (! src->xrefstr) MEMORY_ERROR;