about summary refs log tree commit diff
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2003-11-19 09:09:27 +0000
committerUlrich Drepper <drepper@redhat.com>2003-11-19 09:09:27 +0000
commit02b50340af3fe92aebd6960faa5eb45c34ae7fe6 (patch)
tree1e8b6040fdb2217b0bf8ba7ea814b1b299ea1269
parentebcf449fd415a0b4fbb7cd3284b744e911064009 (diff)
downloadglibc-02b50340af3fe92aebd6960faa5eb45c34ae7fe6.tar.gz
glibc-02b50340af3fe92aebd6960faa5eb45c34ae7fe6.tar.xz
glibc-02b50340af3fe92aebd6960faa5eb45c34ae7fe6.zip
Update.
	* posix/regex_internal.c (build_wcs_upper_buffer): If mbrtowc
	fails, just use the byte, do no fancy conversions.
-rw-r--r--ChangeLog3
-rw-r--r--posix/regex_internal.c25
2 files changed, 18 insertions, 10 deletions
diff --git a/ChangeLog b/ChangeLog
index 8de71d7c4f..50f86c0b9c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
 2003-11-19  Ulrich Drepper  <drepper@redhat.com>
 
+	* posix/regex_internal.c (build_wcs_upper_buffer): If mbrtowc
+	fails, just use the byte, do no fancy conversions.
+
 	* posix/regex_internal.h (re_string_first_byte): Use ->valid_len
 	not ->len.
 	(re_string_is_single_byte_char): Likewise.
diff --git a/posix/regex_internal.c b/posix/regex_internal.c
index 1da5f7040a..859fe16c61 100644
--- a/posix/regex_internal.c
+++ b/posix/regex_internal.c
@@ -294,16 +294,11 @@ build_wcs_upper_buffer (pstr)
 	    }
 	  else if (mbclen == (size_t) -1 || mbclen == 0)
 	    {
-	      /* In case of a singlebyte character.  */
+	      /* It is an invalid character.  Just use the byte.  */
 	      int ch = pstr->raw_mbs[pstr->raw_mbs_idx + byte_idx];
-	      /* Apply the translation if we need.  */
-	      if (BE (pstr->trans != NULL, 0) && mbclen == 1)
-		{
-		  ch = pstr->trans[ch];
-		  pstr->mbs_case[byte_idx] = ch;
-		}
-	      pstr->wcs[byte_idx] = towupper (wc);
-	      pstr->mbs[byte_idx++] = toupper (ch);
+	      pstr->mbs[byte_idx] = ch;
+	      /* And also cast it to wide char.  */
+	      pstr->wcs[byte_idx++] = (wchar_t) ch;
 	      if (BE (mbclen == (size_t) -1, 0))
 		pstr->cur_state = prev_st;
 	    }
@@ -324,7 +319,7 @@ build_wcs_upper_buffer (pstr)
 	mbclen = mbrtowc (&wc,
 			  ((const char *) pstr->raw_mbs + pstr->raw_mbs_idx
 			   + byte_idx), remain_len, &pstr->cur_state);
-	if (mbclen == 1 || mbclen == (size_t) -1 || mbclen == 0)
+	if (mbclen == 1)
 	  {
 	    /* In case of a singlebyte character.  */
 	    int ch = pstr->raw_mbs[pstr->raw_mbs_idx + byte_idx];
@@ -351,6 +346,16 @@ build_wcs_upper_buffer (pstr)
 	    for (remain_len = byte_idx + mbclen - 1; byte_idx < remain_len ;)
 	      pstr->wcs[byte_idx++] = WEOF;
 	  }
+	else if (mbclen == (size_t) -1 || mbclen == 0)
+	  {
+	    /* It is an invalid character.  Just use the byte.  */
+	    int ch = pstr->raw_mbs[pstr->raw_mbs_idx + byte_idx];
+	    pstr->mbs[byte_idx] = ch;
+	    /* And also cast it to wide char.  */
+	    pstr->wcs[byte_idx++] = (wchar_t) ch;
+	    if (BE (mbclen == (size_t) -1, 0))
+	      pstr->cur_state = prev_st;
+	  }
 	else
 	  {
 	    /* The buffer doesn't have enough space, finish to build.  */