about summary refs log tree commit diff
path: root/iconv/gconv_trans.c
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2000-06-17 03:08:26 +0000
committerUlrich Drepper <drepper@redhat.com>2000-06-17 03:08:26 +0000
commit1d96d74da7f6adccd82e4000efe38900b295467a (patch)
treee17bb7feb5740943051034b27028df9e72ed0132 /iconv/gconv_trans.c
parent323fb88dac799cddfaa33cb80f7fc3395c2297e5 (diff)
downloadglibc-1d96d74da7f6adccd82e4000efe38900b295467a.tar.gz
glibc-1d96d74da7f6adccd82e4000efe38900b295467a.tar.xz
glibc-1d96d74da7f6adccd82e4000efe38900b295467a.zip
Update.
	* locale/langinfo.h: Add entries for default_missing information.
	* locale/C-ctype.c: Add initializers for new fields.
	* iconv/gconv_trans.c: If nothing matched, try to use default_missing
	information.
	* locale/categories.h: Add entries for all LC_CTYPE values.
	* locale/programs/ld-ctype.c (ctype_output): Write out default_missing
	information.

	* localedata/tst-trans.c: Write out an error message if class is
	not found.
Diffstat (limited to 'iconv/gconv_trans.c')
-rw-r--r--iconv/gconv_trans.c35
1 files changed, 34 insertions, 1 deletions
diff --git a/iconv/gconv_trans.c b/iconv/gconv_trans.c
index 829ff5f981..0bb5f00c07 100644
--- a/iconv/gconv_trans.c
+++ b/iconv/gconv_trans.c
@@ -44,12 +44,13 @@ __gconv_transliterate (struct __gconv_step *step,
   uint32_t *winbufend;
   uint_fast32_t low;
   uint_fast32_t high;
+  uint32_t *default_missing;
 
   /* If there is no transliteration information in the locale don't do
      anything and return the error.  */
   size = _NL_CURRENT_WORD (LC_CTYPE, _NL_CTYPE_TRANSLIT_HASH_SIZE);
   if (size == 0)
-    return __GCONV_ILLEGAL_INPUT;
+    goto no_rules;
 
   /* Get the rest of the values.  */
   layers = _NL_CURRENT_WORD (LC_CTYPE, _NL_CTYPE_TRANSLIT_HASH_LAYERS);
@@ -141,6 +142,38 @@ __gconv_transliterate (struct __gconv_step *step,
 	high = idx;
     }
 
+  /* One last chance: use the default replacement.  */
+ no_rules:
+  default_missing = (uint32_t *)
+    _NL_CURRENT (LC_CTYPE, _NL_CTYPE_TRANSLIT_DEFAULT_MISSING);
+  if (default_missing[0] != L'\0')
+    {
+      const unsigned char *toinptr = (const unsigned char *) default_missing;
+      uint32_t len = _NL_CURRENT_WORD (LC_CTYPE,
+				       _NL_CTYPE_TRANSLIT_DEFAULT_MISSING_LEN);
+      int res;
+
+      res = DL_CALL_FCT (step->__fct,
+			 (step, step_data, &toinptr,
+			  (const unsigned char *) (default_missing + len),
+			  (unsigned char **) outbufstart,
+			  irreversible, 0, 0));
+
+      if (res != __GCONV_ILLEGAL_INPUT)
+	{
+	  /* If the conversion succeeds we have to increment the
+	     input buffer.  */
+	  if (res == __GCONV_EMPTY_INPUT)
+	    {
+	      /* We consuming one character.  */
+	      ++*inbufp;
+	      ++*irreversible;
+	    }
+
+	  return res;
+	}
+    }
+
   /* Haven't found a match.  */
   return __GCONV_ILLEGAL_INPUT;
 }