3 #include "familia_gedcom.h"
5 #include "../storage/storage.h"
6 #include "../storage/individual.h"
7 #include "../memory_stack.h"
9 Gedcom_ctxt familia_gedcom_header_start (Gedcom_rec rec,
15 Gedcom_val parsed_value)
17 fprintf(stderr, "The header starts (l: %d, tag: %s, raw:%s) \n", level, tag, raw_value);
18 return (Gedcom_ctxt)1;
21 void familia_gedcom_header_end (Gedcom_rec rec, Gedcom_ctxt self)
23 /* context will print as "1" */
24 fprintf(stderr, "The header ends, context is %d\n", (int)self);
27 Gedcom_ctxt familia_gedcom_header_source_start(Gedcom_elt elt,
33 Gedcom_val parsed_value)
35 char *source = GEDCOM_STRING(parsed_value);
36 printf("This file was created by %s\n", source);
41 void familia_gedcom_header_source_end(Gedcom_elt elt,
44 Gedcom_val parsed_value)
46 printf("End of the source description\n");
50 Gedcom_ctxt familia_gedcom_header_version_start(Gedcom_elt elt,
56 Gedcom_val parsed_value)
58 char *source = GEDCOM_STRING(parsed_value);
59 printf("Program version: %s (l: %d, tag: %s, raw:%s) \n", source, level, tag, raw_value);
63 void familia_gedcom_header_version_end(Gedcom_elt elt,
66 Gedcom_val parsed_value)
68 printf("End of the version description\n");
71 Gedcom_ctxt familia_gedcom_family_start (Gedcom_rec rec,
77 Gedcom_val parsed_value)
79 struct familia_family * family = NULL;
80 struct xref_value *xr = GEDCOM_XREF_PTR(xref);
82 family = familia_memory_stack_find(xr->string, FS_FAMILY);
84 return (Gedcom_ctxt)family;
87 void familia_gedcom_family_end (Gedcom_rec rec, Gedcom_ctxt self)
89 familia_storage_add_family(familia_storage_get_current(), self);
92 Gedcom_ctxt familia_gedcom_individual_start (Gedcom_rec rec,
98 Gedcom_val parsed_value)
100 struct familia_individual * individual = NULL;
101 struct xref_value *xr = GEDCOM_XREF_PTR(xref);
103 individual = familia_memory_stack_find(xr->string, FS_INDIVIDUAL);
105 return (Gedcom_ctxt)individual;
108 void familia_gedcom_individual_end (Gedcom_rec rec, Gedcom_ctxt self)
110 familia_storage_add_individual(familia_storage_get_current(), self);
113 Gedcom_ctxt familia_gedcom_individual_set_first_name(Gedcom_elt elt,
119 Gedcom_val parsed_value)
121 familia_individual_set_first_name(parent, GEDCOM_STRING(parsed_value));
125 void familia_gedcom_individual_first_name_end(Gedcom_elt elt,
128 Gedcom_val parsed_value)
132 Gedcom_ctxt familia_gedcom_individual_last_name_start(Gedcom_elt elt,
138 Gedcom_val parsed_value)
140 if (GEDCOM_IS_STRING(parsed_value)) {
141 familia_individual_set_last_name(parent, GEDCOM_STRING(parsed_value));
146 void familia_gedcom_individual_last_name_end(Gedcom_elt elt,
149 Gedcom_val parsed_value)
154 Gedcom_ctxt familia_gedcom_individual_add_family(Gedcom_elt elt,
160 Gedcom_val parsed_value)
162 void * object = NULL;
163 struct xref_value *xr = GEDCOM_XREF_PTR(parsed_value);
165 object = familia_memory_stack_find(xr->string, FS_FAMILY);
166 familia_individual_add_family(parent, object);
172 * Adds child to the family
174 Gedcom_ctxt familia_gedcom_family_add_child(Gedcom_elt elt,
180 Gedcom_val parsed_value)
182 void * object = NULL;
184 struct xref_value *xr = GEDCOM_XREF_PTR(parsed_value);
186 object = familia_memory_stack_find(xr->string, FS_FAMILY);
187 /* parent: REC_INDI */
188 familia_family_add_child(object, parent);
194 void familia_gedcom_individual_family_end(Gedcom_elt elt,
197 Gedcom_val parsed_value)
201 void familia_gedcom_error (Gedcom_msg_type type, char *msg)
203 fprintf(stderr, "> %s\n", msg);
208 void familia_gedcom_init()
210 gedcom_set_message_handler(familia_gedcom_error);
212 gedcom_subscribe_to_record(REC_HEAD,
213 familia_gedcom_header_start,
214 familia_gedcom_header_end);
215 gedcom_subscribe_to_element(ELT_HEAD_SOUR,
216 familia_gedcom_header_source_start,
218 gedcom_subscribe_to_element(ELT_HEAD_SOUR_VERS,
219 familia_gedcom_header_version_start,
221 gedcom_subscribe_to_record(REC_FAM,
222 familia_gedcom_family_start,
224 gedcom_subscribe_to_record(REC_INDI,
225 familia_gedcom_individual_start,
227 gedcom_subscribe_to_element(ELT_SUB_PERS_NAME,
228 familia_gedcom_individual_set_first_name,
230 gedcom_subscribe_to_element(ELT_SUB_PERS_NAME_SURN,
231 familia_gedcom_individual_last_name_start,
233 gedcom_subscribe_to_element(ELT_SUB_FAMS,
234 familia_gedcom_family_add_child,
236 gedcom_subscribe_to_element(ELT_SUB_FAMC,
237 familia_gedcom_family_add_child,
240 familia_memory_stack_init();
243 void familia_gedcom_dump_val(Gedcom_val val)
245 if (GEDCOM_IS_NULL(val)) {
246 fprintf(stderr, "| %25s |\n", "NULL");
248 else if (GEDCOM_IS_STRING(val)) {
249 fprintf(stderr, "| %4s | %20s |\n", "STRING", GEDCOM_STRING(val));
251 else if (GEDCOM_IS_DATE(val)) {
252 fprintf(stderr, "| %4s | %20s |\n", "DATE", "(@todo)");
254 else if (GEDCOM_IS_AGE(val)) {
255 fprintf(stderr, "| %4s | %20s |\n", "AGE", "(@todo)");
257 else if (GEDCOM_IS_XREF_PTR(val)) {
258 struct xref_value *xref = NULL;
259 fprintf(stderr, "| %25s | %15s | %4s |\n", "STRING", "OBJECT", "TYPE");
260 xref = GEDCOM_XREF_PTR(val);
261 fprintf(stderr, "| %25s | %15s | %4s |\n",
263 xref->object ? "initialized" : "NULL",
264 (xref->type == XREF_NONE) ? "NONE" :
265 (xref->type == XREF_FAM ) ? "FAM" :
266 (xref->type == XREF_INDI) ? "INDI" :
267 (xref->type == XREF_NOTE) ? "NOTE" :
268 (xref->type == XREF_OBJE) ? "OBJE" :
269 (xref->type == XREF_REPO) ? "REPO" :
270 (xref->type == XREF_SOUR) ? "SOUR" :
271 (xref->type == XREF_SUBM) ? "SUBM" :
272 (xref->type == XREF_SUBN) ? "SUBN" :
273 (xref->type == XREF_ANY ) ? "ANY" :
274 (xref->type == XREF_USER) ? "USER" : "???");
277 fprintf(stderr, "| %20s |\n", "???");