When we parse an ident line, we end up with several fields,
each with a begin/end pointer into the buffer, like:

  const char *name_begin;
  const char *name_end;

There is nothing except the field names to indicate that
they are paired. This makes it annoying to write helper
functions for dealing with the sub-fields, as you have to
pass both sides. Instead, let's move them into a single
struct "name", with fields "begin" and "end". This will be
stored identically, but can be passed as a unit.

We have to do a mechanical update of "s/_/./" at each point
of use, but other than that, the fields should behave
identically.

Signed-off-by: Jeff King <p...@peff.net>
---
Suggestions welcome on the name "pointer_pair".

While writing this series, I also noticed that it would be more
convenient to have a pointer/len combination rather than two pointers.
You can convert between them, of course, but I found I was always
converting the other way.

I left it this way because it makes the mass-update mechanical (and
because now that I can pass the pair as a unit, I don't have to write
the same "ident->name_begin, ident->name_end - ident->name_begin" pair
over and over).

 builtin/blame.c         | 16 +++++++-------
 builtin/check-mailmap.c |  8 +++----
 builtin/commit.c        | 26 +++++++++++-----------
 builtin/shortlog.c      |  8 +++----
 cache.h                 | 17 ++++++++-------
 commit.c                |  6 +++---
 ident.c                 | 57 +++++++++++++++++++++++--------------------------
 log-tree.c              |  2 +-
 pretty.c                | 36 +++++++++++++++----------------
 revision.c              | 12 +++++------
 10 files changed, 93 insertions(+), 95 deletions(-)

diff --git a/builtin/blame.c b/builtin/blame.c
index 53f43ab..6e6dddb 100644
--- a/builtin/blame.c
+++ b/builtin/blame.c
@@ -1599,19 +1599,19 @@ static void get_ac_line(const char *inbuf, const char 
*what,
                return;
        }
 
-       namelen = ident.name_end - ident.name_begin;
-       namebuf = ident.name_begin;
+       namelen = ident.name.end - ident.name.begin;
+       namebuf = ident.name.begin;
 
-       maillen = ident.mail_end - ident.mail_begin;
-       mailbuf = ident.mail_begin;
+       maillen = ident.mail.end - ident.mail.begin;
+       mailbuf = ident.mail.begin;
 
-       if (ident.date_begin && ident.date_end)
-               *time = strtoul(ident.date_begin, NULL, 10);
+       if (ident.date.begin && ident.date.end)
+               *time = strtoul(ident.date.begin, NULL, 10);
        else
                *time = 0;
 
-       if (ident.tz_begin && ident.tz_end)
-               strbuf_add(tz, ident.tz_begin, ident.tz_end - ident.tz_begin);
+       if (ident.tz.begin && ident.tz.end)
+               strbuf_add(tz, ident.tz.begin, ident.tz.end - ident.tz.begin);
        else
                strbuf_addstr(tz, "(unknown)");
 
diff --git a/builtin/check-mailmap.c b/builtin/check-mailmap.c
index 8f4d809..65dcbc6 100644
--- a/builtin/check-mailmap.c
+++ b/builtin/check-mailmap.c
@@ -23,10 +23,10 @@ static void check_mailmap(struct string_list *mailmap, 
const char *contact)
        if (split_ident_line(&ident, contact, strlen(contact)))
                die(_("unable to parse contact: %s"), contact);
 
-       name = ident.name_begin;
-       namelen = ident.name_end - ident.name_begin;
-       mail = ident.mail_begin;
-       maillen = ident.mail_end - ident.mail_begin;
+       name = ident.name.begin;
+       namelen = ident.name.end - ident.name.begin;
+       mail = ident.mail.begin;
+       maillen = ident.mail.end - ident.mail.begin;
 
        map_user(mailmap, &mail, &maillen, &name, &namelen);
 
