Make sure that gettext uses UTF-8 as target encoding.
[gedcom-parse.git] / standalone.c
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.
5
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.
10
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.
15
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
19    02111-1307 USA.  */
20
21 /* $Id$ */
22 /* $Name$ */
23
24 #include <stdio.h>
25 #include <string.h>
26 #include <stdlib.h>
27 #include "gedcom.h"
28
29 void show_help ()
30 {
31   printf("gedcom-parse test program for libgedcom\n\n");
32   printf("Usage:  gedcom-parse [options] file\n");
33   printf("Options:\n");
34   printf("  -h    Show this help text\n");
35   printf("  -nc   Disable compatibility mode\n");
36   printf("  -fi   Fail immediately on errors\n");
37   printf("  -fd   Deferred fail on errors, but parse completely\n");
38   printf("  -fn   No fail on errors\n");
39   printf("  -dg   Debug setting: only libgedcom debug messages\n");
40   printf("  -da   Debug setting: libgedcom + yacc debug messages\n");
41   printf("  -2    Run the test parse 2 times instead of once\n");
42   printf("  -3    Run the test parse 3 times instead of once\n");
43 }
44
45 Gedcom_ctxt header_start(int level, char *xref, char *tag)
46 {
47   printf("Header start\n");
48   return (Gedcom_ctxt)0;
49 }
50
51 void header_end(Gedcom_ctxt self)
52 {
53   printf("Header end, context is %d\n", (int)self);
54 }
55
56 char family_xreftags[100][255];
57 int  family_nr = 0;
58
59 Gedcom_ctxt family_start(int level, char *xref, char *tag)
60 {
61   printf("Family start, xref is %s\n", xref);
62   strcpy(family_xreftags[family_nr], xref);
63   return (Gedcom_ctxt)(family_nr++);
64 }
65
66 void family_end(Gedcom_ctxt self)
67 {
68   printf("Family end, xref is %s\n", family_xreftags[(int)self]);
69 }
70
71 Gedcom_ctxt submit_start(int level, char *xref, char *tag)
72 {
73   printf("Submitter, xref is %s\n", xref);
74   return (Gedcom_ctxt)10000;
75 }
76
77 Gedcom_ctxt source_start(Gedcom_ctxt parent, int level, char *tag,
78                          char* raw_value, Gedcom_val parsed_value)
79 {
80   Gedcom_ctxt self = (Gedcom_ctxt)((int) parent + 1000);
81   printf("Source is %s (ctxt is %d, parent is %d)\n",
82          (char*)parsed_value, (int) self, (int) parent);
83   return self;
84 }
85
86 void source_end(Gedcom_ctxt parent, Gedcom_ctxt self, Gedcom_val parsed_value)
87 {
88   printf("Source context %d in parent %d\n", (int)self, (int)parent);
89 }
90
91 void default_cb(Gedcom_ctxt ctxt, int level, char *tag, char *raw_value)
92 {
93   printf("== %d %s %s (ctxt is %d)\n", level, tag, raw_value, (int)ctxt);
94 }
95
96 void subscribe_callbacks()
97 {
98   gedcom_subscribe_to_record(REC_HEAD, header_start, header_end);
99   gedcom_subscribe_to_record(REC_FAM,  family_start, family_end);
100   gedcom_subscribe_to_record(REC_SUBM, submit_start, NULL);
101   gedcom_subscribe_to_element(ELT_HEAD_SOUR, source_start, source_end);
102 }
103
104 void gedcom_message_handler(Gedcom_msg_type type, char *msg)
105 {
106   if (type == MESSAGE)
107     fprintf(stderr, "MESSAGE: ");
108   else if (type == WARNING)
109     fprintf(stderr, "WARNING: ");
110   else if (type == ERROR)
111     fprintf(stderr, "ERROR: ");
112   fprintf(stderr, msg);
113 }
114
115 int main(int argc, char* argv[])
116 {
117   Gedcom_err_mech mech = IMMED_FAIL;
118   int compat_enabled = 1;
119   int debug_level = 0;
120   int run_times   = 1;
121   int result      = 0;
122   char* file_name = NULL;
123
124   if (argc > 1) {
125     int i;
126     for (i=1; i<argc; i++) {
127       if (!strncmp(argv[i], "-da", 4))
128         debug_level = 2;
129       else if (!strncmp(argv[i], "-dg", 4))
130         debug_level = 1;
131       else if (!strncmp(argv[i], "-fi", 4))
132         mech = IMMED_FAIL;
133       else if (!strncmp(argv[i], "-fd", 4))
134         mech = DEFER_FAIL;
135       else if (!strncmp(argv[i], "-fn", 4))
136         mech = IGNORE_ERRORS;
137       else if (!strncmp(argv[i], "-nc", 4))
138         compat_enabled = 0;
139       else if (!strncmp(argv[i], "-h", 3)) {
140         show_help();
141         exit(1);
142       }
143       else if (!strncmp(argv[i], "-2", 3)) {
144         run_times = 2;
145       }
146       else if (!strncmp(argv[i], "-3", 3)) {
147         run_times = 3;
148       }
149       else if (strncmp(argv[i], "-", 1)) {
150         file_name = argv[i];
151         break;
152       }
153       else {
154         printf ("Unrecognized option: %s\n", argv[i]);
155         show_help();
156         exit(1);
157       }
158     }
159   }
160   
161   if (!file_name) {
162     printf("No file name given\n");
163     show_help();
164     exit(1);
165   }
166
167   gedcom_set_debug_level(debug_level, NULL);
168   gedcom_set_compat_handling(compat_enabled);
169   gedcom_set_error_handling(mech);
170   gedcom_set_message_handler(gedcom_message_handler);
171   gedcom_set_default_callback(default_cb);
172   
173   subscribe_callbacks();
174   while (run_times-- > 0) {
175     result |= gedcom_parse_file(file_name);
176   }
177   if (result == 0) {
178     printf("Parse succeeded\n");
179     return 0;
180   }
181   else {
182     printf("Parse failed\n");
183     return 1;
184   }  
185 }