Coverage Report

Created: 2026-04-28 06:11

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/w3m/libwc/status.c
Line
Count
Source
1
2
#include <string.h>
3
#include "../alloc.h"
4
5
#include "wc.h"
6
#ifdef USE_UNICODE
7
#include "ucs.h"
8
#endif
9
10
wc_option WcOption = {
11
    WC_OPT_DETECT_ON, /* auto_detect */
12
    WC_TRUE,    /* use_combining */
13
    WC_TRUE,    /* use_language_tag */
14
    WC_TRUE,    /* ucs_conv */
15
    WC_FALSE,   /* pre_conv */
16
    WC_TRUE,    /* fix_width_conv */
17
    WC_FALSE,   /* use_gb12345_map */
18
    WC_FALSE,   /* use_jisx0201 */
19
    WC_FALSE,   /* use_jisc6226 */
20
    WC_FALSE,   /* use_jisx0201k */
21
    WC_FALSE,   /* use_jisx0212 */
22
    WC_FALSE,   /* use_jisx0213 */
23
    WC_TRUE,    /* strict_iso2022 */
24
    WC_FALSE,   /* gb18030_as_ucs */
25
    WC_FALSE,   /* no_replace */
26
    WC_TRUE,    /* use_wide */
27
    WC_FALSE,   /* east_asian_width */
28
};
29
30
static wc_status output_st;
31
static wc_option output_option;
32
static wc_bool output_set = WC_FALSE;
33
34
#define wc_option_cmp(opt1, opt2) \
35
460
    memcmp((void *)(opt1), (void *)(opt2), sizeof(wc_option))
