⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 convert-cache.c

📁 非常热门的linux管理软件git的雏形 小而全
💻 C
字号:
#include "cache.h"struct entry {	unsigned char old_sha1[20];	unsigned char new_sha1[20];	int converted;};#define MAXOBJECTS (1000000)static struct entry *convert[MAXOBJECTS];static int nr_convert;static struct entry * convert_entry(unsigned char *sha1);static struct entry *insert_new(unsigned char *sha1, int pos){	struct entry *new = malloc(sizeof(struct entry));	memset(new, 0, sizeof(*new));	memcpy(new->old_sha1, sha1, 20);	memmove(convert + pos + 1, convert + pos, (nr_convert - pos) * sizeof(struct entry *));	convert[pos] = new;	nr_convert++;	if (nr_convert == MAXOBJECTS)		die("you're kidding me - hit maximum object limit");	return new;}static struct entry *lookup_entry(unsigned char *sha1){	int low = 0, high = nr_convert;	while (low < high) {		int next = (low + high) / 2;		struct entry *n = convert[next];		int cmp = memcmp(sha1, n->old_sha1, 20);		if (!cmp)			return n;		if (cmp < 0) {			high = next;			continue;		}		low = next+1;	}	return insert_new(sha1, low);}static void convert_blob(void *buffer, unsigned long size){	/* Nothing to do */}static void convert_binary_sha1(void *buffer){	struct entry *entry = convert_entry(buffer);	memcpy(buffer, entry->new_sha1, 20);}static void convert_ascii_sha1(void *buffer){	unsigned char sha1[20];	struct entry *entry;	if (get_sha1_hex(buffer, sha1))		die("bad sha1");	entry = convert_entry(sha1);	memcpy(buffer, sha1_to_hex(entry->new_sha1), 40);}static void convert_tree(void *buffer, unsigned long size){	while (size) {		int len = 1+strlen(buffer);		convert_binary_sha1(buffer + len);		len += 20;		if (len > size)			die("corrupt tree object");		size -= len;		buffer += len;	}}static void convert_commit(void *buffer, unsigned long size){	convert_ascii_sha1(buffer+5);	buffer += 46;    /* "tree " + "hex sha1" + "\n" */	while (!memcmp(buffer, "parent ", 7)) {		convert_ascii_sha1(buffer+7);		buffer += 48;	}}static struct entry * convert_entry(unsigned char *sha1){	struct entry *entry = lookup_entry(sha1);	char type[20];	void *buffer, *data;	unsigned long size, offset;	if (entry->converted)		return entry;	data = read_sha1_file(sha1, type, &size);	if (!data)		die("unable to read object %s", sha1_to_hex(sha1));	buffer = malloc(size + 100);	offset = sprintf(buffer, "%s %lu", type, size)+1;	memcpy(buffer + offset, data, size);		if (!strcmp(type, "blob"))		convert_blob(buffer + offset, size);	else if (!strcmp(type, "tree"))		convert_tree(buffer + offset, size);	else if (!strcmp(type, "commit"))		convert_commit(buffer + offset, size);	else		die("unknown object type '%s' in %s", type, sha1_to_hex(sha1));	write_sha1_file(buffer, size + offset, entry->new_sha1);	entry->converted = 1;	free(buffer);	return entry;}int main(int argc, char **argv){	unsigned char sha1[20];	struct entry *entry;	if (argc != 2 || get_sha1_hex(argv[1], sha1))		usage("convert-cache <sha1>");	entry = convert_entry(sha1);	printf("new sha1: %s\n", sha1_to_hex(entry->new_sha1));	return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -