зеркало из https://github.com/microsoft/git.git
define utility functions for object IDs
There are several utility functions (hashcmp and friends) that are used for comparing object IDs (SHA-1 values). Using these functions, which take pointers to unsigned char, with struct object_id requires tiresome access to the sha1 member, which bloats code and violates the desired encapsulation. Provide wrappers around these functions for struct object_id for neater, more maintainable code. Use the new constants to avoid the hard-coded 20s and 40s throughout the original functions. These functions simply call the underlying pointer-to-unsigned-char versions to ensure that any performance improvements will be passed through to the new functions. Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Родитель
5f7817c85d
Коммит
aa1c6fdf47
32
cache.h
32
cache.h
|
@ -718,13 +718,13 @@ extern char *sha1_pack_name(const unsigned char *sha1);
|
|||
extern char *sha1_pack_index_name(const unsigned char *sha1);
|
||||
|
||||
extern const char *find_unique_abbrev(const unsigned char *sha1, int);
|
||||
extern const unsigned char null_sha1[20];
|
||||
extern const unsigned char null_sha1[GIT_SHA1_RAWSZ];
|
||||
|
||||
static inline int hashcmp(const unsigned char *sha1, const unsigned char *sha2)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 20; i++, sha1++, sha2++) {
|
||||
for (i = 0; i < GIT_SHA1_RAWSZ; i++, sha1++, sha2++) {
|
||||
if (*sha1 != *sha2)
|
||||
return *sha1 - *sha2;
|
||||
}
|
||||
|
@ -732,20 +732,42 @@ static inline int hashcmp(const unsigned char *sha1, const unsigned char *sha2)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static inline int oidcmp(const struct object_id *oid1, const struct object_id *oid2)
|
||||
{
|
||||
return hashcmp(oid1->hash, oid2->hash);
|
||||
}
|
||||
|
||||
static inline int is_null_sha1(const unsigned char *sha1)
|
||||
{
|
||||
return !hashcmp(sha1, null_sha1);
|
||||
}
|
||||
|
||||
static inline int is_null_oid(const struct object_id *oid)
|
||||
{
|
||||
return !hashcmp(oid->hash, null_sha1);
|
||||
}
|
||||
|
||||
static inline void hashcpy(unsigned char *sha_dst, const unsigned char *sha_src)
|
||||
{
|
||||
memcpy(sha_dst, sha_src, 20);
|
||||
memcpy(sha_dst, sha_src, GIT_SHA1_RAWSZ);
|
||||
}
|
||||
|
||||
static inline void oidcpy(struct object_id *dst, const struct object_id *src)
|
||||
{
|
||||
hashcpy(dst->hash, src->hash);
|
||||
}
|
||||
|
||||
static inline void hashclr(unsigned char *hash)
|
||||
{
|
||||
memset(hash, 0, 20);
|
||||
memset(hash, 0, GIT_SHA1_RAWSZ);
|
||||
}
|
||||
|
||||
static inline void oidclr(struct object_id *oid)
|
||||
{
|
||||
hashclr(oid->hash);
|
||||
}
|
||||
|
||||
|
||||
#define EMPTY_TREE_SHA1_HEX \
|
||||
"4b825dc642cb6eb9a060e54bf8d69288fbee4904"
|
||||
#define EMPTY_TREE_SHA1_BIN_LITERAL \
|
||||
|
@ -952,8 +974,10 @@ extern int for_each_abbrev(const char *prefix, each_abbrev_fn, void *);
|
|||
* null-terminated string.
|
||||
*/
|
||||
extern int get_sha1_hex(const char *hex, unsigned char *sha1);
|
||||
extern int get_oid_hex(const char *hex, struct object_id *sha1);
|
||||
|
||||
extern char *sha1_to_hex(const unsigned char *sha1); /* static buffer result! */
|
||||
extern char *oid_to_hex(const struct object_id *oid); /* same static buffer as sha1_to_hex */
|
||||
extern int read_ref_full(const char *refname, int resolve_flags,
|
||||
unsigned char *sha1, int *flags);
|
||||
extern int read_ref(const char *refname, unsigned char *sha1);
|
||||
|
|
16
hex.c
16
hex.c
|
@ -38,7 +38,7 @@ const signed char hexval_table[256] = {
|
|||
int get_sha1_hex(const char *hex, unsigned char *sha1)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < 20; i++) {
|
||||
for (i = 0; i < GIT_SHA1_RAWSZ; i++) {
|
||||
unsigned int val;
|
||||
/*
|
||||
* hex[1]=='\0' is caught when val is checked below,
|
||||
|
@ -56,15 +56,20 @@ int get_sha1_hex(const char *hex, unsigned char *sha1)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int get_oid_hex(const char *hex, struct object_id *oid)
|
||||
{
|
||||
return get_sha1_hex(hex, oid->hash);
|
||||
}
|
||||
|
||||
char *sha1_to_hex(const unsigned char *sha1)
|
||||
{
|
||||
static int bufno;
|
||||
static char hexbuffer[4][41];
|
||||
static char hexbuffer[4][GIT_SHA1_HEXSZ + 1];
|
||||
static const char hex[] = "0123456789abcdef";
|
||||
char *buffer = hexbuffer[3 & ++bufno], *buf = buffer;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 20; i++) {
|
||||
for (i = 0; i < GIT_SHA1_RAWSZ; i++) {
|
||||
unsigned int val = *sha1++;
|
||||
*buf++ = hex[val >> 4];
|
||||
*buf++ = hex[val & 0xf];
|
||||
|
@ -73,3 +78,8 @@ char *sha1_to_hex(const unsigned char *sha1)
|
|||
|
||||
return buffer;
|
||||
}
|
||||
|
||||
char *oid_to_hex(const struct object_id *oid)
|
||||
{
|
||||
return sha1_to_hex(oid->hash);
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче