More compatibility testing.
[gedcom-parse.git] / t / src / gom_write.c
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.
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 "gedcom.h"
25 #include "gom.h"
26 #include "output.h"
27 #include "portability.h"
28 #include <locale.h>
29 #include <stdio.h>
30
31 #define WRITE_GEDCOM "gom_write.ged"
32 #define PROG_NAME "writegomtest"
33 #define PROG_VERSION "3.14"
34 #define TIMESTAMP 1000000000L
35
36 void gedcom_message_handler(Gedcom_msg_type type, char *msg)
37 {
38   if (type == MESSAGE)
39     output(1, "MESSAGE: ");
40   else if (type == WARNING)
41     output(1, "WARNING: ");
42   else if (type == ERROR)
43     output(1, "ERROR: ");
44   output(1, "%s\n", msg);
45 }
46
47 void show_help ()
48 {
49   printf("gedcom-parse test program for libgedcom\n\n");
50   printf("Usage:  writegomtest [options]\n");
51   printf("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");
62 }
63
64 int update_header(char* encoding)
65 {
66   struct header* head = NULL;
67   char* value;
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";
71
72   head = gom_get_header();
73   if (head == NULL)
74     return 1;
75   else {
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))
80         return 1;
81     }
82     value = gom_set_string(&head->note, long_note);
83     if (value == NULL || strcmp(value, long_note))
84       return 1;
85     else
86       return 0;
87   }
88 }
89
90 int test_timestamps()
91 {
92   int result = 0;
93   struct tm* tm_ptr;
94   time_t tval;
95   /* Make sure we get a reproduceable output, in different timezones */
96   tval   = TIMESTAMP;
97   tm_ptr = gmtime(&tval);
98   tm_ptr->tm_isdst = 0;
99   tval   = mktime(tm_ptr);
100   result = gom_header_update_timestamp(tval);
101   
102   /* Also change timestamp of submitter */
103   if (result == 0) {
104     struct submitter* subm = gom_get_first_submitter();
105     if (!subm)
106       result = 100;
107     else {
108       result = gom_update_timestamp(&(subm->change_date), tval);
109     }
110   }
111   
112   return result;
113 }
114
115 int main(int argc, char* argv[])
116 {
117   int result;
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;
126   
127   if (argc > 1) {
128     int i;
129     for (i=1; i<argc; i++) {
130       if (!strncmp(argv[i], "-h", 3)) {
131         show_help();
132         exit(1);
133       }
134       else if (!strncmp(argv[i], "-q", 3)) {
135         output_set_quiet(1);
136       }
137       else if (!strncmp(argv[i], "-o", 3)) {
138         i++;
139         if (i < argc) {
140           outfilename = argv[i];
141         }
142         else {
143           printf ("Missing output file name\n");
144           show_help();
145           exit(1);
146         }
147       }
148       else if (!strncmp(argv[i], "-w", 3)) {
149         i++;
150         if (i < argc) {
151           gedfilename = argv[i];
152         }
153         else {
154           printf ("Missing output file name\n");
155           show_help();
156           exit(1);
157         }
158       }
159       else if (!strncmp(argv[i], "-i", 3)) {
160         i++;
161         if (i < argc) {
162           infilename = argv[i];
163         }
164         else {
165           printf ("Missing input file name\n");
166           show_help();
167           exit(1);
168         }
169       }
170       else if (!strncmp(argv[i], "-e", 3)) {
171         i++;
172         if (i < argc) {
173           encoding = argv[i];
174         }
175         else {
176           printf ("Missing encoding\n");
177           show_help();
178           exit(1);
179         }
180       }
181       else if (!strncmp(argv[i], "-u", 3)) {
182         i++;
183         if (i < argc) {
184           char* details = argv[i];
185           if (!strncmp(details, "HILO", 4))
186             enc = TWO_BYTE_HILO;
187           else if (!strncmp(details, "LOHI", 4))
188             enc = TWO_BYTE_LOHI;
189           else {
190             printf("Unknown encoding details %s\n", details);
191             show_help();
192             exit(1);
193           }
194           if (!strncmp(details+5, "BOM", 4))
195             bom = WITH_BOM;
196         }
197         else {
198           printf ("Missing encoding details\n");
199           show_help();
200           exit(1);
201         }
202       }
203       else if (!strncmp(argv[i], "-t", 3)) {
204         i++;
205         if (i < argc) {
206           char* term = argv[i];
207           if (!strncmp(term, "CR", 3))
208             end = END_CR;
209           else if (!strncmp(term, "LF", 3))
210             end = END_LF;
211           else if (!strncmp(term, "CR_LF", 6))
212             end = END_CR_LF;
213           else if (!strncmp(term, "LF_CR", 6))
214             end = END_LF_CR;
215           else {
216             printf("Unknown terminator: %s\n", term);
217             show_help();
218             exit(1);
219           }
220         }
221         else {
222           printf ("Missing terminator\n");
223           show_help();
224           exit(1);
225         }
226       }
227       else {
228         printf ("Unrecognized option: %s\n", argv[i]);
229         show_help();
230         exit(1);
231       }
232     }
233   }
234   
235   gedcom_init();
236   setlocale(LC_ALL, "");
237   gedcom_set_message_handler(gedcom_message_handler);
238
239   output_open(outfilename);
240
241   if (infilename) {
242     result = gom_parse_file(infilename);
243   }
244   else {
245     gedcom_write_set_encoding(ENC_MANUAL, encoding, enc, bom);
246     gedcom_write_set_line_terminator(ENC_MANUAL, end);
247     result = gom_new_model();
248     if (result == 0)
249       result |= update_header(encoding);
250   }
251   if (result == 0)
252     result |= test_timestamps();
253   if (result == 0) {
254     output(1, "Writing file...\n");
255     result |= gom_write_file(gedfilename, &total_conv_fails);
256   }
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);
261   }
262   if (result == 0) {
263     output(1, "Test succeeded\n");
264   }
265   else {
266     output(1, "Test failed: %d\n", result);
267   }
268
269   output_close();
270   return result;
271 }