Currently, creation and addition (to a list) of trailer items are spread
across multiple functions. Streamline this by only having 2 functions:
one to parse the user-supplied string, and one to add the parsed
information to a list.

Signed-off-by: Jonathan Tan <jonathanta...@google.com>
---
 trailer.c | 130 +++++++++++++++++++++++++++++---------------------------------
 1 file changed, 60 insertions(+), 70 deletions(-)

diff --git a/trailer.c b/trailer.c
index 4e85aae..ae3972a 100644
--- a/trailer.c
+++ b/trailer.c
@@ -500,10 +500,31 @@ static int git_trailer_config(const char *conf_key, const 
char *value, void *cb)
        return 0;
 }
 
-static int parse_trailer(struct strbuf *tok, struct strbuf *val, const char 
*trailer)
+static const char *token_from_item(struct trailer_item *item, char *tok)
+{
+       if (item->conf.key)
+               return item->conf.key;
+       if (tok)
+               return tok;
+       return item->conf.name;
+}
+
+static int token_matches_item(const char *tok, struct trailer_item *item, int 
tok_len)
+{
+       if (!strncasecmp(tok, item->conf.name, tok_len))
+               return 1;
+       return item->conf.key ? !strncasecmp(tok, item->conf.key, tok_len) : 0;
+}
+
+static int parse_trailer(struct strbuf *tok, struct strbuf *val,
+                        const struct conf_info **conf, const char *trailer)
 {
        size_t len;
        struct strbuf seps = STRBUF_INIT;
+       struct trailer_item *item;
+       int tok_len;
+       struct list_head *pos;
+
        strbuf_addstr(&seps, separators);
        strbuf_addch(&seps, '=');
        len = strcspn(trailer, seps.buf);
@@ -523,74 +544,31 @@ static int parse_trailer(struct strbuf *tok, struct 
strbuf *val, const char *tra
                strbuf_addstr(tok, trailer);
                strbuf_trim(tok);
        }
-       return 0;
-}
-
-static const char *token_from_item(struct trailer_item *item, char *tok)
-{
-       if (item->conf.key)
-               return item->conf.key;
-       if (tok)
-               return tok;
-       return item->conf.name;
-}
-
-static struct trailer_item *new_trailer_item(struct trailer_item *conf_item,
-                                            char *tok, char *val)
-{
-       struct trailer_item *new = xcalloc(sizeof(*new), 1);
-       new->value = val ? val : xstrdup("");
-
-       if (conf_item) {
-               duplicate_conf(&new->conf, &conf_item->conf);
-               new->token = xstrdup(token_from_item(conf_item, tok));
-               free(tok);
-       } else {
-               duplicate_conf(&new->conf, &default_conf_info);
-               new->token = tok;
-       }
-
-       return new;
-}
-
-static int token_matches_item(const char *tok, struct trailer_item *item, int 
tok_len)
-{
-       if (!strncasecmp(tok, item->conf.name, tok_len))
-               return 1;
-       return item->conf.key ? !strncasecmp(tok, item->conf.key, tok_len) : 0;
-}
-
-static struct trailer_item *create_trailer_item(const char *string)
-{
-       struct strbuf tok = STRBUF_INIT;
-       struct strbuf val = STRBUF_INIT;
-       struct trailer_item *item;
-       int tok_len;
-       struct list_head *pos;
-
-       if (parse_trailer(&tok, &val, string))
-               return NULL;
-
-       tok_len = token_len_without_separator(tok.buf, tok.len);
 
        /* Lookup if the token matches something in the config */
+       tok_len = token_len_without_separator(tok->buf, tok->len);
+       *conf = &default_conf_info;
        list_for_each(pos, &conf_head) {
                item = list_entry(pos, struct trailer_item, list);
-               if (token_matches_item(tok.buf, item, tok_len))
-                       return new_trailer_item(item,
-                                               strbuf_detach(&tok, NULL),
-                                               strbuf_detach(&val, NULL));
+               if (token_matches_item(tok->buf, item, tok_len)) {
+                       char *tok_buf = strbuf_detach(tok, NULL);
+                       *conf = &item->conf;
+                       strbuf_addstr(tok, token_from_item(item, tok_buf));
+                       free(tok_buf);
+                       break;
+               }
        }
 
-       return new_trailer_item(NULL,
-                               strbuf_detach(&tok, NULL),
-                               strbuf_detach(&val, NULL));
+       return 0;
 }
 
-static void add_trailer_item(struct list_head *head, struct trailer_item *new)
+static void add_trailer_item(struct list_head *head, char *tok, char *val,
+                            const struct conf_info *conf)
 {
-       if (!new)
-               return;
+       struct trailer_item *new = xcalloc(sizeof(*new), 1);
+       new->token = tok;
+       new->value = val;
+       duplicate_conf(&new->conf, conf);
        list_add_tail(&new->list, head);
 }
 
@@ -599,21 +577,28 @@ static void process_command_line_args(struct list_head 
*arg_head,
 {
        struct string_list_item *tr;
        struct trailer_item *item;
+       struct strbuf tok = STRBUF_INIT;
+       struct strbuf val = STRBUF_INIT;
+       const struct conf_info *conf;
        struct list_head *pos;
 
        /* Add a trailer item for each configured trailer with a command */
        list_for_each(pos, &conf_head) {
                item = list_entry(pos, struct trailer_item, list);
-               if (item->conf.command) {
-                       struct trailer_item *new = new_trailer_item(item, NULL, 
NULL);
-                       add_trailer_item(arg_head, new);
-               }
+               if (item->conf.command)
+                       add_trailer_item(arg_head,
+                                        xstrdup(token_from_item(item, NULL)),
+                                        xstrdup(""),
+                                        &item->conf);
        }
 
        /* Add a trailer item for each trailer on the command line */
        for_each_string_list_item(tr, trailers) {
-               struct trailer_item *new = create_trailer_item(tr->string);
-               add_trailer_item(arg_head, new);
+               if (!parse_trailer(&tok, &val, &conf, tr->string))
+                       add_trailer_item(arg_head,
+                                        strbuf_detach(&tok, NULL),
+                                        strbuf_detach(&val, NULL),
+                                        conf);
        }
 }
 
@@ -734,6 +719,9 @@ static int process_input_file(FILE *outfile,
 {
        int count = 0;
        int patch_start, trailer_start, trailer_end, i;
+       struct strbuf tok = STRBUF_INIT;
+       struct strbuf val = STRBUF_INIT;
+       const struct conf_info *conf;
 
        /* Get the line count */
        while (lines[count])
@@ -751,10 +739,12 @@ static int process_input_file(FILE *outfile,
 
        /* Parse trailer lines */
        for (i = trailer_start; i < trailer_end; i++) {
-               if (lines[i]->buf[0] != comment_line_char) {
-                       struct trailer_item *new = 
create_trailer_item(lines[i]->buf);
-                       add_trailer_item(head, new);
-               }
+               if (lines[i]->buf[0] != comment_line_char &&
+                   !parse_trailer(&tok, &val, &conf, lines[i]->buf))
+                       add_trailer_item(head,
+                                        strbuf_detach(&tok, NULL),
+                                        strbuf_detach(&val, NULL),
+                                        conf);
        }
 
        return trailer_end;
-- 
2.8.0.rc3.226.g39d4020

Reply via email to