1 /* -*- c-basic-offset:2; tab-width:2; indent-tabs-mode:nil -*- */
2 
3 #include "ef_euckr_parser.h"
4 
5 #include <stdio.h> /* NULL */
6 #include <pobl/bl_debug.h>
7 
8 #include "ef_iso2022_parser.h"
9 
10 #if 0
11 #define __DEBUG
12 #endif
13 
14 /* --- static functions --- */
15 
uhc_parser_next_char(ef_parser_t * parser,ef_char_t * ch)16 static int uhc_parser_next_char(ef_parser_t *parser, ef_char_t *ch) {
17   if (parser->is_eos) {
18     return 0;
19   }
20 
21   ef_parser_mark(parser);
22 
23   if (/* 0x00 <= *parser->str && */ *parser->str <= 0x80) {
24     ch->ch[0] = *parser->str;
25     ch->cs = US_ASCII;
26     ch->size = 1;
27   } else {
28     ch->ch[0] = *parser->str;
29 
30     if (ef_parser_increment(parser) == 0) {
31       ef_parser_reset(parser);
32 
33       return 0;
34     }
35 
36     ch->ch[1] = *parser->str;
37     ch->size = 2;
38     ch->cs = UHC;
39   }
40 
41   ch->property = 0;
42 
43   ef_parser_increment(parser);
44 
45   return 1;
46 }
47 
euckr_parser_init_intern(ef_parser_t * parser,ef_charset_t g1_cs)48 static void euckr_parser_init_intern(ef_parser_t *parser, ef_charset_t g1_cs) {
49   ef_iso2022_parser_t *iso2022_parser;
50 
51   ef_parser_init(parser);
52 
53   iso2022_parser = (ef_iso2022_parser_t*)parser;
54 
55   iso2022_parser->g0 = US_ASCII;
56   iso2022_parser->g1 = g1_cs;
57   iso2022_parser->g2 = UNKNOWN_CS;
58   iso2022_parser->g3 = UNKNOWN_CS;
59 
60   iso2022_parser->gl = &iso2022_parser->g0;
61   iso2022_parser->gr = &iso2022_parser->g1;
62 
63   iso2022_parser->non_iso2022_cs = UNKNOWN_CS;
64 
65   iso2022_parser->is_single_shifted = 0;
66 }
67 
euckr_parser_init(ef_parser_t * parser)68 static void euckr_parser_init(ef_parser_t *parser) {
69   euckr_parser_init_intern(parser, KSC5601_1987);
70 }
71 
uhc_parser_init(ef_parser_t * parser)72 static void uhc_parser_init(ef_parser_t *parser) { euckr_parser_init_intern(parser, UHC); }
73 
74 /* --- global functions --- */
75 
ef_euckr_parser_new(void)76 ef_parser_t *ef_euckr_parser_new(void) {
77   ef_iso2022_parser_t *iso2022_parser;
78 
79   if ((iso2022_parser = ef_iso2022_parser_new()) == NULL) {
80     return NULL;
81   }
82 
83   euckr_parser_init((ef_parser_t*)iso2022_parser);
84 
85   /* override */
86   iso2022_parser->parser.init = euckr_parser_init;
87 
88   return (ef_parser_t*)iso2022_parser;
89 }
90 
ef_uhc_parser_new(void)91 ef_parser_t *ef_uhc_parser_new(void) {
92   ef_iso2022_parser_t *iso2022_parser;
93 
94   if ((iso2022_parser = ef_iso2022_parser_new()) == NULL) {
95     return NULL;
96   }
97 
98   uhc_parser_init((ef_parser_t*)iso2022_parser);
99 
100   /* override */
101   iso2022_parser->parser.init = uhc_parser_init;
102   iso2022_parser->parser.next_char = uhc_parser_next_char;
103 
104   return (ef_parser_t*)iso2022_parser;
105 }
106