1 /* Main file for building 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
29 #include "submitter.h"
30 #include "submission.h"
32 #include "individual.h"
33 #include "multimedia.h"
35 #include "repository.h"
41 #include "source_citation.h"
42 #include "multimedia_link.h"
44 #include "lds_event.h"
46 #include "change_date.h"
47 #include "personal_name.h"
48 #include "family_link.h"
49 #include "association.h"
50 #include "source_event.h"
51 #include "source_description.h"
53 #include "gom_internal.h"
55 void gom_default_callback (Gedcom_elt elt, Gedcom_ctxt parent, int level, char* tag,
56 char* raw_value, int parsed_tag);
63 individuals_cleanup();
64 multimedias_cleanup();
66 repositories_cleanup();
72 int gom_parse_file(char* file_name)
74 gedcom_set_default_callback(gom_default_callback);
76 submission_subscribe();
78 individual_subscribe();
79 multimedia_subscribe();
81 repository_subscribe();
83 submitter_subscribe();
91 multimedia_link_subscribe();
92 lds_event_subscribe();
94 change_date_subscribe();
96 family_link_subscribe();
97 association_subscribe();
98 source_event_subscribe();
99 source_description_subscribe();
102 return gedcom_parse_file(file_name);
105 Gom_ctxt make_gom_ctxt(int ctxt_type, OBJ_TYPE obj_type, void *ctxt_ptr)
107 Gom_ctxt ctxt = (Gom_ctxt)malloc(sizeof(struct Gom_ctxt_struct));
108 ctxt->ctxt_type = ctxt_type;
109 ctxt->obj_type = obj_type;
110 ctxt->ctxt_ptr = ctxt_ptr;
114 void NULL_DESTROY(void* anything)
118 void destroy_gom_ctxt(Gom_ctxt ctxt)
123 void gom_cast_error(char* file, int line, OBJ_TYPE expected, OBJ_TYPE found)
126 "Wrong gom ctxt cast at %s, line %d: expected %d, found %d\n",
127 file, line, expected, found);
131 void gom_unexpected_context(char* file, int line, OBJ_TYPE found)
133 gedcom_warning(_("Internal error: Unexpected context at %s, line %d: %d"),
137 void gom_default_callback (Gedcom_elt elt, Gedcom_ctxt parent, int level, char* tag,
138 char* raw_value, int parsed_tag)
140 gedcom_warning(_("Data loss in import: \"%d %s %s\""),
141 level, tag, raw_value);
144 void def_rec_end(Gedcom_rec rec, Gedcom_ctxt self)
146 Gom_ctxt ctxt = (Gom_ctxt)self;
147 destroy_gom_ctxt(ctxt);
150 void def_elt_end(Gedcom_elt elt, Gedcom_ctxt parent, Gedcom_ctxt self,
151 Gedcom_val parsed_value)
153 Gom_ctxt ctxt = (Gom_ctxt)self;
154 destroy_gom_ctxt(ctxt);
157 void set_xref_type(struct xref_value* xr, char *str)
159 if (!strcasecmp(str, "FAM"))
161 else if (!strcasecmp(str, "INDI"))
162 xr->type = XREF_INDI;
163 else if (!strcasecmp(str, "NOTE"))
164 xr->type = XREF_NOTE;
165 else if (!strcasecmp(str, "OBJE"))
166 xr->type = XREF_OBJE;
167 else if (!strcasecmp(str, "REPO"))
168 xr->type = XREF_REPO;
169 else if (!strcasecmp(str, "SOUR"))
170 xr->type = XREF_SOUR;
171 else if (!strcasecmp(str, "SUBM"))
172 xr->type = XREF_SUBM;
173 else if (!strcasecmp(str, "SUBN"))
174 xr->type = XREF_SUBN;
179 char* concat_strings(NL_TYPE type, char *str1, const char *str2)
181 if (str1 != NULL && str2 != NULL) {
184 size_t len1 = strlen(str1);
185 size_t len2 = strlen(str2);
186 size_t len = len1 + len2 + 1;
189 newp = (char*) realloc(str1, len);
198 wp = memcpy (wp, str2, len2);
206 struct date_value* dup_date(struct date_value dv)
208 struct date_value* dv_ptr;
209 dv_ptr = (struct date_value*) malloc(sizeof(struct date_value));
210 memcpy(dv_ptr, &dv, sizeof(struct date_value));
214 struct age_value* dup_age(struct age_value age)
216 struct age_value* age_ptr;
217 age_ptr = (struct age_value*) malloc(sizeof(struct age_value));
218 memcpy(age_ptr, &age, sizeof(struct age_value));