summaryrefslogtreecommitdiffstats
path: root/gl/mbrtowc.c
diff options
context:
space:
mode:
Diffstat (limited to 'gl/mbrtowc.c')
-rw-r--r--gl/mbrtowc.c47
1 files changed, 42 insertions, 5 deletions
diff --git a/gl/mbrtowc.c b/gl/mbrtowc.c
index 603f006..0fec5f1 100644
--- a/gl/mbrtowc.c
+++ b/gl/mbrtowc.c
@@ -1,5 +1,5 @@
1/* Convert multibyte character to wide character. 1/* Convert multibyte character to wide character.
2 Copyright (C) 1999-2002, 2005-2008 Free Software Foundation, Inc. 2 Copyright (C) 1999-2002, 2005-2009 Free Software Foundation, Inc.
3 Written by Bruno Haible <bruno@clisp.org>, 2008. 3 Written by Bruno Haible <bruno@clisp.org>, 2008.
4 4
5 This program is free software: you can redistribute it and/or modify 5 This program is free software: you can redistribute it and/or modify
@@ -89,7 +89,7 @@ mbrtowc (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps)
89 return (size_t)(-1); 89 return (size_t)(-1);
90 } 90 }
91 91
92 /* Here 0 < m 4. */ 92 /* Here m > 0. */
93 93
94# if __GLIBC__ 94# if __GLIBC__
95 /* Work around bug <http://sourceware.org/bugzilla/show_bug.cgi?id=9674> */ 95 /* Work around bug <http://sourceware.org/bugzilla/show_bug.cgi?id=9674> */
@@ -118,7 +118,7 @@ mbrtowc (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps)
118 lack mbrtowc(), we use the second approach. 118 lack mbrtowc(), we use the second approach.
119 The possible encodings are: 119 The possible encodings are:
120 - 8-bit encodings, 120 - 8-bit encodings,
121 - EUC-JP, EUC-KR, GB2312, EUC-TW, BIG5, SJIS, 121 - EUC-JP, EUC-KR, GB2312, EUC-TW, BIG5, GB18030, SJIS,
122 - UTF-8. 122 - UTF-8.
123 Use specialized code for each. */ 123 Use specialized code for each. */
124 if (m >= 4 || m >= MB_CUR_MAX) 124 if (m >= 4 || m >= MB_CUR_MAX)
@@ -238,6 +238,39 @@ mbrtowc (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps)
238 } 238 }
239 goto invalid; 239 goto invalid;
240 } 240 }
241 if (STREQ (encoding, "GB18030", 'G', 'B', '1', '8', '0', '3', '0', 0, 0))
242 {
243 if (m == 1)
244 {
245 unsigned char c = (unsigned char) p[0];
246
247 if ((c >= 0x90 && c <= 0xe3) || (c >= 0xf8 && c <= 0xfe))
248 goto incomplete;
249 }
250 else /* m == 2 || m == 3 */
251 {
252 unsigned char c = (unsigned char) p[0];
253
254 if (c >= 0x90 && c <= 0xe3)
255 {
256 unsigned char c2 = (unsigned char) p[1];
257
258 if (c2 >= 0x30 && c2 <= 0x39)
259 {
260 if (m == 2)
261 goto incomplete;
262 else /* m == 3 */
263 {
264 unsigned char c3 = (unsigned char) p[2];
265
266 if (c3 >= 0x81 && c3 <= 0xfe)
267 goto incomplete;
268 }
269 }
270 }
271 }
272 goto invalid;
273 }
241 if (STREQ (encoding, "SJIS", 'S', 'J', 'I', 'S', 0, 0, 0, 0, 0)) 274 if (STREQ (encoding, "SJIS", 'S', 'J', 'I', 'S', 0, 0, 0, 0, 0))
242 { 275 {
243 if (m == 1) 276 if (m == 1)
@@ -258,10 +291,14 @@ mbrtowc (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps)
258 incomplete: 291 incomplete:
259 { 292 {
260 size_t k = nstate; 293 size_t k = nstate;
261 /* Here 0 < k < m < 4. */ 294 /* Here 0 <= k < m < 4. */
262 pstate[++k] = s[0]; 295 pstate[++k] = s[0];
263 if (k < m) 296 if (k < m)
264 pstate[++k] = s[1]; 297 {
298 pstate[++k] = s[1];
299 if (k < m)
300 pstate[++k] = s[2];
301 }
265 if (k != m) 302 if (k != m)
266 abort (); 303 abort ();
267 } 304 }