Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2009-03-19 22:47:52 +0300
committerCorinna Vinschen <corinna@vinschen.de>2009-03-19 22:47:52 +0300
commit360dc06fdb022a7e5857bdce3175360a61fb4ada (patch)
treeaf98278849497e68fafd48e98de8308cfba09509 /newlib/libc/stdlib
parentd09a742ef465d529cf0f1f8afe0cb69333d03c3c (diff)
* libc/stdlib/mbtowc_r.c (_mbtowc_r): Return EILSEQ in case of an
invalid character sequence. * libc/stdlib/mbtowc_r.c (_mbtowc_r): Fix compiler warning due to missing declaration of __locale_charset. * libc/stdlib/wctomb_r.c (_wctomb_r): Ditto.
Diffstat (limited to 'newlib/libc/stdlib')
-rw-r--r--newlib/libc/stdlib/mbtowc_r.c75
-rw-r--r--newlib/libc/stdlib/wctomb_r.c2
2 files changed, 61 insertions, 16 deletions
diff --git a/newlib/libc/stdlib/mbtowc_r.c b/newlib/libc/stdlib/mbtowc_r.c
index 693c06c2d..d3856e041 100644
--- a/newlib/libc/stdlib/mbtowc_r.c
+++ b/newlib/libc/stdlib/mbtowc_r.c
@@ -4,8 +4,11 @@
#include "mbctype.h"
#include <wchar.h>
#include <string.h>
+#include <errno.h>
#ifdef _MB_CAPABLE
+extern char *__locale_charset ();
+
typedef enum { ESCAPE, DOLLAR, BRACKET, AT, B, J,
NUL, JIS_CHAR, OTHER, JIS_C_NUM } JIS_CHAR_TYPE;
typedef enum { ASCII, JIS, A_ESC, A_ESC_DL, JIS_1, J_ESC, J_ESC_BR,
@@ -117,10 +120,16 @@ _DEFUN (_mbtowc_r, (r, pwc, s, n, state),
return -2;
ch = t[i++];
if (ch < 0x80 || ch > 0xbf)
- return -1;
+ {
+ r->_errno = EILSEQ;
+ return -1;
+ }
if (state->__value.__wchb[0] < 0xc2)
- /* overlong UTF-8 sequence */
- return -1;
+ {
+ /* overlong UTF-8 sequence */
+ r->_errno = EILSEQ;
+ return -1;
+ }
state->__count = 0;
*pwc = (wchar_t)((state->__value.__wchb[0] & 0x1f) << 6)
| (wchar_t)(ch & 0x3f);
@@ -139,24 +148,36 @@ _DEFUN (_mbtowc_r, (r, pwc, s, n, state),
return -2;
ch = (state->__count == 1) ? t[i++] : state->__value.__wchb[1];
if (state->__value.__wchb[0] == 0xe0 && ch < 0xa0)
- /* overlong UTF-8 sequence */
- return -1;
+ {
+ /* overlong UTF-8 sequence */
+ r->_errno = EILSEQ;
+ return -1;
+ }
if (ch < 0x80 || ch > 0xbf)
- return -1;
+ {
+ r->_errno = EILSEQ;
+ return -1;
+ }
state->__value.__wchb[1] = ch;
state->__count = 2;
if (n < 3)
return -2;
ch = t[i++];
if (ch < 0x80 || ch > 0xbf)
- return -1;
+ {
+ r->_errno = EILSEQ;
+ return -1;
+ }
state->__count = 0;
tmp = (wchar_t)((state->__value.__wchb[0] & 0x0f) << 12)
| (wchar_t)((state->__value.__wchb[1] & 0x3f) << 6)
| (wchar_t)(ch & 0x3f);
if (tmp >= 0xd800 && tmp <= 0xdfff)
- return -1;
+ {
+ r->_errno = EILSEQ;
+ return -1;
+ }
*pwc = tmp;
return i;
}
@@ -173,10 +194,16 @@ _DEFUN (_mbtowc_r, (r, pwc, s, n, state),
return -2;
ch = (state->__count == 1) ? t[i++] : state->__value.__wchb[1];
if (state->__value.__wchb[0] == 0xf0 && ch < 0x90)
- /* overlong UTF-8 sequence */
- return -1;
+ {
+ /* overlong UTF-8 sequence */
+ r->_errno = EILSEQ;
+ return -1;
+ }
if (ch < 0x80 || ch > 0xbf)
- return -1;
+ {
+ r->_errno = EILSEQ;
+ return -1;
+ }
state->__value.__wchb[1] = ch;
if (state->__count == 1)
state->__count = 2;
@@ -186,14 +213,20 @@ _DEFUN (_mbtowc_r, (r, pwc, s, n, state),
return -2;
ch = (state->__count == 2) ? t[i++] : state->__value.__wchb[2];
if (ch < 0x80 || ch > 0xbf)
- return -1;
+ {
+ r->_errno = EILSEQ;
+ return -1;
+ }
state->__value.__wchb[2] = ch;
state->__count = 3;
if (n < 4)
return -2;
ch = t[i++];
if (ch < 0x80 || ch > 0xbf)
- return -1;
+ {
+ r->_errno = EILSEQ;
+ return -1;
+ }
tmp = (wint_t)((state->__value.__wchb[0] & 0x07) << 18)
| (wint_t)((state->__value.__wchb[1] & 0x3f) << 12)
| (wint_t)((state->__value.__wchb[2] & 0x3f) << 6)
@@ -217,7 +250,10 @@ _DEFUN (_mbtowc_r, (r, pwc, s, n, state),
return i;
}
else
- return -1;
+ {
+ r->_errno = EILSEQ;
+ return -1;
+ }
}
else if (!strcmp (__locale_charset (), "SJIS"))
{
@@ -246,7 +282,10 @@ _DEFUN (_mbtowc_r, (r, pwc, s, n, state),
return i;
}
else
- return -1;
+ {
+ r->_errno = EILSEQ;
+ return -1;
+ }
}
}
else if (!strcmp (__locale_charset (), "EUCJP"))
@@ -276,7 +315,10 @@ _DEFUN (_mbtowc_r, (r, pwc, s, n, state),
return i;
}
else
- return -1;
+ {
+ r->_errno = EILSEQ;
+ return -1;
+ }
}
}
else if (!strcmp (__locale_charset (), "JIS"))
@@ -357,6 +399,7 @@ _DEFUN (_mbtowc_r, (r, pwc, s, n, state),
break;
case ERROR:
default:
+ r->_errno = EILSEQ;
return -1;
}
diff --git a/newlib/libc/stdlib/wctomb_r.c b/newlib/libc/stdlib/wctomb_r.c
index 7178514dc..8d6d3fc92 100644
--- a/newlib/libc/stdlib/wctomb_r.c
+++ b/newlib/libc/stdlib/wctomb_r.c
@@ -5,6 +5,8 @@
#include <locale.h>
#include "mbctype.h"
+extern char *__locale_charset ();
+
/* for some conversions, we use the __count field as a place to store a state value */
#define __state __count