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