Basic framework for recognizing Unicode encoding.
[gedcom-parse.git] / standalone.c
1 /* $Id$ */
2 /* $Name$ */
3
4 #include "gedcom.h"
5
6 void show_help ()
7 {
8   printf("gedcom-parse test program for libgedcom\n\n");
9   printf("Usage:  gedcom-parse [options] file\n");
10   printf("Options:\n");
11   printf("  -h    Show this help text\n");
12   printf("  -nc   Disable compatibility mode\n");
13   printf("  -fi   Fail immediately on errors\n");
14   printf("  -fd   Deferred fail on errors, but parse completely\n");
15   printf("  -fn   No fail on errors\n");
16   printf("  -dg   Debug setting: only libgedcom debug messages\n");
17   printf("  -da   Debug setting: libgedcom + yacc debug messages\n");
18 }
19
20 int determine_encoding(FILE* f)
21 {
22   char first[2];
23
24   fread(first, 1, 2, f);
25   if ((first[0] == '0') && (first[1] == ' ')) {
26     gedcom_warning("One-byte encoding");
27     fseek(f, 0, 0);
28     return ONE_BYTE;
29   }
30   else if ((first[0] == '\0') && (first[1] == '0'))
31   {
32     gedcom_warning("Two-byte encoding, high-low");
33     fseek(f, 0, 0);
34     return TWO_BYTE_HILO;
35   }
36   else if ((first[0] == '\xFE') && (first[1] == '\xFF'))
37   {
38     gedcom_warning("Two-byte encoding, high-low, with BOM");
39     return TWO_BYTE_HILO;
40   }
41   else if ((first[0] == '0') && (first[1] == '\0'))
42   {
43     gedcom_warning("Two-byte encoding, low-high");
44     fseek(f, 0, 0);
45     return TWO_BYTE_LOHI;
46   }
47   else if ((first[0] == '\xFF') && (first[1] == '\xFE'))
48   {
49     gedcom_warning("Two-byte encoding, low-high, with BOM");
50     return TWO_BYTE_LOHI;
51   }
52   else {
53     gedcom_warning("Unknown encoding, falling back to one-byte");
54     fseek(f, 0, 0);
55     return ONE_BYTE;
56   }
57 }
58
59 int gedcom_xxx_parse(char* file_name)
60 {
61   ENCODING enc;
62   FILE* file = fopen (file_name, "r");
63   if (!file) {
64     printf("Could not open file '%s'\n", file_name);
65     exit(1);
66   }
67   enc = determine_encoding(file);
68
69   if (enc == ONE_BYTE) {
70     gedcom_in = file;
71     return gedcom_parse();
72   }
73   else {
74     printf("No parser yet for encoding\n");
75     exit(1);
76   }
77 }
78
79 int main(int argc, char* argv[])
80 {
81   MECHANISM mech = IMMED_FAIL;
82   int compat_enabled = 1;
83   int debug_level = 0;
84   char* file_name = NULL;
85
86   if (argc > 1) {
87     int i;
88     for (i=1; i<argc; i++) {
89       if (!strncmp(argv[i], "-da", 4))
90         debug_level = 2;
91       else if (!strncmp(argv[i], "-dg", 4))
92         debug_level = 1;
93       else if (!strncmp(argv[i], "-fi", 4))
94         mech = IMMED_FAIL;
95       else if (!strncmp(argv[i], "-fd", 4))
96         mech = DEFER_FAIL;
97       else if (!strncmp(argv[i], "-fn", 4))
98         mech = IGNORE_ERRORS;
99       else if (!strncmp(argv[i], "-nc", 4))
100         compat_enabled = 0;
101       else if (!strncmp(argv[i], "-h", 3)) {
102         show_help();
103         exit(1);
104       }
105       else if (strncmp(argv[i], "-", 1)) {
106         file_name = argv[i];
107         break;
108       }
109       else {
110         printf ("Unrecognized option: %s\n", argv[i]);
111         show_help();
112         exit(1);
113       }
114     }
115   }
116   
117   if (!file_name) {
118     printf("No file name given\n");
119     show_help();
120     exit(1);
121   }
122
123   gedcom_set_debug_level(debug_level);
124   gedcom_set_compat_handling(compat_enabled);
125   gedcom_set_error_handling(mech);
126   
127   if (gedcom_xxx_parse(file_name) == 0) {
128     printf("Parse succeeded\n");
129     return 0;
130   }
131   else {
132     printf("Parse failed\n");
133     return 1;
134   }  
135 }
136
137 int gedcom_warning(char* s, ...)
138 {
139   int res;
140   va_list ap;
141
142   va_start(ap, s);
143   fprintf(stderr, "Warning on line %d: ", line_no);
144   res = vfprintf(stderr, s, ap);
145   fprintf(stderr, "\n");
146   va_end(ap);
147   
148   return res;
149 }
150
151 int gedcom_error(char* s, ...)
152 {
153   int res;
154   va_list ap;
155
156   va_start(ap, s);
157   fprintf(stderr, "Error on line %d: ", line_no);
158   res = vfprintf(stderr, s, ap);
159   fprintf(stderr, "\n");
160   va_end(ap);
161   
162   return res;
163 }