1 /* -*- c-basic-offset:2; tab-width:2; indent-tabs-mode:nil -*- */
2
3 #include "ef_8bit_parser.h"
4
5 #include <pobl/bl_mem.h>
6 #include <pobl/bl_debug.h>
7
8 typedef struct ef_iscii_parser {
9 ef_parser_t parser;
10 ef_charset_t cs;
11
12 } ef_iscii_parser_t;
13
14 /* --- static functions --- */
15
parser_next_char_intern(ef_parser_t * parser,ef_char_t * ch,ef_charset_t cs)16 static int parser_next_char_intern(ef_parser_t *parser, ef_char_t *ch, ef_charset_t cs) {
17 u_char c;
18
19 if (parser->is_eos) {
20 return 0;
21 }
22
23 ef_parser_mark(parser);
24
25 ch->ch[0] = c = *parser->str;
26 ch->size = 1;
27 ch->property = 0;
28
29 if (/* 0x0 <= c && */ c <= 0x7f && (cs != VISCII || (c != 0x02 && c != 0x05 && c != 0x06 &&
30 c != 0x14 && c != 0x19 && c != 0x1e))) {
31 ch->cs = US_ASCII;
32 } else {
33 if (cs == CP874 && (c == 0xd1 || (0xd4 <= c && c <= 0xda) || (0xe7 <= c && c <= 0xee))) {
34 ch->property = EF_COMBINING;
35 }
36
37 ch->cs = cs;
38 }
39
40 ef_parser_increment(parser);
41
42 return 1;
43 }
44
koi8_r_parser_next_char(ef_parser_t * parser,ef_char_t * ch)45 static int koi8_r_parser_next_char(ef_parser_t *parser, ef_char_t *ch) {
46 return parser_next_char_intern(parser, ch, KOI8_R);
47 }
48
koi8_u_parser_next_char(ef_parser_t * parser,ef_char_t * ch)49 static int koi8_u_parser_next_char(ef_parser_t *parser, ef_char_t *ch) {
50 return parser_next_char_intern(parser, ch, KOI8_U);
51 }
52
koi8_t_parser_next_char(ef_parser_t * parser,ef_char_t * ch)53 static int koi8_t_parser_next_char(ef_parser_t *parser, ef_char_t *ch) {
54 return parser_next_char_intern(parser, ch, KOI8_T);
55 }
56
georgian_ps_parser_next_char(ef_parser_t * parser,ef_char_t * ch)57 static int georgian_ps_parser_next_char(ef_parser_t *parser, ef_char_t *ch) {
58 return parser_next_char_intern(parser, ch, GEORGIAN_PS);
59 }
60
cp1250_parser_next_char(ef_parser_t * parser,ef_char_t * ch)61 static int cp1250_parser_next_char(ef_parser_t *parser, ef_char_t *ch) {
62 return parser_next_char_intern(parser, ch, CP1250);
63 }
64
cp1251_parser_next_char(ef_parser_t * parser,ef_char_t * ch)65 static int cp1251_parser_next_char(ef_parser_t *parser, ef_char_t *ch) {
66 return parser_next_char_intern(parser, ch, CP1251);
67 }
68
cp1252_parser_next_char(ef_parser_t * parser,ef_char_t * ch)69 static int cp1252_parser_next_char(ef_parser_t *parser, ef_char_t *ch) {
70 return parser_next_char_intern(parser, ch, CP1252);
71 }
72
cp1253_parser_next_char(ef_parser_t * parser,ef_char_t * ch)73 static int cp1253_parser_next_char(ef_parser_t *parser, ef_char_t *ch) {
74 return parser_next_char_intern(parser, ch, CP1253);
75 }
76
cp1254_parser_next_char(ef_parser_t * parser,ef_char_t * ch)77 static int cp1254_parser_next_char(ef_parser_t *parser, ef_char_t *ch) {
78 return parser_next_char_intern(parser, ch, CP1254);
79 }
80
cp1255_parser_next_char(ef_parser_t * parser,ef_char_t * ch)81 static int cp1255_parser_next_char(ef_parser_t *parser, ef_char_t *ch) {
82 return parser_next_char_intern(parser, ch, CP1255);
83 }
84
cp1256_parser_next_char(ef_parser_t * parser,ef_char_t * ch)85 static int cp1256_parser_next_char(ef_parser_t *parser, ef_char_t *ch) {
86 return parser_next_char_intern(parser, ch, CP1256);
87 }
88
cp1257_parser_next_char(ef_parser_t * parser,ef_char_t * ch)89 static int cp1257_parser_next_char(ef_parser_t *parser, ef_char_t *ch) {
90 return parser_next_char_intern(parser, ch, CP1257);
91 }
92
cp1258_parser_next_char(ef_parser_t * parser,ef_char_t * ch)93 static int cp1258_parser_next_char(ef_parser_t *parser, ef_char_t *ch) {
94 return parser_next_char_intern(parser, ch, CP1258);
95 }
96
cp874_parser_next_char(ef_parser_t * parser,ef_char_t * ch)97 static int cp874_parser_next_char(ef_parser_t *parser, ef_char_t *ch) {
98 return parser_next_char_intern(parser, ch, CP874);
99 }
100
viscii_parser_next_char(ef_parser_t * parser,ef_char_t * ch)101 static int viscii_parser_next_char(ef_parser_t *parser, ef_char_t *ch) {
102 return parser_next_char_intern(parser, ch, VISCII);
103 }
104
iscii_parser_next_char(ef_parser_t * parser,ef_char_t * ch)105 static int iscii_parser_next_char(ef_parser_t *parser, ef_char_t *ch) {
106 return parser_next_char_intern(parser, ch, ((ef_iscii_parser_t*)parser)->cs);
107 }
108
parser_set_str(ef_parser_t * parser,u_char * str,size_t size)109 static void parser_set_str(ef_parser_t *parser, u_char *str, size_t size) {
110 parser->str = str;
111 parser->left = size;
112 parser->marked_left = 0;
113 parser->is_eos = 0;
114 }
115
parser_destroy(ef_parser_t * s)116 static void parser_destroy(ef_parser_t *s) { free(s); }
117
iscii_parser_new(ef_charset_t cs)118 static ef_parser_t *iscii_parser_new(ef_charset_t cs) {
119 ef_iscii_parser_t *iscii_parser;
120
121 if ((iscii_parser = malloc(sizeof(ef_iscii_parser_t))) == NULL) {
122 return NULL;
123 }
124
125 ef_parser_init(&iscii_parser->parser);
126
127 iscii_parser->parser.init = ef_parser_init;
128 iscii_parser->parser.next_char = iscii_parser_next_char;
129 iscii_parser->parser.set_str = parser_set_str;
130 iscii_parser->parser.destroy = parser_destroy;
131 iscii_parser->cs = cs;
132
133 return &iscii_parser->parser;
134 }
135
136 /* --- global functions --- */
137
ef_koi8_r_parser_new(void)138 ef_parser_t *ef_koi8_r_parser_new(void) {
139 ef_parser_t *parser;
140
141 if ((parser = malloc(sizeof(ef_parser_t))) == NULL) {
142 return NULL;
143 }
144
145 ef_parser_init(parser);
146
147 parser->init = ef_parser_init;
148 parser->next_char = koi8_r_parser_next_char;
149 parser->set_str = parser_set_str;
150 parser->destroy = parser_destroy;
151
152 return parser;
153 }
154
ef_koi8_u_parser_new(void)155 ef_parser_t *ef_koi8_u_parser_new(void) {
156 ef_parser_t *parser;
157
158 if ((parser = malloc(sizeof(ef_parser_t))) == NULL) {
159 return NULL;
160 }
161
162 ef_parser_init(parser);
163
164 parser->init = ef_parser_init;
165 parser->next_char = koi8_u_parser_next_char;
166 parser->set_str = parser_set_str;
167 parser->destroy = parser_destroy;
168
169 return parser;
170 }
171
ef_koi8_t_parser_new(void)172 ef_parser_t *ef_koi8_t_parser_new(void) {
173 ef_parser_t *parser;
174
175 if ((parser = malloc(sizeof(ef_parser_t))) == NULL) {
176 return NULL;
177 }
178
179 ef_parser_init(parser);
180
181 parser->init = ef_parser_init;
182 parser->next_char = koi8_t_parser_next_char;
183 parser->set_str = parser_set_str;
184 parser->destroy = parser_destroy;
185
186 return parser;
187 }
188
ef_georgian_ps_parser_new(void)189 ef_parser_t *ef_georgian_ps_parser_new(void) {
190 ef_parser_t *parser;
191
192 if ((parser = malloc(sizeof(ef_parser_t))) == NULL) {
193 return NULL;
194 }
195
196 ef_parser_init(parser);
197
198 parser->init = ef_parser_init;
199 parser->next_char = georgian_ps_parser_next_char;
200 parser->set_str = parser_set_str;
201 parser->destroy = parser_destroy;
202
203 return parser;
204 }
205
ef_cp1250_parser_new(void)206 ef_parser_t *ef_cp1250_parser_new(void) {
207 ef_parser_t *parser;
208
209 if ((parser = malloc(sizeof(ef_parser_t))) == NULL) {
210 return NULL;
211 }
212
213 ef_parser_init(parser);
214
215 parser->init = ef_parser_init;
216 parser->next_char = cp1250_parser_next_char;
217 parser->set_str = parser_set_str;
218 parser->destroy = parser_destroy;
219
220 return parser;
221 }
222
ef_cp1251_parser_new(void)223 ef_parser_t *ef_cp1251_parser_new(void) {
224 ef_parser_t *parser;
225
226 if ((parser = malloc(sizeof(ef_parser_t))) == NULL) {
227 return NULL;
228 }
229
230 ef_parser_init(parser);
231
232 parser->init = ef_parser_init;
233 parser->next_char = cp1251_parser_next_char;
234 parser->set_str = parser_set_str;
235 parser->destroy = parser_destroy;
236
237 return parser;
238 }
239
ef_cp1252_parser_new(void)240 ef_parser_t *ef_cp1252_parser_new(void) {
241 ef_parser_t *parser;
242
243 if ((parser = malloc(sizeof(ef_parser_t))) == NULL) {
244 return NULL;
245 }
246
247 ef_parser_init(parser);
248
249 parser->init = ef_parser_init;
250 parser->next_char = cp1252_parser_next_char;
251 parser->set_str = parser_set_str;
252 parser->destroy = parser_destroy;
253
254 return parser;
255 }
256
ef_cp1253_parser_new(void)257 ef_parser_t *ef_cp1253_parser_new(void) {
258 ef_parser_t *parser;
259
260 if ((parser = malloc(sizeof(ef_parser_t))) == NULL) {
261 return NULL;
262 }
263
264 ef_parser_init(parser);
265
266 parser->init = ef_parser_init;
267 parser->next_char = cp1253_parser_next_char;
268 parser->set_str = parser_set_str;
269 parser->destroy = parser_destroy;
270
271 return parser;
272 }
273
ef_cp1254_parser_new(void)274 ef_parser_t *ef_cp1254_parser_new(void) {
275 ef_parser_t *parser;
276
277 if ((parser = malloc(sizeof(ef_parser_t))) == NULL) {
278 return NULL;
279 }
280
281 ef_parser_init(parser);
282
283 parser->init = ef_parser_init;
284 parser->next_char = cp1254_parser_next_char;
285 parser->set_str = parser_set_str;
286 parser->destroy = parser_destroy;
287
288 return parser;
289 }
290
ef_cp1255_parser_new(void)291 ef_parser_t *ef_cp1255_parser_new(void) {
292 ef_parser_t *parser;
293
294 if ((parser = malloc(sizeof(ef_parser_t))) == NULL) {
295 return NULL;
296 }
297
298 ef_parser_init(parser);
299
300 parser->init = ef_parser_init;
301 parser->next_char = cp1255_parser_next_char;
302 parser->set_str = parser_set_str;
303 parser->destroy = parser_destroy;
304
305 return parser;
306 }
307
ef_cp1256_parser_new(void)308 ef_parser_t *ef_cp1256_parser_new(void) {
309 ef_parser_t *parser;
310
311 if ((parser = malloc(sizeof(ef_parser_t))) == NULL) {
312 return NULL;
313 }
314
315 ef_parser_init(parser);
316
317 parser->init = ef_parser_init;
318 parser->next_char = cp1256_parser_next_char;
319 parser->set_str = parser_set_str;
320 parser->destroy = parser_destroy;
321
322 return parser;
323 }
324
ef_cp1257_parser_new(void)325 ef_parser_t *ef_cp1257_parser_new(void) {
326 ef_parser_t *parser;
327
328 if ((parser = malloc(sizeof(ef_parser_t))) == NULL) {
329 return NULL;
330 }
331
332 ef_parser_init(parser);
333
334 parser->init = ef_parser_init;
335 parser->next_char = cp1257_parser_next_char;
336 parser->set_str = parser_set_str;
337 parser->destroy = parser_destroy;
338
339 return parser;
340 }
341
ef_cp1258_parser_new(void)342 ef_parser_t *ef_cp1258_parser_new(void) {
343 ef_parser_t *parser;
344
345 if ((parser = malloc(sizeof(ef_parser_t))) == NULL) {
346 return NULL;
347 }
348
349 ef_parser_init(parser);
350
351 parser->init = ef_parser_init;
352 parser->next_char = cp1258_parser_next_char;
353 parser->set_str = parser_set_str;
354 parser->destroy = parser_destroy;
355
356 return parser;
357 }
358
ef_cp874_parser_new(void)359 ef_parser_t *ef_cp874_parser_new(void) {
360 ef_parser_t *parser;
361
362 if ((parser = malloc(sizeof(ef_parser_t))) == NULL) {
363 return NULL;
364 }
365
366 ef_parser_init(parser);
367
368 parser->init = ef_parser_init;
369 parser->next_char = cp874_parser_next_char;
370 parser->set_str = parser_set_str;
371 parser->destroy = parser_destroy;
372
373 return parser;
374 }
375
ef_viscii_parser_new(void)376 ef_parser_t *ef_viscii_parser_new(void) {
377 ef_parser_t *viscii_parser;
378
379 if ((viscii_parser = malloc(sizeof(ef_parser_t))) == NULL) {
380 return NULL;
381 }
382
383 ef_parser_init(viscii_parser);
384
385 viscii_parser->init = ef_parser_init;
386 viscii_parser->next_char = viscii_parser_next_char;
387 viscii_parser->set_str = parser_set_str;
388 viscii_parser->destroy = parser_destroy;
389
390 return viscii_parser;
391 }
392
ef_iscii_assamese_parser_new(void)393 ef_parser_t *ef_iscii_assamese_parser_new(void) { return iscii_parser_new(ISCII_ASSAMESE); }
394
ef_iscii_bengali_parser_new(void)395 ef_parser_t *ef_iscii_bengali_parser_new(void) { return iscii_parser_new(ISCII_BENGALI); }
396
ef_iscii_gujarati_parser_new(void)397 ef_parser_t *ef_iscii_gujarati_parser_new(void) { return iscii_parser_new(ISCII_GUJARATI); }
398
ef_iscii_hindi_parser_new(void)399 ef_parser_t *ef_iscii_hindi_parser_new(void) { return iscii_parser_new(ISCII_HINDI); }
400
ef_iscii_kannada_parser_new(void)401 ef_parser_t *ef_iscii_kannada_parser_new(void) { return iscii_parser_new(ISCII_KANNADA); }
402
ef_iscii_malayalam_parser_new(void)403 ef_parser_t *ef_iscii_malayalam_parser_new(void) { return iscii_parser_new(ISCII_MALAYALAM); }
404
ef_iscii_oriya_parser_new(void)405 ef_parser_t *ef_iscii_oriya_parser_new(void) { return iscii_parser_new(ISCII_ORIYA); }
406
ef_iscii_punjabi_parser_new(void)407 ef_parser_t *ef_iscii_punjabi_parser_new(void) { return iscii_parser_new(ISCII_PUNJABI); }
408
ef_iscii_tamil_parser_new(void)409 ef_parser_t *ef_iscii_tamil_parser_new(void) { return iscii_parser_new(ISCII_TAMIL); }
410
ef_iscii_telugu_parser_new(void)411 ef_parser_t *ef_iscii_telugu_parser_new(void) { return iscii_parser_new(ISCII_TELUGU); }
412