Annotation of embedaddon/libiconv/lib/c99.h, revision 1.1.1.1
1.1 misho 1: /*
2: * Copyright (C) 1999-2002 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,
18: * Fifth Floor, Boston, MA 02110-1301, USA.
19: */
20:
21: /*
22: * C99
23: * This is ASCII with \uXXXX and \UXXXXXXXX escape sequences, denoting Unicode
24: * characters. See ISO/IEC 9899:1999, section 6.4.3.
25: * The treatment of control characters in the range U+0080..U+009F is not
26: * specified; we pass them through unmodified.
27: */
28:
29: static int
30: c99_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n)
31: {
32: unsigned char c;
33: ucs4_t wc;
34: int i;
35:
36: c = s[0];
37: if (c < 0xa0) {
38: if (c != '\\') {
39: *pwc = c;
40: return 1;
41: }
42: if (n < 2)
43: return RET_TOOFEW(0);
44: c = s[1];
45: if (c == 'u') {
46: wc = 0;
47: for (i = 2; i < 6; i++) {
48: if (n <= i)
49: return RET_TOOFEW(0);
50: c = s[i];
51: if (c >= '0' && c <= '9')
52: c -= '0';
53: else if (c >= 'A' && c <= 'Z')
54: c -= 'A'-10;
55: else if (c >= 'a' && c <= 'z')
56: c -= 'a'-10;
57: else
58: goto simply_backslash;
59: wc |= (ucs4_t) c << (4 * (5-i));
60: }
61: if ((wc >= 0x00a0 && !(wc >= 0xd800 && wc < 0xe000))
62: || wc == 0x0024 || wc == 0x0040 || wc == 0x0060) {
63: *pwc = wc;
64: return 6;
65: }
66: } else if (c == 'U') {
67: wc = 0;
68: for (i = 2; i < 10; i++) {
69: if (n <= i)
70: return RET_TOOFEW(0);
71: c = s[i];
72: if (c >= '0' && c <= '9')
73: c -= '0';
74: else if (c >= 'A' && c <= 'Z')
75: c -= 'A'-10;
76: else if (c >= 'a' && c <= 'z')
77: c -= 'a'-10;
78: else
79: goto simply_backslash;
80: wc |= (ucs4_t) c << (4 * (9-i));
81: }
82: if ((wc >= 0x00a0 && !(wc >= 0xd800 && wc < 0xe000))
83: || wc == 0x0024 || wc == 0x0040 || wc == 0x0060) {
84: *pwc = wc;
85: return 10;
86: }
87: } else
88: goto simply_backslash;
89: }
90: return RET_ILSEQ;
91: simply_backslash:
92: *pwc = '\\';
93: return 1;
94: }
95:
96: static int
97: c99_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n)
98: {
99: if (wc < 0xa0) {
100: *r = wc;
101: return 1;
102: } else {
103: int result;
104: unsigned char u;
105: if (wc < 0x10000) {
106: result = 6;
107: u = 'u';
108: } else {
109: result = 10;
110: u = 'U';
111: }
112: if (n >= result) {
113: int count;
114: r[0] = '\\';
115: r[1] = u;
116: r += 2;
117: for (count = result-3; count >= 0; count--) {
118: unsigned int i = (wc >> (4*count)) & 0x0f;
119: *r++ = (i < 10 ? '0'+i : 'a'-10+i);
120: }
121: return result;
122: } else
123: return RET_TOOSMALL;
124: }
125: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>