On Tue, Dec 29, 2015 at 2:20 AM, Jeff King <[email protected]> wrote:
> We want to chomp newlines off the end of the "value" string.
> But because it's const, we must track its length rather than
> writing a NUL. This leads to us having to tweak that length
> later, to account for moving the pointer forward.
>
> Since we are about to create a copy of it anyway, let's just
> wait and chomp at the end.
>
> Signed-off-by: Jeff King <[email protected]>
> ---
> diff --git a/builtin/log.c b/builtin/log.c
> @@ -675,21 +675,18 @@ static struct string_list extra_cc;
> static void add_header(const char *value)
> {
> struct string_list_item *item;
> - int len = strlen(value);
> - while (len && value[len - 1] == '\n')
> - len--;
> + size_t len;
>
> - if (!strncasecmp(value, "to: ", 4)) {
> + if (!strncasecmp(value, "to: ", 4))
> item = string_list_append(&extra_to, value + 4);
> - len -= 4;
> - } else if (!strncasecmp(value, "cc: ", 4)) {
> + else if (!strncasecmp(value, "cc: ", 4))
> item = string_list_append(&extra_cc, value + 4);
> - len -= 4;
> - } else {
> + else
> item = string_list_append(&extra_hdr, value);
> - }
>
> - item->string[len] = '\0';
> + len = strlen(item->string);
> + while (len && item->string[len - 1] == '\n')
> + item->string[--len] = '\0';
Not a strong objection, but this implementation may make the reader
wonder why NUL needs to be assigned to all "stripped" characters. I'd
have expected to see:
len = strlen(item->string);
while (len && item->string[len - 1] == '\n')
len--;
item->string[len] = '\0';
which indicates clearly that this is a simple truncation rather than
some odd NUL-fill operation, and is slightly more easy to reason about
since it doesn't involve a pre-decrement as an array subscript.
> }
>
> #define THREAD_SHALLOW 1
> --
> 2.7.0.rc3.367.g09631da
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html