reencode_string() will be used in the next patch for re-encoding pretty output, which can contain NULs. Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@xxxxxxxxx> --- builtin/fast-export.c | 3 ++- builtin/mailinfo.c | 3 ++- compat/precompose_utf8.c | 2 +- notes.c | 4 +++- pretty.c | 3 ++- sequencer.c | 5 +++-- utf8.c | 10 +++++++--- utf8.h | 10 +++++++--- 8 files changed, 27 insertions(+), 13 deletions(-) diff --git a/builtin/fast-export.c b/builtin/fast-export.c index 77dffd1..7ba9f3b 100644 --- a/builtin/fast-export.c +++ b/builtin/fast-export.c @@ -316,7 +316,8 @@ static void handle_commit(struct commit *commit, struct rev_info *rev) mark_next_object(&commit->object); if (!is_encoding_utf8(encoding)) - reencoded = reencode_string(message, "UTF-8", encoding); + reencoded = reencode_string(message, strlen(message), + "UTF-8", encoding, NULL); if (!commit->parents) printf("reset %s\n", (const char*)commit->util); printf("commit %s\nmark :%"PRIu32"\n%.*s\n%.*s\ndata %u\n%s", diff --git a/builtin/mailinfo.c b/builtin/mailinfo.c index 24a772d..129e7dc 100644 --- a/builtin/mailinfo.c +++ b/builtin/mailinfo.c @@ -486,7 +486,8 @@ static void convert_to_utf8(struct strbuf *line, const char *charset) if (same_encoding(metainfo_charset, charset)) return; - out = reencode_string(line->buf, metainfo_charset, charset); + out = reencode_string(line->buf, line->len, + metainfo_charset, charset, NULL); if (!out) die("cannot convert from %s to %s", charset, metainfo_charset); diff --git a/compat/precompose_utf8.c b/compat/precompose_utf8.c index 8cf5955..d9203d0 100644 --- a/compat/precompose_utf8.c +++ b/compat/precompose_utf8.c @@ -78,7 +78,7 @@ void precompose_argv(int argc, const char **argv) size_t namelen; oldarg = argv[i]; 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) argv[i] = newarg; } diff --git a/notes.c b/notes.c index f63fd57..4ae3b25 100644 --- a/notes.c +++ b/notes.c @@ -1222,7 +1222,9 @@ static void format_note(struct notes_tree *t, const unsigned char *object_sha1, if (output_encoding && *output_encoding && !is_encoding_utf8(output_encoding)) { - char *reencoded = reencode_string(msg, output_encoding, utf8); + char *reencoded = reencode_string(msg, strlen(msg), + output_encoding, utf8, + NULL); if (reencoded) { free(msg); msg = reencoded; diff --git a/pretty.c b/pretty.c index e2241e5..092dd1d 100644 --- a/pretty.c +++ b/pretty.c @@ -643,7 +643,8 @@ char *logmsg_reencode(const struct commit *commit, * this point, we are done with msg. If we allocated a fresh * copy, we can free it. */ - out = reencode_string(msg, output_encoding, use_encoding); + out = reencode_string(msg, strlen(msg), + output_encoding, use_encoding, NULL); if (out && msg != commit->buffer) free(msg); } diff --git a/sequencer.c b/sequencer.c index aef5e8a..bf15531 100644 --- a/sequencer.c +++ b/sequencer.c @@ -61,8 +61,9 @@ static int get_message(struct commit *commit, struct commit_message *out) out->reencoded_message = NULL; out->message = commit->buffer; if (same_encoding(encoding, git_commit_encoding)) - out->reencoded_message = reencode_string(commit->buffer, - git_commit_encoding, encoding); + out->reencoded_message = + reencode_string(commit->buffer, strlen(commit->buffer), + git_commit_encoding, encoding, NULL); if (out->reencoded_message) out->message = out->reencoded_message; diff --git a/utf8.c b/utf8.c index 38322a1..9d98043 100644 --- a/utf8.c +++ b/utf8.c @@ -468,7 +468,7 @@ int utf8_fprintf(FILE *stream, const char *format, ...) #else typedef char * iconv_ibp; #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; char *out, *outpos; @@ -502,13 +502,17 @@ char *reencode_string_iconv(const char *in, size_t insz, iconv_t conv) } else { *outpos = '\0'; + if (outsz_p) + *outsz_p = outpos - out; break; } } return out; } -char *reencode_string(const char *in, const char *out_encoding, const char *in_encoding) +char *reencode_string(const char *in, int insz, + const char *out_encoding, const char *in_encoding, + int *outsz) { iconv_t conv; char *out; @@ -518,7 +522,7 @@ char *reencode_string(const char *in, const char *out_encoding, const char *in_e conv = iconv_open(out_encoding, in_encoding); if (conv == (iconv_t) -1) return NULL; - out = reencode_string_iconv(in, strlen(in), conv); + out = reencode_string_iconv(in, insz, conv, outsz); iconv_close(conv); return out; } diff --git a/utf8.h b/utf8.h index a556932..99db3e0 100644 --- a/utf8.h +++ b/utf8.h @@ -17,10 +17,14 @@ void strbuf_add_wrapped_bytes(struct strbuf *buf, const char *data, int len, int indent, int indent2, int width); #ifndef NO_ICONV -char *reencode_string_iconv(const char *in, size_t insz, iconv_t conv); -char *reencode_string(const char *in, const char *out_encoding, const char *in_encoding); +char *reencode_string_iconv(const char *in, size_t insz, + iconv_t conv, int *outsz); +char *reencode_string(const char *in, int insz, + const char *out_encoding, + const char *in_encoding, + int *outsz); #else -#define reencode_string(a,b,c) NULL +#define reencode_string(a,b,c,d) NULL #endif #endif -- 1.8.2.83.gc99314b -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html