aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog10
-rw-r--r--localedata/ChangeLog5
-rw-r--r--localedata/tests-mbwc/dat_mbrlen.c17
-rw-r--r--localedata/tests-mbwc/tst_mbrlen.c5
-rw-r--r--wcsmbs/mbrtowc.c9
-rw-r--r--wcsmbs/wcrtomb.c3
6 files changed, 35 insertions, 14 deletions
diff --git a/ChangeLog b/ChangeLog
index 3a73d1c..ef1d856 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,15 @@
2000-06-28 Ulrich Drepper <drepper@redhat.com>
+ * wcsmbs/mbrtowc.c: Set flush to 1 for conversion function calls
+ depending on whether the input string is empty or not.
+
+ * wcsmbs/mbrtowc.c: Calling function without input means clearing the
+ given state and not avoiding this by modifying a local object.
+ * wcsmbs/wcrtomb.c: Likewise.
+
+ * iconv/skeleton.c: If no EMIT_SHIFT_TO_INIT is defined clear state
+ object since some incomplete characters might be in there.
+
* iconvdata/euc-jp.c: In conversion to UCS4, handling invalid
sequences with first by 0x8e correctly.
diff --git a/localedata/ChangeLog b/localedata/ChangeLog
index 1f61a85..483038a 100644
--- a/localedata/ChangeLog
+++ b/localedata/ChangeLog
@@ -1,5 +1,10 @@
2000-06-28 Ulrich Drepper <drepper@redhat.com>
+ * tests-mbwc/dat_mbrlen.c: Correct some tests. Remove old WAIVER
+ comments.
+ * tests-mbwc/tst_mbrlen.c: Enable code to respect t_ini. Also clear
+ internal state of mbrlen.
+
* Makefile (do-tst-ctype): Add do-tst-mbswcs to list of dependencies.
(TEST_MBWC_ENV): Remove unnecessary slash.
* tst-ctype.sh: Add de_DE.UTF-8 to list of tested locales.
diff --git a/localedata/tests-mbwc/dat_mbrlen.c b/localedata/tests-mbwc/dat_mbrlen.c
index f1f9e15..8fdef8b 100644
--- a/localedata/tests-mbwc/dat_mbrlen.c
+++ b/localedata/tests-mbwc/dat_mbrlen.c
@@ -85,9 +85,7 @@ TST_MBRLEN tst_mbrlen_loc [] = {
{
{
{ 1, 0, 1, 0, },
- /* <WAIVER_? x 2> assuming ascii */
{ 1, EILSEQ, 1, -1, },
- /* <WAIVER_? x 2> assuming ascii */
{ 1, EILSEQ, 1, -1, },
}
}
@@ -102,16 +100,20 @@ TST_MBRLEN tst_mbrlen_loc [] = {
{
{
{ 1, "\317\302", 1, 0, 0 },
+#ifdef SHOJI_IS_RIGHT
{ 0, "", 0, 0, 0 },
+#else
+ /* XXX This test depends on the internal state being empty.
+ XXX Therefore we must explicitly clean it. */
+ { 0, "", 0, 0, 1 },
+#endif
{ 1, "\317\302", USE_MBCURMAX, 0, 0 },
}
},
{
{
{ 1, 0, 1, -2, },
- /* <WAIVER_?> returned -2 */
{ 1, 0, 1, 0, },
- /* <WAIVER_?> returned 1 */
{ 1, 0, 1, 2, },
}
}
@@ -127,8 +129,13 @@ TST_MBRLEN tst_mbrlen_loc [] = {
{
{
{ 1, 0, 1, -2, },
- /* <WAIVER_?> returned -2 */
+#ifdef SHOJI_IS_RIGHT
{ 1, 0, 1, +2, },
+#else
+ /* XXX ISO C explicitly says that the return value does not
+ XXX reflect the bytes contained in the state. */
+ { 1, 0, 1, +1, },
+#endif
{ 1, 0, 1, 2, },
}
}
diff --git a/localedata/tests-mbwc/tst_mbrlen.c b/localedata/tests-mbwc/tst_mbrlen.c
index a067acb..5b31d32 100644
--- a/localedata/tests-mbwc/tst_mbrlen.c
+++ b/localedata/tests-mbwc/tst_mbrlen.c
@@ -53,12 +53,13 @@ tst_mbrlen (FILE * fp, int debug_flg)
}
ps = (t_flg == 0) ? NULL : &s;
-#if 0
+
if (t_ini != 0)
{
memset (&s, 0, sizeof (s));
+ mbrlen (NULL, 0, NULL);
}
-#endif
+
TST_CLEAR_ERRNO;
ret = mbrlen (s_in, n, ps);
TST_SAVE_ERRNO;
diff --git a/wcsmbs/mbrtowc.c b/wcsmbs/mbrtowc.c
index d78a38b..034ccfe 100644
--- a/wcsmbs/mbrtowc.c
+++ b/wcsmbs/mbrtowc.c
@@ -35,7 +35,6 @@ static mbstate_t state;
size_t
__mbrtowc (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps)
{
- mbstate_t temp_state;
wchar_t buf[1];
struct __gconv_step_data data;
int status;
@@ -43,6 +42,7 @@ __mbrtowc (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps)
size_t dummy;
const unsigned char *inbuf;
char *outbuf = (char *) (pwc ?: buf);
+ int flush;
/* Set information for this step. */
data.__invocation_counter = 0;
@@ -58,9 +58,10 @@ __mbrtowc (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps)
outbuf = (char *) buf;
s = "";
n = 1;
- temp_state = *data.__statep;
- data.__statep = &temp_state;
+ flush = 1;
}
+ else
+ flush = *s == '\0' ? 1 : 0;
/* Tell where we want the result. */
data.__outbuf = outbuf;
@@ -73,7 +74,7 @@ __mbrtowc (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps)
inbuf = (const unsigned char *) s;
status = DL_CALL_FCT (__wcsmbs_gconv_fcts.towc->__fct,
(__wcsmbs_gconv_fcts.towc, &data, &inbuf, inbuf + n,
- NULL, &dummy, 0, 1));
+ NULL, &dummy, flush, 1));
/* There must not be any problems with the conversion but illegal input
characters. The output buffer must be large enough, otherwise the
diff --git a/wcsmbs/wcrtomb.c b/wcsmbs/wcrtomb.c
index ec75e57..ad0e0a9 100644
--- a/wcsmbs/wcrtomb.c
+++ b/wcsmbs/wcrtomb.c
@@ -37,7 +37,6 @@ static mbstate_t state;
size_t
__wcrtomb (char *s, wchar_t wc, mbstate_t *ps)
{
- mbstate_t temp_state;
char buf[MB_CUR_MAX];
struct __gconv_step_data data;
int status;
@@ -57,8 +56,6 @@ __wcrtomb (char *s, wchar_t wc, mbstate_t *ps)
{
s = buf;
wc = L'\0';
- temp_state = *data.__statep;
- data.__statep = &temp_state;
}
/* Tell where we want to have the result. */