1 /* Test program for the Gedcom library.
2 Copyright (C) 2001 The Genes Development Team
3 This file is part of the Gedcom parser library.
4 Contributed by Peter Verthez <Peter.Verthez@advalvas.be>, 2001.
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
30 #define OUTFILE "testgedcom.out"
33 void output(int to_stdout_too, char* format, ...)
38 vfprintf(outfile, format, ap);
48 printf("gedcom-parse test program for libgedcom\n\n");
49 printf("Usage: testgedcom [options] file\n");
51 printf(" -h Show this help text\n");
52 printf(" -nc Disable compatibility mode\n");
53 printf(" -fi Fail immediately on errors\n");
54 printf(" -fd Deferred fail on errors, but parse completely\n");
55 printf(" -fn No fail on errors\n");
56 printf(" -dg Debug setting: only libgedcom debug messages\n");
57 printf(" -da Debug setting: libgedcom + yacc debug messages\n");
58 printf(" -2 Run the test parse 2 times instead of once\n");
59 printf(" -3 Run the test parse 3 times instead of once\n");
62 Gedcom_ctxt header_start(int level, Gedcom_val xref, char *tag)
64 output(1, "Header start\n");
65 return (Gedcom_ctxt)0;
68 void header_end(Gedcom_ctxt self)
70 output(1, "Header end, context is %d\n", (int)self);
73 char family_xreftags[100][255];
76 Gedcom_ctxt family_start(int level, Gedcom_val xref, char *tag)
78 output(1, "Family start, xref is %s\n", GEDCOM_STRING(xref));
79 strcpy(family_xreftags[family_nr], GEDCOM_STRING(xref));
80 return (Gedcom_ctxt)(family_nr++);
83 void family_end(Gedcom_ctxt self)
85 output(1, "Family end, xref is %s\n", family_xreftags[(int)self]);
88 Gedcom_ctxt submit_start(int level, Gedcom_val xref, char *tag)
90 output(1, "Submitter, xref is %s\n", GEDCOM_STRING(xref));
91 return (Gedcom_ctxt)10000;
94 Gedcom_ctxt source_start(Gedcom_ctxt parent, int level, char *tag,
95 char* raw_value, Gedcom_val parsed_value)
97 Gedcom_ctxt self = (Gedcom_ctxt)((int) parent + 1000);
98 output(1, "Source is %s (ctxt is %d, parent is %d)\n",
99 GEDCOM_STRING(parsed_value), (int) self, (int) parent);
103 void source_end(Gedcom_ctxt parent, Gedcom_ctxt self, Gedcom_val parsed_value)
105 output(1, "Source context %d in parent %d\n", (int)self, (int)parent);
108 Gedcom_ctxt source_date_start(Gedcom_ctxt parent, int level, char *tag,
109 char* raw_value, Gedcom_val parsed_value)
111 struct date_value dv;
112 Gedcom_ctxt self = (Gedcom_ctxt)((int) parent + 1000);
113 dv = GEDCOM_DATE(parsed_value);
114 output(1, "Contents of the date_value:\n");
115 output(1, " raw value: %s\n", raw_value);
116 output(1, " type: %d\n", dv.type);
117 output(1, " date1:\n");
118 output(1, " calendar type: %d\n", dv.date1.cal);
119 output(1, " day: %s\n", dv.date1.day_str);
120 output(1, " month: %s\n", dv.date1.month_str);
121 output(1, " year: %s\n", dv.date1.year_str);
122 output(1, " date type: %d\n", dv.date1.type);
123 output(1, " sdn1: %ld\n", dv.date1.sdn1);
124 output(1, " sdn2: %ld\n", dv.date1.sdn2);
125 output(1, " date2:\n");
126 output(1, " calendar type: %d\n", dv.date2.cal);
127 output(1, " day: %s\n", dv.date2.day_str);
128 output(1, " month: %s\n", dv.date2.month_str);
129 output(1, " year: %s\n", dv.date2.year_str);
130 output(1, " date type: %d\n", dv.date2.type);
131 output(1, " sdn1: %ld\n", dv.date2.sdn1);
132 output(1, " sdn2: %ld\n", dv.date2.sdn2);
133 output(1, " phrase: %s\n", dv.phrase);
137 void default_cb(Gedcom_ctxt ctxt, int level, char *tag, char *raw_value)
139 output(0, "== %d %s %s (ctxt is %d)\n", level, tag, raw_value, (int)ctxt);
142 void subscribe_callbacks()
144 gedcom_subscribe_to_record(REC_HEAD, header_start, header_end);
145 gedcom_subscribe_to_record(REC_FAM, family_start, family_end);
146 gedcom_subscribe_to_record(REC_SUBM, submit_start, NULL);
147 gedcom_subscribe_to_element(ELT_HEAD_SOUR, source_start, source_end);
148 gedcom_subscribe_to_element(ELT_SOUR_DATA_EVEN_DATE,
149 source_date_start, NULL);
152 void gedcom_message_handler(Gedcom_msg_type type, char *msg)
155 fprintf(stderr, "MESSAGE: ");
156 else if (type == WARNING)
157 fprintf(stderr, "WARNING: ");
158 else if (type == ERROR)
159 fprintf(stderr, "ERROR: ");
160 fprintf(stderr, "%s\n", msg);
163 int main(int argc, char* argv[])
165 Gedcom_err_mech mech = IMMED_FAIL;
166 int compat_enabled = 1;
170 char* file_name = NULL;
174 for (i=1; i<argc; i++) {
175 if (!strncmp(argv[i], "-da", 4))
177 else if (!strncmp(argv[i], "-dg", 4))
179 else if (!strncmp(argv[i], "-fi", 4))
181 else if (!strncmp(argv[i], "-fd", 4))
183 else if (!strncmp(argv[i], "-fn", 4))
184 mech = IGNORE_ERRORS;
185 else if (!strncmp(argv[i], "-nc", 4))
187 else if (!strncmp(argv[i], "-h", 3)) {
191 else if (!strncmp(argv[i], "-2", 3)) {
194 else if (!strncmp(argv[i], "-3", 3)) {
197 else if (strncmp(argv[i], "-", 1)) {
202 printf ("Unrecognized option: %s\n", argv[i]);
210 printf("No file name given\n");
215 gedcom_set_debug_level(debug_level, NULL);
216 gedcom_set_compat_handling(compat_enabled);
217 gedcom_set_error_handling(mech);
218 gedcom_set_message_handler(gedcom_message_handler);
219 gedcom_set_default_callback(default_cb);
221 subscribe_callbacks();
222 outfile = fopen(OUTFILE, "a");
224 printf("Could not open %s for appending\n", OUTFILE);
226 while (run_times-- > 0) {
227 output(0, "\n=== Parsing file %s\n", file_name);
228 result |= gedcom_parse_file(file_name);
232 printf("Parse succeeded\n");
236 printf("Parse failed\n");