1 /* Source code for modifying 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
26 #include "utf8tools.h"
29 #include "gom_internal.h"
31 void gom_set_unknown(const char* unknown)
33 convert_set_unknown(unknown);
36 char* gom_get_string(char* data)
41 char* gom_get_string_for_locale(char* data, int* conversion_failures)
43 return convert_utf8_to_locale(gom_get_string(data), conversion_failures);
46 char* gom_set_string(char** data, const char* utf8_str)
51 if (utf8_str == NULL) {
55 if (!is_utf8_string(utf8_str)) {
56 gedcom_error(_("The input '%s' is not a valid UTF-8 string"), utf8_str);
59 newptr = strdup(utf8_str);
73 char* gom_set_string_for_locale(char** data, const char* locale_str)
77 if (locale_str == NULL) {
78 result = gom_set_string(data, NULL);
81 char* utf8_str = convert_locale_to_utf8(locale_str);
84 gedcom_error(_("The input '%s' is not a valid string for the locale"),
87 result = gom_set_string(data, utf8_str);
93 void unref_xref_value(struct xref_value *xref)
96 gedcom_unlink_xref(xref->type, xref->string);
99 void UNREFALLFUNC(xref_list)(struct xref_list* obj)
102 struct xref_list* runner;
103 for (runner = obj; runner; runner = runner->next) {
104 unref_xref_value(runner->xref);
105 UNREFALLFUNC(user_data)(runner->extra);
110 void CLEANFUNC(xref_list)(struct xref_list *obj)
113 DESTROY_CHAIN_ELTS(user_data, obj->extra);
117 struct xref_value* gom_set_xref(struct xref_value** data, const char* xref)
119 struct xref_value* result = NULL;
120 struct xref_value* newval = NULL;
124 newval = gedcom_get_by_xref(xref);
126 gedcom_error(_("No record found for xref '%s'"), xref);
129 /* Unreference the old value if not NULL */
131 result = gedcom_unlink_xref((*data)->type, (*data)->string);
135 /* Reference the new value if not NULL */
136 if (result != NULL && newval) {
137 result = gedcom_link_xref(newval->type, newval->string);
138 /* On error, perform rollback to old value (guaranteed to work) */
140 gedcom_link_xref((*data)->type, (*data)->string);
143 if (result != NULL) {
151 struct xref_list* gom_add_xref(struct xref_list** data, const char* xref)
153 struct xref_value* result = NULL;
154 struct xref_value* newval = NULL;
155 struct xref_list* xrl = NULL;
158 newval = gedcom_get_by_xref(xref);
160 gedcom_error(_("No record found for xref '%s'"), xref);
162 result = gedcom_link_xref(newval->type, newval->string);
163 if (result != NULL) {
164 MAKE_CHAIN_ELT(xref_list, *data, xrl);
165 if (xrl) xrl->xref = newval;
173 struct xref_list* find_xref(struct xref_list** data, const char* xref)
175 struct xref_list* result = NULL;
176 struct xref_value* xr = gedcom_get_by_xref(xref);
178 gedcom_error(_("No record found for xref '%s'"), xref);
180 struct xref_list* xrl;
181 for (xrl = *data ; xrl ; xrl = xrl->next) {
182 if (xrl->xref == xr) {
188 gedcom_error(_("Xref '%s' not part of chain"), xref);
193 int gom_remove_xref(struct xref_list** data, const char* xref)
198 struct xref_list* xrl = find_xref(data, xref);
200 UNLINK_CHAIN_ELT(xref_list, *data, xrl);
201 gedcom_unlink_xref(xrl->xref->type, xrl->xref->string);
202 CLEANFUNC(xref_list)(xrl);
211 int gom_move_xref(Gom_direction dir, struct xref_list** data, const char* xref)
216 struct xref_list* xrl = find_xref(data, xref);
218 MOVE_CHAIN_ELT(xref_list, dir, *data, xrl);