summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source4/lib/iconv.c32
1 files changed, 20 insertions, 12 deletions
diff --git a/source4/lib/iconv.c b/source4/lib/iconv.c
index 045ed36320..181834d66a 100644
--- a/source4/lib/iconv.c
+++ b/source4/lib/iconv.c
@@ -67,8 +67,7 @@ static const struct charset_functions builtin_functions[] = {
{"UTF8", utf8_pull, utf8_push},
{"UTF-8", utf8_pull, utf8_push},
{"ASCII", ascii_pull, ascii_push},
- {"UCS2-HEX", ucs2hex_pull, ucs2hex_push},
- {NULL, NULL, NULL}
+ {"UCS2-HEX", ucs2hex_pull, ucs2hex_push}
};
static struct charset_functions *charsets = NULL;
@@ -161,10 +160,8 @@ static BOOL is_utf16(const char *name)
smb_iconv_t smb_iconv_open(const char *tocode, const char *fromcode)
{
smb_iconv_t ret;
- struct charset_functions *from, *to;
-
- from = charsets;
- to = charsets;
+ const struct charset_functions *from=NULL, *to=NULL;
+ int i;
ret = (smb_iconv_t)talloc_named(NULL, sizeof(*ret),
"iconv(%s,%s)", tocode, fromcode);
@@ -180,14 +177,25 @@ smb_iconv_t smb_iconv_open(const char *tocode, const char *fromcode)
return ret;
}
- while (from) {
- if (strcasecmp(from->name, fromcode) == 0) break;
- from = from->next;
+ for (i=0;i<ARRAY_SIZE(builtin_functions);i++) {
+ if (strcasecmp(fromcode, builtin_functions[i].name) == 0) {
+ from = &builtin_functions[i];
+ }
+ if (strcasecmp(tocode, builtin_functions[i].name) == 0) {
+ to = &builtin_functions[i];
+ }
}
- while (to) {
- if (strcasecmp(to->name, tocode) == 0) break;
- to = to->next;
+ if (from == NULL) {
+ for (from=charsets; from; from=from->next) {
+ if (strcasecmp(from->name, fromcode) == 0) break;
+ }
+ }
+
+ if (to == NULL) {
+ for (to=charsets; to; to=to->next) {
+ if (strcasecmp(to->name, tocode) == 0) break;
+ }
}
#ifdef HAVE_NATIVE_ICONV