diff --git a/builtin/commit.c b/builtin/commit.c
index 84cec9a..047cc76 100644
--- a/builtin/commit.c
+++ b/builtin/commit.c
@@ -514,14 +514,14 @@ static void export_one(const char *var, const char *s, 
const char *e, int hack)
 
 static int sane_ident_split(struct ident_split *person)
 {
-       if (!person->name_begin || !person->name_end ||
-           person->name_begin == person->name_end)
+       if (!person->name.begin || !person->name.end ||
+           person->name.begin == person->name.end)
                return 0; /* no human readable name */
-       if (!person->mail_begin || !person->mail_end ||
-           person->mail_begin == person->mail_end)
+       if (!person->mail.begin || !person->mail.end ||
+           person->mail.begin == person->mail.end)
                return 0; /* no usable mail */
-       if (!person->date_begin || !person->date_end ||
-           !person->tz_begin || !person->tz_end)
+       if (!person->date.begin || !person->date.end ||
+           !person->tz.begin || !person->tz.end)
                return 0;
        return 1;
 }
@@ -602,9 +602,9 @@ static void determine_author_info(struct strbuf 
*author_ident)
        strbuf_addstr(author_ident, fmt_ident(name, email, date, IDENT_STRICT));
        if (!split_ident_line(&author, author_ident->buf, author_ident->len) &&
            sane_ident_split(&author)) {
-               export_one("GIT_AUTHOR_NAME", author.name_begin, 
author.name_end, 0);
-               export_one("GIT_AUTHOR_EMAIL", author.mail_begin, 
author.mail_end, 0);
-               export_one("GIT_AUTHOR_DATE", author.date_begin, author.tz_end, 
'@');
+               export_one("GIT_AUTHOR_NAME", author.name.begin, 
author.name.end, 0);
+               export_one("GIT_AUTHOR_EMAIL", author.mail.begin, 
author.mail.end, 0);
+               export_one("GIT_AUTHOR_DATE", author.date.begin, author.tz.end, 
'@');
        }
 }
 
@@ -861,8 +861,8 @@ static int prepare_to_commit(const char *index_file, const 
char *prefix,
                                _("%s"
                                "Author:    %.*s <%.*s>"),
                                ident_shown++ ? "" : "\n",
-                               (int)(ai.name_end - ai.name_begin), 
ai.name_begin,
-                               (int)(ai.mail_end - ai.mail_begin), 
ai.mail_begin);
+                               (int)(ai.name.end - ai.name.begin), 
ai.name.begin,
+                               (int)(ai.mail.end - ai.mail.begin), 
ai.mail.begin);
 
                if (author_date_is_interesting())
                        status_printf_ln(s, GIT_COLOR_NORMAL,
@@ -876,8 +876,8 @@ static int prepare_to_commit(const char *index_file, const 
char *prefix,
                                _("%s"
                                "Committer: %.*s <%.*s>"),
                                ident_shown++ ? "" : "\n",
-                               (int)(ci.name_end - ci.name_begin), 
ci.name_begin,
-                               (int)(ci.mail_end - ci.mail_begin), 
ci.mail_begin);
+                               (int)(ci.name.end - ci.name.begin), 
ci.name.begin,
+                               (int)(ci.mail.end - ci.mail.begin), 
ci.mail.begin);
 
                if (ident_shown)
                        status_printf_ln(s, GIT_COLOR_NORMAL, "%s", "");
