Nicolas Pitre <n...@fluxnic.net> writes:

> Let's create another dictionary table to hold the author and committer
> entries.  We use the same table format used for tree entries where the
> 16 bit data prefix is conveniently used to store the timezone value.
>
> In order to copy straight from a commit object buffer, dict_add_entry()
> is modified to get the string length as the provided string pointer is
> not always be null terminated.
>
> Signed-off-by: Nicolas Pitre <n...@fluxnic.net>
> ---
> @@ -135,8 +136,73 @@ static void sort_dict_entries_by_hits(struct dict_table 
> *t)
>       rehash_entries(t);
>  }
>  
> +static struct dict_table *commit_name_table;
>  static struct dict_table *tree_path_table;
>  
> +/*
> + * Parse the author/committer line from a canonical commit object.
> + * The 'from' argument points right after the "author " or "committer "
> + * string.  The time zone is parsed and stored in *tz_val.  The returned
> + * pointer is right after the end of the email address which is also just
> + * before the time value, or NULL if a parsing error is encountered.
> + */
> +static char *get_nameend_and_tz(char *from, int *tz_val)
> +{
> +     char *end, *tz;
> +
> +     tz = strchr(from, '\n');
> +     /* let's assume the smallest possible string to be "x <x> 0 +0000\n" */
> +     if (!tz || tz - from < 13)
> +             return NULL;
> +     tz -= 4;
> +     end = tz - 4;
> +     while (end - from > 5 && *end != ' ')
> +             end--;
> +     if (end[-1] != '>' || end[0] != ' ' || tz[-2] != ' ')
> +             return NULL;
> +     *tz_val = (tz[0] - '0') * 1000 +
> +               (tz[1] - '0') * 100 +
> +               (tz[2] - '0') * 10 +
> +               (tz[3] - '0');
> +     switch (tz[-1]) {
> +     default:        return NULL;
> +     case '+':       break;
> +     case '-':       *tz_val = -*tz_val;
> +     }
> +     return end;
> +}

This may want to share code with ident.c::split_ident_line(), as we
have been trying to reduce the number of ident-line parsers.
--
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