Coverage Report

Created: 2025-12-05 06:38

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.5k
{
20
11.5k
    if (f_ces != WC_CES_WTF)
21
11.5k
  is = (*WcCesInfo[WC_CES_INDEX(f_ces)].conv_from)(is, f_ces);
22
11.5k
    if (t_ces != WC_CES_WTF)
23
11.5k
  return wc_conv_to_ces(is, t_ces);
24
0
    else
25
0
  return is;
26
11.5k
}
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.5k
{
45
11.5k
    Str os;
46
11.5k
    wc_uchar *sp = (wc_uchar *)is->ptr;
47
11.5k
    wc_uchar *ep = sp + is->length;
48
11.5k
    wc_uchar *p;
49
11.5k
    wc_status st;
50
51
11.5k
    switch (ces) {
52
436
    case WC_CES_HZ_GB_2312:
53
944
  for (p = sp; p < ep && *p != '~' && *p < 0x80; p++)
54
508
      ;
55
436
  break;
56
80
    case WC_CES_TCVN_5712:
57
272
    case WC_CES_VISCII_11:
58
306
    case WC_CES_VPS:
59
629
  for (p = sp; p < ep && 0x20 <= *p && *p < 0x80; p++)
60
323
      ;
61
306
  break;
62
10.8k
    default:
63
40.1k
  for (p = sp; p < ep && *p < 0x80; p++)
64
29.3k
      ;
65
10.8k
  break;
66
11.5k
    }
67
11.5k
    if (p == ep)
68
2.39k
  return is;
69
70
9.17k
    os = Strnew_size(is->length);
71
9.17k
    if (p > sp)
72
1.63k
  p--; /* for precompose */
73
9.17k
    if (p > sp)
74
949
  Strcat_charp_n(os, is->ptr, (int)(p - sp));
75
76
9.17k
    wc_output_init(ces, &st);
77
78
9.17k
    switch (ces) {
79
128
    case WC_CES_ISO_2022_JP:
80
236
    case WC_CES_ISO_2022_JP_2:
81
237
    case WC_CES_ISO_2022_JP_3:
82
601
    case WC_CES_ISO_2022_CN:
83
819
    case WC_CES_ISO_2022_KR:
84
1.23k
    case WC_CES_HZ_GB_2312:
85
1.30k
    case WC_CES_TCVN_5712:
86
1.46k
    case WC_CES_VISCII_11:
87
1.49k
    case WC_CES_VPS:
88
1.49k
#ifdef USE_UNICODE
89
1.95k
    case WC_CES_UTF_8:
90
2.61k
    case WC_CES_UTF_7:
91
2.61k
#endif
92
87.3M
  while (p < ep)
93
87.3M
      (*st.ces_info->push_to)(os, wtf_parse(&p), &st);
94
2.61k
  break;
95
6.55k
    default:
96
88.2M
  while (p < ep) {
97
88.1M
      if (*p < 0x80 && wtf_width(p + 1)) {
98
8.54M
    Strcat_char(os, (char)*p);
99
8.54M
    p++;
100
8.54M
      } else
101
79.6M
    (*st.ces_info->push_to)(os, wtf_parse(&p), &st);
102
88.1M
  }
103
6.55k
  break;
104
9.17k
    }
105
106
9.17k
    wc_push_end(os, &st);
107
108
9.17k
    return os;
109
9.17k
}
110
111
Str
112
wc_Str_conv_with_detect(Str is, wc_ces *f_ces, wc_ces hint, wc_ces t_ces)
113
11.5k
{
114
11.5k
    wc_ces detect;
115
116
11.5k
    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.5k
    } else if (WcOption.auto_detect == WC_OPT_DETECT_OFF) {
120
0
  *f_ces = hint;
121
0
  detect = hint;
122
11.5k
    } else {
123
11.5k
  if (*f_ces & WC_CES_T_8BIT)
124
8.19k
      hint = *f_ces;
125
11.5k
  detect = wc_auto_detect(is->ptr, is->length, hint);
126
11.5k
  if (WcOption.auto_detect == WC_OPT_DETECT_ON) {
127
11.5k
      if ((detect & WC_CES_T_8BIT) ||
128
2.84k
    ((detect & WC_CES_T_NASCII) && ! (*f_ces & WC_CES_T_8BIT)))
129
10.3k
    *f_ces = detect;
130
11.5k
  } 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.5k
    }
135
11.5k
    return wc_Str_conv(is, detect, t_ces);
136
11.5k
}
137
138
void
139
wc_push_end(Str os, wc_status *st)
140
9.17k
{
141
9.17k
    if (st->ces_info->id & WC_CES_T_ISO_2022)
142
819
  wc_push_to_iso2022_end(os, st);
143
8.35k
    else if (st->ces_info->id == WC_CES_HZ_GB_2312)
144
416
  wc_push_to_hz_end(os, st);
145
7.93k
#ifdef USE_UNICODE
146
7.93k
    else if (st->ces_info->id == WC_CES_UTF_8)
147
465
  wc_push_to_utf8_end(os, st);
148
7.47k
    else if (st->ces_info->id == WC_CES_UTF_7)
149
659
  wc_push_to_utf7_end(os, st);
150
9.17k
#endif
151
9.17k
}
152