about summary refs log tree commit diff
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 3a73d1c53b..ef1d856bce 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 1f61a85259..483038a784 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 f1f9e15294..8fdef8bf8a 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 a067acb266..5b31d32149 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 d78a38bd43..034ccfec41 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 ec75e579a4..ad0e0a98a1 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.  */