Some changes to safe_buffer structure.
[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 "header.h"
25 #include "submission.h"
26 #include "submitter.h"
27 #include "address.h"
28 #include "user_rec.h"
29 #include "gom.h"
30 #include "gedcom.h"
31 #include "gom_internal.h"
32
33 struct header gom_header;
34
35 Gedcom_ctxt head_start(_REC_PARAMS_)
36 {
37   /* Nothing special */
38   return (Gedcom_ctxt) MAKE_GOM_CTXT(rec, header, &gom_header);
39 }
40
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 */
64      
65 void head_note_end(_ELT_END_PARAMS_)
66 {
67   Gom_ctxt ctxt = (Gom_ctxt)self;
68
69   if (! ctxt)
70     NO_CONTEXT;
71   else {
72     struct header *head = SAFE_CTXT_CAST(header, ctxt);
73     if (head) {
74       char *str = GEDCOM_STRING(parsed_value);
75       char *newvalue = strdup(str);
76       if (! newvalue)
77         MEMORY_ERROR;
78       else
79         head->note = newvalue;
80     }
81   }
82 }
83
84 void header_add_address(Gom_ctxt ctxt, struct address* addr)
85 {
86   struct header *head = SAFE_CTXT_CAST(header, ctxt);
87   if (head)
88     head->source.corporation.address = addr;
89 }
90
91 void header_add_phone(Gom_ctxt ctxt, const char* phone)
92 {
93   struct header *head = SAFE_CTXT_CAST(header, ctxt);
94   if (head) {
95     struct header_corporation *corp = &(head->source.corporation);
96     int i = 0;
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;
101     }
102   }
103 }
104
105 void header_add_user_data(Gom_ctxt ctxt, struct user_data* data)
106 {
107   struct header *head = SAFE_CTXT_CAST(header, ctxt);
108   if (head)
109     LINK_CHAIN_ELT(user_data, head->extra, data);
110 }
111
112 void header_subscribe()
113 {
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,
117                               def_elt_end);
118   gedcom_subscribe_to_element(ELT_HEAD_SOUR_VERS, head_sour_vers_start,
119                               def_elt_end);
120   gedcom_subscribe_to_element(ELT_HEAD_SOUR_CORP, head_sour_corp_start,
121                               def_elt_end);
122   gedcom_subscribe_to_element(ELT_HEAD_SOUR_DATA, head_sour_data_start,
123                               def_elt_end);
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);
149 }
150
151 void header_cleanup()
152 {
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);
177 }
178
179 struct header* gom_get_header()
180 {
181   return &gom_header;
182 }
183
184 int write_header(Gedcom_write_hndl hndl)
185 {
186   int result = 0;
187   
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,
194                                        ELT_HEAD_SOUR,
195                                        gom_header.source.name);
196   if (gom_header.source.version)
197     result |= gedcom_write_element_str(hndl, ELT_HEAD_SOUR_VERS, NULL,
198                                        ELT_HEAD_SOUR,
199                                        gom_header.source.version);
200   if (gom_header.source.corporation.name)
201     result |= gedcom_write_element_str(hndl, ELT_HEAD_SOUR_CORP, NULL,
202                                        ELT_HEAD_SOUR,
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,
206                                        ELT_HEAD_SOUR,
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,
210                                        ELT_HEAD_SOUR_DATA,
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,
222                                      NULL);
223   if (gom_header.gedcom.version)
224     result |= gedcom_write_element_str(hndl, ELT_HEAD_GEDC_VERS, NULL,
225                                        ELT_HEAD_GEDC,
226                                        gom_header.gedcom.version);
227   if (gom_header.gedcom.form)
228     result |= gedcom_write_element_str(hndl, ELT_HEAD_GEDC_FORM, NULL,
229                                        ELT_HEAD_GEDC,
230                                        gom_header.gedcom.form);
231   if (gom_header.charset.name)
232     result |= gedcom_write_element_str(hndl, ELT_HEAD_CHAR, NULL,
233                                        REC_HEAD,
234                                        gom_header.charset.name);
235   if (gom_header.charset.version)
236     result |= gedcom_write_element_str(hndl, ELT_HEAD_CHAR_VERS, NULL,
237                                        ELT_HEAD_CHAR,
238                                        gom_header.charset.version);
239   if (gom_header.language)
240     result |= gedcom_write_element_str(hndl, ELT_HEAD_LANG, NULL,
241                                        REC_HEAD,
242                                        gom_header.language);
243   if (gom_header.place_hierarchy) {
244     result |= gedcom_write_element_str(hndl, ELT_HEAD_PLAC, NULL, REC_HEAD,
245                                        NULL);
246     result |= gedcom_write_element_str(hndl, ELT_HEAD_PLAC_FORM, NULL,
247                                        ELT_HEAD_PLAC,
248                                        gom_header.place_hierarchy);
249   }
250   if (gom_header.note)
251     result |= gedcom_write_element_str(hndl, ELT_HEAD_NOTE, NULL,
252                                        REC_HEAD,
253                                        gom_header.note);
254   return result;
255 }