Support UTF-8 encoding in gedcom files.
[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 main(int argc, char* argv[])
91 {
92   int result;
93   struct tm* tm_ptr;
94   time_t tval;
95   int total_conv_fails = 0;
96   char* outfilename = NULL;
97   char* infilename  = NULL;
98   char* gedfilename = WRITE_GEDCOM;
99   char* encoding    = "ASCII";
100   Encoding enc      = ONE_BYTE;
101   Enc_bom bom       = WITHOUT_BOM;
102   Enc_line_end end  = END_LF;
103   
104   if (argc > 1) {
105     int i;
106     for (i=1; i<argc; i++) {
107       if (!strncmp(argv[i], "-h", 3)) {
108         show_help();
109         exit(1);
110       }
111       else if (!strncmp(argv[i], "-q", 3)) {
112         output_set_quiet(1);
113       }
114       else if (!strncmp(argv[i], "-o", 3)) {
115         i++;
116         if (i < argc) {
117           outfilename = argv[i];
118         }
119         else {
120           printf ("Missing output file name\n");
121           show_help();
122           exit(1);
123         }
124       }
125       else if (!strncmp(argv[i], "-w", 3)) {
126         i++;
127         if (i < argc) {
128           gedfilename = argv[i];
129         }
130         else {
131           printf ("Missing output file name\n");
132           show_help();
133           exit(1);
134         }
135       }
136       else if (!strncmp(argv[i], "-i", 3)) {
137         i++;
138         if (i < argc) {
139           infilename = argv[i];
140         }
141         else {
142           printf ("Missing input file name\n");
143           show_help();
144           exit(1);
145         }
146       }
147       else if (!strncmp(argv[i], "-e", 3)) {
148         i++;
149         if (i < argc) {
150           encoding = argv[i];
151         }
152         else {
153           printf ("Missing encoding\n");
154           show_help();
155           exit(1);
156         }
157       }
158       else if (!strncmp(argv[i], "-u", 3)) {
159         i++;
160         if (i < argc) {
161           char* details = argv[i];
162           if (!strncmp(details, "HILO", 4))
163             enc = TWO_BYTE_HILO;
164           else if (!strncmp(details, "LOHI", 4))
165             enc = TWO_BYTE_LOHI;
166           else {
167             printf("Unknown encoding details %s\n", details);
168             show_help();
169             exit(1);
170           }
171           if (!strncmp(details+5, "BOM", 4))
172             bom = WITH_BOM;
173         }
174         else {
175           printf ("Missing encoding details\n");
176           show_help();
177           exit(1);
178         }
179       }
180       else if (!strncmp(argv[i], "-t", 3)) {
181         i++;
182         if (i < argc) {
183           char* term = argv[i];
184           if (!strncmp(term, "CR", 3))
185             end = END_CR;
186           else if (!strncmp(term, "LF", 3))
187             end = END_LF;
188           else if (!strncmp(term, "CR_LF", 6))
189             end = END_CR_LF;
190           else if (!strncmp(term, "LF_CR", 6))
191             end = END_LF_CR;
192           else {
193             printf("Unknown terminator: %s\n", term);
194             show_help();
195             exit(1);
196           }
197         }
198         else {
199           printf ("Missing terminator\n");
200           show_help();
201           exit(1);
202         }
203       }
204       else {
205         printf ("Unrecognized option: %s\n", argv[i]);
206         show_help();
207         exit(1);
208       }
209     }
210   }
211   
212   gedcom_init();
213   setlocale(LC_ALL, "");
214   gedcom_set_message_handler(gedcom_message_handler);
215   gedcom_write_set_encoding(encoding, enc, bom);
216   gedcom_write_set_line_terminator(end);
217
218   output_open(outfilename);
219
220   if (infilename) {
221     result = gom_parse_file(infilename);
222   }
223   else {
224     result = gom_new_model();
225     if (result == 0)
226       result |= update_header(encoding);
227   }
228   /* Make sure we get a reproduceable output, in different timezones */
229   if (result == 0) {
230     tval   = TIMESTAMP;
231     tm_ptr = gmtime(&tval);
232     tm_ptr->tm_isdst = 0;
233     tval   = mktime(tm_ptr);
234     result = gom_header_update_timestamp(tval);
235   }
236   if (result == 0)
237     result |= gom_write_file(gedfilename, &total_conv_fails);
238   if (result == 0 && total_conv_fails == 0) {
239     output(1, "Test succeeded\n");
240   }
241   else {
242     output(1, "Test failed: %d\n", result);
243   }
244
245   output_close();
246   return result;
247 }