summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--Completion/Unix/Command/_iconv4
-rw-r--r--Src/utils.c6
3 files changed, 11 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog
index c94e60fba..1cfb1edcd 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,10 @@
 2005-03-03  Oliver Kiddle  <opk@zsh.org>
 
+	* 20921, 20924: Src/utils.c, Completion/Unix/Command/_iconv:
+	using UCS-4BE instead of ISO-10646 to identify character
+	encoding is more portable; make error message more specific;
+	find more encodings in iconv completion on Solaris
+
 	* Henryk Konsek: 20918 (modified): Completion/Unix/Command/_unace:
 	new completion for unace
 
diff --git a/Completion/Unix/Command/_iconv b/Completion/Unix/Command/_iconv
index e1528aec5..92fa17e34 100644
--- a/Completion/Unix/Command/_iconv
+++ b/Completion/Unix/Command/_iconv
@@ -1,7 +1,8 @@
 #compdef iconv
 
-local expl curcontext="$curcontext" state line codeset ret=1
+local expl curcontext="$curcontext" state line ret=1
 local LOCPATH="${LOCPATH:-/usr/lib/nls/loc}"
+local -U codeset
 
 if _pick_variant gnu=GNU unix --version; then
 
@@ -40,6 +41,7 @@ else
   if [[ $state = codeset ]]; then
     if [[ -f /usr/lib/iconv/iconv_data ]]; then  # IRIX & Solaris
       codeset=( ${${(f)"$(</usr/lib/iconv/iconv_data)"}%%[[:blank:]]*} )
+      codeset+=( /usr/lib/iconv/*%*.so(Ne.'reply=( ${${REPLY:t}%%%*} ${${REPLY:r}#*%} )'.) )
     elif [[ -d $LOCPATH/iconv ]]; then  # OSF
       codeset=( $LOCPATH/iconv/*(N:t) )
       codeset=( ${(j:_:s:_:)codeset} )
diff --git a/Src/utils.c b/Src/utils.c
index 469361c33..f33dda54d 100644
--- a/Src/utils.c
+++ b/Src/utils.c
@@ -3617,13 +3617,13 @@ getkeystring(char *s, int *len, int fromwhere, int *misc)
 		    ICONV_CONST char *inptr = inbuf;
     	    	    inbytes = 4;
 		    outbytes = 6;
-		    /* assume big endian convention for UCS-4 */
+		    /* store value in big endian form */
 		    for (i=3;i>=0;i--) {
 			inbuf[i] = wval & 0xff;
 			wval >>= 8;
 		    }
 
-    	    	    cd = iconv_open(nl_langinfo(CODESET), "ISO-10646");
+    	    	    cd = iconv_open(nl_langinfo(CODESET), "UCS-4BE");
 		    if (cd == (iconv_t)-1) {
 			zerr("cannot do charset conversion", NULL, 0);
 			if (fromwhere == 4) {
@@ -3637,7 +3637,7 @@ getkeystring(char *s, int *len, int fromwhere, int *misc)
                     count = iconv(cd, &inptr, &inbytes, &t, &outbytes);
 		    iconv_close(cd);
 		    if (count == (size_t)-1) {
-                        zerr("cannot do charset conversion", NULL, 0);
+                        zerr("character not in range", NULL, 0);
 		        *t = '\0';
 			*len = t - buf;
 			return buf;