Skip to content

Commit aa1c6fd

Browse files
bk2204gitster
authored andcommitted
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 <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 5f7817c commit aa1c6fd

File tree

2 files changed

+41
-7
lines changed

2 files changed

+41
-7
lines changed

cache.h

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -718,34 +718,56 @@ extern char *sha1_pack_name(const unsigned char *sha1);
718718
extern char *sha1_pack_index_name(const unsigned char *sha1);
719719

720720
extern const char *find_unique_abbrev(const unsigned char *sha1, int);
721-
extern const unsigned char null_sha1[20];
721+
extern const unsigned char null_sha1[GIT_SHA1_RAWSZ];
722722

723723
static inline int hashcmp(const unsigned char *sha1, const unsigned char *sha2)
724724
{
725725
int i;
726726

727-
for (i = 0; i < 20; i++, sha1++, sha2++) {
727+
for (i = 0; i < GIT_SHA1_RAWSZ; i++, sha1++, sha2++) {
728728
if (*sha1 != *sha2)
729729
return *sha1 - *sha2;
730730
}
731731

732732
return 0;
733733
}
734734

735+
static inline int oidcmp(const struct object_id *oid1, const struct object_id *oid2)
736+
{
737+
return hashcmp(oid1->hash, oid2->hash);
738+
}
739+
735740
static inline int is_null_sha1(const unsigned char *sha1)
736741
{
737742
return !hashcmp(sha1, null_sha1);
738743
}
739744

745+
static inline int is_null_oid(const struct object_id *oid)
746+
{
747+
return !hashcmp(oid->hash, null_sha1);
748+
}
749+
740750
static inline void hashcpy(unsigned char *sha_dst, const unsigned char *sha_src)
741751
{
742-
memcpy(sha_dst, sha_src, 20);
752+
memcpy(sha_dst, sha_src, GIT_SHA1_RAWSZ);
753+
}
754+
755+
static inline void oidcpy(struct object_id *dst, const struct object_id *src)
756+
{
757+
hashcpy(dst->hash, src->hash);
743758
}
759+
744760
static inline void hashclr(unsigned char *hash)
745761
{
746-
memset(hash, 0, 20);
762+
memset(hash, 0, GIT_SHA1_RAWSZ);
747763
}
748764

765+
static inline void oidclr(struct object_id *oid)
766+
{
767+
hashclr(oid->hash);
768+
}
769+
770+
749771
#define EMPTY_TREE_SHA1_HEX \
750772
"4b825dc642cb6eb9a060e54bf8d69288fbee4904"
751773
#define EMPTY_TREE_SHA1_BIN_LITERAL \
@@ -952,8 +974,10 @@ extern int for_each_abbrev(const char *prefix, each_abbrev_fn, void *);
952974
* null-terminated string.
953975
*/
954976
extern int get_sha1_hex(const char *hex, unsigned char *sha1);
977+
extern int get_oid_hex(const char *hex, struct object_id *sha1);
955978

956979
extern char *sha1_to_hex(const unsigned char *sha1); /* static buffer result! */
980+
extern char *oid_to_hex(const struct object_id *oid); /* same static buffer as sha1_to_hex */
957981
extern int read_ref_full(const char *refname, int resolve_flags,
958982
unsigned char *sha1, int *flags);
959983
extern int read_ref(const char *refname, unsigned char *sha1);

hex.c

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ const signed char hexval_table[256] = {
3838
int get_sha1_hex(const char *hex, unsigned char *sha1)
3939
{
4040
int i;
41-
for (i = 0; i < 20; i++) {
41+
for (i = 0; i < GIT_SHA1_RAWSZ; i++) {
4242
unsigned int val;
4343
/*
4444
* hex[1]=='\0' is caught when val is checked below,
@@ -56,15 +56,20 @@ int get_sha1_hex(const char *hex, unsigned char *sha1)
5656
return 0;
5757
}
5858

59+
int get_oid_hex(const char *hex, struct object_id *oid)
60+
{
61+
return get_sha1_hex(hex, oid->hash);
62+
}
63+
5964
char *sha1_to_hex(const unsigned char *sha1)
6065
{
6166
static int bufno;
62-
static char hexbuffer[4][41];
67+
static char hexbuffer[4][GIT_SHA1_HEXSZ + 1];
6368
static const char hex[] = "0123456789abcdef";
6469
char *buffer = hexbuffer[3 & ++bufno], *buf = buffer;
6570
int i;
6671

67-
for (i = 0; i < 20; i++) {
72+
for (i = 0; i < GIT_SHA1_RAWSZ; i++) {
6873
unsigned int val = *sha1++;
6974
*buf++ = hex[val >> 4];
7075
*buf++ = hex[val & 0xf];
@@ -73,3 +78,8 @@ char *sha1_to_hex(const unsigned char *sha1)
7378

7479
return buffer;
7580
}
81+
82+
char *oid_to_hex(const struct object_id *oid)
83+
{
84+
return sha1_to_hex(oid->hash);
85+
}

0 commit comments

Comments
 (0)