static int add_message_id;
static int use_inbody_headers = 1;
-#define MAX_HDR_PARSED 10
#define MAX_BOUNDARIES 5
static void cleanup_space(struct strbuf *sb)
strbuf_trim(subject);
}
+#define MAX_HDR_PARSED 10
static const char *header[MAX_HDR_PARSED] = {
"From","Subject","Date",
};
gap * 2 < perforation);
}
-static int handle_commit_msg(struct strbuf *line)
+static int handle_commit_msg(struct strbuf *line, int *still_looking)
{
- static int still_looking = 1;
-
if (!cmitmsg)
return 0;
- if (still_looking) {
+ if (*still_looking) {
if (!line->len || (line->len == 1 && line->buf[0] == '\n'))
return 0;
}
- if (use_inbody_headers && still_looking) {
- still_looking = check_header(line, s_hdr_data, 0);
- if (still_looking)
+ if (use_inbody_headers && *still_looking) {
+ *still_looking = check_header(line, s_hdr_data, 0);
+ if (*still_looking)
return 0;
} else
/* Only trim the first (blank) line of the commit message
* when ignoring in-body headers.
*/
- still_looking = 0;
+ *still_looking = 0;
/* normalize the log message to UTF-8. */
if (metainfo_charset)
die_errno("Could not rewind output message file");
if (ftruncate(fileno(cmitmsg), 0))
die_errno("Could not truncate output message file at scissors");
- still_looking = 1;
+ *still_looking = 1;
/*
* We may have already read "secondary headers"; purge
patch_lines++;
}
-static void handle_filter(struct strbuf *line)
+static void handle_filter(struct strbuf *line, int *filter_stage, int *header_stage)
{
- static int filter = 0;
-
- /* filter tells us which part we left off on */
- switch (filter) {
+ switch (*filter_stage) {
case 0:
- if (!handle_commit_msg(line))
+ if (!handle_commit_msg(line, header_stage))
break;
- filter++;
+ (*filter_stage)++;
case 1:
handle_patch(line);
break;
return 0;
}
-static int handle_boundary(void)
+static int handle_boundary(struct strbuf *line, int *filter_stage, int *header_stage)
{
struct strbuf newline = STRBUF_INIT;
strbuf_addch(&newline, '\n');
again:
- if (line.len >= (*content_top)->len + 2 &&
- !memcmp(line.buf + (*content_top)->len, "--", 2)) {
+ if (line->len >= (*content_top)->len + 2 &&
+ !memcmp(line->buf + (*content_top)->len, "--", 2)) {
/* we hit an end boundary */
/* pop the current boundary off the stack */
strbuf_release(*content_top);
"can't recover\n");
exit(1);
}
- handle_filter(&newline);
+ handle_filter(&newline, filter_stage, header_stage);
strbuf_release(&newline);
/* skip to the next boundary */
strbuf_reset(&charset);
/* slurp in this section's info */
- while (read_one_header_line(&line, fin))
- check_header(&line, p_hdr_data, 0);
+ while (read_one_header_line(line, fin))
+ check_header(line, p_hdr_data, 0);
strbuf_release(&newline);
/* replenish line */
- if (strbuf_getline(&line, fin, '\n'))
+ if (strbuf_getline(line, fin, '\n'))
return 0;
- strbuf_addch(&line, '\n');
+ strbuf_addch(line, '\n');
return 1;
}
-static void handle_body(void)
+static void handle_body(struct strbuf *line)
{
struct strbuf prev = STRBUF_INIT;
+ int filter_stage = 0;
+ int header_stage = 1;
/* Skip up to the first boundary */
if (*content_top) {
do {
/* process any boundary lines */
- if (*content_top && is_multipart_boundary(&line)) {
+ if (*content_top && is_multipart_boundary(line)) {
/* flush any leftover */
if (prev.len) {
- handle_filter(&prev);
+ handle_filter(&prev, &filter_stage, &header_stage);
strbuf_reset(&prev);
}
- if (!handle_boundary())
+ if (!handle_boundary(line, &filter_stage, &header_stage))
goto handle_body_out;
}
/* Unwrap transfer encoding */
- decode_transfer_encoding(&line);
+ decode_transfer_encoding(line);
switch (transfer_encoding) {
case TE_BASE64:
struct strbuf **lines, **it, *sb;
/* Prepend any previous partial lines */
- strbuf_insert(&line, 0, prev.buf, prev.len);
+ strbuf_insert(line, 0, prev.buf, prev.len);
strbuf_reset(&prev);
/*
* multiple new lines. Pass only one chunk
* at a time to handle_filter()
*/
- lines = strbuf_split(&line, '\n');
+ lines = strbuf_split(line, '\n');
for (it = lines; (sb = *it); it++) {
if (*(it + 1) == NULL) /* The last line */
if (sb->buf[sb->len - 1] != '\n') {
strbuf_addbuf(&prev, sb);
break;
}
- handle_filter(sb);
+ handle_filter(sb, &filter_stage, &header_stage);
}
/*
* The partial chunk is saved in "prev" and will be
break;
}
default:
- handle_filter(&line);
+ handle_filter(line, &filter_stage, &header_stage);
}
- } while (!strbuf_getwholeline(&line, fin, '\n'));
+ } while (!strbuf_getwholeline(line, fin, '\n'));
handle_body_out:
strbuf_release(&prev);
while (read_one_header_line(&line, fin))
check_header(&line, p_hdr_data, 1);
- handle_body();
+ handle_body(&line);
fclose(patchfile);
handle_info();