1 /* Test program for the Gedcom library.
2 Copyright (C) 2001, 2002 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
27 #include "portability.h"
31 #define WRITE_GEDCOM "gom_write.ged"
32 #define PROG_NAME "writegomtest"
33 #define PROG_VERSION "3.14"
34 #define TIMESTAMP 1000000000L
36 void gedcom_message_handler(Gedcom_msg_type type, char *msg)
39 output(1, "MESSAGE: ");
40 else if (type == WARNING)
41 output(1, "WARNING: ");
42 else if (type == ERROR)
44 output(1, "%s\n", msg);
49 printf("gedcom-parse test program for libgedcom\n\n");
50 printf("Usage: writegomtest [options]\n");
52 printf(" -h Show this help text\n");
53 printf(" -q No output to standard output\n");
54 printf(" -o <outfile> File to generate errors to (def. testgedcom.out)\n");
55 printf(" -i <gedfile> File to read gedcom from (default: new file)\n");
56 printf(" -w <gedfile> File to write gedcom to (def. %s)\n", WRITE_GEDCOM);
57 printf(" -e <encoding> Encoding (UNICODE, ASCII, ANSEL, ...: see gedcom.enc)\n");
58 printf(" -u <unicode_enc> Encoding details for Unicode\n");
59 printf(" <unicode_enc> can be: HILO, LOHI, HILO_BOM, LOHI_BOM\n");
60 printf(" -t <terminator> Line terminator\n");
61 printf(" <terminator> can be CR, LF, CR_LF, LF_CR\n");
64 int update_header(char* encoding)
66 struct header* head = NULL;
68 char* long_note = "This note is for testing the continuation stuff\n"
69 "Some Specials: This line is very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very long but too long (255 caharcters is the limit), so this is going over the border\n"
70 "And now we have an at character: @, which should be doubled";
72 head = gom_get_header();
76 /* force warning for anything except UNICODE */
77 if (!strcmp(encoding, "UNICODE")) {
78 value = gom_set_string(&head->charset.name, encoding);
79 if (value == NULL || strcmp(value, encoding))
82 value = gom_set_string(&head->note, long_note);
83 if (value == NULL || strcmp(value, long_note))
95 /* Make sure we get a reproduceable output, in different timezones */
97 tm_ptr = gmtime(&tval);
99 tval = mktime(tm_ptr);
100 result = gom_header_update_timestamp(tval);
102 /* Also change timestamp of submitter */
104 struct submitter* subm = gom_get_first_submitter();
108 result = gom_update_timestamp(&(subm->change_date), tval);
115 int main(int argc, char* argv[])
118 int total_conv_fails = 0;
119 char* outfilename = NULL;
120 char* infilename = NULL;
121 char* gedfilename = WRITE_GEDCOM;
122 char* encoding = "ASCII";
123 Encoding enc = ONE_BYTE;
124 Enc_bom bom = WITHOUT_BOM;
125 Enc_line_end end = END_LF;
129 for (i=1; i<argc; i++) {
130 if (!strncmp(argv[i], "-h", 3)) {
134 else if (!strncmp(argv[i], "-q", 3)) {
137 else if (!strncmp(argv[i], "-o", 3)) {
140 outfilename = argv[i];
143 printf ("Missing output file name\n");
148 else if (!strncmp(argv[i], "-w", 3)) {
151 gedfilename = argv[i];
154 printf ("Missing output file name\n");
159 else if (!strncmp(argv[i], "-i", 3)) {
162 infilename = argv[i];
165 printf ("Missing input file name\n");
170 else if (!strncmp(argv[i], "-e", 3)) {
176 printf ("Missing encoding\n");
181 else if (!strncmp(argv[i], "-u", 3)) {
184 char* details = argv[i];
185 if (!strncmp(details, "HILO", 4))
187 else if (!strncmp(details, "LOHI", 4))
190 printf("Unknown encoding details %s\n", details);
194 if (!strncmp(details+5, "BOM", 4))
198 printf ("Missing encoding details\n");
203 else if (!strncmp(argv[i], "-t", 3)) {
206 char* term = argv[i];
207 if (!strncmp(term, "CR", 3))
209 else if (!strncmp(term, "LF", 3))
211 else if (!strncmp(term, "CR_LF", 6))
213 else if (!strncmp(term, "LF_CR", 6))
216 printf("Unknown terminator: %s\n", term);
222 printf ("Missing terminator\n");
228 printf ("Unrecognized option: %s\n", argv[i]);
236 setlocale(LC_ALL, "");
237 gedcom_set_message_handler(gedcom_message_handler);
239 output_open(outfilename);
242 result = gom_parse_file(infilename);
245 gedcom_write_set_encoding(ENC_MANUAL, encoding, enc, bom);
246 gedcom_write_set_line_terminator(ENC_MANUAL, end);
247 result = gom_new_model();
249 result |= update_header(encoding);
252 result |= test_timestamps();
254 output(1, "Writing file...\n");
255 result |= gom_write_file(gedfilename, &total_conv_fails);
257 if (result == 0 && total_conv_fails == 0) {
258 output(1, "Re-parsing file...\n");
259 gedcom_set_compat_handling(0);
260 result |= gom_parse_file(gedfilename);
263 output(1, "Test succeeded\n");
266 output(1, "Test failed: %d\n", result);