summaryrefslogtreecommitdiff
path: root/source4/lib/iconv.c
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>2004-12-19 00:13:24 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 13:07:30 -0500
commit469fd3868b9538715cf8d8c845e68232b54d2fa6 (patch)
treea328863ba79b5d58fbd717adb7de138b7df7e86b /source4/lib/iconv.c
parent114bcfe837699083be2a5145b9f44092a649cae4 (diff)
downloadsamba-469fd3868b9538715cf8d8c845e68232b54d2fa6.tar.gz
samba-469fd3868b9538715cf8d8c845e68232b54d2fa6.tar.bz2
samba-469fd3868b9538715cf8d8c845e68232b54d2fa6.zip
r4267: fixed the charset code to use the builtin_functions.
Jelmer, please be more careful about testing new code. Your charsets register change completely broke charset handling on systems without iconv, and slowed every system down as the builtins were not being used at all. (This used to be commit 0022b4d24c7bb649fd69fffca04c022ea6b33634)
Diffstat (limited to 'source4/lib/iconv.c')
-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