{"thread":{"id":"6903","subject":"[PATCH] Check for PRIuMAX rather than NO_C99_FORMAT in fast-import.c.","startedAt":"2007-02-21T01:34:56Z","lastAt":"2011-03-20T06:03:54Z","messageCount":5,"participants":["Jason Riedy","Jonathan Nieder","Junio C Hamano"],"isPatch":true,"patchVersion":1,"patchTotal":null},"messages":[{"id":"35153","messageId":"27484.1172021696@lotus.CS.Berkeley.EDU","threadId":"6903","inReplyTo":null,"subject":"[PATCH] Check for PRIuMAX rather than NO_C99_FORMAT in fast-import.c.","fromName":"Jason Riedy","fromEmail":"ejr@eecs.berkeley.edu","sentAt":"2007-02-21T01:34:56Z","receivedAt":"2007-02-21T01:34:56Z","isPatch":true,"sender":{"key":"ejr@eecs.berkeley.edu","avatar":"https://gravatar.com/avatar/547fa56f887cab01599edab4e9f813c949c1269e02714f20e0496c56185d9837?d=mp&s=160"},"body":"Thanks to Simon 'corecode' Schubert <corecode@fs.ei.tum.de> for\nthe clean-up.  Defining the C99 standard PRIuMAX when necessary\nreplaces UM_FMT and the awkward UM10_FMT.  There are no direct\nC99 translations for other uses of NO_C99_FORMAT in git, alas.\n\nSigned-off-by: Jason Riedy <ejr@cs.berkeley.edu>\n---\n fast-import.c |   37 ++++++++++++++++---------------------\n 1 files changed, 16 insertions(+), 21 deletions(-)\n\ndiff --git a/fast-import.c b/fast-import.c\nindex 8720090..1ae125a 100644\n--- a/fast-import.c\n+++ b/fast-import.c\n@@ -133,13 +133,8 @@ Format of STDIN stream:\n #define PACK_ID_BITS 16\n #define MAX_PACK_ID ((1<<PACK_ID_BITS)-1)\n \n-#if !defined(NO_C99_FORMAT)\n-#define UM_FMT \"%ju\"\n-#define UM10_FMT \"%10ju\"\n-#else\n-/* Assumes unsigned long long exists. */\n-#define UM_FMT \"%llu\"\n-#define UM10_FMT \"%10llu\"\n+#ifndef PRIuMAX\n+#define PRIuMAX \"llu\"\n #endif\n \n struct object_entry\n@@ -484,7 +479,7 @@ static struct object_entry *find_mark(uintmax_t idnum)\n \t\t\toe = s->data.marked[idnum];\n \t}\n \tif (!oe)\n-\t\tdie(\"mark :\" UM_FMT \" not declared\", orig_idnum);\n+\t\tdie(\"mark :%\" PRIuMAX \" not declared\", orig_idnum);\n \treturn oe;\n }\n \n@@ -1370,7 +1365,7 @@ static void dump_marks_helper(FILE *f,\n \t} else {\n \t\tfor (k = 0; k < 1024; k++) {\n \t\t\tif (m->data.marked[k])\n-\t\t\t\tfprintf(f, \":\" UM_FMT \" %s\\n\", base + k,\n+\t\t\t\tfprintf(f, \":%\" PRIuMAX \" %s\\n\", base + k,\n \t\t\t\t\tsha1_to_hex(m->data.marked[k]->sha1));\n \t\t}\n \t}\n@@ -1696,7 +1691,7 @@ static void cmd_from(struct branch *b)\n \t\tunsigned long size;\n \t\tchar *buf;\n \t\tif (oe->type != OBJ_COMMIT)\n-\t\t\tdie(\"Mark :\" UM_FMT \" not a commit\", idnum);\n+\t\t\tdie(\"Mark :%\" PRIuMAX \" not a commit\", idnum);\n \t\thashcpy(b->sha1, oe->sha1);\n \t\tbuf = gfi_unpack_entry(oe, &size);\n \t\tif (!buf || size < 46)\n@@ -1749,7 +1744,7 @@ static struct hash_list *cmd_merge(unsigned int *count)\n \t\t\tuintmax_t idnum = strtoumax(from + 1, NULL, 10);\n \t\t\tstruct object_entry *oe = find_mark(idnum);\n \t\t\tif (oe->type != OBJ_COMMIT)\n-\t\t\t\tdie(\"Mark :\" UM_FMT \" not a commit\", idnum);\n+\t\t\t\tdie(\"Mark :%\" PRIuMAX \" not a commit\", idnum);\n \t\t\thashcpy(n->sha1, oe->sha1);\n \t\t} else if (get_sha1(from, n->sha1))\n \t\t\tdie(\"Invalid ref name or SHA1 expression: %s\", from);\n@@ -1893,7 +1888,7 @@ static void cmd_new_tag(void)\n \t\tfrom_mark = strtoumax(from + 1, NULL, 10);\n \t\toe = find_mark(from_mark);\n \t\tif (oe->type != OBJ_COMMIT)\n-\t\t\tdie(\"Mark :\" UM_FMT \" not a commit\", from_mark);\n+\t\t\tdie(\"Mark :%\" PRIuMAX \" not a commit\", from_mark);\n \t\thashcpy(sha1, oe->sha1);\n \t} else if (!get_sha1(from, sha1)) {\n \t\tunsigned long size;\n@@ -2068,18 +2063,18 @@ int main(int argc, const char **argv)\n \n \t\tfprintf(stderr, \"%s statistics:\\n\", argv[0]);\n \t\tfprintf(stderr, \"---------------------------------------------------------------------\\n\");\n-\t\tfprintf(stderr, \"Alloc'd objects: \" UM10_FMT \"\\n\", alloc_count);\n-\t\tfprintf(stderr, \"Total objects:   \" UM10_FMT \" (\" UM10_FMT \" duplicates                  )\\n\", total_count, duplicate_count);\n-\t\tfprintf(stderr, \"      blobs  :   \" UM10_FMT \" (\" UM10_FMT \" duplicates \" UM10_FMT \" deltas)\\n\", object_count_by_type[OBJ_BLOB], duplicate_count_by_type[OBJ_BLOB], delta_count_by_type[OBJ_BLOB]);\n-\t\tfprintf(stderr, \"      trees  :   \" UM10_FMT \" (\" UM10_FMT \" duplicates \" UM10_FMT \" deltas)\\n\", object_count_by_type[OBJ_TREE], duplicate_count_by_type[OBJ_TREE], delta_count_by_type[OBJ_TREE]);\n-\t\tfprintf(stderr, \"      commits:   \" UM10_FMT \" (\" UM10_FMT \" duplicates \" UM10_FMT \" deltas)\\n\", object_count_by_type[OBJ_COMMIT], duplicate_count_by_type[OBJ_COMMIT], delta_count_by_type[OBJ_COMMIT]);\n-\t\tfprintf(stderr, \"      tags   :   \" UM10_FMT \" (\" UM10_FMT \" duplicates \" UM10_FMT \" deltas)\\n\", object_count_by_type[OBJ_TAG], duplicate_count_by_type[OBJ_TAG], delta_count_by_type[OBJ_TAG]);\n+\t\tfprintf(stderr, \"Alloc'd objects: %10\" PRIuMAX \"\\n\", alloc_count);\n+\t\tfprintf(stderr, \"Total objects:   %10\" PRIuMAX \" (%10\" PRIuMAX \" duplicates                  )\\n\", total_count, duplicate_count);\n+\t\tfprintf(stderr, \"      blobs  :   %10\" PRIuMAX \" (%10\" PRIuMAX \" duplicates %10\" PRIuMAX \" deltas)\\n\", object_count_by_type[OBJ_BLOB], duplicate_count_by_type[OBJ_BLOB], delta_count_by_type[OBJ_BLOB]);\n+\t\tfprintf(stderr, \"      trees  :   %10\" PRIuMAX \" (%10\" PRIuMAX \" duplicates %10\" PRIuMAX \" deltas)\\n\", object_count_by_type[OBJ_TREE], duplicate_count_by_type[OBJ_TREE], delta_count_by_type[OBJ_TREE]);\n+\t\tfprintf(stderr, \"      commits:   %10\" PRIuMAX \" (%10\" PRIuMAX \" duplicates %10\" PRIuMAX \" deltas)\\n\", object_count_by_type[OBJ_COMMIT], duplicate_count_by_type[OBJ_COMMIT], delta_count_by_type[OBJ_COMMIT]);\n+\t\tfprintf(stderr, \"      tags   :   %10\" PRIuMAX \" (%10\" PRIuMAX \" duplicates %10\" PRIuMAX \" deltas)\\n\", object_count_by_type[OBJ_TAG], duplicate_count_by_type[OBJ_TAG], delta_count_by_type[OBJ_TAG]);\n \t\tfprintf(stderr, \"Total branches:  %10lu (%10lu loads     )\\n\", branch_count, branch_load_count);\n-\t\tfprintf(stderr, \"      marks:     \" UM10_FMT \" (\" UM10_FMT \" unique    )\\n\", (((uintmax_t)1) << marks->shift) * 1024, marks_set_count);\n+\t\tfprintf(stderr, \"      marks:     %10\" PRIuMAX \" (%10\" PRIuMAX \" unique    )\\n\", (((uintmax_t)1) << marks->shift) * 1024, marks_set_count);\n \t\tfprintf(stderr, \"      atoms:     %10u\\n\", atom_cnt);\n-\t\tfprintf(stderr, \"Memory total:    \" UM10_FMT \" KiB\\n\", (total_allocd + alloc_count*sizeof(struct object_entry))/1024);\n+\t\tfprintf(stderr, \"Memory total:    %10\" PRIuMAX \" KiB\\n\", (total_allocd + alloc_count*sizeof(struct object_entry))/1024);\n \t\tfprintf(stderr, \"       pools:    %10lu KiB\\n\", (unsigned long)(total_allocd/1024));\n-\t\tfprintf(stderr, \"     objects:    \" UM10_FMT \" KiB\\n\", (alloc_count*sizeof(struct object_entry))/1024);\n+\t\tfprintf(stderr, \"     objects:    %10\" PRIuMAX \" KiB\\n\", (alloc_count*sizeof(struct object_entry))/1024);\n \t\tfprintf(stderr, \"---------------------------------------------------------------------\\n\");\n \t\tpack_report();\n \t\tfprintf(stderr, \"---------------------------------------------------------------------\\n\");\n-- \n1.5.0.1.4.gd41a\n"},{"id":"163419","messageId":"20110316051232.GA1932@elie","threadId":"6903","inReplyTo":"27484.1172021696@lotus.CS.Berkeley.EDU","subject":"[PATCH 0/2] fix NO_C99_FORMAT on 64-bit systems","fromName":"Jonathan Nieder","fromEmail":"jrnieder@gmail.com","sentAt":"2011-03-16T05:12:44Z","receivedAt":"2011-03-16T05:12:44Z","isPatch":true,"sender":{"key":"jrnieder@gmail.com","avatar":"https://avatars.githubusercontent.com/u/281595?v=4"},"body":"Hi,\n\nJason Riedy wrote:\n\n> There are no direct\n> C99 translations for other uses of NO_C99_FORMAT in git, alas.\n\nSo here's an indirect one. :)\n\nThe goal of this series is to unbreak \"make CC=c89 NO_C99_FORMAT=yeah\"\non my amd64 machine.  Side-effects include uglifying mktag a little\nand eliminating the NO_C99_FORMAT knob.\n\nThoughts welcome, as always.\n\nJonathan Nieder (2):\n  mktag: avoid %td in format string\n  unbreak and eliminate NO_C99_FORMAT\n\n Makefile        |   14 --------------\n alloc.c         |   11 ++---------\n builtin/mktag.c |   48 ++++++++++++++++++++++--------------------------\n config.mak.in   |    1 -\n configure.ac    |   24 ------------------------\n sha1_file.c     |    9 ++-------\n 6 files changed, 26 insertions(+), 81 deletions(-)\n"},{"id":"163420","messageId":"20110316051422.GB1932@elie","threadId":"6903","inReplyTo":"20110316051232.GA1932@elie","subject":"[PATCH 1/2] mktag: avoid %td in format string","fromName":"Jonathan Nieder","fromEmail":"jrnieder@gmail.com","sentAt":"2011-03-16T05:14:22Z","receivedAt":"2011-03-16T05:14:22Z","isPatch":true,"sender":{"key":"jrnieder@gmail.com","avatar":"https://avatars.githubusercontent.com/u/281595?v=4"},"body":"Since v1.7.0-rc0~34 (make \"mktag\" a built-in, 2010-01-22), git mktag\nuses the C99-style %td format to print ptrdiff_t values.  It falls\nback to %d when NO_C99_FORMAT is set, on the assumption that pre-C99\nsystems probably are using 32-bit pointers.\n\nBut many modern systems are 64-bit and\n\n * sometimes one wants to test the NO_C99_FORMAT fallbacks using a\n   modern development platform;\n * some platforms (I'm looking at you, msvc) have not gotten with the\n   program and are still C89-only.\n\nThese ptrdiff_t values are offsets from the beginning of a buffer, so\na size_t or uintmax_t would work about as well.  Use the latter so we\ncan take advantage of the PRIuMAX fallback in git-compat-util.h, even\non C99-challenged systems with 64-bit pointers.\n\nSigned-off-by: Jonathan Nieder <jrnieder@gmail.com>\n---\nThese two patches apply to maint.\n\n builtin/mktag.c |   48 ++++++++++++++++++++++--------------------------\n 1 files changed, 22 insertions(+), 26 deletions(-)\n\ndiff --git a/builtin/mktag.c b/builtin/mktag.c\nindex 1cb0f3f..bc05227 100644\n--- a/builtin/mktag.c\n+++ b/builtin/mktag.c\n@@ -35,12 +35,6 @@ static int verify_object(const unsigned char *sha1, const char *expected_type)\n \treturn ret;\n }\n \n-#ifdef NO_C99_FORMAT\n-#define PD_FMT \"%d\"\n-#else\n-#define PD_FMT \"%td\"\n-#endif\n-\n static int verify_tag(char *buffer, unsigned long size)\n {\n \tint typelen;\n@@ -70,15 +64,18 @@ static int verify_tag(char *buffer, unsigned long size)\n \t/* Verify tag-line */\n \ttag_line = strchr(type_line, '\\n');\n \tif (!tag_line)\n-\t\treturn error(\"char\" PD_FMT \": could not find next \\\"\\\\n\\\"\", type_line - buffer);\n+\t\treturn error(\"char%\"PRIuMAX\": could not find next \\\"\\\\n\\\"\",\n+\t\t\t\t(uintmax_t) (type_line - buffer));\n \ttag_line++;\n \tif (memcmp(tag_line, \"tag \", 4) || tag_line[4] == '\\n')\n-\t\treturn error(\"char\" PD_FMT \": no \\\"tag \\\" found\", tag_line - buffer);\n+\t\treturn error(\"char%\"PRIuMAX\": no \\\"tag \\\" found\",\n+\t\t\t\t(uintmax_t) (tag_line - buffer));\n \n \t/* Get the actual type */\n \ttypelen = tag_line - type_line - strlen(\"type \\n\");\n \tif (typelen >= sizeof(type))\n-\t\treturn error(\"char\" PD_FMT \": type too long\", type_line+5 - buffer);\n+\t\treturn error(\"char%\"PRIuMAX\": type too long\",\n+\t\t\t\t(uintmax_t) (type_line+5 - buffer));\n \n \tmemcpy(type, type_line+5, typelen);\n \ttype[typelen] = 0;\n@@ -95,15 +92,16 @@ static int verify_tag(char *buffer, unsigned long size)\n \t\t\tbreak;\n \t\tif (c > ' ')\n \t\t\tcontinue;\n-\t\treturn error(\"char\" PD_FMT \": could not verify tag name\", tag_line - buffer);\n+\t\treturn error(\"char%\"PRIuMAX\": could not verify tag name\",\n+\t\t\t\t(uintmax_t) (tag_line - buffer));\n \t}\n \n \t/* Verify the tagger line */\n \ttagger_line = tag_line;\n \n \tif (memcmp(tagger_line, \"tagger \", 7))\n-\t\treturn error(\"char\" PD_FMT \": could not find \\\"tagger \\\"\",\n-\t\t\ttagger_line - buffer);\n+\t\treturn error(\"char%\"PRIuMAX\": could not find \\\"tagger \\\"\",\n+\t\t\t(uintmax_t) (tagger_line - buffer));\n \n \t/*\n \t * Check for correct form for name and email\n@@ -115,44 +113,42 @@ static int verify_tag(char *buffer, unsigned long size)\n \tif (!(lb = strstr(tagger_line, \" <\")) || !(rb = strstr(lb+2, \"> \")) ||\n \t\tstrpbrk(tagger_line, \"<>\\n\") != lb+1 ||\n \t\tstrpbrk(lb+2, \"><\\n \") != rb)\n-\t\treturn error(\"char\" PD_FMT \": malformed tagger field\",\n-\t\t\ttagger_line - buffer);\n+\t\treturn error(\"char%\"PRIuMAX\": malformed tagger field\",\n+\t\t\t(uintmax_t) (tagger_line - buffer));\n \n \t/* Check for author name, at least one character, space is acceptable */\n \tif (lb == tagger_line)\n-\t\treturn error(\"char\" PD_FMT \": missing tagger name\",\n-\t\t\ttagger_line - buffer);\n+\t\treturn error(\"char%\"PRIuMAX\": missing tagger name\",\n+\t\t\t(uintmax_t) (tagger_line - buffer));\n \n \t/* timestamp, 1 or more digits followed by space */\n \ttagger_line = rb + 2;\n \tif (!(len = strspn(tagger_line, \"0123456789\")))\n-\t\treturn error(\"char\" PD_FMT \": missing tag timestamp\",\n-\t\t\ttagger_line - buffer);\n+\t\treturn error(\"char%\"PRIuMAX\": missing tag timestamp\",\n+\t\t\t(uintmax_t) (tagger_line - buffer));\n \ttagger_line += len;\n \tif (*tagger_line != ' ')\n-\t\treturn error(\"char\" PD_FMT \": malformed tag timestamp\",\n-\t\t\ttagger_line - buffer);\n+\t\treturn error(\"char%\"PRIuMAX\": malformed tag timestamp\",\n+\t\t\t(uintmax_t) (tagger_line - buffer));\n \ttagger_line++;\n \n \t/* timezone, 5 digits [+-]hhmm, max. 1400 */\n \tif (!((tagger_line[0] == '+' || tagger_line[0] == '-') &&\n \t      strspn(tagger_line+1, \"0123456789\") == 4 &&\n \t      tagger_line[5] == '\\n' && atoi(tagger_line+1) <= 1400))\n-\t\treturn error(\"char\" PD_FMT \": malformed tag timezone\",\n-\t\t\ttagger_line - buffer);\n+\t\treturn error(\"char%\"PRIuMAX\": malformed tag timezone\",\n+\t\t\t(uintmax_t) (tagger_line - buffer));\n \ttagger_line += 6;\n \n \t/* Verify the blank line separating the header from the body */\n \tif (*tagger_line != '\\n')\n-\t\treturn error(\"char\" PD_FMT \": trailing garbage in tag header\",\n-\t\t\ttagger_line - buffer);\n+\t\treturn error(\"char%\"PRIuMAX\": trailing garbage in tag header\",\n+\t\t\t(uintmax_t) (tagger_line - buffer));\n \n \t/* The actual stuff afterwards we don't care about.. */\n \treturn 0;\n }\n \n-#undef PD_FMT\n-\n int cmd_mktag(int argc, const char **argv, const char *prefix)\n {\n \tstruct strbuf buf = STRBUF_INIT;\n-- \n1.7.4.1\n"},{"id":"163421","messageId":"20110316051531.GC1932@elie","threadId":"6903","inReplyTo":"20110316051232.GA1932@elie","subject":"[PATCH 2/2] unbreak and eliminate NO_C99_FORMAT","fromName":"Jonathan Nieder","fromEmail":"jrnieder@gmail.com","sentAt":"2011-03-16T05:15:31Z","receivedAt":"2011-03-16T05:15:31Z","isPatch":true,"sender":{"key":"jrnieder@gmail.com","avatar":"https://avatars.githubusercontent.com/u/281595?v=4"},"body":"In the spirit of v1.5.0.2~21 (Check for PRIuMAX rather than\nNO_C99_FORMAT in fast-import.c, 2007-02-20), use PRIuMAX from\ngit-compat-util.h on all platforms instead of C99-specific formats\nlike %zu with dangerous fallbacks to %u or %lu.\n\nSo now C99-challenged platforms can build git without provoking\nwarnings or errors from printf, even if pointers do not have the same\nsize as an int or long.\n\nThe need for a fallback PRIuMAX is detected in git-compat-util.h with\n\"#ifndef PRIuMAX\".  So while at it, simplify the Makefile and configure\nscript by eliminating the NO_C99_FORMAT knob altogether.\n\nSigned-off-by: Jonathan Nieder <jrnieder@gmail.com>\n---\n Makefile      |   14 --------------\n alloc.c       |   11 ++---------\n config.mak.in |    1 -\n configure.ac  |   24 ------------------------\n sha1_file.c   |    9 ++-------\n 5 files changed, 4 insertions(+), 55 deletions(-)\n\ndiff --git a/Makefile b/Makefile\nindex 775ee83..d9243aa 100644\n--- a/Makefile\n+++ b/Makefile\n@@ -45,11 +45,6 @@ all::\n # Define NO_D_TYPE_IN_DIRENT if your platform defines DT_UNKNOWN but lacks\n # d_type in struct dirent (Cygwin 1.5, fixed in Cygwin 1.7).\n #\n-# Define NO_C99_FORMAT if your formatted IO functions (printf/scanf et.al.)\n-# do not support the 'size specifiers' introduced by C99, namely ll, hh,\n-# j, z, t. (representing long long int, char, intmax_t, size_t, ptrdiff_t).\n-# some C compilers supported these specifiers prior to C99 as an extension.\n-#\n # Define NO_STRCASESTR if you don't have strcasestr.\n #\n # Define NO_MEMMEM if you don't have memmem.\n@@ -870,7 +865,6 @@ ifeq ($(uname_S),SunOS)\n \t\tNO_UNSETENV = YesPlease\n \t\tNO_SETENV = YesPlease\n \t\tNO_STRLCPY = YesPlease\n-\t\tNO_C99_FORMAT = YesPlease\n \t\tNO_STRTOUMAX = YesPlease\n \t\tGIT_TEST_CMP = cmp\n \tendif\n@@ -881,21 +875,18 @@ ifeq ($(uname_S),SunOS)\n \t\tNO_UNSETENV = YesPlease\n \t\tNO_SETENV = YesPlease\n \t\tNO_STRLCPY = YesPlease\n-\t\tNO_C99_FORMAT = YesPlease\n \t\tNO_STRTOUMAX = YesPlease\n \t\tGIT_TEST_CMP = cmp\n \tendif\n \tifeq ($(uname_R),5.8)\n \t\tNO_UNSETENV = YesPlease\n \t\tNO_SETENV = YesPlease\n-\t\tNO_C99_FORMAT = YesPlease\n \t\tNO_STRTOUMAX = YesPlease\n \t\tGIT_TEST_CMP = cmp\n \tendif\n \tifeq ($(uname_R),5.9)\n \t\tNO_UNSETENV = YesPlease\n \t\tNO_SETENV = YesPlease\n-\t\tNO_C99_FORMAT = YesPlease\n \t\tNO_STRTOUMAX = YesPlease\n \t\tGIT_TEST_CMP = cmp\n \tendif\n@@ -1074,7 +1065,6 @@ ifeq ($(uname_S),Windows)\n \tNO_MEMMEM = YesPlease\n \t# NEEDS_LIBICONV = YesPlease\n \tNO_ICONV = YesPlease\n-\tNO_C99_FORMAT = YesPlease\n \tNO_STRTOUMAX = YesPlease\n \tNO_STRTOULL = YesPlease\n \tNO_MKDTEMP = YesPlease\n@@ -1151,7 +1141,6 @@ ifneq (,$(findstring MINGW,$(uname_S)))\n \tNO_MEMMEM = YesPlease\n \tNEEDS_LIBICONV = YesPlease\n \tOLD_ICONV = YesPlease\n-\tNO_C99_FORMAT = YesPlease\n \tNO_STRTOUMAX = YesPlease\n \tNO_MKDTEMP = YesPlease\n \tNO_MKSTEMPS = YesPlease\n@@ -1354,9 +1343,6 @@ endif\n ifdef NO_NSEC\n \tBASIC_CFLAGS += -DNO_NSEC\n endif\n-ifdef NO_C99_FORMAT\n-\tBASIC_CFLAGS += -DNO_C99_FORMAT\n-endif\n ifdef SNPRINTF_RETURNS_BOGUS\n \tCOMPAT_CFLAGS += -DSNPRINTF_RETURNS_BOGUS\n \tCOMPAT_OBJS += compat/snprintf.o\ndiff --git a/alloc.c b/alloc.c\nindex 6ef6753..aeae55c 100644\n--- a/alloc.c\n+++ b/alloc.c\n@@ -51,19 +51,12 @@ DEFINE_ALLOCATOR(commit, struct commit)\n DEFINE_ALLOCATOR(tag, struct tag)\n DEFINE_ALLOCATOR(object, union any_object)\n \n-#ifdef NO_C99_FORMAT\n-#define SZ_FMT \"%u\"\n-#else\n-#define SZ_FMT \"%zu\"\n-#endif\n-\n static void report(const char *name, unsigned int count, size_t size)\n {\n-    fprintf(stderr, \"%10s: %8u (\" SZ_FMT \" kB)\\n\", name, count, size);\n+\tfprintf(stderr, \"%10s: %8u (%\"PRIuMAX\" kB)\\n\",\n+\t\t\tname, count, (uintmax_t) size);\n }\n \n-#undef SZ_FMT\n-\n #define REPORT(name)\t\\\n     report(#name, name##_allocs, name##_allocs*sizeof(struct name) >> 10)\n \ndiff --git a/config.mak.in b/config.mak.in\nindex 9614973..e378534 100644\n--- a/config.mak.in\n+++ b/config.mak.in\n@@ -43,7 +43,6 @@ NO_D_INO_IN_DIRENT=@NO_D_INO_IN_DIRENT@\n NO_D_TYPE_IN_DIRENT=@NO_D_TYPE_IN_DIRENT@\n NO_SOCKADDR_STORAGE=@NO_SOCKADDR_STORAGE@\n NO_IPV6=@NO_IPV6@\n-NO_C99_FORMAT=@NO_C99_FORMAT@\n NO_HSTRERROR=@NO_HSTRERROR@\n NO_STRCASESTR=@NO_STRCASESTR@\n NO_STRTOK_R=@NO_STRTOK_R@\ndiff --git a/configure.ac b/configure.ac\nindex 20039c5..dd07907 100644\n--- a/configure.ac\n+++ b/configure.ac\n@@ -686,30 +686,6 @@ AC_CHECK_TYPE([struct addrinfo],[\n ])\n AC_SUBST(NO_IPV6)\n #\n-# Define NO_C99_FORMAT if your formatted IO functions (printf/scanf et.al.)\n-# do not support the 'size specifiers' introduced by C99, namely ll, hh,\n-# j, z, t. (representing long long int, char, intmax_t, size_t, ptrdiff_t).\n-# some C compilers supported these specifiers prior to C99 as an extension.\n-AC_CACHE_CHECK([whether formatted IO functions support C99 size specifiers],\n- [ac_cv_c_c99_format],\n-[# Actually git uses only %z (%zu) in alloc.c, and %t (%td) in mktag.c\n-AC_RUN_IFELSE(\n-\t[AC_LANG_PROGRAM([AC_INCLUDES_DEFAULT],\n-\t\t[[char buf[64];\n-\t\tif (sprintf(buf, \"%lld%hhd%jd%zd%td\", (long long int)1, (char)2, (intmax_t)3, (size_t)4, (ptrdiff_t)5) != 5)\n-\t\t  return 1;\n-\t\telse if (strcmp(buf, \"12345\"))\n-\t\t  return 2;]])],\n-\t[ac_cv_c_c99_format=yes],\n-\t[ac_cv_c_c99_format=no])\n-])\n-if test $ac_cv_c_c99_format = no; then\n-\tNO_C99_FORMAT=YesPlease\n-else\n-\tNO_C99_FORMAT=\n-fi\n-AC_SUBST(NO_C99_FORMAT)\n-#\n # Define NO_REGEX if you have no or inferior regex support in your C library.\n AC_CACHE_CHECK([whether the platform regex can handle null bytes],\n  [ac_cv_c_excellent_regex], [\ndiff --git a/sha1_file.c b/sha1_file.c\nindex 27730c3..ea99f6f 100644\n--- a/sha1_file.c\n+++ b/sha1_file.c\n@@ -25,13 +25,8 @@\n #endif\n #endif\n \n-#ifdef NO_C99_FORMAT\n-#define SZ_FMT \"lu\"\n-static unsigned long sz_fmt(size_t s) { return (unsigned long)s; }\n-#else\n-#define SZ_FMT \"zu\"\n-static size_t sz_fmt(size_t s) { return s; }\n-#endif\n+#define SZ_FMT PRIuMAX\n+static inline uintmax_t sz_fmt(size_t s) { return s; }\n \n const unsigned char null_sha1[20];\n \n-- \n1.7.4.1\n"},{"id":"163803","messageId":"7vlj0atjjp.fsf@alter.siamese.dyndns.org","threadId":"6903","inReplyTo":"20110316051422.GB1932@elie","subject":"Re: [PATCH 1/2] mktag: avoid %td in format string","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2011-03-20T06:03:54Z","receivedAt":"2011-03-20T06:03:54Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Unfortunate but sensible and correct.  Thanks.\n"}]}