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
26 #include "submission.h"
27 #include "submitter.h"
32 #include "gom_internal.h"
34 struct header gom_header;
36 Gedcom_ctxt head_start(_REC_PARAMS_)
39 return (Gedcom_ctxt) MAKE_GOM_CTXT(rec, header, &gom_header);
42 /** This function updates the timestamp of the header.
44 \param t The time_t value giving the wanted timestamp
47 \retval nonzero on errors
49 int gom_header_update_timestamp(time_t t)
52 struct tm *tm_ptr = localtime(&t);
53 result |= update_date(&gom_header.date, tm_ptr);
54 result |= update_time(&gom_header.time, tm_ptr);
58 DEFINE_STRING_CB(header, head_sour_start, source.id)
59 DEFINE_STRING_CB(header, head_sour_name_start, source.name)
60 DEFINE_STRING_CB(header, head_sour_vers_start, source.version)
61 DEFINE_STRING_CB(header, head_sour_corp_start, source.corporation.name)
62 DEFINE_STRING_CB(header, head_sour_data_start, source.data.name)
63 DEFINE_DATE_CB(header, head_sour_data_date_start, source.data.date)
64 DEFINE_STRING_CB(header, head_sour_data_copr_start, source.data.copyright)
65 DEFINE_STRING_CB(header, head_dest_start, destination)
66 DEFINE_XREF_CB(header, head_subm_start, submitter, submitter)
67 DEFINE_XREF_CB(header, head_subn_start, submission, submission)
68 DEFINE_DATE_CB(header, head_date_start, date)
69 DEFINE_STRING_CB(header, head_date_time_start, time)
70 DEFINE_STRING_CB(header, head_file_start, filename)
71 DEFINE_STRING_CB(header, head_copr_start, copyright)
72 DEFINE_NULL_CB(header, head_gedc_start)
73 DEFINE_STRING_CB(header, head_gedc_vers_start, gedcom.version)
74 DEFINE_STRING_CB(header, head_gedc_form_start, gedcom.form)
75 DEFINE_STRING_CB(header, head_char_start, charset.name)
76 DEFINE_STRING_CB(header, head_char_vers_start, charset.version)
77 DEFINE_STRING_CB(header, head_lang_start, language)
78 DEFINE_NULL_CB(header, head_plac_start)
79 DEFINE_STRING_CB(header, head_plac_form_start, place_hierarchy)
80 DEFINE_NULL_CB(header, head_note_start) /* the end cb will fill the value */
81 DEFINE_STRING_END_CB(header, head_note_end, note)
83 DEFINE_ADDFUNC2_NOLIST(header, address, source.corporation.address)
84 DEFINE_ADDFUNC2(header, user_data, extra)
86 void header_add_phone(Gom_ctxt ctxt, const char* phone)
88 struct header *head = SAFE_CTXT_CAST(header, ctxt);
90 struct header_corporation *corp = &(head->source.corporation);
92 while (i<2 && corp->phone[i]) i++;
93 if (! corp->phone[i]) {
94 corp->phone[i] = strdup(phone);
95 if (! corp->phone[i]) MEMORY_ERROR;
100 void header_subscribe()
102 gedcom_subscribe_to_record(REC_HEAD, head_start, def_rec_end);
103 gedcom_subscribe_to_element(ELT_HEAD_SOUR, head_sour_start, def_elt_end);
104 gedcom_subscribe_to_element(ELT_HEAD_SOUR_NAME, head_sour_name_start,
106 gedcom_subscribe_to_element(ELT_HEAD_SOUR_VERS, head_sour_vers_start,
108 gedcom_subscribe_to_element(ELT_HEAD_SOUR_CORP, head_sour_corp_start,
110 gedcom_subscribe_to_element(ELT_HEAD_SOUR_DATA, head_sour_data_start,
112 gedcom_subscribe_to_element(ELT_HEAD_SOUR_DATA_DATE,
113 head_sour_data_date_start, def_elt_end);
114 gedcom_subscribe_to_element(ELT_HEAD_SOUR_DATA_COPR,
115 head_sour_data_copr_start, def_elt_end);
116 gedcom_subscribe_to_element(ELT_HEAD_DEST, head_dest_start, def_elt_end);
117 gedcom_subscribe_to_element(ELT_HEAD_DATE, head_date_start, def_elt_end);
118 gedcom_subscribe_to_element(ELT_HEAD_DATE_TIME,
119 head_date_time_start, def_elt_end);
120 gedcom_subscribe_to_element(ELT_HEAD_SUBM, head_subm_start, def_elt_end);
121 gedcom_subscribe_to_element(ELT_HEAD_SUBN, head_subn_start, def_elt_end);
122 gedcom_subscribe_to_element(ELT_HEAD_FILE, head_file_start, def_elt_end);
123 gedcom_subscribe_to_element(ELT_HEAD_COPR, head_copr_start, def_elt_end);
124 gedcom_subscribe_to_element(ELT_HEAD_GEDC, head_gedc_start, def_elt_end);
125 gedcom_subscribe_to_element(ELT_HEAD_GEDC_VERS,
126 head_gedc_vers_start, def_elt_end);
127 gedcom_subscribe_to_element(ELT_HEAD_GEDC_FORM,
128 head_gedc_form_start, def_elt_end);
129 gedcom_subscribe_to_element(ELT_HEAD_CHAR, head_char_start, def_elt_end);
130 gedcom_subscribe_to_element(ELT_HEAD_CHAR_VERS,
131 head_char_vers_start, def_elt_end);
132 gedcom_subscribe_to_element(ELT_HEAD_LANG, head_lang_start, def_elt_end);
133 gedcom_subscribe_to_element(ELT_HEAD_PLAC, head_plac_start, def_elt_end);
134 gedcom_subscribe_to_element(ELT_HEAD_PLAC_FORM,
135 head_plac_form_start, def_elt_end);
136 gedcom_subscribe_to_element(ELT_HEAD_NOTE, head_note_start, head_note_end);
139 void header_cleanup()
141 SAFE_FREE(gom_header.source.id);
142 SAFE_FREE(gom_header.source.name);
143 SAFE_FREE(gom_header.source.version);
144 SAFE_FREE(gom_header.source.corporation.name);
145 CLEANFUNC(address)(gom_header.source.corporation.address);
146 SAFE_FREE(gom_header.source.corporation.phone[0]);
147 SAFE_FREE(gom_header.source.corporation.phone[1]);
148 SAFE_FREE(gom_header.source.corporation.phone[2]);
149 SAFE_FREE(gom_header.source.data.name);
150 SAFE_FREE(gom_header.source.data.date);
151 SAFE_FREE(gom_header.source.data.copyright);
152 SAFE_FREE(gom_header.destination);
153 SAFE_FREE(gom_header.date);
154 SAFE_FREE(gom_header.time);
155 SAFE_FREE(gom_header.filename);
156 SAFE_FREE(gom_header.copyright);
157 SAFE_FREE(gom_header.gedcom.version);
158 SAFE_FREE(gom_header.gedcom.form);
159 SAFE_FREE(gom_header.charset.name);
160 SAFE_FREE(gom_header.charset.version);
161 SAFE_FREE(gom_header.language);
162 SAFE_FREE(gom_header.place_hierarchy);
163 SAFE_FREE(gom_header.note);
164 DESTROY_CHAIN_ELTS(user_data, gom_header.extra);
167 struct header* gom_get_header()
172 int write_header(Gedcom_write_hndl hndl)
177 result |= gedcom_write_record_str(hndl, REC_HEAD, NULL, NULL);
178 if (gom_header.charset.name)
179 result |= gedcom_write_element_str(hndl, ELT_HEAD_CHAR, 0, REC_HEAD,
180 gom_header.charset.name);
181 if (gom_header.charset.version)
182 result |= gedcom_write_element_str(hndl, ELT_HEAD_CHAR_VERS, 0,
184 gom_header.charset.version);
185 if (gom_header.source.id)
186 result |= gedcom_write_element_str(hndl, ELT_HEAD_SOUR, 0, REC_HEAD,
187 gom_header.source.id);
188 if (gom_header.source.name)
189 result |= gedcom_write_element_str(hndl, ELT_HEAD_SOUR_NAME, 0,
191 gom_header.source.name);
192 if (gom_header.source.version)
193 result |= gedcom_write_element_str(hndl, ELT_HEAD_SOUR_VERS, 0,
195 gom_header.source.version);
196 if (gom_header.source.corporation.name)
197 result |= gedcom_write_element_str(hndl, ELT_HEAD_SOUR_CORP, 0,
199 gom_header.source.corporation.name);
200 if (gom_header.source.corporation.address)
201 result |= write_address(hndl, ELT_HEAD_SOUR_CORP,
202 gom_header.source.corporation.address);
203 for (i = 0; i < 3 && gom_header.source.corporation.phone[i]; i++)
204 result |= gedcom_write_element_str(hndl, ELT_SUB_PHON, 0, ELT_HEAD_SOUR_CORP,
205 gom_header.source.corporation.phone[i]);
206 if (gom_header.source.data.name)
207 result |= gedcom_write_element_str(hndl, ELT_HEAD_SOUR_DATA, 0,
209 gom_header.source.data.name);
210 if (gom_header.source.data.date)
211 result |= gedcom_write_element_date(hndl, ELT_HEAD_SOUR_DATA_DATE, 0,
213 gom_header.source.data.date);
214 if (gom_header.source.data.copyright)
215 result |= gedcom_write_element_str(hndl, ELT_HEAD_SOUR_DATA_COPR, 0,
217 gom_header.source.data.copyright);
218 if (gom_header.destination)
219 result |= gedcom_write_element_str(hndl, ELT_HEAD_DEST, 0, REC_HEAD,
220 gom_header.destination);
222 result |= gedcom_write_element_date(hndl, ELT_HEAD_DATE, 0, REC_HEAD,
225 result |= gedcom_write_element_str(hndl, ELT_HEAD_DATE_TIME, 0,
226 ELT_HEAD_DATE, gom_header.time);
227 if (gom_header.submitter)
228 result |= gedcom_write_element_xref(hndl, ELT_HEAD_SUBM, 0, REC_HEAD,
229 gom_header.submitter);
230 if (gom_header.submission)
231 result |= gedcom_write_element_xref(hndl, ELT_HEAD_SUBN, 0, REC_HEAD,
232 gom_header.submission);
233 if (gom_header.filename)
234 result |= gedcom_write_element_str(hndl, ELT_HEAD_FILE, 0, REC_HEAD,
235 gom_header.filename);
236 if (gom_header.copyright)
237 result |= gedcom_write_element_str(hndl, ELT_HEAD_COPR, 0, REC_HEAD,
238 gom_header.copyright);
239 result |= gedcom_write_element_str(hndl, ELT_HEAD_GEDC, 0, REC_HEAD,
241 if (gom_header.gedcom.version)
242 result |= gedcom_write_element_str(hndl, ELT_HEAD_GEDC_VERS, 0,
244 gom_header.gedcom.version);
245 if (gom_header.gedcom.form)
246 result |= gedcom_write_element_str(hndl, ELT_HEAD_GEDC_FORM, 0,
248 gom_header.gedcom.form);
249 if (gom_header.language)
250 result |= gedcom_write_element_str(hndl, ELT_HEAD_LANG, 0,
252 gom_header.language);
253 if (gom_header.place_hierarchy) {
254 result |= gedcom_write_element_str(hndl, ELT_HEAD_PLAC, 0, REC_HEAD,
256 result |= gedcom_write_element_str(hndl, ELT_HEAD_PLAC_FORM, 0,
258 gom_header.place_hierarchy);
261 result |= gedcom_write_element_str(hndl, ELT_HEAD_NOTE, 0,
264 if (gom_header.extra)
265 result |= write_user_data(hndl, gom_header.extra);