diff --git a/builtin/shortlog.c b/builtin/shortlog.c
index 4b7e536..e4ddfea 100644
--- a/builtin/shortlog.c
+++ b/builtin/shortlog.c
@@ -44,10 +44,10 @@ static void insert_one_record(struct shortlog *log,
        if (split_ident_line(&ident, author, strlen(author)))
                return;
 
-       namebuf = ident.name_begin;
-       mailbuf = ident.mail_begin;
-       namelen = ident.name_end - ident.name_begin;
-       maillen = ident.mail_end - ident.mail_begin;
+       namebuf = ident.name.begin;
+       mailbuf = ident.mail.begin;
+       namelen = ident.name.end - ident.name.begin;
+       maillen = ident.mail.end - ident.mail.begin;
 
        map_user(&log->mailmap, &mailbuf, &maillen, &namebuf, &namelen);
        strbuf_add(&namemailbuf, namebuf, namelen);
diff --git a/cache.h b/cache.h
index cbe1935..5255661 100644
--- a/cache.h
+++ b/cache.h
@@ -1045,15 +1045,16 @@ extern const char *git_editor(void);
 extern const char *git_pager(int stdout_is_tty);
 extern int git_ident_config(const char *, const char *, void *);
 
+struct pointer_pair {
+       const char *begin;
+       const char *end;
+};
+
 struct ident_split {
-       const char *name_begin;
-       const char *name_end;
-       const char *mail_begin;
-       const char *mail_end;
-       const char *date_begin;
-       const char *date_end;
-       const char *tz_begin;
-       const char *tz_end;
+       struct pointer_pair name;
+       struct pointer_pair mail;
+       struct pointer_pair date;
+       struct pointer_pair tz;
 };
 /*
  * Signals an success with 0, but time part of the result may be NULL
diff --git a/commit.c b/commit.c
index c33431c..dcf8dce 100644
--- a/commit.c
+++ b/commit.c
@@ -617,11 +617,11 @@ static void record_author_date(struct author_date_slab 
*author_date,
        if (!ident_line)
                goto fail_exit; /* no author line */
        if (split_ident_line(&ident, ident_line, ident_len) ||
-           !ident.date_begin || !ident.date_end)
+           !ident.date.begin || !ident.date.end)
                goto fail_exit; /* malformed "author" line */
 
-       date = strtoul(ident.date_begin, &date_end, 10);
-       if (date_end != ident.date_end)
+       date = strtoul(ident.date.begin, &date_end, 10);
+       if (date_end != ident.date.end)
                goto fail_exit; /* malformed date */
        *(author_date_slab_at(author_date, commit)) = date;
 
diff --git a/ident.c b/ident.c
index 1d9b6e7..570fda7 100644
--- a/ident.c
+++ b/ident.c
@@ -206,42 +206,42 @@ int split_ident_line(struct ident_split *split, const 
char *line, int len)
 
        memset(split, 0, sizeof(*split));
 
-       split->name_begin = line;
+       split->name.begin = line;
        for (cp = line; *cp && cp < line + len; cp++)
                if (*cp == '<') {
-                       split->mail_begin = cp + 1;
+                       split->mail.begin = cp + 1;
                        break;
                }
-       if (!split->mail_begin)
+       if (!split->mail.begin)
                return status;
 
-       for (cp = split->mail_begin - 2; line <= cp; cp--)
+       for (cp = split->mail.begin - 2; line <= cp; cp--)
                if (!isspace(*cp)) {
-                       split->name_end = cp + 1;
+                       split->name.end = cp + 1;
                        break;
                }
-       if (!split->name_end) {
+       if (!split->name.end) {
                /* no human readable name */
-               split->name_end = split->name_begin;
+               split->name.end = split->name.begin;
        }
 
-       for (cp = split->mail_begin; cp < line + len; cp++)
+       for (cp = split->mail.begin; cp < line + len; cp++)
                if (*cp == '>') {
-                       split->mail_end = cp;
+                       split->mail.end = cp;
                        break;
                }
-       if (!split->mail_end)
+       if (!split->mail.end)
                return status;
 
        /*
         * Look from the end-of-line to find the trailing ">" of the mail
-        * address, even though we should already know it as split->mail_end.
+        * address, even though we should already know it as split->mail.end.
         * This can help in cases of broken idents with an extra ">" somewhere
         * in the email address.  Note that we are assuming the timestamp will
         * never have a ">" in it.
         *
         * Note that we will always find some ">" before going off the front of
-        * the string, because will always hit the split->mail_end closing
+        * the string, because will always hit the split->mail.end closing
         * bracket.
         */
        for (cp = line + len - 1; *cp != '>'; cp--)
@@ -251,27 +251,27 @@ int split_ident_line(struct ident_split *split, const 
char *line, int len)
                ;
        if (line + len <= cp)
                goto person_only;
-       split->date_begin = cp;
+       split->date.begin = cp;
        span = strspn(cp, "0123456789");
        if (!span)
                goto person_only;
-       split->date_end = split->date_begin + span;
-       for (cp = split->date_end; cp < line + len && isspace(*cp); cp++)
+       split->date.end = split->date.begin + span;
+       for (cp = split->date.end; cp < line + len && isspace(*cp); cp++)
                ;
        if (line + len <= cp || (*cp != '+' && *cp != '-'))
                goto person_only;
-       split->tz_begin = cp;
+       split->tz.begin = cp;
        span = strspn(cp + 1, "0123456789");
        if (!span)
                goto person_only;
-       split->tz_end = split->tz_begin + 1 + span;
+       split->tz.end = split->tz.begin + 1 + span;
        return 0;
 
 person_only:
-       split->date_begin = NULL;
-       split->date_end = NULL;
-       split->tz_begin = NULL;
-       split->tz_end = NULL;
+       split->date.begin = NULL;
+       split->date.end = NULL;
+       split->tz.begin = NULL;
+       split->tz.end = NULL;
        return 0;
 }
 
