Coverage Report

Created: 2026-03-01 06:28

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/w3m/libwc/conv.c
Line
Count
Source
1
2
#include "wc.h"
3
#include "wtf.h"
4
#include "iso2022.h"
5
#include "hz.h"
6
#ifdef USE_UNICODE
7
#include "ucs.h"
8
#include "utf8.h"
9
#include "utf7.h"
10
#endif
11
12
char *WcReplace = "?";
13
char *WcReplaceW = "??";
14
15
static Str wc_conv_to_ces(Str is, wc_ces ces);
16
17
Str
18
wc_Str_conv(Str is, wc_ces f_ces, wc_ces t_ces)
19
11.3k
{
20
11.3k
    if (f_ces != WC_CES_WTF)
21
11.3k
  is = (*WcCesInfo[WC_CES_INDEX(f_ces)].conv_from)(is, f_ces);
22
11.3k
    if (t_ces != WC_CES_WTF)
23
11.3k
  return wc_conv_to_ces(is, t_ces);
24
0
    else
25
0
  return is;
26
11.3k
}
27
28
Str
29
wc_Str_conv_strict(Str is, wc_ces f_ces, wc_ces t_ces)
30
0
{
31
0
    Str os;
32
0
    wc_option opt = WcOption;
33
34
0
    WcOption.strict_iso2022 = WC_TRUE;
35
0
    WcOption.no_replace = WC_TRUE;
36
0
    WcOption.fix_width_conv = WC_FALSE;
37
0
    os = wc_Str_conv(is, f_ces, t_ces);
38
0
    WcOption = opt;
39
0
    return os;
40
0
}
41
42
static Str
43
wc_conv_to_ces(Str is, wc_ces ces)
44
11.3k
{
45
11.3k
    Str os;
46
11.3k
    wc_uchar *sp = (wc_uchar *)is->ptr;
47
11.3k
    wc_uchar *ep = sp + is->length;
48
11.3k
    wc_uchar *p;
49
11.3k
    wc_status st;
50
51
11.3k
    switch (ces) {
52
481
    case WC_CES_HZ_GB_2312:
53
33.7k
  for (p = sp; p < ep && *p != '~' && *p < 0x80; p++)
54
33.2k
      ;
55
481
  break;
56
85
    case WC_CES_TCVN_5712:
57
270
    case WC_CES_VISCII_11:
58
304
    case WC_CES_VPS:
59
770
  for (p = sp; p < ep && 0x20 <= *p && *p < 0x80; p++)
60
466
      ;
61
304
  break;
62
10.5k
    default:
63
400k
  for (p = sp; p < ep && *p < 0x80; p++)
64
389k
      ;
65
10.5k
  break;
66
11.3k
    }
67
11.3k
    if (p == ep)
68
2.20k
  return is;
69
70
9.13k
    os = Strnew_size(is->length);
71
9.13k
    if (p > sp)
72
1.78k
  p--; /* for precompose */
73
9.13k
    if (p > sp)
74
1.03k
  Strcat_charp_n(os, is->ptr, (int)(p - sp));
75
76
9.13k
    wc_output_init(ces, &st);
77
78
9.13k
    switch (ces) {
79
134
    case WC_CES_ISO_2022_JP:
80
263
    case WC_CES_ISO_2022_JP_2:
81
265
    case WC_CES_ISO_2022_JP_3:
82
593
    case WC_CES_ISO_2022_CN:
83
791
    case WC_CES_ISO_2022_KR:
84
1.25k
    case WC_CES_HZ_GB_2312:
85
1.32k
    case WC_CES_TCVN_5712:
86
1.48k
    case WC_CES_VISCII_11:
87
1.51k
    case WC_CES_VPS:
88
1.51k
#ifdef USE_UNICODE
89
1.98k
    case WC_CES_UTF_8:
90
2.64k
    case WC_CES_UTF_7:
91
2.64k
#endif
92
104M
  while (p < ep)
93
104M
      (*st.ces_info->push_to)(os, wtf_parse(&p), &st);
94
2.64k
  break;
95
6.49k
    default:
96
163M
  while (p < ep) {
97
163M
      if (*p < 0x80 && wtf_width(p + 1)) {
98
29.1M
    Strcat_char(os, (char)*p);
99
29.1M
    p++;
100
29.1M
      } else
101
134M
    (*st.ces_info->push_to)(os, wtf_parse(&p), &st);
102
163M
  }
103
6.49k
  break;
104
9.13k
    }
105
106
9.13k
    wc_push_end(os, &st);
107
108
9.13k
    return os;
109
9.13k
}
110
111
Str
112
wc_Str_conv_with_detect(Str is, wc_ces *f_ces, wc_ces hint, wc_ces t_ces)
113
11.3k
{
114
11.3k
    wc_ces detect;
115
116
11.3k
    if (*f_ces == WC_CES_WTF || hint == WC_CES_WTF) {
117
0
  *f_ces = WC_CES_WTF;
118
0
  detect = WC_CES_WTF;
119
11.3k
    } else if (WcOption.auto_detect == WC_OPT_DETECT_OFF) {
120
0
  *f_ces = hint;
121
0
  detect = hint;
122
11.3k
    } else {
123
11.3k
  if (*f_ces & WC_CES_T_8BIT)
124
8.16k
      hint = *f_ces;
125
11.3k
  detect = wc_auto_detect(is->ptr, is->length, hint);
126
11.3k
  if (WcOption.auto_detect == WC_OPT_DETECT_ON) {
127
11.3k
      if ((detect & WC_CES_T_8BIT) ||
128
2.67k
    ((detect & WC_CES_T_NASCII) && ! (*f_ces & WC_CES_T_8BIT)))
129
10.1k
    *f_ces = detect;
130
11.3k
  } else {
131
0
      if ((detect & WC_CES_T_ISO_2022) && ! (*f_ces & WC_CES_T_8BIT))
132
0
    *f_ces = detect;
133
0
  }
134
11.3k
    }
135
11.3k
    return wc_Str_conv(is, detect, t_ces);
136
11.3k
}
137
138
void
139
wc_push_end(Str os, wc_status *st)
140
9.13k
{
141
9.13k
    if (st->ces_info->id & WC_CES_T_ISO_2022)
142
791
  wc_push_to_iso2022_end(os, st);
143
8.34k
    else if (st->ces_info->id == WC_CES_HZ_GB_2312)
144
463
  wc_push_to_hz_end(os, st);
145
7.88k
#ifdef USE_UNICODE
146
7.88k
    else if (st->ces_info->id == WC_CES_UTF_8)
147
473
  wc_push_to_utf8_end(os, st);
148
7.41k
    else if (st->ces_info->id == WC_CES_UTF_7)
149
654
  wc_push_to_utf7_end(os, st);
150
9.13k
#endif
151
9.13k
}
152