mirror of
https://github.com/git/git.git
synced 2024-11-23 18:05:29 +08:00
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:
parent
2bc1e7ecba
commit
b782bbab94
@ -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
10
utf8.c
@ -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
19
utf8.h
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user