Coverage Report

Created: 2023-06-07 06:55

/src/w3m/libwc/hz.c
Line
Count
Source (jump to first uncovered line)
1
2
#include "wc.h"
3
#include "iso2022.h"
4
#include "hz.h"
5
#include "wtf.h"
6
#ifdef USE_UNICODE
7
#include "ucs.h"
8
#endif
9
10
Str
11
wc_conv_from_hz(Str is, wc_ces ces)
12
0
{
13
0
    Str os;
14
0
    wc_uchar *sp = (wc_uchar *)is->ptr;
15
0
    wc_uchar *ep = sp + is->length;
16
0
    wc_uchar *p;
17
0
    int state = WC_HZ_NOSTATE;
18
19
0
    for (p = sp; p < ep && *p < 0x80 && *p != WC_C_HZ_TILDA; p++)
20
0
  ;
21
0
    if (p == ep)
22
0
  return is;
23
0
    os = Strnew_size(is->length);
24
0
    if (p > sp)
25
0
  Strcat_charp_n(os, is->ptr, (int)(p - sp));
26
27
0
    for (; p < ep; p++) {
28
0
  switch (state) {
29
0
  case WC_HZ_NOSTATE:
30
0
      if (*p == WC_C_HZ_TILDA)
31
0
    state = WC_HZ_TILDA;
32
0
      else if (WC_ISO_MAP[*p] == WC_ISO_MAP_GR)
33
0
    state = WC_HZ_MBYTE1_GR;   /* GB 2312 ? */
34
0
      else if (*p & 0x80)
35
0
    wtf_push_unknown(os, p, 1);
36
0
      else
37
0
    Strcat_char(os, (char)*p);
38
0
      break;
39
0
  case WC_HZ_TILDA:
40
0
      if (*p == WC_C_HZ_SI) {
41
0
    state = WC_HZ_MBYTE;
42
0
    break;
43
0
      } else if (*p == WC_C_HZ_TILDA)
44
0
    Strcat_char(os, (char)*p);
45
0
      else if (*p == '\n')
46
0
    break;
47
0
      else
48
0
    wtf_push_unknown(os, p-1, 2);
49
0
      state = WC_HZ_NOSTATE;
50
0
      break;
51
0
  case WC_HZ_TILDA_MB:
52
0
      if (*p == WC_C_HZ_SO || *p == '\n') {
53
0
    state = WC_HZ_NOSTATE;
54
0
    break;
55
0
      }
56
0
      else if (WC_ISO_MAP[*p & 0x7f] == WC_ISO_MAP_GL)
57
0
    wtf_push(os, WC_CCS_GB_2312, ((wc_uint32)*(p-1) << 8) | *p);
58
0
      else
59
0
    wtf_push_unknown(os, p-1, 2);
60
0
      state = WC_HZ_MBYTE;
61
0
      break;
62
0
  case WC_HZ_MBYTE:
63
0
      if (*p == WC_C_HZ_TILDA)
64
0
    state = WC_HZ_TILDA_MB;
65
0
      else if (WC_ISO_MAP[*p & 0x7f] == WC_ISO_MAP_GL)
66
0
    state = WC_HZ_MBYTE1;
67
0
      else
68
0
    wtf_push_unknown(os, p, 1);
69
0
      break;
70
0
  case WC_HZ_MBYTE1:
71
0
      if (WC_ISO_MAP[*p & 0x7f] == WC_ISO_MAP_GL)
72
0
    wtf_push(os, WC_CCS_GB_2312, ((wc_uint32)*(p-1) << 8) | *p);
73
0
      else
74
0
    wtf_push_unknown(os, p-1, 2);
75
0
      state = WC_HZ_MBYTE;
76
0
      break;
77
0
  case WC_HZ_MBYTE1_GR:
78
0
      if (WC_ISO_MAP[*p] == WC_ISO_MAP_GR)
79
0
    wtf_push(os, WC_CCS_GB_2312, ((wc_uint32)*(p-1) << 8) | *p);
80
0
      else
81
0
    wtf_push_unknown(os, p-1, 2);
82
0
      state = WC_HZ_NOSTATE;
83
0
      break;
84
0
  }
85
0
    }
86
0
    switch (state) {
87
0
    case WC_HZ_TILDA:
88
0
    case WC_HZ_TILDA_MB:
89
0
    case WC_HZ_MBYTE1:
90
0
    case WC_HZ_MBYTE1_GR:
91
0
  wtf_push_unknown(os, p-1, 1);
92
0
  break;
93
0
    }
94
0
    return os;
95
0
}
96
97
void
98
wc_push_to_hz(Str os, wc_wchar_t cc, wc_status *st)
99
0
{
100
0
  while (1) {
101
0
    switch (cc.ccs) {
102
0
    case WC_CCS_US_ASCII:
103
0
  if (st->gl) {
104
0
      Strcat_char(os, WC_C_HZ_TILDA);
105
0
      Strcat_char(os, WC_C_HZ_SO);
106
0
      st->gl = 0;
107
0
  }
108
0
  if ((char)cc.code == WC_C_HZ_TILDA)
109
0
      Strcat_char(os, WC_C_HZ_TILDA);
110
0
  Strcat_char(os, (char)cc.code);
111
0
  return;
112
0
    case WC_CCS_GB_2312:
113
0
  if (! st->gl) {
114
0
      Strcat_char(os, WC_C_HZ_TILDA);
115
0
      Strcat_char(os, WC_C_HZ_SI);
116
0
      st->gl = 1;
117
0
  }
118
0
  Strcat_char(os, (char)((cc.code >> 8) & 0x7f));
119
0
  Strcat_char(os, (char)(cc.code & 0x7f));
120
0
  return;
121
0
    case WC_CCS_UNKNOWN_W:
122
0
  if (WcOption.no_replace)
123
0
      return;
124
0
  if (st->gl) {
125
0
      Strcat_char(os, WC_C_HZ_TILDA);
126
0
      Strcat_char(os, WC_C_HZ_SO);
127
0
      st->gl = 0;
128
0
  }
129
0
  Strcat_charp(os, WC_REPLACE_W);
130
0
  return;
131
0
    case WC_CCS_UNKNOWN:
132
0
  if (WcOption.no_replace)
133
0
      return;
134
0
  if (st->gl) {
135
0
      Strcat_char(os, WC_C_HZ_TILDA);
136
0
      Strcat_char(os, WC_C_HZ_SO);
137
0
      st->gl = 0;
138
0
  }
139
0
  Strcat_charp(os, WC_REPLACE);
140
0
  return;
141
0
    default:
142
0
#ifdef USE_UNICODE
143
0
  if (WcOption.ucs_conv)
144
0
      cc = wc_any_to_any_ces(cc, st);
145
0
  else
146
0
#endif
147
0
      cc.ccs = WC_CCS_IS_WIDE(cc.ccs) ? WC_CCS_UNKNOWN_W : WC_CCS_UNKNOWN;
148
0
  continue;
149
0
    }
150
0
  }
151
0
}
152
153
void
154
wc_push_to_hz_end(Str os, wc_status *st)
155
0
{
156
0
    if (st->gl) {
157
0
  Strcat_char(os, WC_C_HZ_TILDA);
158
0
  Strcat_char(os, WC_C_HZ_SO);
159
0
  st->gl = 0;
160
0
    }
161
0
}