Coverage Report

Created: 2025-07-09 06:28

/src/w3m/libwc/status.c
Line
Count
Source (jump to first uncovered line)
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
613
    memcmp((void *)(opt1), (void *)(opt2), sizeof(wc_option))
36
37
void
38
wc_input_init(wc_ces ces, wc_status *st)
39
13.7k
{
40
13.7k
    wc_gset *gset;
41
13.7k
    int i, g;
42
43
13.7k
    st->ces_info = &WcCesInfo[WC_CES_INDEX(ces)];
44
13.7k
    gset = st->ces_info->gset;
45
46
13.7k
    st->state = 0;
47
13.7k
    st->g0_ccs = 0;
48
13.7k
    st->g1_ccs = 0;
49
13.7k
    st->design[0] = gset[0].ccs;
50
13.7k
    st->design[1] = gset[1].ccs;  /* for ISO-2022-JP/EUC-JP */ 
51
13.7k
    st->design[2] = 0;
52
13.7k
    st->design[3] = 0;
53
13.7k
    st->gl = 0;
54
13.7k
    st->gr = 1;
55
13.7k
    st->ss = 0;
56
57
35.0k
    for (i = 0; gset[i].ccs; i++) {
58
21.3k
  if (gset[i].init) {
59
17.4k
      g = gset[i].g & 0x03;
60
17.4k
      if (! st->design[g])
61
1.65k
    st->design[g] = gset[i].ccs;
62
17.4k
  }
63
21.3k
    }
64
65
13.7k
#ifdef USE_UNICODE
66
13.7k
    st->tag = NULL;
67
13.7k
    st->ntag = 0;
68
13.7k
#endif
69
13.7k
}
70
71
void
72
wc_output_init(wc_ces ces, wc_status *st)
73
10.0k
{
74
10.0k
    wc_gset *gset;
75
10.0k
#ifdef USE_UNICODE
76
10.0k
    size_t i, n, nw;
77
10.0k
#endif
78
79
10.0k
    if (output_set && ces == output_st.ces_info->id &&
80
10.0k
  ! wc_option_cmp(&WcOption, &output_option)) {
81
613
  *st = output_st;
82
613
  return;
83
613
    }
84
85
9.45k
    st->state = 0;
86
9.45k
    st->ces_info = &WcCesInfo[WC_CES_INDEX(ces)];
87
9.45k
    gset = st->ces_info->gset;
88
89
9.45k
    st->g0_ccs = ((ces == WC_CES_ISO_2022_JP || ces == WC_CES_ISO_2022_JP_2 ||
90
9.45k
  ces == WC_CES_ISO_2022_JP_3) && WcOption.use_jisx0201)
91
9.45k
  ? WC_CCS_JIS_X_0201 : gset[0].ccs;
92
9.45k
    st->g1_ccs = ((ces == WC_CES_ISO_2022_JP || ces == WC_CES_ISO_2022_JP_2 ||
93
9.45k
  ces == WC_CES_ISO_2022_JP_3) && WcOption.use_jisc6226)
94
9.45k
  ? WC_CCS_JIS_C_6226 : gset[1].ccs;
95
9.45k
    st->design[0] = st->g0_ccs;
96
9.45k
    st->design[1] = 0;
97
9.45k
    st->design[2] = 0;
98
9.45k
    st->design[3] = 0;
99
9.45k
    st->gl = 0;
100
9.45k
    st->gr = 0;
101
9.45k
    st->ss = 0;
102
103
9.45k
    if (ces & WC_CES_T_ISO_2022)
104
795
  wc_create_gmap(st);
105
106
9.45k
#ifdef USE_UNICODE
107
9.45k
    st->tag = NULL;
108
9.45k
    st->ntag = 0;
109
110
9.45k
    if (! WcOption.ucs_conv) {
111
0
  st->tlist = NULL;
112
0
  st->tlistw = NULL;
113
9.45k
    } else {
114
115
39.0k
    for (i = n = nw = 0; gset[i].ccs; i++) {
116
29.5k
  if (WC_CCS_IS_WIDE(gset[i].ccs))
117
14.6k
      nw++;
118
14.9k
  else
119
14.9k
      n++;
120
29.5k
    }
121
9.45k
    st->tlist = New_N(wc_table *, n + 1);
122
9.45k
    st->tlistw = New_N(wc_table *, nw + 1);
123
39.0k
    for (i = n = nw = 0; gset[i].ccs; i++) {
124
29.5k
  if (WC_CCS_IS_WIDE(gset[i].ccs)) {
125
14.6k
      switch (gset[i].ccs) {
126
324
      case WC_CCS_JIS_X_0212:
127
324
    if (! WcOption.use_jisx0212)
128
324
        continue;
129
0
    break;
130
371
      case WC_CCS_JIS_X_0213_1:
131
742
      case WC_CCS_JIS_X_0213_2:
132
742
    if (! WcOption.use_jisx0213)
133
742
        continue;
134
0
    break;
135
1.59k
      case WC_CCS_GB_2312:
136
1.59k
    if (WcOption.use_gb12345_map &&
137
1.59k
        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.59k
    break;
142
14.6k
      }
143
13.5k
      st->tlistw[nw++] = wc_get_ucs_table(gset[i].ccs);
144
14.9k
  } else {
145
14.9k
      switch (gset[i].ccs) {
146
559
      case WC_CCS_JIS_X_0201K:
147
559
    if (! WcOption.use_jisx0201k)
148
559
        continue;
149
0
    break;
150
14.9k
      }
151
14.3k
      st->tlist[n++] = wc_get_ucs_table(gset[i].ccs);
152
14.3k
  }
153
29.5k
    }
154
9.45k
    st->tlist[n] = NULL;
155
9.45k
    st->tlistw[nw] = NULL;
156
9.45k
    }
157
9.45k
#endif
158
159
9.45k
    output_st = *st;
160
9.45k
    output_set = WC_TRUE;
161
9.45k
    output_option = WcOption;
162
9.45k
}
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
}