summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2015-10-14 15:40:04 -0700
committerJunio C Hamano <gitster@pobox.com>2015-10-21 15:39:01 -0700
commit173aef7c2ee9aa0021dad7c70d30f9099be4a134 (patch)
treec640135990f14671ffce77205b4aabb3d8b8896c
parent849106d5116e62d36070249f01adefc02cff157e (diff)
downloadgit-173aef7c2ee9aa0021dad7c70d30f9099be4a134.tar.gz
mailinfo: move global "FILE *fin, *fout" to struct mailinfo
This requires us to pass "struct mailinfo" to more functions throughout the codepath that read input lines. Incidentally, later steps are helped by this patch passing the struct to more callchains. Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r--builtin/mailinfo.c54
1 files changed, 28 insertions, 26 deletions
diff --git a/builtin/mailinfo.c b/builtin/mailinfo.c
index a219cbcc59..e2979e0c76 100644
--- a/builtin/mailinfo.c
+++ b/builtin/mailinfo.c
@@ -7,11 +7,14 @@
#include "utf8.h"
#include "strbuf.h"
-static FILE *cmitmsg, *patchfile, *fin, *fout;
+static FILE *cmitmsg, *patchfile;
static const char *metainfo_charset;
struct mailinfo {
+ FILE *input;
+ FILE *output;
+
struct strbuf name;
struct strbuf email;
int keep_subject;
@@ -788,16 +791,17 @@ static int read_one_header_line(struct strbuf *line, FILE *in)
return 1;
}
-static int find_boundary(struct strbuf *line)
+static int find_boundary(struct mailinfo *mi, struct strbuf *line)
{
- while (!strbuf_getline(line, fin, '\n')) {
+ while (!strbuf_getline(line, mi->input, '\n')) {
if (*content_top && is_multipart_boundary(line))
return 1;
}
return 0;
}
-static int handle_boundary(struct strbuf *line, int *filter_stage, int *header_stage)
+static int handle_boundary(struct mailinfo *mi, struct strbuf *line,
+ int *filter_stage, int *header_stage)
{
struct strbuf newline = STRBUF_INIT;
@@ -823,7 +827,7 @@ again:
strbuf_release(&newline);
/* skip to the next boundary */
- if (!find_boundary(line))
+ if (!find_boundary(mi, line))
return 0;
goto again;
}
@@ -833,18 +837,18 @@ again:
strbuf_reset(&charset);
/* slurp in this section's info */
- while (read_one_header_line(line, fin))
+ while (read_one_header_line(line, mi->input))
check_header(line, p_hdr_data, 0);
strbuf_release(&newline);
/* replenish line */
- if (strbuf_getline(line, fin, '\n'))
+ if (strbuf_getline(line, mi->input, '\n'))
return 0;
strbuf_addch(line, '\n');
return 1;
}
-static void handle_body(struct strbuf *line)
+static void handle_body(struct mailinfo *mi, struct strbuf *line)
{
struct strbuf prev = STRBUF_INIT;
int filter_stage = 0;
@@ -852,7 +856,7 @@ static void handle_body(struct strbuf *line)
/* Skip up to the first boundary */
if (*content_top) {
- if (!find_boundary(line))
+ if (!find_boundary(mi, line))
goto handle_body_out;
}
@@ -864,7 +868,7 @@ static void handle_body(struct strbuf *line)
handle_filter(&prev, &filter_stage, &header_stage);
strbuf_reset(&prev);
}
- if (!handle_boundary(line, &filter_stage, &header_stage))
+ if (!handle_boundary(mi, line, &filter_stage, &header_stage))
goto handle_body_out;
}
@@ -907,7 +911,7 @@ static void handle_body(struct strbuf *line)
handle_filter(line, &filter_stage, &header_stage);
}
- } while (!strbuf_getwholeline(line, fin, '\n'));
+ } while (!strbuf_getwholeline(line, mi->input, '\n'));
handle_body_out:
strbuf_release(&prev);
@@ -949,29 +953,25 @@ static void handle_info(struct mailinfo *mi)
cleanup_subject(mi, hdr);
cleanup_space(hdr);
}
- output_header_lines(fout, "Subject", hdr);
+ output_header_lines(mi->output, "Subject", hdr);
} else if (!strcmp(header[i], "From")) {
cleanup_space(hdr);
handle_from(mi, hdr);
- fprintf(fout, "Author: %s\n", mi->name.buf);
- fprintf(fout, "Email: %s\n", mi->email.buf);
+ fprintf(mi->output, "Author: %s\n", mi->name.buf);
+ fprintf(mi->output, "Email: %s\n", mi->email.buf);
} else {
cleanup_space(hdr);
- fprintf(fout, "%s: %s\n", header[i], hdr->buf);
+ fprintf(mi->output, "%s: %s\n", header[i], hdr->buf);
}
}
- fprintf(fout, "\n");
+ fprintf(mi->output, "\n");
}
-static int mailinfo(struct mailinfo *mi,
- FILE *in, FILE *out, const char *msg, const char *patch)
+static int mailinfo(struct mailinfo *mi, const char *msg, const char *patch)
{
int peek;
struct strbuf line = STRBUF_INIT;
- fin = in;
- fout = out;
-
cmitmsg = fopen(msg, "w");
if (!cmitmsg) {
perror(msg);
@@ -988,15 +988,15 @@ static int mailinfo(struct mailinfo *mi,
s_hdr_data = xcalloc(MAX_HDR_PARSED, sizeof(*s_hdr_data));
do {
- peek = fgetc(in);
+ peek = fgetc(mi->input);
} while (isspace(peek));
- ungetc(peek, in);
+ ungetc(peek, mi->input);
/* process the email header */
- while (read_one_header_line(&line, fin))
+ while (read_one_header_line(&line, mi->input))
check_header(&line, p_hdr_data, 1);
- handle_body(&line);
+ handle_body(mi, &line);
fclose(patchfile);
handle_info(mi);
@@ -1074,7 +1074,9 @@ int cmd_mailinfo(int argc, const char **argv, const char *prefix)
if (argc != 3)
usage(mailinfo_usage);
- status = !!mailinfo(&mi, stdin, stdout, argv[1], argv[2]);
+ mi.input = stdin;
+ mi.output = stdout;
+ status = !!mailinfo(&mi, argv[1], argv[2]);
clear_mailinfo(&mi);
return status;