ff67c35ab4483f3dd838ce47fd07ad6fff6f47a1
[gedcom-parse.git] / gom / header.c
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.
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 <time.h>
25 #include "header.h"
26 #include "submission.h"
27 #include "submitter.h"
28 #include "address.h"
29 #include "user_rec.h"
30 #include "gom.h"
31 #include "gedcom.h"
32 #include "gom_internal.h"
33
34 struct header gom_header;
35
36 Gedcom_ctxt head_start(_REC_PARAMS_)
37 {
38   /* Nothing special */
39   return (Gedcom_ctxt) MAKE_GOM_CTXT(rec, header, &gom_header);
40 }
41
42 /** This function updates the timestamp of the header.
43
44     \param t  The time_t value giving the wanted timestamp
45
46     \retval 0 on success
47     \retval nonzero on errors
48 */
49 int gom_header_update_timestamp(time_t t)
50 {
51   int result = 0;
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);
55   return result;
56 }
57
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)
82
83 DEFINE_ADDFUNC2_NOLIST(header, address, source.corporation.address)
84 DEFINE_ADDFUNC2(header, user_data, extra)
85      
86 void header_add_phone(Gom_ctxt ctxt, const char* phone)
87 {
88   struct header *head = SAFE_CTXT_CAST(header, ctxt);
89   if (head) {
90     struct header_corporation *corp = &(head->source.corporation);
91     int i = 0;
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;
96     }
97   }
98 }
99
100 void header_subscribe()
101 {
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,
105                               def_elt_end);
106   gedcom_subscribe_to_element(ELT_HEAD_SOUR_VERS, head_sour_vers_start,
107                               def_elt_end);
108   gedcom_subscribe_to_element(ELT_HEAD_SOUR_CORP, head_sour_corp_start,
109                               def_elt_end);
110   gedcom_subscribe_to_element(ELT_HEAD_SOUR_DATA, head_sour_data_start,
111                               def_elt_end);
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);
137 }
138
139 void header_cleanup()
140 {
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);
165 }
166
167 struct header* gom_get_header()
168 {
169   return &gom_header;
170 }
171
172 int write_header(Gedcom_write_hndl hndl)
173 {
174   int result = 0;
175   int i;
176   
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,
183                                        ELT_HEAD_CHAR,
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,
190                                        ELT_HEAD_SOUR,
191                                        gom_header.source.name);
192   if (gom_header.source.version)
193     result |= gedcom_write_element_str(hndl, ELT_HEAD_SOUR_VERS, 0,
194                                        ELT_HEAD_SOUR,
195                                        gom_header.source.version);
196   if (gom_header.source.corporation.name)
197     result |= gedcom_write_element_str(hndl, ELT_HEAD_SOUR_CORP, 0,
198                                        ELT_HEAD_SOUR,
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,
208                                        ELT_HEAD_SOUR,
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,
212                                         ELT_HEAD_SOUR_DATA,
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,
216                                        ELT_HEAD_SOUR_DATA,
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);
221   if (gom_header.date)
222     result |= gedcom_write_element_date(hndl, ELT_HEAD_DATE, 0, REC_HEAD,
223                                         gom_header.date);
224   if (gom_header.time)
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,
240                                      NULL);
241   if (gom_header.gedcom.version)
242     result |= gedcom_write_element_str(hndl, ELT_HEAD_GEDC_VERS, 0,
243                                        ELT_HEAD_GEDC,
244                                        gom_header.gedcom.version);
245   if (gom_header.gedcom.form)
246     result |= gedcom_write_element_str(hndl, ELT_HEAD_GEDC_FORM, 0,
247                                        ELT_HEAD_GEDC,
248                                        gom_header.gedcom.form);
249   if (gom_header.language)
250     result |= gedcom_write_element_str(hndl, ELT_HEAD_LANG, 0,
251                                        REC_HEAD,
252                                        gom_header.language);
253   if (gom_header.place_hierarchy) {
254     result |= gedcom_write_element_str(hndl, ELT_HEAD_PLAC, 0, REC_HEAD,
255                                        NULL);
256     result |= gedcom_write_element_str(hndl, ELT_HEAD_PLAC_FORM, 0,
257                                        ELT_HEAD_PLAC,
258                                        gom_header.place_hierarchy);
259   }
260   if (gom_header.note)
261     result |= gedcom_write_element_str(hndl, ELT_HEAD_NOTE, 0,
262                                        REC_HEAD,
263                                        gom_header.note);
264   if (gom_header.extra)
265     result |= write_user_data(hndl, gom_header.extra);
266   return result;
267 }