mirror of
https://github.com/git/git.git
synced 2024-12-01 14:03:34 +08:00
5be507fc95
Elsewhere in Git we already use PRIuMAX and cast to uintmax_t when we need to display a value that is 'very big' and we're not exactly sure what the largest display size is for this platform. This particular fix is needed so we can do the incredibly crazy temporary hack of: diff --git a/cache.h b/cache.h index e0abcd6..6637fd8 100644 --- a/cache.h +++ b/cache.h @@ -6,6 +6,7 @@ #include SHA1_HEADER #include <zlib.h> +#define long long long #if ZLIB_VERNUM < 0x1200 #define deflateBound(c,s) ((s) + (((s) + 7) >> 3) + (((s) + 63) >> 6) + 11) allowing us to more easily look for locations where we are passing a pointer to an 8 byte value to a function that expects a 4 byte value. This can occur on some platforms where sizeof(long) == 8 and sizeof(size_t) == 4. Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
79 lines
2.1 KiB
C
79 lines
2.1 KiB
C
#include "cache.h"
|
|
#include "pack.h"
|
|
|
|
int main(int argc, char **argv)
|
|
{
|
|
int i;
|
|
unsigned nr;
|
|
unsigned int version;
|
|
static unsigned int top_index[256];
|
|
|
|
if (fread(top_index, 2 * 4, 1, stdin) != 1)
|
|
die("unable to read header");
|
|
if (top_index[0] == htonl(PACK_IDX_SIGNATURE)) {
|
|
version = ntohl(top_index[1]);
|
|
if (version < 2 || version > 2)
|
|
die("unknown index version");
|
|
if (fread(top_index, 256 * 4, 1, stdin) != 1)
|
|
die("unable to read index");
|
|
} else {
|
|
version = 1;
|
|
if (fread(&top_index[2], 254 * 4, 1, stdin) != 1)
|
|
die("unable to read index");
|
|
}
|
|
nr = 0;
|
|
for (i = 0; i < 256; i++) {
|
|
unsigned n = ntohl(top_index[i]);
|
|
if (n < nr)
|
|
die("corrupt index file");
|
|
nr = n;
|
|
}
|
|
if (version == 1) {
|
|
for (i = 0; i < nr; i++) {
|
|
unsigned int offset, entry[6];
|
|
|
|
if (fread(entry, 4 + 20, 1, stdin) != 1)
|
|
die("unable to read entry %u/%u", i, nr);
|
|
offset = ntohl(entry[0]);
|
|
printf("%u %s\n", offset, sha1_to_hex((void *)(entry+1)));
|
|
}
|
|
} else {
|
|
unsigned off64_nr = 0;
|
|
struct {
|
|
unsigned char sha1[20];
|
|
uint32_t crc;
|
|
uint32_t off;
|
|
} *entries = xmalloc(nr * sizeof(entries[0]));
|
|
for (i = 0; i < nr; i++)
|
|
if (fread(entries[i].sha1, 20, 1, stdin) != 1)
|
|
die("unable to read sha1 %u/%u", i, nr);
|
|
for (i = 0; i < nr; i++)
|
|
if (fread(&entries[i].crc, 4, 1, stdin) != 1)
|
|
die("unable to read crc %u/%u", i, nr);
|
|
for (i = 0; i < nr; i++)
|
|
if (fread(&entries[i].off, 4, 1, stdin) != 1)
|
|
die("unable to read 32b offset %u/%u", i, nr);
|
|
for (i = 0; i < nr; i++) {
|
|
uint64_t offset;
|
|
uint32_t off = ntohl(entries[i].off);
|
|
if (!(off & 0x80000000)) {
|
|
offset = off;
|
|
} else {
|
|
uint32_t off64[2];
|
|
if ((off & 0x7fffffff) != off64_nr)
|
|
die("inconsistent 64b offset index");
|
|
if (fread(off64, 8, 1, stdin) != 1)
|
|
die("unable to read 64b offset %u", off64_nr);
|
|
offset = (((uint64_t)ntohl(off64[0])) << 32) |
|
|
ntohl(off64[1]);
|
|
off64_nr++;
|
|
}
|
|
printf("%" PRIuMAX " %s (%08x)\n", (uintmax_t) offset,
|
|
sha1_to_hex(entries[i].sha1),
|
|
ntohl(entries[i].crc));
|
|
}
|
|
free(entries);
|
|
}
|
|
return 0;
|
|
}
|