36
37
void
38
wc_input_init(wc_ces ces, wc_status *st)
39
12.6k
{
40
12.6k
    wc_gset *gset;
41
12.6k
    int i, g;
42
43
12.6k
    st->ces_info = &WcCesInfo[WC_CES_INDEX(ces)];
44
12.6k
    gset = st->ces_info->gset;
45
46
12.6k
    st->state = 0;
47
12.6k
    st->g0_ccs = 0;
48
12.6k
    st->g1_ccs = 0;
49
12.6k
    st->design[0] = gset[0].ccs;
50
12.6k
    st->design[1] = gset[1].ccs;  /* for ISO-2022-JP/EUC-JP */ 
51
12.6k
    st->design[2] = 0;
52
12.6k
    st->design[3] = 0;
53
12.6k
    st->gl = 0;
54
12.6k
    st->gr = 1;
55
12.6k
    st->ss = 0;
56
57
31.6k
    for (i = 0; gset[i].ccs; i++) {
58
18.9k
  if (gset[i].init) {
59
15.7k
      g = gset[i].g & 0x03;
60
15.7k
      if (! st->design[g])
61
1.33k
    st->design[g] = gset[i].ccs;
62
15.7k
  }
63
18.9k
    }
64
65
12.6k
#ifdef USE_UNICODE
66
12.6k
    st->tag = NULL;
67
12.6k
    st->ntag = 0;
68
12.6k
#endif
69
12.6k
}
70
71
void
72
wc_output_init(wc_ces ces, wc_status *st)
73
9.35k
{
74
9.35k
    wc_gset *gset;
75
9.35k
#ifdef USE_UNICODE
76
9.35k
    size_t i, n, nw;
77
9.35k
#endif
78
79
9.35k
    if (output_set && ces == output_st.ces_info->id &&
80
460
  ! wc_option_cmp(&WcOption, &output_option)) {
81
460
  *st = output_st;
82
460
  return;
83
460
    }
84
85
8.89k
    st->state = 0;
86
8.89k
    st->ces_info = &WcCesInfo[WC_CES_INDEX(ces)];
87
8.89k
    gset = st->ces_info->gset;
88
89
8.89k
    st->g0_ccs = ((ces == WC_CES_ISO_2022_JP || ces == WC_CES_ISO_2022_JP_2 ||
90
8.63k
  ces == WC_CES_ISO_2022_JP_3) && WcOption.use_jisx0201)
91
8.89k
  ? WC_CCS_JIS_X_0201 : gset[0].ccs;
92
8.89k
    st->g1_ccs = ((ces == WC_CES_ISO_2022_JP || ces == WC_CES_ISO_2022_JP_2 ||
93
8.63k
  ces == WC_CES_ISO_2022_JP_3) && WcOption.use_jisc6226)
94
8.89k
  ? WC_CCS_JIS_C_6226 : gset[1].ccs;
95
8.89k
    st->design[0] = st->g0_ccs;
96
8.89k
    st->design[1] = 0;
97
8.89k
    st->design[2] = 0;
98
8.89k
    st->design[3] = 0;
99
8.89k
    st->gl = 0;
100
8.89k
    st->gr = 0;
101
8.89k
    st->ss = 0;
102
103
8.89k
    if (ces & WC_CES_T_ISO_2022)
104
776
  wc_create_gmap(st);
105
106
8.89k
#ifdef USE_UNICODE
107
8.89k
    st->tag = NULL;
108
8.89k
    st->ntag = 0;
109
110
8.89k
    if (! WcOption.ucs_conv) {
111
0
  st->tlist = NULL;
112
0
  st->tlistw = NULL;
113
8.89k
    } else {
114
115
37.6k
    for (i = n = nw = 0; gset[i].ccs; i++) {
116
28.7k
  if (WC_CCS_IS_WIDE(gset[i].ccs))
117
14.6k
      nw++;
118
14.1k
  else
119
14.1k
      n++;
120
28.7k
    }
121
8.89k
    st->tlist = New_N(wc_table *, n + 1);
122
8.89k
    st->tlistw = New_N(wc_table *, nw + 1);
123
37.6k
    for (i = n = nw = 0; gset[i].ccs; i++) {
124
28.7k
  if (WC_CCS_IS_WIDE(gset[i].ccs)) {
125
14.6k
      switch (gset[i].ccs) {
126
323
      case WC_CCS_JIS_X_0212:
127
323
    if (! WcOption.use_jisx0212)
128
323
        continue;
129
0
    break;
130
339
      case WC_CCS_JIS_X_0213_1:
131
678
      case WC_CCS_JIS_X_0213_2:
132
678
    if (! WcOption.use_jisx0213)
133
678
        continue;
134
0
    break;
135
1.56k
      case WC_CCS_GB_2312:
136
1.56k
    if (WcOption.use_gb12345_map &&
137
0
        ces != WC_CES_GBK && ces != WC_CES_GB18030) {
138
0
        st->tlistw[nw++] = wc_get_ucs_table(WC_CCS_GB_12345);
139
0
        continue;
140
0
    }
141
1.56k
    break;
142
14.6k
      }
143
13.6k
      st->tlistw[nw++] = wc_get_ucs_table(gset[i].ccs);
144
14.1k
  } else {
145
14.1k
      switch (gset[i].ccs) {
146
554
      case WC_CCS_JIS_X_0201K:
147
554
    if (! WcOption.use_jisx0201k)
148
554
        continue;
149
0
    break;
150
14.1k
      }
151
13.6k
      st->tlist[n++] = wc_get_ucs_table(gset[i].ccs);
152
13.6k
  }
153
28.7k
    }
154
8.89k
    st->tlist[n] = NULL;
155
8.89k
    st->tlistw[nw] = NULL;
156
8.89k
    }
157
8.89k
#endif
158
159
8.89k
    output_st = *st;
160
8.89k
    output_set = WC_TRUE;
161
8.89k
    output_option = WcOption;
162
8.89k
}
163
164
wc_bool
165
wc_ces_has_ccs(wc_ccs ccs, wc_status *st)
166
0
{
167
0
    wc_gset *gset = st->ces_info->gset;
168
0
    int i;
169
170
0
    for (i = 0; gset[i].ccs; i++) {
171
0
  if (ccs == gset[i].ccs)
172
0
      return WC_TRUE;
173
0
    }
174
0
    return WC_FALSE;
175
0
}