@@ -417,15 +417,14 @@ int git_ident_config(const char *var, const char *value, 
void *data)
        return 0;
 }
 
-static int buf_cmp(const char *a_begin, const char *a_end,
-                  const char *b_begin, const char *b_end)
+static int buf_cmp(const struct pointer_pair *a, const struct pointer_pair *b)
 {
-       int a_len = a_end - a_begin;
-       int b_len = b_end - b_begin;
+       int a_len = a->end - a->begin;
+       int b_len = b->end - b->begin;
        int min = a_len < b_len ? a_len : b_len;
        int cmp;
 
-       cmp = memcmp(a_begin, b_begin, min);
+       cmp = memcmp(a->begin, b->begin, min);
        if (cmp)
                return cmp;
 
@@ -437,11 +436,9 @@ int ident_cmp(const struct ident_split *a,
 {
        int cmp;
 
-       cmp = buf_cmp(a->mail_begin, a->mail_end,
-                     b->mail_begin, b->mail_end);
+       cmp = buf_cmp(&a->mail, &b->mail);
        if (cmp)
                return cmp;
 
-       return buf_cmp(a->name_begin, a->name_end,
-                      b->name_begin, b->name_end);
+       return buf_cmp(&a->name, &b->name);
 }
diff --git a/log-tree.c b/log-tree.c
index 4447021..385f07f 100644
--- a/log-tree.c
+++ b/log-tree.c
@@ -620,7 +620,7 @@ void show_log(struct rev_info *opt)
        ctx.mailmap = opt->mailmap;
        ctx.color = opt->diffopt.use_color;
        ctx.output_encoding = get_log_output_encoding();
-       if (opt->from_ident.mail_begin && opt->from_ident.name_begin)
+       if (opt->from_ident.mail.begin && opt->from_ident.name.begin)
                ctx.from_ident = &opt->from_ident;
        pretty_print_commit(&ctx, commit, &msgbuf);
 
diff --git a/pretty.c b/pretty.c
index 6081750..83ef5b7 100644
--- a/pretty.c
+++ b/pretty.c
@@ -399,13 +399,13 @@ const char *show_ident_date(const struct ident_split 
*ident,
        unsigned long date = 0;
        long tz = 0;
 
-       if (ident->date_begin && ident->date_end)
-               date = strtoul(ident->date_begin, NULL, 10);
+       if (ident->date.begin && ident->date.end)
+               date = strtoul(ident->date.begin, NULL, 10);
        if (date_overflows(date))
                date = 0;
        else {
-               if (ident->tz_begin && ident->tz_end)
-                       tz = strtol(ident->tz_begin, NULL, 10);
+               if (ident->tz.begin && ident->tz.end)
+                       tz = strtol(ident->tz.begin, NULL, 10);
                if (tz >= INT_MAX || tz <= INT_MIN)
                        tz = 0;
        }
@@ -429,10 +429,10 @@ void pp_user_info(struct pretty_print_context *pp,
        if (split_ident_line(&ident, line, line_end - line))
                return;
 
-       mailbuf = ident.mail_begin;
-       maillen = ident.mail_end - ident.mail_begin;
-       namebuf = ident.name_begin;
-       namelen = ident.name_end - ident.name_begin;
+       mailbuf = ident.mail.begin;
+       maillen = ident.mail.end - ident.mail.begin;
+       namebuf = ident.name.begin;
+       namelen = ident.name.end - ident.name.begin;
 
        if (pp->mailmap)
                map_user(pp->mailmap, &mailbuf, &maillen, &namebuf, &namelen);
@@ -449,10 +449,10 @@ void pp_user_info(struct pretty_print_context *pp,
                        string_list_append(&pp->in_body_headers,
                                           strbuf_detach(&buf, NULL));
 
-                       mailbuf = pp->from_ident->mail_begin;
-                       maillen = pp->from_ident->mail_end - mailbuf;
-                       namebuf = pp->from_ident->name_begin;
-                       namelen = pp->from_ident->name_end - namebuf;
+                       mailbuf = pp->from_ident->mail.begin;
+                       maillen = pp->from_ident->mail.end - mailbuf;
+                       namebuf = pp->from_ident->name.begin;
+                       namelen = pp->from_ident->name.end - namebuf;
                }
 
                strbuf_addstr(sb, "From: ");
@@ -677,10 +677,10 @@ static size_t format_person_part(struct strbuf *sb, char 
part,
        if (split_ident_line(&s, msg, len) < 0)
                goto skip;
 
-       name = s.name_begin;
-       namelen = s.name_end - s.name_begin;
-       mail = s.mail_begin;
-       maillen = s.mail_end - s.mail_begin;
+       name = s.name.begin;
+       namelen = s.name.end - s.name.begin;
+       mail = s.mail.begin;
+       maillen = s.mail.end - s.mail.begin;
 
        if (part == 'N' || part == 'E') /* mailmap lookup */
                mailmap_name(&mail, &maillen, &name, &namelen);
@@ -693,11 +693,11 @@ static size_t format_person_part(struct strbuf *sb, char 
part,
                return placeholder_len;
        }
 
-       if (!s.date_begin)
+       if (!s.date.begin)
                goto skip;
 
        if (part == 't') {      /* date, UNIX timestamp */
-               strbuf_add(sb, s.date_begin, s.date_end - s.date_begin);
+               strbuf_add(sb, s.date.begin, s.date.end - s.date.begin);
                return placeholder_len;
        }
 
diff --git a/revision.c b/revision.c
index 9d628c6..c5fbaf8 100644
--- a/revision.c
+++ b/revision.c
@@ -2762,10 +2762,10 @@ static int commit_rewrite_person(struct strbuf *buf, 
const char *what, struct st
        if (split_ident_line(&ident, person, len))
                return 0;
 
-       mail = ident.mail_begin;
-       maillen = ident.mail_end - ident.mail_begin;
-       name = ident.name_begin;
-       namelen = ident.name_end - ident.name_begin;
+       mail = ident.mail.begin;
+       maillen = ident.mail.end - ident.mail.begin;
+       name = ident.name.begin;
+       namelen = ident.name.end - ident.name.begin;
 
        if (map_user(mailmap, &mail, &maillen, &name, &namelen)) {
                struct strbuf namemail = STRBUF_INIT;
@@ -2773,8 +2773,8 @@ static int commit_rewrite_person(struct strbuf *buf, 
const char *what, struct st
                strbuf_addf(&namemail, "%.*s <%.*s>",
                            (int)namelen, name, (int)maillen, mail);
 
-               strbuf_splice(buf, ident.name_begin - buf->buf,
-                             ident.mail_end - ident.name_begin + 1,
+               strbuf_splice(buf, ident.name.begin - buf->buf,
+                             ident.mail.end - ident.name.begin + 1,
                              namemail.buf, namemail.len);
 
                strbuf_release(&namemail);
-- 
2.0.0.566.gfe3e6b2

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to