Skip to content
This repository has been archived by the owner on Nov 9, 2017. It is now read-only.

Commit

Permalink
mktag: avoid %td in format string
Browse files Browse the repository at this point in the history
Since v1.7.0-rc0~34 (make "mktag" a built-in, 2010-01-22), git mktag
uses the C99-style %td format to print ptrdiff_t values.  It falls
back to %d when NO_C99_FORMAT is set, on the assumption that pre-C99
systems probably are using 32-bit pointers.

But many modern systems are 64-bit and

 * sometimes one wants to test the NO_C99_FORMAT fallbacks using a
   modern development platform;
 * some platforms (I'm looking at you, msvc) have not gotten with the
   program and are still C89-only.

These ptrdiff_t values are offsets from the beginning of a buffer, so
a size_t or uintmax_t would work about as well.  Use the latter so we
can take advantage of the PRIuMAX fallback in git-compat-util.h, even
on C99-challenged systems with 64-bit pointers.

Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
jrn authored and gitster committed Mar 17, 2011
1 parent fbcda3c commit 31d713d
Showing 1 changed file with 22 additions and 26 deletions.
48 changes: 22 additions & 26 deletions builtin/mktag.c
Expand Up @@ -35,12 +35,6 @@ static int verify_object(const unsigned char *sha1, const char *expected_type)
return ret; return ret;
} }


#ifdef NO_C99_FORMAT
#define PD_FMT "%d"
#else
#define PD_FMT "%td"
#endif

static int verify_tag(char *buffer, unsigned long size) static int verify_tag(char *buffer, unsigned long size)
{ {
int typelen; int typelen;
Expand Down Expand Up @@ -70,15 +64,18 @@ static int verify_tag(char *buffer, unsigned long size)
/* Verify tag-line */ /* Verify tag-line */
tag_line = strchr(type_line, '\n'); tag_line = strchr(type_line, '\n');
if (!tag_line) if (!tag_line)
return error("char" PD_FMT ": could not find next \"\\n\"", type_line - buffer); return error("char%"PRIuMAX": could not find next \"\\n\"",
(uintmax_t) (type_line - buffer));
tag_line++; tag_line++;
if (memcmp(tag_line, "tag ", 4) || tag_line[4] == '\n') if (memcmp(tag_line, "tag ", 4) || tag_line[4] == '\n')
return error("char" PD_FMT ": no \"tag \" found", tag_line - buffer); return error("char%"PRIuMAX": no \"tag \" found",
(uintmax_t) (tag_line - buffer));


/* Get the actual type */ /* Get the actual type */
typelen = tag_line - type_line - strlen("type \n"); typelen = tag_line - type_line - strlen("type \n");
if (typelen >= sizeof(type)) if (typelen >= sizeof(type))
return error("char" PD_FMT ": type too long", type_line+5 - buffer); return error("char%"PRIuMAX": type too long",
(uintmax_t) (type_line+5 - buffer));


memcpy(type, type_line+5, typelen); memcpy(type, type_line+5, typelen);
type[typelen] = 0; type[typelen] = 0;
Expand All @@ -95,15 +92,16 @@ static int verify_tag(char *buffer, unsigned long size)
break; break;
if (c > ' ') if (c > ' ')
continue; continue;
return error("char" PD_FMT ": could not verify tag name", tag_line - buffer); return error("char%"PRIuMAX": could not verify tag name",
(uintmax_t) (tag_line - buffer));
} }


/* Verify the tagger line */ /* Verify the tagger line */
tagger_line = tag_line; tagger_line = tag_line;


if (memcmp(tagger_line, "tagger ", 7)) if (memcmp(tagger_line, "tagger ", 7))
return error("char" PD_FMT ": could not find \"tagger \"", return error("char%"PRIuMAX": could not find \"tagger \"",
tagger_line - buffer); (uintmax_t) (tagger_line - buffer));


/* /*
* Check for correct form for name and email * Check for correct form for name and email
Expand All @@ -115,44 +113,42 @@ static int verify_tag(char *buffer, unsigned long size)
if (!(lb = strstr(tagger_line, " <")) || !(rb = strstr(lb+2, "> ")) || if (!(lb = strstr(tagger_line, " <")) || !(rb = strstr(lb+2, "> ")) ||
strpbrk(tagger_line, "<>\n") != lb+1 || strpbrk(tagger_line, "<>\n") != lb+1 ||
strpbrk(lb+2, "><\n ") != rb) strpbrk(lb+2, "><\n ") != rb)
return error("char" PD_FMT ": malformed tagger field", return error("char%"PRIuMAX": malformed tagger field",
tagger_line - buffer); (uintmax_t) (tagger_line - buffer));


/* Check for author name, at least one character, space is acceptable */ /* Check for author name, at least one character, space is acceptable */
if (lb == tagger_line) if (lb == tagger_line)
return error("char" PD_FMT ": missing tagger name", return error("char%"PRIuMAX": missing tagger name",
tagger_line - buffer); (uintmax_t) (tagger_line - buffer));


/* timestamp, 1 or more digits followed by space */ /* timestamp, 1 or more digits followed by space */
tagger_line = rb + 2; tagger_line = rb + 2;
if (!(len = strspn(tagger_line, "0123456789"))) if (!(len = strspn(tagger_line, "0123456789")))
return error("char" PD_FMT ": missing tag timestamp", return error("char%"PRIuMAX": missing tag timestamp",
tagger_line - buffer); (uintmax_t) (tagger_line - buffer));
tagger_line += len; tagger_line += len;
if (*tagger_line != ' ') if (*tagger_line != ' ')
return error("char" PD_FMT ": malformed tag timestamp", return error("char%"PRIuMAX": malformed tag timestamp",
tagger_line - buffer); (uintmax_t) (tagger_line - buffer));
tagger_line++; tagger_line++;


/* timezone, 5 digits [+-]hhmm, max. 1400 */ /* timezone, 5 digits [+-]hhmm, max. 1400 */
if (!((tagger_line[0] == '+' || tagger_line[0] == '-') && if (!((tagger_line[0] == '+' || tagger_line[0] == '-') &&
strspn(tagger_line+1, "0123456789") == 4 && strspn(tagger_line+1, "0123456789") == 4 &&
tagger_line[5] == '\n' && atoi(tagger_line+1) <= 1400)) tagger_line[5] == '\n' && atoi(tagger_line+1) <= 1400))
return error("char" PD_FMT ": malformed tag timezone", return error("char%"PRIuMAX": malformed tag timezone",
tagger_line - buffer); (uintmax_t) (tagger_line - buffer));
tagger_line += 6; tagger_line += 6;


/* Verify the blank line separating the header from the body */ /* Verify the blank line separating the header from the body */
if (*tagger_line != '\n') if (*tagger_line != '\n')
return error("char" PD_FMT ": trailing garbage in tag header", return error("char%"PRIuMAX": trailing garbage in tag header",
tagger_line - buffer); (uintmax_t) (tagger_line - buffer));


/* The actual stuff afterwards we don't care about.. */ /* The actual stuff afterwards we don't care about.. */
return 0; return 0;
} }


#undef PD_FMT

int cmd_mktag(int argc, const char **argv, const char *prefix) int cmd_mktag(int argc, const char **argv, const char *prefix)
{ {
struct strbuf buf = STRBUF_INIT; struct strbuf buf = STRBUF_INIT;
Expand Down

0 comments on commit 31d713d

Please sign in to comment.