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