version 1.1, 2012/02/21 22:57:48
|
version 1.1.1.2, 2021/03/17 13:38:46
|
Line 1
|
Line 1
|
/* |
/* |
* Copyright (C) 1999-2001, 2005 Free Software Foundation, Inc. | * Copyright (C) 1999-2001, 2005, 2012, 2016 Free Software Foundation, Inc. |
* This file is part of the GNU LIBICONV Library. |
* This file is part of the GNU LIBICONV Library. |
* |
* |
* The GNU LIBICONV Library is free software; you can redistribute it |
* The GNU LIBICONV Library is free software; you can redistribute it |
Line 14
|
Line 14
|
* |
* |
* You should have received a copy of the GNU Library General Public |
* You should have received a copy of the GNU Library General Public |
* License along with the GNU LIBICONV Library; see the file COPYING.LIB. |
* License along with the GNU LIBICONV Library; see the file COPYING.LIB. |
* If not, write to the Free Software Foundation, Inc., 51 Franklin Street, | * If not, see <https://www.gnu.org/licenses/>. |
* Fifth Floor, Boston, MA 02110-1301, USA. | |
*/ |
*/ |
|
|
/* |
/* |
Line 168 static const unsigned short gb18030uni_ranges[206] = {
|
Line 167 static const unsigned short gb18030uni_ranges[206] = {
|
}; |
}; |
|
|
static int |
static int |
gb18030uni_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) | gb18030uni_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, size_t n) |
{ |
{ |
unsigned char c1 = s[0]; |
unsigned char c1 = s[0]; |
if (c1 >= 0x81 && c1 <= 0x84) { |
if (c1 >= 0x81 && c1 <= 0x84) { |
Line 183 gb18030uni_mbtowc (conv_t conv, ucs4_t *pwc, const uns
|
Line 182 gb18030uni_mbtowc (conv_t conv, ucs4_t *pwc, const uns
|
if (c4 >= 0x30 && c4 <= 0x39) { |
if (c4 >= 0x30 && c4 <= 0x39) { |
unsigned int i = (((c1 - 0x81) * 10 + (c2 - 0x30)) * 126 + (c3 - 0x81)) * 10 + (c4 - 0x30); |
unsigned int i = (((c1 - 0x81) * 10 + (c2 - 0x30)) * 126 + (c3 - 0x81)) * 10 + (c4 - 0x30); |
if (i >= 0 && i <= 39419) { |
if (i >= 0 && i <= 39419) { |
unsigned int k1 = 0; | if (i == 7457) { |
unsigned int k2 = 205; | *pwc = 0xe7c7; |
while (k1 < k2) { | } else { |
unsigned int k = (k1 + k2) / 2; | unsigned int k1 = 0; |
if (i <= gb18030uni_charset2uni_ranges[2*k+1]) | unsigned int k2 = 205; |
k2 = k; | while (k1 < k2) { |
else if (i >= gb18030uni_charset2uni_ranges[2*k+2]) | unsigned int k = (k1 + k2) / 2; |
k1 = k + 1; | if (i <= gb18030uni_charset2uni_ranges[2*k+1]) |
else | k2 = k; |
return RET_ILSEQ; | else if (i >= gb18030uni_charset2uni_ranges[2*k+2]) |
| k1 = k + 1; |
| else |
| return RET_ILSEQ; |
| } |
| { |
| unsigned int diff = gb18030uni_ranges[k1]; |
| *pwc = (ucs4_t) (i + diff); |
| } |
} |
} |
{ | return 4; |
unsigned int diff = gb18030uni_ranges[k1]; | |
*pwc = (ucs4_t) (i + diff); | |
return 4; | |
} | |
} |
} |
} |
} |
return RET_ILSEQ; |
return RET_ILSEQ; |
Line 217 gb18030uni_mbtowc (conv_t conv, ucs4_t *pwc, const uns
|
Line 220 gb18030uni_mbtowc (conv_t conv, ucs4_t *pwc, const uns
|
} |
} |
|
|
static int |
static int |
gb18030uni_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) | gb18030uni_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, size_t n) |
{ |
{ |
if (n >= 4) { |
if (n >= 4) { |
unsigned int i = wc; |
unsigned int i = wc; |
if (i >= 0x0080 && i <= 0xffff) { |
if (i >= 0x0080 && i <= 0xffff) { |
unsigned int k1 = 0; | if (i == 0xe7c7) { |
unsigned int k2 = 205; | i = 7457; |
while (k1 < k2) { | } else { |
unsigned int k = (k1 + k2) / 2; | unsigned int k1 = 0; |
if (i <= gb18030uni_uni2charset_ranges[2*k+1]) | unsigned int k2 = 205; |
k2 = k; | while (k1 < k2) { |
else if (i >= gb18030uni_uni2charset_ranges[2*k+2]) | unsigned int k = (k1 + k2) / 2; |
k1 = k + 1; | if (i <= gb18030uni_uni2charset_ranges[2*k+1]) |
else | k2 = k; |
return RET_ILUNI; | else if (i >= gb18030uni_uni2charset_ranges[2*k+2]) |
| k1 = k + 1; |
| else |
| return RET_ILUNI; |
| } |
| { |
| unsigned int diff = gb18030uni_ranges[k1]; |
| i -= diff; |
| } |
} |
} |
{ | r[3] = (i % 10) + 0x30; i = i / 10; |
unsigned int diff = gb18030uni_ranges[k1]; | r[2] = (i % 126) + 0x81; i = i / 126; |
i -= diff; | r[1] = (i % 10) + 0x30; i = i / 10; |
r[3] = (i % 10) + 0x30; i = i / 10; | r[0] = i + 0x81; |
r[2] = (i % 126) + 0x81; i = i / 126; | return 4; |
r[1] = (i % 10) + 0x30; i = i / 10; | |
r[0] = i + 0x81; | |
return 4; | |
} | |
} |
} |
return RET_ILUNI; |
return RET_ILUNI; |
} |
} |