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>

Nguyễn Thái Ngọc Duy committed Apr 19, 2013 at 09:08 UTC b782bbab94e3618aea352907caa77321b487b918
3 files changed +24 -7
compat/precompose_utf8.c
+1 -1
@@ -78,7 +78,7 @@ void precompose_argv(int argc, const char **argv)
78 size_t namelen;
79 oldarg = argv[i];
80 if (has_non_ascii(oldarg, (size_t)-1, &namelen)) {
81 - newarg = reencode_string_iconv(oldarg, namelen, ic_precompose);
81 + newarg = reencode_string_iconv(oldarg, namelen, ic_precompose, NULL);
82 if (newarg)
83 argv[i] = newarg;
84 }
utf8.c
+7 -3
@@ -468,7 +468,7 @@ int utf8_fprintf(FILE *stream, const char *format, ...)
468 #else
469 typedef char * iconv_ibp;
470 #endif
471 -char *reencode_string_iconv(const char *in, size_t insz, iconv_t conv)
471 +char *reencode_string_iconv(const char *in, size_t insz, iconv_t conv, int *outsz_p)
472 {
473 size_t outsz, outalloc;
474 char *out, *outpos;
@@ -502,13 +502,17 @@ char *reencode_string_iconv(const char *in, size_t insz, iconv_t conv)
502 }
503 else {
504 *outpos = '\0';
505 + if (outsz_p)
506 + *outsz_p = outpos - out;
507 break;
508 }
509 }
510 return out;
511 }
512
511 -char *reencode_string(const char *in, const char *out_encoding, const char *in_encoding)
513 +char *reencode_string_len(const char *in, int insz,
514 + const char *out_encoding, const char *in_encoding,
515 + int *outsz)
516 {
517 iconv_t conv;
518 char *out;
@@ -534,7 +538,7 @@ char *reencode_string(const char *in, const char *out_encoding, const char *in_e
538 return NULL;
539 }
540
537 - out = reencode_string_iconv(in, strlen(in), conv);
541 + out = reencode_string_iconv(in, insz, conv, outsz);
542 iconv_close(conv);
543 return out;
544 }
utf8.h
+16 -3
@@ -17,12 +17,25 @@ void strbuf_add_wrapped_bytes(struct strbuf *buf, const char *data, int len,
17 int indent, int indent2, int width);
18
19 #ifndef NO_ICONV
20 -char *reencode_string_iconv(const char *in, size_t insz, iconv_t conv);
21 -char *reencode_string(const char *in, const char *out_encoding, const char *in_encoding);
20 +char *reencode_string_iconv(const char *in, size_t insz,
21 + iconv_t conv, int *outsz);
22 +char *reencode_string_len(const char *in, int insz,
23 + const char *out_encoding,
24 + const char *in_encoding,
25 + int *outsz);
26 #else
23 -#define reencode_string(a,b,c) NULL
27 +#define reencode_string_len(a,b,c,d,e) NULL
28 #endif
29
30 +static inline char *reencode_string(const char *in,
31 + const char *out_encoding,
32 + const char *in_encoding)
33 +{
34 + return reencode_string_len(in, strlen(in),
35 + out_encoding, in_encoding,
36 + NULL);
37 +}
38 +
39 int mbs_chrlen(const char **text, size_t *remainder_p, const char *encoding);
40
41 #endif