summaryrefslogtreecommitdiff
path: root/ident.c
diff options
context:
space:
mode:
authorJeff King <peff@peff.net>2012-05-21 23:10:26 (GMT)
committerJunio C Hamano <gitster@pobox.com>2012-05-22 16:08:48 (GMT)
commitc96f0c8d0a9f1eeabb2ea49cb7ede954a64bd540 (patch)
treec3b2800a889480091ff46b141ba11753d3e9f954 /ident.c
parentf8254d321cc42a6d47abf79b0f93d16e28432df3 (diff)
downloadgit-c96f0c8d0a9f1eeabb2ea49cb7ede954a64bd540.zip
git-c96f0c8d0a9f1eeabb2ea49cb7ede954a64bd540.tar.gz
git-c96f0c8d0a9f1eeabb2ea49cb7ede954a64bd540.tar.bz2
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>
Diffstat (limited to 'ident.c')
-rw-r--r--ident.c43
1 files changed, 15 insertions, 28 deletions
diff --git a/ident.c b/ident.c
index b111e34..cefb829 100644
--- a/ident.c
+++ b/ident.c
@@ -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)
* 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)
/*
* 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 =
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,
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, ">");
+ strbuf_addch(&ident, ' ');
+ strbuf_addstr_without_crud(&ident, date);
}
- if (i >= sizeof(buffer))
- die("Impossibly long personal identifier");
- buffer[i] = 0;
- return buffer;
+ return ident.buf;
}
const char *fmt_name(const char *name, const char *email)