strtolocale.c | strtolocale.c | |||
---|---|---|---|---|
skipping to change at line 32 | skipping to change at line 32 | |||
size_t src_size, dest_size; | size_t src_size, dest_size; | |||
char *result, *dest; | char *result, *dest; | |||
const char *src; | const char *src; | |||
if (locale_encoding == NULL) { | if (locale_encoding == NULL) { | |||
#ifdef HAVE_LANGINFO_H | #ifdef HAVE_LANGINFO_H | |||
const char *encoding = nl_langinfo(CODESET); | const char *encoding = nl_langinfo(CODESET); | |||
#else | #else | |||
const char *encoding = "char"; | const char *encoding = "char"; | |||
#endif | #endif | |||
locale_encoding = xmalloc(strlen(encoding) + 11); | locale_encoding = (char *) xmalloc(strlen(encoding) + 11); | |||
sprintf(locale_encoding, "%s//TRANSLIT", encoding); | sprintf(locale_encoding, "%s//TRANSLIT", encoding); | |||
locale_encoding_is_utf8 = strcasecmp(encoding, "UTF-8") == 0; | locale_encoding_is_utf8 = strcasecmp(encoding, "UTF-8") == 0; | |||
} | } | |||
if (!str || !*str || locale_encoding_is_utf8) | if (!str || !*str || locale_encoding_is_utf8) | |||
return str; | return str; | |||
cd = iconv_open(locale_encoding, "UTF-8"); | cd = iconv_open(locale_encoding, "UTF-8"); | |||
if (cd == (iconv_t)-1) | if (cd == (iconv_t)-1) | |||
return str; | return str; | |||
src_size = strlen(str); | src_size = strlen(str); | |||
dest_size = src_size + 1; | dest_size = src_size + 1; | |||
result = xmalloc(dest_size); | result = (char *) xmalloc(dest_size); | |||
src = str; | src = str; | |||
dest = result; | dest = result; | |||
for(;;) { | for(;;) { | |||
size_t status = iconv(cd, (char **)&src, &src_size, &dest, &dest_siz e); | size_t status = iconv(cd, (char **)&src, &src_size, &dest, &dest_siz e); | |||
if (status == (size_t)-1) { | if (status == (size_t)-1) { | |||
size_t dest_offset; | size_t dest_offset; | |||
if (errno != E2BIG) { | if (errno != E2BIG) { | |||
free(result); | free(result); | |||
(void) iconv_close(cd); | (void) iconv_close(cd); | |||
return str; | return str; | |||
} | } | |||
dest_offset = dest - result; | dest_offset = dest - result; | |||
dest_size += 16; | dest_size += 16; | |||
result = xrealloc(result, dest_offset + dest_size); | result = (char *) xrealloc(result, dest_offset + dest_size); | |||
dest = result + dest_offset; | dest = result + dest_offset; | |||
} else if (src_size == 0) { | } else if (src_size == 0) { | |||
if (src == NULL) break; | if (src == NULL) break; | |||
src = NULL; | src = NULL; | |||
} | } | |||
} | } | |||
(void) iconv_close(cd); | (void) iconv_close(cd); | |||
free((void *)str); | free((void *)str); | |||
if (dest_size == 0) { | if (dest_size == 0) { | |||
size_t dest_offset = dest - result; | size_t dest_offset = dest - result; | |||
result = xrealloc(result, dest_offset + 1); | result = (char *) xrealloc(result, dest_offset + 1); | |||
dest = result + dest_offset; | dest = result + dest_offset; | |||
} | } | |||
*dest = '\0'; | *dest = '\0'; | |||
return result; | return result; | |||
#else | #else | |||
return str; | return str; | |||
#endif | #endif | |||
} | } | |||
End of changes. 4 change blocks. | ||||
4 lines changed or deleted | 4 lines changed or added | |||
This html diff was produced by rfcdiff 1.41. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ |