| #include "cache.h" | 
 |  | 
 | int main(int ac, char **av) | 
 | { | 
 | 	git_SHA_CTX ctx; | 
 | 	unsigned char sha1[20]; | 
 | 	unsigned bufsz = 8192; | 
 | 	int binary = 0; | 
 | 	char *buffer; | 
 |  | 
 | 	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"); | 
 | 	} | 
 |  | 
 | 	git_SHA1_Init(&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-sha1"); | 
 | 			this_sz += sz; | 
 | 			cp += sz; | 
 | 			room -= sz; | 
 | 		} | 
 | 		if (this_sz == 0) | 
 | 			break; | 
 | 		git_SHA1_Update(&ctx, buffer, this_sz); | 
 | 	} | 
 | 	git_SHA1_Final(sha1, &ctx); | 
 |  | 
 | 	if (binary) | 
 | 		fwrite(sha1, 1, 20, stdout); | 
 | 	else | 
 | 		puts(sha1_to_hex(sha1)); | 
 | 	exit(0); | 
 | } |