Browse Source

ident: use a dynamic strbuf in fmt_ident

Now that we accept arbitrary-sized names and email
addresses, the only remaining limit is in the actual
formatting of the names into a buffer. The current limit is
1000 characters, which is not likely to be reached, but
using a strbuf is one less error condition we have to worry
about.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Jeff King 13 years ago committed by Junio C Hamano
parent
commit
c96f0c8d0a
  1. 45
      ident.c

45
ident.c

@ -121,15 +121,6 @@ const char *ident_default_date(void) @@ -121,15 +121,6 @@ const char *ident_default_date(void)
return git_default_date;
}

static int add_raw(char *buf, size_t size, int offset, const char *str)
{
size_t len = strlen(str);
if (offset + len > size)
return size;
memcpy(buf + offset, str, len);
return offset + len;
}

static int crud(unsigned char c)
{
return c <= 32 ||
@ -148,7 +139,7 @@ static int crud(unsigned char c) @@ -148,7 +139,7 @@ static int crud(unsigned char c)
* Copy over a string to the destination, but avoid special
* characters ('\n', '<' and '>') and remove crud at the end
*/
static int copy(char *buf, size_t size, int offset, const char *src)
static void strbuf_addstr_without_crud(struct strbuf *sb, const char *src)
{
size_t i, len;
unsigned char c;
@ -172,19 +163,19 @@ static int copy(char *buf, size_t size, int offset, const char *src) @@ -172,19 +163,19 @@ static int copy(char *buf, size_t size, int offset, const char *src)
/*
* Copy the rest to the buffer, but avoid the special
* characters '\n' '<' and '>' that act as delimiters on
* an identification line
* an identification line. We can only remove crud, never add it,
* so 'len' is our maximum.
*/
strbuf_grow(sb, len);
for (i = 0; i < len; i++) {
c = *src++;
switch (c) {
case '\n': case '<': case '>':
continue;
}
if (offset >= size)
return size;
buf[offset++] = c;
sb->buf[sb->len++] = c;
}
return offset;
sb->buf[sb->len] = '\0';
}

/*
@ -271,9 +262,8 @@ static const char *env_hint = @@ -271,9 +262,8 @@ static const char *env_hint =
const char *fmt_ident(const char *name, const char *email,
const char *date_str, int flag)
{
static char buffer[1000];
static struct strbuf ident = STRBUF_INIT;
char date[50];
int i;
int error_on_no_name = (flag & IDENT_ERROR_ON_NO_NAME);
int name_addr_only = (flag & IDENT_NO_DATE);

@ -300,19 +290,16 @@ const char *fmt_ident(const char *name, const char *email, @@ -300,19 +290,16 @@ const char *fmt_ident(const char *name, const char *email,
die("invalid date format: %s", date_str);
}

i = copy(buffer, sizeof(buffer), 0, name);
i = add_raw(buffer, sizeof(buffer), i, " <");
i = copy(buffer, sizeof(buffer), i, email);
strbuf_reset(&ident);
strbuf_addstr_without_crud(&ident, name);
strbuf_addstr(&ident, " <");
strbuf_addstr_without_crud(&ident, email);
strbuf_addch(&ident, '>');
if (!name_addr_only) {
i = add_raw(buffer, sizeof(buffer), i, "> ");
i = copy(buffer, sizeof(buffer), i, date);
} else {
i = add_raw(buffer, sizeof(buffer), i, ">");
}
if (i >= sizeof(buffer))
die("Impossibly long personal identifier");
buffer[i] = 0;
return buffer;
strbuf_addch(&ident, ' ');
strbuf_addstr_without_crud(&ident, date);
}
return ident.buf;
}

const char *fmt_name(const char *name, const char *email)

Loading…
Cancel
Save