Coverage Report

Created: 2025-08-28 06:51

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