This patch reads trailers from an input file, parses them and puts the result into a doubly linked list. Signed-off-by: Christian Couder <chriscool@xxxxxxxxxxxxx> --- trailer.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/trailer.c b/trailer.c index f48fd94..084b3e1 100644 --- a/trailer.c +++ b/trailer.c @@ -439,3 +439,65 @@ static struct trailer_item *process_command_line_args(int argc, const char **arg return arg_tok_first; } + +static struct strbuf **read_input_file(const char *infile) +{ + struct strbuf sb = STRBUF_INIT; + + if (strbuf_read_file(&sb, infile, 0) < 0) + die_errno(_("could not read input file '%s'"), infile); + + return strbuf_split(&sb, '\n'); +} + +/* + * Return the the (0 based) index of the first trailer line + * or the line count if there are no trailers. + */ +static int find_trailer_start(struct strbuf **lines) +{ + int count, start, empty = 1; + + /* Get the line count */ + for (count = 0; lines[count]; count++); + + /* + * Get the start of the trailers by looking starting from the end + * for a line with only spaces before lines with one ':'. + */ + for (start = count - 1; start >= 0; start--) { + if (strbuf_isspace(lines[start])) { + if (empty) + continue; + return start + 1; + } + if (strchr(lines[start]->buf, ':')) { + if (empty) + empty = 0; + continue; + } + return count; + } + + return empty ? count : start + 1; +} + +static void process_input_file(const char *infile, + struct trailer_item **infile_tok_first, + struct trailer_item **infile_tok_last) +{ + struct strbuf **lines = read_input_file(infile); + int start = find_trailer_start(lines); + int i; + + /* Print non trailer lines as is */ + for (i = 0; lines[i] && i < start; i++) { + printf("%s", lines[i]->buf); + } + + /* Parse trailer lines */ + for (i = start; lines[i]; i++) { + struct trailer_item *new = create_trailer_item(lines[i]->buf); + add_trailer_item(infile_tok_first, infile_tok_last, new); + } +} -- 1.8.5.2.201.gacc5987 -- 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