Message ID | 99012733e440be15afc7fd45272e738c71b3ef27.1662559356.git.matheus.bernardino@usp.br (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | format-patch: warn if commit msg contains a patch delimiter | expand |
On 07/09/2022 15:44, Matheus Tavares wrote: > From: René Scharfe <l.s.r@web.de> > > The next patch will add calls to these two functions from code that > works with a char */size_t pair. So let's adapt the functions in > preparation. Reading this I wonder if we should add a starts_with_mem() function, rather than having to pass pointers to buf and len to skip_prefix_mem(). Best Wishes Phillip > --- > mailinfo.c | 37 +++++++++++++++++++------------------ > 1 file changed, 19 insertions(+), 18 deletions(-) > > diff --git a/mailinfo.c b/mailinfo.c > index 9621ba62a3..f0a690b6e8 100644 > --- a/mailinfo.c > +++ b/mailinfo.c > @@ -646,32 +646,30 @@ static void decode_transfer_encoding(struct mailinfo *mi, struct strbuf *line) > free(ret); > } > > -static inline int patchbreak(const struct strbuf *line) > +static inline int patchbreak(const char *buf, size_t len) > { > - size_t i; > - > /* Beginning of a "diff -" header? */ > - if (starts_with(line->buf, "diff -")) > + if (skip_prefix_mem(buf, len, "diff -", &buf, &len)) > return 1; > > /* CVS "Index: " line? */ > - if (starts_with(line->buf, "Index: ")) > + if (skip_prefix_mem(buf, len, "Index: ", &buf, &len)) > return 1; > > /* > * "--- <filename>" starts patches without headers > * "---<sp>*" is a manual separator > */ > - if (line->len < 4) > + if (len < 4) > return 0; > > - if (starts_with(line->buf, "---")) { > + if (skip_prefix_mem(buf, len, "---", &buf, &len)) { > /* space followed by a filename? */ > - if (line->buf[3] == ' ' && !isspace(line->buf[4])) > + if (len > 1 && buf[0] == ' ' && !isspace(buf[1])) > return 1; > /* Just whitespace? */ > - for (i = 3; i < line->len; i++) { > - unsigned char c = line->buf[i]; > + for (; len; buf++, len--) { > + unsigned char c = buf[0]; > if (c == '\n') > return 1; > if (!isspace(c)) > @@ -682,14 +680,14 @@ static inline int patchbreak(const struct strbuf *line) > return 0; > } > > -static int is_scissors_line(const char *line) > +static int is_scissors_line(const char *line, size_t len) > { > const char *c; > int scissors = 0, gap = 0; > const char *first_nonblank = NULL, *last_nonblank = NULL; > int visible, perforation = 0, in_perforation = 0; > > - for (c = line; *c; c++) { > + for (c = line; len; c++, len--) { > if (isspace(*c)) { > if (in_perforation) { > perforation++; > @@ -705,12 +703,14 @@ static int is_scissors_line(const char *line) > perforation++; > continue; > } > - if (starts_with(c, ">8") || starts_with(c, "8<") || > - starts_with(c, ">%") || starts_with(c, "%<")) { > + if (skip_prefix_mem(c, len, ">8", &c, &len) || > + skip_prefix_mem(c, len, "8<", &c, &len) || > + skip_prefix_mem(c, len, ">%", &c, &len) || > + skip_prefix_mem(c, len, "%<", &c, &len)) { > in_perforation = 1; > perforation += 2; > scissors += 2; > - c++; > + c--, len++; > continue; > } > in_perforation = 0; > @@ -747,7 +747,8 @@ static int check_inbody_header(struct mailinfo *mi, const struct strbuf *line) > { > if (mi->inbody_header_accum.len && > (line->buf[0] == ' ' || line->buf[0] == '\t')) { > - if (mi->use_scissors && is_scissors_line(line->buf)) { > + if (mi->use_scissors && > + is_scissors_line(line->buf, line->len)) { > /* > * This is a scissors line; do not consider this line > * as a header continuation line. > @@ -808,7 +809,7 @@ static int handle_commit_msg(struct mailinfo *mi, struct strbuf *line) > if (convert_to_utf8(mi, line, mi->charset.buf)) > return 0; /* mi->input_error already set */ > > - if (mi->use_scissors && is_scissors_line(line->buf)) { > + if (mi->use_scissors && is_scissors_line(line->buf, line->len)) { > int i; > > strbuf_setlen(&mi->log_message, 0); > @@ -826,7 +827,7 @@ static int handle_commit_msg(struct mailinfo *mi, struct strbuf *line) > return 0; > } > > - if (patchbreak(line)) { > + if (patchbreak(line->buf, line->len)) { > if (mi->message_id) > strbuf_addf(&mi->log_message, > "Message-Id: %s\n", mi->message_id);
On Wed, Sep 7, 2022 at 10:46 AM Matheus Tavares <matheus.bernardino@usp.br> wrote: > The next patch will add calls to these two functions from code that > works with a char */size_t pair. So let's adapt the functions in > preparation. > --- Missing sign-off.
diff --git a/mailinfo.c b/mailinfo.c index 9621ba62a3..f0a690b6e8 100644 --- a/mailinfo.c +++ b/mailinfo.c @@ -646,32 +646,30 @@ static void decode_transfer_encoding(struct mailinfo *mi, struct strbuf *line) free(ret); } -static inline int patchbreak(const struct strbuf *line) +static inline int patchbreak(const char *buf, size_t len) { - size_t i; - /* Beginning of a "diff -" header? */ - if (starts_with(line->buf, "diff -")) + if (skip_prefix_mem(buf, len, "diff -", &buf, &len)) return 1; /* CVS "Index: " line? */ - if (starts_with(line->buf, "Index: ")) + if (skip_prefix_mem(buf, len, "Index: ", &buf, &len)) return 1; /* * "--- <filename>" starts patches without headers * "---<sp>*" is a manual separator */ - if (line->len < 4) + if (len < 4) return 0; - if (starts_with(line->buf, "---")) { + if (skip_prefix_mem(buf, len, "---", &buf, &len)) { /* space followed by a filename? */ - if (line->buf[3] == ' ' && !isspace(line->buf[4])) + if (len > 1 && buf[0] == ' ' && !isspace(buf[1])) return 1; /* Just whitespace? */ - for (i = 3; i < line->len; i++) { - unsigned char c = line->buf[i]; + for (; len; buf++, len--) { + unsigned char c = buf[0]; if (c == '\n') return 1; if (!isspace(c)) @@ -682,14 +680,14 @@ static inline int patchbreak(const struct strbuf *line) return 0; } -static int is_scissors_line(const char *line) +static int is_scissors_line(const char *line, size_t len) { const char *c; int scissors = 0, gap = 0; const char *first_nonblank = NULL, *last_nonblank = NULL; int visible, perforation = 0, in_perforation = 0; - for (c = line; *c; c++) { + for (c = line; len; c++, len--) { if (isspace(*c)) { if (in_perforation) { perforation++; @@ -705,12 +703,14 @@ static int is_scissors_line(const char *line) perforation++; continue; } - if (starts_with(c, ">8") || starts_with(c, "8<") || - starts_with(c, ">%") || starts_with(c, "%<")) { + if (skip_prefix_mem(c, len, ">8", &c, &len) || + skip_prefix_mem(c, len, "8<", &c, &len) || + skip_prefix_mem(c, len, ">%", &c, &len) || + skip_prefix_mem(c, len, "%<", &c, &len)) { in_perforation = 1; perforation += 2; scissors += 2; - c++; + c--, len++; continue; } in_perforation = 0; @@ -747,7 +747,8 @@ static int check_inbody_header(struct mailinfo *mi, const struct strbuf *line) { if (mi->inbody_header_accum.len && (line->buf[0] == ' ' || line->buf[0] == '\t')) { - if (mi->use_scissors && is_scissors_line(line->buf)) { + if (mi->use_scissors && + is_scissors_line(line->buf, line->len)) { /* * This is a scissors line; do not consider this line * as a header continuation line. @@ -808,7 +809,7 @@ static int handle_commit_msg(struct mailinfo *mi, struct strbuf *line) if (convert_to_utf8(mi, line, mi->charset.buf)) return 0; /* mi->input_error already set */ - if (mi->use_scissors && is_scissors_line(line->buf)) { + if (mi->use_scissors && is_scissors_line(line->buf, line->len)) { int i; strbuf_setlen(&mi->log_message, 0); @@ -826,7 +827,7 @@ static int handle_commit_msg(struct mailinfo *mi, struct strbuf *line) return 0; } - if (patchbreak(line)) { + if (patchbreak(line->buf, line->len)) { if (mi->message_id) strbuf_addf(&mi->log_message, "Message-Id: %s\n", mi->message_id);
From: René Scharfe <l.s.r@web.de> The next patch will add calls to these two functions from code that works with a char */size_t pair. So let's adapt the functions in preparation. --- mailinfo.c | 37 +++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 18 deletions(-)