Coverage Report

Created: 2023-06-07 06:55

/src/w3m/libwc/viet.c
Line
Count
Source (jump to first uncovered line)
1
2
#include "wc.h"
3
#include "viet.h"
4
#include "wtf.h"
5
#include "search.h"
6
#ifdef USE_UNICODE
7
#include "ucs.h"
8
#endif
9
#include "map/tcvn57123_tcvn5712.map"
10
11
wc_uint8 wc_c0_tcvn57122_map[ 0x20 ] = {
12
    0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,     
13
    0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,     
14
};
15
wc_uint8 wc_c0_viscii112_map[ 0x20 ] = {
16
    0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,     
17
    0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0,     
18
};
19
wc_uint8 wc_c0_vps2_map[ 0x20 ] = {
20
    0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,     
21
    1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0,     
22
};
23
static wc_uint8 tcvn5712_precompose_map[ 0x100 ] = {
24
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
25
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
26
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
27
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
28
/*     A           E           I                 O */
29
    0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1,
30
/*                 U           Y                   */
31
    0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,
32
/*     a           e           i                 o */
33
    0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1,
34
/*                 u           y                   */
35
    0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,
36
37
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
38
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
39
/*     A( A^ E^ O^ O+ U+    a( a^ e^ o^ o+ u+      */
40
    0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0,
41
/*  `  ?  ~  '  .                                  */
42
    2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
43
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
44
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
45
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
46
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
47
};
48
static wc_uint8 cp1258_precompose_map[ 0x100 ] = {
49
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
50
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
51
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
52
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
53
/*     A           E           I                 O */
54
    0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1,
55
/*                 U           Y                   */
56
    0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,
57
/*     a           e           i                 o */
58
    0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1,
59
/*                 u           y                   */
60
    0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,
61
62
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
63
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
64
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
65
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
66
/*        A^ A(                   E^    `          */
67
    0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 2, 0, 0, 0,
68
/*        ?     O^ O+                      U+ ~    */
69
    0, 0, 2, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0,
70
/*        a^ a(                   e^    '          */
71
    0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 2, 0, 0, 0,
72
/*        .     o^ o+                      u+      */
73
    0, 0, 2, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0,
74
};
75
76
wc_uint32
77
wc_tcvn5712_precompose(wc_uchar c1, wc_uchar c2)
78
0
{
79
0
    if (tcvn5712_precompose_map[c1] == 1 && tcvn5712_precompose_map[c2] == 2)
80
0
  return ((wc_uint32)c1 << 8) | c2;
81
0
    else
82
0
  return 0;
83
0
}
84
85
wc_wchar_t
86
wc_tcvn57123_to_tcvn5712(wc_wchar_t cc)
87
0
{
88
0
    wc_map *map;
89
90
0
    map = wc_map_search((wc_uint16)(cc.code & 0x7f7f),
91
0
  tcvn57123_tcvn5712_map, N_tcvn57123_tcvn5712_map);
92
0
    if (map) {
93
0
  cc.ccs = (map->code2 < 0x20) ? WC_CCS_TCVN_5712_2 : WC_CCS_TCVN_5712_1;
94
0
  cc.code = map->code2 | 0x80;
95
0
    } else {
96
0
  cc.ccs = WC_CCS_UNKNOWN;
97
0
    }
98
0
    return cc;
99
0
}
100
101
wc_uint32
102
wc_cp1258_precompose(wc_uchar c1, wc_uchar c2)
103
0
{
104
0
    if (cp1258_precompose_map[c1] == 1 && cp1258_precompose_map[c2] == 2)
105
0
  return ((wc_uint32)c1 << 8) | c2;
106
0
    else
107
0
  return 0;
108
0
}
109
110
Str
111
wc_conv_from_viet(Str is, wc_ces ces)
112
0
{
113
0
    Str os;
114
0
    wc_uchar *sp = (wc_uchar *)is->ptr;
115
0
    wc_uchar *ep = sp + is->length;
116
0
    wc_uchar *p;
117
0
    wc_ccs ccs1 = WcCesInfo[WC_CCS_INDEX(ces)].gset[1].ccs;
118
0
    wc_ccs ccs2 = WcCesInfo[WC_CCS_INDEX(ces)].gset[2].ccs;
119
0
    wc_uint8 *map = NULL;
120
121
0
    switch (ces) {
122
0
    case WC_CES_TCVN_5712:
123
0
  map = wc_c0_tcvn57122_map;
124
0
  break;
125
0
    case WC_CES_VISCII_11:
126
0
  map = wc_c0_viscii112_map;
127
0
  break;
128
0
    case WC_CES_VPS:
129
0
  map = wc_c0_vps2_map;
130
0
  break;
131
0
    }
132
133
0
    wc_create_detect_map(ces, WC_FALSE);
134
0
    for (p = sp; p < ep && ! WC_DETECT_MAP[*p]; p++)
135
0
  ;
136
0
    if (p == ep)
137
0
  return is;
138
0
    os = Strnew_size(is->length);
139
0
    if (p > sp)
140
0
  Strcat_charp_n(os, is->ptr, (int)(p - sp));
141
142
0
    for (; p < ep; p++) {
143
0
  if (*p & 0x80)
144
0
      wtf_push(os, ccs1, (wc_uint32)*p);
145
0
  else if (*p < 0x20 && map[*p])
146
0
      wtf_push(os, ccs2, (wc_uint32)*p);
147
0
  else
148
0
      Strcat_char(os, (char)*p);
149
0
    }
150
0
    return os;
151
0
}
152
153
void
154
wc_push_to_viet(Str os, wc_wchar_t cc, wc_status *st)
155
0
{
156
0
    wc_ccs ccs1 = st->ces_info->gset[1].ccs;
157
0
    wc_ccs ccs2 = 0, ccs3 = 0;
158
0
    wc_uint8 *map = NULL;
159
160
0
    switch (st->ces_info->id) {
161
0
    case WC_CES_CP1258:
162
0
  ccs3 = st->ces_info->gset[2].ccs;
163
0
  break;
164
0
    case WC_CES_TCVN_5712:
165
0
  map = wc_c0_tcvn57122_map;
166
0
  ccs2 = st->ces_info->gset[2].ccs;
167
0
  ccs3 = st->ces_info->gset[3].ccs;
168
0
  break;
169
0
    case WC_CES_VISCII_11:
170
0
  map = wc_c0_viscii112_map;
171
0
  ccs2 = st->ces_info->gset[2].ccs;
172
0
  break;
173
0
    case WC_CES_VPS:
174
0
  map = wc_c0_vps2_map;
175
0
  ccs2 = st->ces_info->gset[2].ccs;
176
0
  break;
177
0
    }
178
179
0
  while (1) {
180
0
    if (cc.ccs == ccs1) {
181
0
  Strcat_char(os, (char)(cc.code | 0x80));
182
0
  return;
183
0
    } else if (cc.ccs == ccs2) {
184
0
  Strcat_char(os, (char)(cc.code & 0x7f));
185
0
  return;
186
0
    } else if (cc.ccs == ccs3) {
187
0
  Strcat_char(os, (char)((cc.code >> 8) & 0xff));
188
0
  Strcat_char(os, (char)(cc.code & 0xff));
189
0
  return;
190
0
    }
191
0
    switch (cc.ccs) {
192
0
    case WC_CCS_US_ASCII:
193
0
  if (cc.code < 0x20 && map && map[cc.code])
194
0
      Strcat_char(os, ' ');
195
0
  else
196
0
      Strcat_char(os, (char)cc.code);
197
0
  return;
198
0
    case WC_CCS_UNKNOWN_W:
199
0
  if (!WcOption.no_replace)
200
0
      Strcat_charp(os, WC_REPLACE_W);
201
0
  return;
202
0
    case WC_CCS_UNKNOWN:
203
0
  if (!WcOption.no_replace)
204
0
      Strcat_charp(os, WC_REPLACE);
205
0
  return;
206
0
    default:
207
0
#ifdef USE_UNICODE
208
0
  if (WcOption.ucs_conv)
209
0
      cc = wc_any_to_any_ces(cc, st);
210
0
  else
211
0
#endif
212
0
      cc.ccs = WC_CCS_IS_WIDE(cc.ccs) ? WC_CCS_UNKNOWN_W : WC_CCS_UNKNOWN;
213
0
  continue;
214
0
    }
215
0
  }
216
0
}
217
218
Str
219
wc_char_conv_from_viet(wc_uchar c, wc_status *st)
220
0
{
221
0
    Str os = Strnew_size(1);
222
0
    wc_uint8 *map = NULL;
223
224
0
    switch (st->ces_info->id) {
225
0
    case WC_CES_TCVN_5712:
226
0
  map = wc_c0_tcvn57122_map;
227
0
  break;
228
0
    case WC_CES_VISCII_11:
229
0
  map = wc_c0_viscii112_map;
230
0
  break;
231
0
    case WC_CES_VPS:
232
0
  map = wc_c0_vps2_map;
233
0
  break;
234
0
    }
235
236
0
    if (c & 0x80)
237
0
  wtf_push(os, st->ces_info->gset[1].ccs, (wc_uint32)c);
238
0
    else if (c < 0x20 && map[c])
239
0
  wtf_push(os, st->ces_info->gset[2].ccs, (wc_uint32)c);
240
0
    else
241
0
  Strcat_char(os, (char)c);
242
0
    return os;
243
0
}