git

Форк
0
/
hex.c 
126 строк · 2.9 Кб
1
#define USE_THE_REPOSITORY_VARIABLE
2

3
#include "git-compat-util.h"
4
#include "hash.h"
5
#include "hex.h"
6

7
static int get_hash_hex_algop(const char *hex, unsigned char *hash,
8
			      const struct git_hash_algo *algop)
9
{
10
	int i;
11
	for (i = 0; i < algop->rawsz; i++) {
12
		int val = hex2chr(hex);
13
		if (val < 0)
14
			return -1;
15
		*hash++ = val;
16
		hex += 2;
17
	}
18
	return 0;
19
}
20

21
int get_hash_hex(const char *hex, unsigned char *sha1)
22
{
23
	return get_hash_hex_algop(hex, sha1, the_hash_algo);
24
}
25

26
int get_oid_hex_algop(const char *hex, struct object_id *oid,
27
		      const struct git_hash_algo *algop)
28
{
29
	int ret = get_hash_hex_algop(hex, oid->hash, algop);
30
	if (!ret) {
31
		oid_set_algo(oid, algop);
32
		if (algop->rawsz != GIT_MAX_RAWSZ)
33
			memset(oid->hash + algop->rawsz, 0,
34
			       GIT_MAX_RAWSZ - algop->rawsz);
35
	}
36
	return ret;
37
}
38

39
/*
40
 * NOTE: This function relies on hash algorithms being in order from shortest
41
 * length to longest length.
42
 */
43
int get_oid_hex_any(const char *hex, struct object_id *oid)
44
{
45
	int i;
46
	for (i = GIT_HASH_NALGOS - 1; i > 0; i--) {
47
		if (!get_oid_hex_algop(hex, oid, &hash_algos[i]))
48
			return i;
49
	}
50
	return GIT_HASH_UNKNOWN;
51
}
52

53
int get_oid_hex(const char *hex, struct object_id *oid)
54
{
55
	return get_oid_hex_algop(hex, oid, the_hash_algo);
56
}
57

58
int parse_oid_hex_algop(const char *hex, struct object_id *oid,
59
			const char **end,
60
			const struct git_hash_algo *algop)
61
{
62
	int ret = get_oid_hex_algop(hex, oid, algop);
63
	if (!ret)
64
		*end = hex + algop->hexsz;
65
	return ret;
66
}
67

68
int parse_oid_hex_any(const char *hex, struct object_id *oid, const char **end)
69
{
70
	int ret = get_oid_hex_any(hex, oid);
71
	if (ret)
72
		*end = hex + hash_algos[ret].hexsz;
73
	return ret;
74
}
75

76
int parse_oid_hex(const char *hex, struct object_id *oid, const char **end)
77
{
78
	return parse_oid_hex_algop(hex, oid, end, the_hash_algo);
79
}
80

81
char *hash_to_hex_algop_r(char *buffer, const unsigned char *hash,
82
			  const struct git_hash_algo *algop)
83
{
84
	static const char hex[] = "0123456789abcdef";
85
	char *buf = buffer;
86
	int i;
87

88
	/*
89
	 * Our struct object_id has been memset to 0, so default to printing
90
	 * using the default hash.
91
	 */
92
	if (algop == &hash_algos[0])
93
		algop = the_hash_algo;
94

95
	for (i = 0; i < algop->rawsz; i++) {
96
		unsigned int val = *hash++;
97
		*buf++ = hex[val >> 4];
98
		*buf++ = hex[val & 0xf];
99
	}
100
	*buf = '\0';
101

102
	return buffer;
103
}
104

105
char *oid_to_hex_r(char *buffer, const struct object_id *oid)
106
{
107
	return hash_to_hex_algop_r(buffer, oid->hash, &hash_algos[oid->algo]);
108
}
109

110
char *hash_to_hex_algop(const unsigned char *hash, const struct git_hash_algo *algop)
111
{
112
	static int bufno;
113
	static char hexbuffer[4][GIT_MAX_HEXSZ + 1];
114
	bufno = (bufno + 1) % ARRAY_SIZE(hexbuffer);
115
	return hash_to_hex_algop_r(hexbuffer[bufno], hash, algop);
116
}
117

118
char *hash_to_hex(const unsigned char *hash)
119
{
120
	return hash_to_hex_algop(hash, the_hash_algo);
121
}
122

123
char *oid_to_hex(const struct object_id *oid)
124
{
125
	return hash_to_hex_algop(oid->hash, &hash_algos[oid->algo]);
126
}
127

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.