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:
brian m. carlson
2015-03-13 23:39:28 +00:00
committed by Junio C Hamano
parent 5f7817c85d
commit aa1c6fdf47
2 changed files with 41 additions and 7 deletions

32
cache.h
View File

@ -718,13 +718,13 @@ extern char *sha1_pack_name(const unsigned char *sha1);
extern char *sha1_pack_index_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 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) static inline int hashcmp(const unsigned char *sha1, const unsigned char *sha2)
{ {
int i; int i;
for (i = 0; i < 20; i++, sha1++, sha2++) { for (i = 0; i < GIT_SHA1_RAWSZ; i++, sha1++, sha2++) {
if (*sha1 != *sha2) if (*sha1 != *sha2)
return *sha1 - *sha2; return *sha1 - *sha2;
} }
@ -732,20 +732,42 @@ static inline int hashcmp(const unsigned char *sha1, const unsigned char *sha2)
return 0; 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) static inline int is_null_sha1(const unsigned char *sha1)
{ {
return !hashcmp(sha1, null_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) 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) 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 \ #define EMPTY_TREE_SHA1_HEX \
"4b825dc642cb6eb9a060e54bf8d69288fbee4904" "4b825dc642cb6eb9a060e54bf8d69288fbee4904"
#define EMPTY_TREE_SHA1_BIN_LITERAL \ #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. * null-terminated string.
*/ */
extern int get_sha1_hex(const char *hex, unsigned char *sha1); 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 *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, extern int read_ref_full(const char *refname, int resolve_flags,
unsigned char *sha1, int *flags); unsigned char *sha1, int *flags);
extern int read_ref(const char *refname, unsigned char *sha1); extern int read_ref(const char *refname, unsigned char *sha1);

16
hex.c
View File

@ -38,7 +38,7 @@ const signed char hexval_table[256] = {
int get_sha1_hex(const char *hex, unsigned char *sha1) int get_sha1_hex(const char *hex, unsigned char *sha1)
{ {
int i; int i;
for (i = 0; i < 20; i++) { for (i = 0; i < GIT_SHA1_RAWSZ; i++) {
unsigned int val; unsigned int val;
/* /*
* hex[1]=='\0' is caught when val is checked below, * 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; 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) char *sha1_to_hex(const unsigned char *sha1)
{ {
static int bufno; static int bufno;
static char hexbuffer[4][41]; static char hexbuffer[4][GIT_SHA1_HEXSZ + 1];
static const char hex[] = "0123456789abcdef"; static const char hex[] = "0123456789abcdef";
char *buffer = hexbuffer[3 & ++bufno], *buf = buffer; char *buffer = hexbuffer[3 & ++bufno], *buf = buffer;
int i; int i;
for (i = 0; i < 20; i++) { for (i = 0; i < GIT_SHA1_RAWSZ; i++) {
unsigned int val = *sha1++; unsigned int val = *sha1++;
*buf++ = hex[val >> 4]; *buf++ = hex[val >> 4];
*buf++ = hex[val & 0xf]; *buf++ = hex[val & 0xf];
@ -73,3 +78,8 @@ char *sha1_to_hex(const unsigned char *sha1)
return buffer; return buffer;
} }
char *oid_to_hex(const struct object_id *oid)
{
return sha1_to_hex(oid->hash);
}