Refactor replace_encoding_header.
* Be more clever in how we search for "encoding ...\n": parse for real instead of the sloppy strstr's. * use strbuf_splice to do the substring replacements. Signed-off-by: Pierre Habouzit <madcoder@debian.org> Acked-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
c7f9cb1428
commit
a08f23ab3e
57
commit.c
57
commit.c
@ -648,47 +648,34 @@ static char *get_header(const struct commit *commit, const char *key)
|
|||||||
|
|
||||||
static char *replace_encoding_header(char *buf, const char *encoding)
|
static char *replace_encoding_header(char *buf, const char *encoding)
|
||||||
{
|
{
|
||||||
char *encoding_header = strstr(buf, "\nencoding ");
|
struct strbuf tmp;
|
||||||
char *header_end = strstr(buf, "\n\n");
|
size_t start, len;
|
||||||
char *end_of_encoding_header;
|
char *cp = buf;
|
||||||
int encoding_header_pos;
|
|
||||||
int encoding_header_len;
|
|
||||||
int new_len;
|
|
||||||
int need_len;
|
|
||||||
int buflen = strlen(buf) + 1;
|
|
||||||
|
|
||||||
if (!header_end)
|
/* guess if there is an encoding header before a \n\n */
|
||||||
header_end = buf + buflen;
|
while (strncmp(cp, "encoding ", strlen("encoding "))) {
|
||||||
if (!encoding_header || encoding_header >= header_end)
|
cp = strchr(cp, '\n');
|
||||||
return buf;
|
if (!cp || *++cp == '\n')
|
||||||
encoding_header++;
|
return buf;
|
||||||
end_of_encoding_header = strchr(encoding_header, '\n');
|
}
|
||||||
if (!end_of_encoding_header)
|
start = cp - buf;
|
||||||
|
cp = strchr(cp, '\n');
|
||||||
|
if (!cp)
|
||||||
return buf; /* should not happen but be defensive */
|
return buf; /* should not happen but be defensive */
|
||||||
end_of_encoding_header++;
|
len = cp + 1 - (buf + start);
|
||||||
|
|
||||||
encoding_header_len = end_of_encoding_header - encoding_header;
|
|
||||||
encoding_header_pos = encoding_header - buf;
|
|
||||||
|
|
||||||
|
strbuf_init(&tmp, 0);
|
||||||
|
strbuf_attach(&tmp, buf, strlen(buf), strlen(buf) + 1);
|
||||||
if (is_encoding_utf8(encoding)) {
|
if (is_encoding_utf8(encoding)) {
|
||||||
/* we have re-coded to UTF-8; drop the header */
|
/* we have re-coded to UTF-8; drop the header */
|
||||||
memmove(encoding_header, end_of_encoding_header,
|
strbuf_splice(&tmp, start, len, NULL, 0);
|
||||||
buflen - (encoding_header_pos + encoding_header_len));
|
} else {
|
||||||
return buf;
|
/* just replaces XXXX in 'encoding XXXX\n' */
|
||||||
|
strbuf_splice(&tmp, start + strlen("encoding "),
|
||||||
|
len - strlen("encoding \n"),
|
||||||
|
encoding, strlen(encoding));
|
||||||
}
|
}
|
||||||
new_len = strlen(encoding);
|
return tmp.buf;
|
||||||
need_len = new_len + strlen("encoding \n");
|
|
||||||
if (encoding_header_len < need_len) {
|
|
||||||
buf = xrealloc(buf, buflen + (need_len - encoding_header_len));
|
|
||||||
encoding_header = buf + encoding_header_pos;
|
|
||||||
end_of_encoding_header = encoding_header + encoding_header_len;
|
|
||||||
}
|
|
||||||
memmove(end_of_encoding_header + (need_len - encoding_header_len),
|
|
||||||
end_of_encoding_header,
|
|
||||||
buflen - (encoding_header_pos + encoding_header_len));
|
|
||||||
memcpy(encoding_header + 9, encoding, strlen(encoding));
|
|
||||||
encoding_header[9 + new_len] = '\n';
|
|
||||||
return buf;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static char *logmsg_reencode(const struct commit *commit,
|
static char *logmsg_reencode(const struct commit *commit,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user