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/