]> git.lyx.org Git - lyx.git/blob - 3rdparty/libiconv/1.15/lib/java.h
Implement auto-nesting.
[lyx.git] / 3rdparty / libiconv / 1.15 / lib / java.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  * JAVA
22  * This is ISO 8859-1 with \uXXXX escape sequences, denoting Unicode BMP
23  * characters. Consecutive pairs of \uXXXX escape sequences in the surrogate
24  * range, as in UTF-16, denote Unicode characters outside the BMP.
25  */
26
27 static int
28 java_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, size_t n)
29 {
30   unsigned char c;
31   ucs4_t wc, wc2;
32   int i;
33
34   c = s[0];
35   if (c != '\\') {
36     *pwc = c;
37     return 1;
38   }
39   if (n < 2)
40     return RET_TOOFEW(0);
41   if (s[1] != 'u')
42     goto simply_backslash;
43   wc = 0;
44   for (i = 2; i < 6; i++) {
45     if (n <= i)
46       return RET_TOOFEW(0);
47     c = s[i];
48     if (c >= '0' && c <= '9')
49       c -= '0';
50     else if (c >= 'A' && c <= 'Z')
51       c -= 'A'-10;
52     else if (c >= 'a' && c <= 'z')
53       c -= 'a'-10;
54     else
55       goto simply_backslash;
56     wc |= (ucs4_t) c << (4 * (5-i));
57   }
58   if (!(wc >= 0xd800 && wc < 0xe000)) {
59     *pwc = wc;
60     return 6;
61   }
62   if (wc >= 0xdc00)
63     goto simply_backslash;
64   if (n < 7)
65     return RET_TOOFEW(0);
66   if (s[6] != '\\')
67     goto simply_backslash;
68   if (n < 8)
69     return RET_TOOFEW(0);
70   if (s[7] != 'u')
71     goto simply_backslash;
72   wc2 = 0;
73   for (i = 8; i < 12; i++) {
74     if (n <= i)
75       return RET_TOOFEW(0);
76     c = s[i];
77     if (c >= '0' && c <= '9')
78       c -= '0';
79     else if (c >= 'A' && c <= 'Z')
80       c -= 'A'-10;
81     else if (c >= 'a' && c <= 'z')
82       c -= 'a'-10;
83     else
84       goto simply_backslash;
85     wc2 |= (ucs4_t) c << (4 * (11-i));
86   }
87   if (!(wc2 >= 0xdc00 && wc2 < 0xe000))
88     goto simply_backslash;
89   *pwc = 0x10000 + ((wc - 0xd800) << 10) + (wc2 - 0xdc00);
90   return 12;
91 simply_backslash:
92   *pwc = '\\';
93   return 1;
94 }
95
96 static int
97 java_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, size_t n)
98 {
99   if (wc < 0x80) {
100     *r = wc;
101     return 1;
102   } else if (wc < 0x10000) {
103     if (n >= 6) {
104       unsigned int i;
105       r[0] = '\\';
106       r[1] = 'u';
107       i = (wc >> 12) & 0x0f; r[2] = (i < 10 ? '0'+i : 'a'-10+i);
108       i = (wc >> 8) & 0x0f;  r[3] = (i < 10 ? '0'+i : 'a'-10+i);
109       i = (wc >> 4) & 0x0f;  r[4] = (i < 10 ? '0'+i : 'a'-10+i);
110       i = wc & 0x0f;         r[5] = (i < 10 ? '0'+i : 'a'-10+i);
111       return 6;
112     } else
113       return RET_TOOSMALL;
114   } else if (wc < 0x110000) {
115     if (n >= 12) {
116       ucs4_t wc1 = 0xd800 + ((wc - 0x10000) >> 10);
117       ucs4_t wc2 = 0xdc00 + ((wc - 0x10000) & 0x3ff);
118       unsigned int i;
119       r[0] = '\\';
120       r[1] = 'u';
121       i = (wc1 >> 12) & 0x0f; r[2] = (i < 10 ? '0'+i : 'a'-10+i);
122       i = (wc1 >> 8) & 0x0f;  r[3] = (i < 10 ? '0'+i : 'a'-10+i);
123       i = (wc1 >> 4) & 0x0f;  r[4] = (i < 10 ? '0'+i : 'a'-10+i);
124       i = wc1 & 0x0f;         r[5] = (i < 10 ? '0'+i : 'a'-10+i);
125       r[6] = '\\';
126       r[7] = 'u';
127       i = (wc2 >> 12) & 0x0f; r[8] = (i < 10 ? '0'+i : 'a'-10+i);
128       i = (wc2 >> 8) & 0x0f;  r[9] = (i < 10 ? '0'+i : 'a'-10+i);
129       i = (wc2 >> 4) & 0x0f; r[10] = (i < 10 ? '0'+i : 'a'-10+i);
130       i = wc2 & 0x0f;        r[11] = (i < 10 ? '0'+i : 'a'-10+i);
131       return 12;
132     } else
133       return RET_TOOSMALL;
134   }
135   return RET_ILUNI;
136 }