4f6728d52d
A number of files were apparently including cache.h solely to get gettext.h. By making those files explicitly include gettext.h, we can already drop the include of cache.h in these files. On top of that, there were some files using cache.h that didn't need to for any reason. Remove these unnecessary includes. Signed-off-by: Elijah Newren <newren@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
60 lines
1.1 KiB
C
60 lines
1.1 KiB
C
#include "test-tool.h"
|
|
#include "hex.h"
|
|
|
|
int cmd_hash_impl(int ac, const char **av, int algo)
|
|
{
|
|
git_hash_ctx ctx;
|
|
unsigned char hash[GIT_MAX_HEXSZ];
|
|
unsigned bufsz = 8192;
|
|
int binary = 0;
|
|
char *buffer;
|
|
const struct git_hash_algo *algop = &hash_algos[algo];
|
|
|
|
if (ac == 2) {
|
|
if (!strcmp(av[1], "-b"))
|
|
binary = 1;
|
|
else
|
|
bufsz = strtoul(av[1], NULL, 10) * 1024 * 1024;
|
|
}
|
|
|
|
if (!bufsz)
|
|
bufsz = 8192;
|
|
|
|
while ((buffer = malloc(bufsz)) == NULL) {
|
|
fprintf(stderr, "bufsz %u is too big, halving...\n", bufsz);
|
|
bufsz /= 2;
|
|
if (bufsz < 1024)
|
|
die("OOPS");
|
|
}
|
|
|
|
algop->init_fn(&ctx);
|
|
|
|
while (1) {
|
|
ssize_t sz, this_sz;
|
|
char *cp = buffer;
|
|
unsigned room = bufsz;
|
|
this_sz = 0;
|
|
while (room) {
|
|
sz = xread(0, cp, room);
|
|
if (sz == 0)
|
|
break;
|
|
if (sz < 0)
|
|
die_errno("test-hash");
|
|
this_sz += sz;
|
|
cp += sz;
|
|
room -= sz;
|
|
}
|
|
if (this_sz == 0)
|
|
break;
|
|
algop->update_fn(&ctx, buffer, this_sz);
|
|
}
|
|
algop->final_fn(hash, &ctx);
|
|
|
|
if (binary)
|
|
fwrite(hash, 1, algop->rawsz, stdout);
|
|
else
|
|
puts(hash_to_hex_algop(hash, algop));
|
|
free(buffer);
|
|
return 0;
|
|
}
|