summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authored <ed@FreeBSD.org>2013-05-25 12:13:54 +0000
committered <ed@FreeBSD.org>2013-05-25 12:13:54 +0000
commitdcb48cfa2b59c0d7067b7107f4f8695e2519758a (patch)
tree82800a1975d4411b2bfb2e8128c26e8a719520ab
parent3f589c4a65061002236515a5e50d5eafb6c1f50f (diff)
downloadFreeBSD-src-dcb48cfa2b59c0d7067b7107f4f8695e2519758a.zip
FreeBSD-src-dcb48cfa2b59c0d7067b7107f4f8695e2519758a.tar.gz
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.
-rw-r--r--lib/libc/iconv/iconv.c36
1 files changed, 15 insertions, 21 deletions
diff --git a/lib/libc/iconv/iconv.c b/lib/libc/iconv/iconv.c
index d1e01e8..99cfc37 100644
--- a/lib/libc/iconv/iconv.c
+++ b/lib/libc/iconv/iconv.c
@@ -66,37 +66,31 @@ iconv_t _iconv_open(const char *out, const char *in,
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);
OpenPOWER on IntegriCloud