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);
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to