Annotation of embedaddon/libiconv/lib/hz.h, revision 1.1.1.1
1.1 misho 1: /*
2: * Copyright (C) 1999-2001, 2008 Free Software Foundation, Inc.
3: * This file is part of the GNU LIBICONV Library.
4: *
5: * The GNU LIBICONV Library is free software; you can redistribute it
6: * and/or modify it under the terms of the GNU Library General Public
7: * License as published by the Free Software Foundation; either version 2
8: * of the License, or (at your option) any later version.
9: *
10: * The GNU LIBICONV Library is distributed in the hope that it will be
11: * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
12: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13: * Library General Public License for more details.
14: *
15: * You should have received a copy of the GNU Library General Public
16: * License along with the GNU LIBICONV Library; see the file COPYING.LIB.
17: * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18: */
19:
20: /*
21: * HZ
22: */
23:
24: /* Specification: RFC 1842, RFC 1843 */
25:
26: /*
27: * The state is 1 in GB mode, 0 in ASCII mode.
28: */
29:
30: static int
31: hz_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n)
32: {
33: state_t state = conv->istate;
34: unsigned int count = 0;
35: unsigned char c;
36: for (;;) {
37: c = *s;
38: if (c == '~') {
39: if (n < count+2)
40: goto none;
41: c = s[1];
42: if (state == 0) {
43: if (c == '~') {
44: *pwc = (ucs4_t) '~';
45: conv->istate = state;
46: return count+2;
47: }
48: if (c == '{') {
49: state = 1;
50: s += 2; count += 2;
51: if (n < count+1)
52: goto none;
53: continue;
54: }
55: if (c == '\n') {
56: s += 2; count += 2;
57: if (n < count+1)
58: goto none;
59: continue;
60: }
61: } else {
62: if (c == '}') {
63: state = 0;
64: s += 2; count += 2;
65: if (n < count+1)
66: goto none;
67: continue;
68: }
69: }
70: goto ilseq;
71: }
72: break;
73: }
74: if (state == 0) {
75: *pwc = (ucs4_t) c;
76: conv->istate = state;
77: return count+1;
78: } else {
79: int ret;
80: if (n < count+2)
81: goto none;
82: ret = gb2312_mbtowc(conv,pwc,s,2);
83: if (ret == RET_ILSEQ)
84: goto ilseq;
85: if (ret != 2) abort();
86: conv->istate = state;
87: return count+2;
88: }
89:
90: none:
91: conv->istate = state;
92: return RET_TOOFEW(count);
93:
94: ilseq:
95: conv->istate = state;
96: return RET_SHIFT_ILSEQ(count);
97: }
98:
99: static int
100: hz_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n)
101: {
102: state_t state = conv->ostate;
103: unsigned char buf[2];
104: int ret;
105:
106: /* Code set 0 (ASCII or GB 1988-89) */
107: ret = ascii_wctomb(conv,buf,wc,1);
108: if (ret != RET_ILUNI) {
109: if (ret != 1) abort();
110: if (buf[0] < 0x80) {
111: int count = (state ? 3 : 1);
112: if (n < count)
113: return RET_TOOSMALL;
114: if (state) {
115: r[0] = '~';
116: r[1] = '}';
117: r += 2;
118: state = 0;
119: }
120: r[0] = buf[0];
121: conv->ostate = state;
122: return count;
123: }
124: }
125:
126: /* Code set 1 (GB 2312-1980) */
127: ret = gb2312_wctomb(conv,buf,wc,2);
128: if (ret != RET_ILUNI) {
129: if (ret != 2) abort();
130: if (buf[0] < 0x80 && buf[1] < 0x80) {
131: int count = (state ? 2 : 4);
132: if (n < count)
133: return RET_TOOSMALL;
134: if (!state) {
135: r[0] = '~';
136: r[1] = '{';
137: r += 2;
138: state = 1;
139: }
140: r[0] = buf[0];
141: r[1] = buf[1];
142: conv->ostate = state;
143: return count;
144: }
145: }
146:
147: return RET_ILUNI;
148: }
149:
150: static int
151: hz_reset (conv_t conv, unsigned char *r, int n)
152: {
153: state_t state = conv->ostate;
154: if (state) {
155: if (n < 2)
156: return RET_TOOSMALL;
157: r[0] = '~';
158: r[1] = '}';
159: /* conv->ostate = 0; will be done by the caller */
160: return 2;
161: } else
162: return 0;
163: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>