svn commit: r250981 - head/lib/libc/iconv

Ed Schouten ed at FreeBSD.org
Sat May 25 12:13:55 UTC 2013


Author: ed
Date: Sat May 25 12:13:54 2013
New Revision: 250981
URL: http://svnweb.freebsd.org/changeset/base/250981

Log:
  Make some tiny improvements to iconv_open().
  
  - Remove an unneeded variable.
  - Fix whitespace bugs.
  - Fix typoes in comment.
  - Improve string handling a bit. Don't handroll strstr() and don't
    terminate a strdup()'ed string. Instead, simply strndup() the part we
    need.

Modified:
  head/lib/libc/iconv/iconv.c

Modified: head/lib/libc/iconv/iconv.c
==============================================================================
--- head/lib/libc/iconv/iconv.c	Sat May 25 12:11:20 2013	(r250980)
+++ head/lib/libc/iconv/iconv.c	Sat May 25 12:13:54 2013	(r250981)
@@ -66,37 +66,31 @@ iconv_t		 _iconv_open(const char *out, c
 		    struct _citrus_iconv *prealloc);
 
 iconv_t
-_iconv_open(const char *out, const char *in, struct _citrus_iconv *prealloc)
+_iconv_open(const char *out, const char *in, struct _citrus_iconv *handle)
 {
-	struct _citrus_iconv *handle;
-	char *out_truncated, *p;
+	const char *out_slashes;
+	char *out_noslashes;
 	int ret;
 
-	handle = prealloc;
-
 	/*
 	 * Remove anything following a //, as these are options (like
 	 * //ignore, //translate, etc) and we just don't handle them.
-	 * This is for compatibilty with software that uses thees
+	 * This is for compatibility with software that uses these
 	 * blindly.
 	 */
-	out_truncated = strdup(out);
-	if (out_truncated == NULL) {
-		errno = ENOMEM;
-		return ((iconv_t)-1);
+	out_slashes = strstr(out, "//");
+	if (out_slashes != NULL) {
+		out_noslashes = strndup(out, out_slashes - out);
+		if (out_noslashes == NULL) {
+			errno = ENOMEM;
+			return ((iconv_t)-1);
+		}
+		ret = _citrus_iconv_open(&handle, in, out_noslashes);
+		free(out_noslashes);
+	} else {
+		ret = _citrus_iconv_open(&handle, in, out);
 	}
 
-	p = out_truncated;
-        while (*p != 0) {
-                if (p[0] == '/' && p[1] == '/') {
-                        *p = '\0';
-                        break;
-                }
-                p++;
-        }
-
-	ret = _citrus_iconv_open(&handle, in, out_truncated);
-	free(out_truncated);
 	if (ret) {
 		errno = ret == ENOENT ? EINVAL : ret;
 		return ((iconv_t)-1);


More information about the svn-src-head mailing list