Coverage Report

Created: 2026-06-07 06:42

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/w3m/libwc/big5.c
Line
Count
Source
1
2
#include "wc.h"
3
#include "big5.h"
4
#include "search.h"
5
#include "wtf.h"
6
#ifdef USE_UNICODE
7
#include "ucs.h"
8
#endif
9
10
#define C0 WC_BIG5_MAP_C0
11
#define GL WC_BIG5_MAP_GL
12
95.5k
#define C1 WC_BIG5_MAP_C1
13
392k
#define LB WC_BIG5_MAP_LB
14
392k
#define UB WC_BIG5_MAP_UB
15
16
wc_uint8 WC_BIG5_MAP[ 0x100 ] = {
17
    C0, C0, C0, C0, C0, C0, C0, C0, C0, C0, C0, C0, C0, C0, C0, C0,
18
    C0, C0, C0, C0, C0, C0, C0, C0, C0, C0, C0, C0, C0, C0, C0, C0,
19
    GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL,
20
    GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL,
21
    LB, LB, LB, LB, LB, LB, LB, LB, LB, LB, LB, LB, LB, LB, LB, LB,
22
    LB, LB, LB, LB, LB, LB, LB, LB, LB, LB, LB, LB, LB, LB, LB, LB,
23
    LB, LB, LB, LB, LB, LB, LB, LB, LB, LB, LB, LB, LB, LB, LB, LB,
24
    LB, LB, LB, LB, LB, LB, LB, LB, LB, LB, LB, LB, LB, LB, LB, C0,
25
26
    C1, C1, C1, C1, C1, C1, C1, C1, C1, C1, C1, C1, C1, C1, C1, C1,
27
    C1, C1, C1, C1, C1, C1, C1, C1, C1, C1, C1, C1, C1, C1, C1, C1,
28
    C1, UB, UB, UB, UB, UB, UB, UB, UB, UB, UB, UB, UB, UB, UB, UB,
29
    UB, UB, UB, UB, UB, UB, UB, UB, UB, UB, UB, UB, UB, UB, UB, UB,
30
    UB, UB, UB, UB, UB, UB, UB, UB, UB, UB, UB, UB, UB, UB, UB, UB,
31
    UB, UB, UB, UB, UB, UB, UB, UB, UB, UB, UB, UB, UB, UB, UB, UB,
32
    UB, UB, UB, UB, UB, UB, UB, UB, UB, UB, UB, UB, UB, UB, UB, UB,
33
    UB, UB, UB, UB, UB, UB, UB, UB, UB, UB, UB, UB, UB, UB, UB, C1,
34
};
35
36
wc_wchar_t
37
wc_big5_to_cs94w(wc_wchar_t cc)
38
8.64M
{
39
8.64M
    cc.code = WC_BIG5_N(cc.code);
40
8.64M
    if (cc.code < WC_C_BIG5_2_BASE)
41
7.18M
  cc.ccs = WC_CCS_BIG5_1;
42
1.45M
    else {
43
1.45M
  cc.ccs = WC_CCS_BIG5_2;
44
1.45M
  cc.code -= WC_C_BIG5_2_BASE;
45
1.45M
    }
46
8.64M
    cc.code = WC_N_CS94W(cc.code);
47
8.64M
    return cc;
48
8.64M
}
49
50
wc_wchar_t
51
wc_cs94w_to_big5(wc_wchar_t cc)
52
8.64M
{
53
8.64M
    cc.code = WC_CS94W_N(cc.code);
54
8.64M
    if (cc.ccs == WC_CCS_BIG5_2)
55
1.45M
  cc.code += WC_C_BIG5_2_BASE;
56
8.64M
    cc.code = WC_N_BIG5(cc.code);
57
8.64M
    cc.ccs = WC_CCS_BIG5;
58
8.64M
    return cc;
59
8.64M
}
60
61
Str
62
wc_conv_from_big5(Str is, wc_ces ces)
63
232
{
64
232
    Str os;
65
232
    wc_uchar *sp = (wc_uchar *)is->ptr;
66
232
    wc_uchar *ep = sp + is->length;
67
232
    wc_uchar *p;
68
232
    int state = WC_BIG5_NOSTATE;
69
70
524k
    for (p = sp; p < ep && *p < 0x80; p++) 
71
524k
  ;
72
232
    if (p == ep)
73
47
  return is;
74
185
    os = Strnew_size(is->length);
75
185
    if (p > sp)
76
11
  Strcat_charp_n(os, (char *)is->ptr, (int)(p - sp));
77
78
1.09M
    for (; p < ep; p++) {
79
1.09M
  switch (state) {
80
699k
  case WC_BIG5_NOSTATE:
81
699k
      switch (WC_BIG5_MAP[*p]) {
82
392k
      case UB:
83
392k
    state = WC_BIG5_MBYTE1;
84
392k
    break;
85
95.5k
      case C1:
86
95.5k
    wtf_push_unknown(os, p, 1);
87
95.5k
    break;
88
210k
      default:
89
210k
    Strcat_char(os, (char)*p);
90
210k
    break;
91
699k
      }
92
699k
      break;
93
699k
  case WC_BIG5_MBYTE1:
94
392k
      if (WC_BIG5_MAP[*p] & LB)
95
356k
    wtf_push(os, WC_CCS_BIG5, ((wc_uint32)*(p-1) << 8) | *p);
96
36.8k
      else
97
36.8k
    wtf_push_unknown(os, p-1, 2);
98
392k
      state = WC_BIG5_NOSTATE;
99
392k
      break;
100
1.09M
  }
101
1.09M
    }
102
185
    switch (state) {
103
18
    case WC_BIG5_MBYTE1:
104
18
  wtf_push_unknown(os, p-1, 1);
105
18
  break;
106
185
    }
107
185
    return os;
108
185
}
109
110
void
111
wc_push_to_big5(Str os, wc_wchar_t cc, wc_status *st)
112
5.28M
{
113
10.3M
  while (1) {
114
10.3M
    switch (cc.ccs) {
115
41.4k
    case WC_CCS_US_ASCII:
116
41.4k
  Strcat_char(os, (char)cc.code);
117
41.4k
  return;
118
2.54M
    case WC_CCS_BIG5_1:
119
2.56M
    case WC_CCS_BIG5_2:
120
2.56M
  cc = wc_cs94w_to_big5(cc);
121
2.56M
    case WC_CCS_BIG5:
122
2.56M
  Strcat_char(os, (char)(cc.code >> 8));
123
2.56M
  Strcat_char(os, (char)(cc.code & 0xff));
124
2.56M
  return;
125
1.20M
    case WC_CCS_UNKNOWN_W:
126
1.20M
  if (!WcOption.no_replace)
127
1.20M
      Strcat_charp(os, WC_REPLACE_W);
128
1.20M
  return;
129
1.47M
    case WC_CCS_UNKNOWN:
130
1.47M
  if (!WcOption.no_replace)
131
1.47M
      Strcat_charp(os, WC_REPLACE);
132
1.47M
  return;
133
5.02M
    default:
134
5.02M
#ifdef USE_UNICODE
135
5.02M
  if (WcOption.ucs_conv)
136
5.02M
      cc = wc_any_to_any_ces(cc, st);
137
0
  else
138
0
#endif
139
0
      cc.ccs = WC_CCS_IS_WIDE(cc.ccs) ? WC_CCS_UNKNOWN_W : WC_CCS_UNKNOWN;
140
5.02M
  continue;
141
10.3M
    }
142
10.3M
  }
143
5.28M
}
144
145
Str
146
wc_char_conv_from_big5(wc_uchar c, wc_status *st)
147
0
{
148
0
    static Str os;
149
0
    static wc_uchar big5u;
150
151
0
    if (st->state == -1) {
152
0
  st->state = WC_BIG5_NOSTATE;
153
0
  os = Strnew_size(8);
154
0
    }
155
156
0
    switch (st->state) {
157
0
    case WC_BIG5_NOSTATE:
158
0
  switch (WC_BIG5_MAP[c]) {
159
0
  case UB:
160
0
      big5u = c;
161
0
      st->state = WC_BIG5_MBYTE1;
162
0
      return NULL;
163
0
  case C1:
164
0
      break;
165
0
  default:
166
0
      Strcat_char(os, (char)c);
167
0
      break;
168
0
  }
169
0
  break;
170
0
    case WC_BIG5_MBYTE1:
171
0
  if (WC_BIG5_MAP[c] & LB)
172
0
      wtf_push(os, WC_CCS_BIG5, ((wc_uint32)big5u << 8) | c);
173
0
  break;
174
0
    }
175
0
    st->state = -1;
176
0
    return os;
177
0
}