]> git.lyx.org Git - lyx.git/blob - 3rdparty/libiconv/1.15/lib/c99.h
Implement auto-nesting.
[lyx.git] / 3rdparty / libiconv / 1.15 / lib / c99.h
1 /*
2  * Copyright (C) 1999-2002, 2016 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, see <http://www.gnu.org/licenses/>.
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
29 c99_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, size_t n)
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
96 c99_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, size_t n)
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 }