Skip to content
/ git Public
forked from git/git

Commit

Permalink
define utility functions for object IDs
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
bk2204 authored and gitster committed Mar 14, 2015
1 parent 5f7817c commit aa1c6fd
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 7 deletions.
32 changes: 28 additions & 4 deletions cache.h
Original file line number Diff line number Diff line change
Expand Up @@ -718,34 +718,56 @@ 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;
}

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 \
Expand Down Expand Up @@ -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);
Expand Down
16 changes: 13 additions & 3 deletions hex.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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];
Expand All @@ -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);
}

0 comments on commit aa1c6fd

Please sign in to comment.