1 /* Header 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
25 #include "submission.h"
26 #include "submitter.h"
31 #include "gom_internal.h"
33 struct header gom_header;
35 Gedcom_ctxt head_start(_REC_PARAMS_)
38 return (Gedcom_ctxt) MAKE_GOM_CTXT(rec, header, &gom_header);
41 STRING_CB(header, head_sour_start, source.id)
42 STRING_CB(header, head_sour_name_start, source.name)
43 STRING_CB(header, head_sour_vers_start, source.version)
44 STRING_CB(header, head_sour_corp_start, source.corporation.name)
45 STRING_CB(header, head_sour_data_start, source.data.name)
46 DATE_CB(header, head_sour_data_date_start, source.data.date)
47 STRING_CB(header, head_sour_data_copr_start, source.data.copyright)
48 STRING_CB(header, head_dest_start, destination)
49 XREF_CB(header, head_subm_start, submitter, make_submitter_record)
50 XREF_CB(header, head_subn_start, submission, make_submission_record)
51 DATE_CB(header, head_date_start, date)
52 STRING_CB(header, head_date_time_start, time)
53 STRING_CB(header, head_file_start, filename)
54 STRING_CB(header, head_copr_start, copyright)
55 NULL_CB(header, head_gedc_start)
56 STRING_CB(header, head_gedc_vers_start, gedcom.version)
57 STRING_CB(header, head_gedc_form_start, gedcom.form)
58 STRING_CB(header, head_char_start, charset.name)
59 STRING_CB(header, head_char_vers_start, charset.version)
60 STRING_CB(header, head_lang_start, language)
61 NULL_CB(header, head_plac_start)
62 STRING_CB(header, head_plac_form_start, place_hierarchy)
63 NULL_CB(header, head_note_start) /* the end callback will fill the value */
65 void head_note_end(_ELT_END_PARAMS_)
67 Gom_ctxt ctxt = (Gom_ctxt)self;
72 struct header *head = SAFE_CTXT_CAST(header, ctxt);
74 char *str = GEDCOM_STRING(parsed_value);
75 char *newvalue = strdup(str);
79 head->note = newvalue;
84 void header_add_address(Gom_ctxt ctxt, struct address* addr)
86 struct header *head = SAFE_CTXT_CAST(header, ctxt);
88 head->source.corporation.address = addr;
91 void header_add_phone(Gom_ctxt ctxt, const char* phone)
93 struct header *head = SAFE_CTXT_CAST(header, ctxt);
95 struct header_corporation *corp = &(head->source.corporation);
97 while (i<2 && corp->phone[i]) i++;
98 if (! corp->phone[i]) {
99 corp->phone[i] = strdup(phone);
100 if (! corp->phone[i]) MEMORY_ERROR;
105 void header_add_user_data(Gom_ctxt ctxt, struct user_data* data)
107 struct header *head = SAFE_CTXT_CAST(header, ctxt);
109 LINK_CHAIN_ELT(user_data, head->extra, data);
112 void header_subscribe()
114 gedcom_subscribe_to_record(REC_HEAD, head_start, def_rec_end);
115 gedcom_subscribe_to_element(ELT_HEAD_SOUR, head_sour_start, def_elt_end);
116 gedcom_subscribe_to_element(ELT_HEAD_SOUR_NAME, head_sour_name_start,
118 gedcom_subscribe_to_element(ELT_HEAD_SOUR_VERS, head_sour_vers_start,
120 gedcom_subscribe_to_element(ELT_HEAD_SOUR_CORP, head_sour_corp_start,
122 gedcom_subscribe_to_element(ELT_HEAD_SOUR_DATA, head_sour_data_start,
124 gedcom_subscribe_to_element(ELT_HEAD_SOUR_DATA_DATE,
125 head_sour_data_date_start, def_elt_end);
126 gedcom_subscribe_to_element(ELT_HEAD_SOUR_DATA_COPR,
127 head_sour_data_copr_start, def_elt_end);
128 gedcom_subscribe_to_element(ELT_HEAD_DEST, head_dest_start, def_elt_end);
129 gedcom_subscribe_to_element(ELT_HEAD_DATE, head_date_start, def_elt_end);
130 gedcom_subscribe_to_element(ELT_HEAD_DATE_TIME,
131 head_date_time_start, def_elt_end);
132 gedcom_subscribe_to_element(ELT_HEAD_SUBM, head_subm_start, def_elt_end);
133 gedcom_subscribe_to_element(ELT_HEAD_SUBN, head_subn_start, def_elt_end);
134 gedcom_subscribe_to_element(ELT_HEAD_FILE, head_file_start, def_elt_end);
135 gedcom_subscribe_to_element(ELT_HEAD_COPR, head_copr_start, def_elt_end);
136 gedcom_subscribe_to_element(ELT_HEAD_GEDC, head_gedc_start, def_elt_end);
137 gedcom_subscribe_to_element(ELT_HEAD_GEDC_VERS,
138 head_gedc_vers_start, def_elt_end);
139 gedcom_subscribe_to_element(ELT_HEAD_GEDC_FORM,
140 head_gedc_form_start, def_elt_end);
141 gedcom_subscribe_to_element(ELT_HEAD_CHAR, head_char_start, def_elt_end);
142 gedcom_subscribe_to_element(ELT_HEAD_CHAR_VERS,
143 head_char_vers_start, def_elt_end);
144 gedcom_subscribe_to_element(ELT_HEAD_LANG, head_lang_start, def_elt_end);
145 gedcom_subscribe_to_element(ELT_HEAD_PLAC, head_plac_start, def_elt_end);
146 gedcom_subscribe_to_element(ELT_HEAD_PLAC_FORM,
147 head_plac_form_start, def_elt_end);
148 gedcom_subscribe_to_element(ELT_HEAD_NOTE, head_note_start, head_note_end);
151 void header_cleanup()
153 SAFE_FREE(gom_header.source.id);
154 SAFE_FREE(gom_header.source.name);
155 SAFE_FREE(gom_header.source.version);
156 SAFE_FREE(gom_header.source.corporation.name);
157 address_cleanup(gom_header.source.corporation.address);
158 SAFE_FREE(gom_header.source.corporation.phone[0]);
159 SAFE_FREE(gom_header.source.corporation.phone[1]);
160 SAFE_FREE(gom_header.source.corporation.phone[2]);
161 SAFE_FREE(gom_header.source.data.name);
162 SAFE_FREE(gom_header.source.data.date);
163 SAFE_FREE(gom_header.source.data.copyright);
164 SAFE_FREE(gom_header.destination);
165 SAFE_FREE(gom_header.date);
166 SAFE_FREE(gom_header.time);
167 SAFE_FREE(gom_header.filename);
168 SAFE_FREE(gom_header.copyright);
169 SAFE_FREE(gom_header.gedcom.version);
170 SAFE_FREE(gom_header.gedcom.form);
171 SAFE_FREE(gom_header.charset.name);
172 SAFE_FREE(gom_header.charset.version);
173 SAFE_FREE(gom_header.language);
174 SAFE_FREE(gom_header.place_hierarchy);
175 SAFE_FREE(gom_header.note);
176 DESTROY_CHAIN_ELTS(user_data, gom_header.extra, user_data_cleanup);
179 struct header* gom_get_header()
184 int write_header(Gedcom_write_hndl hndl)
188 result |= gedcom_write_record_str(hndl, REC_HEAD, NULL, NULL, NULL);
189 if (gom_header.source.id)
190 result |= gedcom_write_element_str(hndl, ELT_HEAD_SOUR, NULL, REC_HEAD,
191 gom_header.source.id);
192 if (gom_header.source.name)
193 result |= gedcom_write_element_str(hndl, ELT_HEAD_SOUR_NAME, NULL,
195 gom_header.source.name);
196 if (gom_header.source.version)
197 result |= gedcom_write_element_str(hndl, ELT_HEAD_SOUR_VERS, NULL,
199 gom_header.source.version);
200 if (gom_header.source.corporation.name)
201 result |= gedcom_write_element_str(hndl, ELT_HEAD_SOUR_CORP, NULL,
203 gom_header.source.corporation.name);
204 if (gom_header.source.data.name)
205 result |= gedcom_write_element_str(hndl, ELT_HEAD_SOUR_DATA, NULL,
207 gom_header.source.data.name);
208 if (gom_header.source.data.copyright)
209 result |= gedcom_write_element_str(hndl, ELT_HEAD_SOUR_DATA_COPR, NULL,
211 gom_header.source.data.copyright);
212 if (gom_header.destination)
213 result |= gedcom_write_element_str(hndl, ELT_HEAD_DEST, NULL, REC_HEAD,
214 gom_header.destination);
215 if (gom_header.filename)
216 result |= gedcom_write_element_str(hndl, ELT_HEAD_FILE, NULL, REC_HEAD,
217 gom_header.filename);
218 if (gom_header.copyright)
219 result |= gedcom_write_element_str(hndl, ELT_HEAD_COPR, NULL, REC_HEAD,
220 gom_header.copyright);
221 result |= gedcom_write_element_str(hndl, ELT_HEAD_GEDC, NULL, REC_HEAD,
223 if (gom_header.gedcom.version)
224 result |= gedcom_write_element_str(hndl, ELT_HEAD_GEDC_VERS, NULL,
226 gom_header.gedcom.version);
227 if (gom_header.gedcom.form)
228 result |= gedcom_write_element_str(hndl, ELT_HEAD_GEDC_FORM, NULL,
230 gom_header.gedcom.form);
231 if (gom_header.charset.name)
232 result |= gedcom_write_element_str(hndl, ELT_HEAD_CHAR, NULL,
234 gom_header.charset.name);
235 if (gom_header.charset.version)
236 result |= gedcom_write_element_str(hndl, ELT_HEAD_CHAR_VERS, NULL,
238 gom_header.charset.version);
239 if (gom_header.language)
240 result |= gedcom_write_element_str(hndl, ELT_HEAD_LANG, NULL,
242 gom_header.language);
243 if (gom_header.place_hierarchy) {
244 result |= gedcom_write_element_str(hndl, ELT_HEAD_PLAC, NULL, REC_HEAD,
246 result |= gedcom_write_element_str(hndl, ELT_HEAD_PLAC_FORM, NULL,
248 gom_header.place_hierarchy);
251 result |= gedcom_write_element_str(hndl, ELT_HEAD_NOTE, NULL,