Beginnings of write support.
[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
35 void gedcom_message_handler(Gedcom_msg_type type, char *msg)
36 {
37   if (type == MESSAGE)
38     output(1, "MESSAGE: ");
39   else if (type == WARNING)
40     output(1, "WARNING: ");
41   else if (type == ERROR)
42     output(1, "ERROR: ");
43   output(1, "%s\n", msg);
44 }
45
46 void show_help ()
47 {
48   printf("gedcom-parse test program for libgedcom\n\n");
49   printf("Usage:  writegomtest [options]\n");
50   printf("Options:\n");
51   printf("  -h    Show this help text\n");
52   printf("  -q    No output to standard output\n");
53   printf("  -o <outfile>  File to generate errors to (def. testgedcom.out)\n");
54   printf("  -w <gedfile>  File to write gedcom to (def. %s)\n", WRITE_GEDCOM);
55   printf("  -e <encoding> Encoding (UNICODE, ASCII, ANSEL, ...: see gedcom.enc)\n");
56   printf("  -u <unicode_enc> Encoding details for Unicode\n");
57   printf("        <unicode_enc> can be: HILO, LOHI, HILO_BOM, LOHI_BOM\n");
58   printf("  -t <terminator>  Line terminator\n");
59   printf("        <terminator> can be CR, LF, CR_LF, LF_CR\n");
60 }
61
62 int update_charset(char* encoding)
63 {
64   struct header* head = NULL;
65   char* value;
66
67   head = gom_get_header();
68   if (head == NULL)
69     return 1;
70   else {
71     value = gom_set_string(&head->charset.name, encoding);
72     if (value == NULL || strcmp(value, encoding))
73       return 1;
74     else
75       return 0;
76   }
77 }
78
79 int main(int argc, char* argv[])
80 {
81   int result;
82   int total_conv_fails = 0;
83   char* outfilename = NULL;
84   char* gedfilename = WRITE_GEDCOM;
85   char* encoding    = "ASCII";
86   Encoding enc      = ONE_BYTE;
87   Enc_bom bom       = WITHOUT_BOM;
88   Enc_line_end end  = END_LF;
89   
90   if (argc > 1) {
91     int i;
92     for (i=1; i<argc; i++) {
93       if (!strncmp(argv[i], "-h", 3)) {
94         show_help();
95         exit(1);
96       }
97       else if (!strncmp(argv[i], "-q", 3)) {
98         output_set_quiet(1);
99       }
100       else if (!strncmp(argv[i], "-o", 3)) {
101         i++;
102         if (i < argc) {
103           outfilename = argv[i];
104         }
105         else {
106           printf ("Missing output file name\n");
107           show_help();
108           exit(1);
109         }
110       }
111       else if (!strncmp(argv[i], "-w", 3)) {
112         i++;
113         if (i < argc) {
114           gedfilename = argv[i];
115         }
116         else {
117           printf ("Missing output file name\n");
118           show_help();
119           exit(1);
120         }
121       }
122       else if (!strncmp(argv[i], "-e", 3)) {
123         i++;
124         if (i < argc) {
125           encoding = argv[i];
126         }
127         else {
128           printf ("Missing encoding\n");
129           show_help();
130           exit(1);
131         }
132       }
133       else if (!strncmp(argv[i], "-u", 3)) {
134         i++;
135         if (i < argc) {
136           char* details = argv[i];
137           if (!strncmp(details, "HILO", 4))
138             enc = TWO_BYTE_HILO;
139           else if (!strncmp(details, "LOHI", 4))
140             enc = TWO_BYTE_LOHI;
141           else {
142             printf("Unknown encoding details %s\n", details);
143             show_help();
144             exit(1);
145           }
146           if (!strncmp(details+5, "BOM", 4))
147             bom = WITH_BOM;
148         }
149         else {
150           printf ("Missing encoding details\n");
151           show_help();
152           exit(1);
153         }
154       }
155       else if (!strncmp(argv[i], "-t", 3)) {
156         i++;
157         if (i < argc) {
158           char* term = argv[i];
159           if (!strncmp(term, "CR", 3))
160             end = END_CR;
161           else if (!strncmp(term, "LF", 3))
162             end = END_LF;
163           else if (!strncmp(term, "CR_LF", 6))
164             end = END_CR_LF;
165           else if (!strncmp(term, "LF_CR", 6))
166             end = END_LF_CR;
167           else {
168             printf("Unknown terminator: %s\n", term);
169             show_help();
170             exit(1);
171           }
172         }
173         else {
174           printf ("Missing terminator\n");
175           show_help();
176           exit(1);
177         }
178       }
179       else {
180         printf ("Unrecognized option: %s\n", argv[i]);
181         show_help();
182         exit(1);
183       }
184     }
185   }
186   
187   gedcom_init();
188   setlocale(LC_ALL, "");
189   gedcom_set_message_handler(gedcom_message_handler);
190   gedcom_write_set_encoding(encoding, enc, bom);
191   gedcom_write_set_line_terminator(end);
192
193   output_open(outfilename);
194   
195   result = gom_new_model();
196   /*
197   if (result == 0)
198     result |= update_charset(encoding);
199   */
200   if (result == 0)
201     result |= gom_write_file(gedfilename, &total_conv_fails);
202   if (result == 0 && total_conv_fails == 0) {
203     output(1, "Test succeeded\n");
204   }
205   else {
206     output(1, "Test failed: %d\n", result);
207   }
208
209   output_close();
210   return result;
211 }