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);
171 void familia_gedcom_individual_family_end(Gedcom_elt elt,
174 Gedcom_val parsed_value)
178 void familia_gedcom_error (Gedcom_msg_type type, char *msg)
180 fprintf(stderr, "> %s\n", msg);
185 void familia_gedcom_init()
187 gedcom_set_message_handler(familia_gedcom_error);
189 gedcom_subscribe_to_record(REC_HEAD,
190 familia_gedcom_header_start,
191 familia_gedcom_header_end);
192 gedcom_subscribe_to_element(ELT_HEAD_SOUR,
193 familia_gedcom_header_source_start,
195 gedcom_subscribe_to_element(ELT_HEAD_SOUR_VERS,
196 familia_gedcom_header_version_start,
198 gedcom_subscribe_to_record(REC_FAM,
199 familia_gedcom_family_start,
201 gedcom_subscribe_to_record(REC_INDI,
202 familia_gedcom_individual_start,
204 gedcom_subscribe_to_element(ELT_SUB_PERS_NAME,
205 familia_gedcom_individual_set_first_name,
207 gedcom_subscribe_to_element(ELT_SUB_PERS_NAME_SURN,
208 familia_gedcom_individual_last_name_start,
210 gedcom_subscribe_to_element(ELT_SUB_FAMS,
211 familia_gedcom_individual_add_family,
214 familia_memory_stack_init();
217 void familia_gedcom_dump_val(Gedcom_val val)
219 if (GEDCOM_IS_NULL(val)) {
220 fprintf(stderr, "| %25s |\n", "NULL");
222 else if (GEDCOM_IS_STRING(val)) {
223 fprintf(stderr, "| %4s | %20s |\n", "STRING", GEDCOM_STRING(val));
225 else if (GEDCOM_IS_DATE(val)) {
226 fprintf(stderr, "| %4s | %20s |\n", "DATE", "(@todo)");
228 else if (GEDCOM_IS_AGE(val)) {
229 fprintf(stderr, "| %4s | %20s |\n", "AGE", "(@todo)");
231 else if (GEDCOM_IS_XREF_PTR(val)) {
232 struct xref_value *xref = NULL;
233 fprintf(stderr, "| %25s | %15s | %4s |\n", "STRING", "OBJECT", "TYPE");
234 xref = GEDCOM_XREF_PTR(val);
235 fprintf(stderr, "| %25s | %15s | %4s |\n",
237 xref->object ? "initialized" : "NULL",
238 (xref->type == XREF_NONE) ? "NONE" :
239 (xref->type == XREF_FAM ) ? "FAM" :
240 (xref->type == XREF_INDI) ? "INDI" :
241 (xref->type == XREF_NOTE) ? "NOTE" :
242 (xref->type == XREF_OBJE) ? "OBJE" :
243 (xref->type == XREF_REPO) ? "REPO" :
244 (xref->type == XREF_SOUR) ? "SOUR" :
245 (xref->type == XREF_SUBM) ? "SUBM" :
246 (xref->type == XREF_SUBN) ? "SUBN" :
247 (xref->type == XREF_ANY ) ? "ANY" :
248 (xref->type == XREF_USER) ? "USER" : "???");
251 fprintf(stderr, "| %20s |\n", "???");