utf8.c: add reencode_string_len() that can handle NULs in string

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Nguyễn Thái Ngọc Duy 2013-04-19 09:08:46 +10:00 committed by Junio C Hamano
parent 2bc1e7ecba
commit b782bbab94
3 changed files with 24 additions and 7 deletions

View File

@ -78,7 +78,7 @@ void precompose_argv(int argc, const char **argv)
size_t namelen; size_t namelen;
oldarg = argv[i]; oldarg = argv[i];
if (has_non_ascii(oldarg, (size_t)-1, &namelen)) { if (has_non_ascii(oldarg, (size_t)-1, &namelen)) {
newarg = reencode_string_iconv(oldarg, namelen, ic_precompose); newarg = reencode_string_iconv(oldarg, namelen, ic_precompose, NULL);
if (newarg) if (newarg)
argv[i] = newarg; argv[i] = newarg;
} }

10
utf8.c
View File

@ -468,7 +468,7 @@ int utf8_fprintf(FILE *stream, const char *format, ...)
#else #else
typedef char * iconv_ibp; typedef char * iconv_ibp;
#endif #endif
char *reencode_string_iconv(const char *in, size_t insz, iconv_t conv) char *reencode_string_iconv(const char *in, size_t insz, iconv_t conv, int *outsz_p)
{ {
size_t outsz, outalloc; size_t outsz, outalloc;
char *out, *outpos; char *out, *outpos;
@ -502,13 +502,17 @@ char *reencode_string_iconv(const char *in, size_t insz, iconv_t conv)
} }
else { else {
*outpos = '\0'; *outpos = '\0';
if (outsz_p)
*outsz_p = outpos - out;
break; break;
} }
} }
return out; return out;
} }
char *reencode_string(const char *in, const char *out_encoding, const char *in_encoding) char *reencode_string_len(const char *in, int insz,
const char *out_encoding, const char *in_encoding,
int *outsz)
{ {
iconv_t conv; iconv_t conv;
char *out; char *out;
@ -534,7 +538,7 @@ char *reencode_string(const char *in, const char *out_encoding, const char *in_e
return NULL; return NULL;
} }
out = reencode_string_iconv(in, strlen(in), conv); out = reencode_string_iconv(in, insz, conv, outsz);
iconv_close(conv); iconv_close(conv);
return out; return out;
} }

19
utf8.h
View File

@ -17,12 +17,25 @@ void strbuf_add_wrapped_bytes(struct strbuf *buf, const char *data, int len,
int indent, int indent2, int width); int indent, int indent2, int width);
#ifndef NO_ICONV #ifndef NO_ICONV
char *reencode_string_iconv(const char *in, size_t insz, iconv_t conv); char *reencode_string_iconv(const char *in, size_t insz,
char *reencode_string(const char *in, const char *out_encoding, const char *in_encoding); iconv_t conv, int *outsz);
char *reencode_string_len(const char *in, int insz,
const char *out_encoding,
const char *in_encoding,
int *outsz);
#else #else
#define reencode_string(a,b,c) NULL #define reencode_string_len(a,b,c,d,e) NULL
#endif #endif
static inline char *reencode_string(const char *in,
const char *out_encoding,
const char *in_encoding)
{
return reencode_string_len(in, strlen(in),
out_encoding, in_encoding,
NULL);
}
int mbs_chrlen(const char **text, size_t *remainder_p, const char *encoding); int mbs_chrlen(const char **text, size_t *remainder_p, const char *encoding);
#endif #endif