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.
This commit is contained in:
Ed Schouten 2013-05-25 12:13:54 +00:00
parent 907b803190
commit a6f45121b5
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=250981

View File

@ -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);