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>

brian m. carlson committed Mar 13, 2015 at 23:39 UTC aa1c6fdf478c023180e5ca5f1658b00a72592dc6
2 files changed +41 -7
cache.h
+28 -4
@@ -718,13 +718,13 @@ extern char *sha1_pack_name(const unsigned char *sha1);
718 extern char *sha1_pack_index_name(const unsigned char *sha1);
719
720 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];
722
723 static inline int hashcmp(const unsigned char *sha1, const unsigned char *sha2)
724 {
725 int i;
726
727 - for (i = 0; i < 20; i++, sha1++, sha2++) {
727 + for (i = 0; i < GIT_SHA1_RAWSZ; i++, sha1++, sha2++) {
728 if (*sha1 != *sha2)
729 return *sha1 - *sha2;
730 }
@@ -732,20 +732,42 @@ static inline int hashcmp(const unsigned char *sha1, const unsigned char *sha2)
732 return 0;
733 }
734
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 +
740 static inline int is_null_sha1(const unsigned char *sha1)
741 {
742 return !hashcmp(sha1, null_sha1);
743 }
744
745 +static inline int is_null_oid(const struct object_id *oid)
746 +{
747 + return !hashcmp(oid->hash, null_sha1);
748 +}
749 +
750 static inline void hashcpy(unsigned char *sha_dst, const unsigned char *sha_src)
751 {
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);
758 }
759 +
760 static inline void hashclr(unsigned char *hash)
761 {
746 - memset(hash, 0, 20);
762 + memset(hash, 0, GIT_SHA1_RAWSZ);
763 }
764
765 +static inline void oidclr(struct object_id *oid)
766 +{
767 + hashclr(oid->hash);
768 +}
769 +
770 +
771 #define EMPTY_TREE_SHA1_HEX \
772 "4b825dc642cb6eb9a060e54bf8d69288fbee4904"
773 #define EMPTY_TREE_SHA1_BIN_LITERAL \
@@ -952,8 +974,10 @@ extern int for_each_abbrev(const char *prefix, each_abbrev_fn, void *);
974 * null-terminated string.
975 */
976 extern int get_sha1_hex(const char *hex, unsigned char *sha1);
977 +extern int get_oid_hex(const char *hex, struct object_id *sha1);
978
979 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 */
981 extern int read_ref_full(const char *refname, int resolve_flags,
982 unsigned char *sha1, int *flags);
983 extern int read_ref(const char *refname, unsigned char *sha1);
hex.c
+13 -3
@@ -38,7 +38,7 @@ const signed char hexval_table[256] = {
38 int get_sha1_hex(const char *hex, unsigned char *sha1)
39 {
40 int i;
41 - for (i = 0; i < 20; i++) {
41 + for (i = 0; i < GIT_SHA1_RAWSZ; i++) {
42 unsigned int val;
43 /*
44 * hex[1]=='\0' is caught when val is checked below,
@@ -56,15 +56,20 @@ int get_sha1_hex(const char *hex, unsigned char *sha1)
56 return 0;
57 }
58
59 +int get_oid_hex(const char *hex, struct object_id *oid)
60 +{
61 + return get_sha1_hex(hex, oid->hash);
62 +}
63 +
64 char *sha1_to_hex(const unsigned char *sha1)
65 {
66 static int bufno;
62 - static char hexbuffer[4][41];
67 + static char hexbuffer[4][GIT_SHA1_HEXSZ + 1];
68 static const char hex[] = "0123456789abcdef";
69 char *buffer = hexbuffer[3 & ++bufno], *buf = buffer;
70 int i;
71
67 - for (i = 0; i < 20; i++) {
72 + for (i = 0; i < GIT_SHA1_RAWSZ; i++) {
73 unsigned int val = *sha1++;
74 *buf++ = hex[val >> 4];
75 *buf++ = hex[val & 0xf];
@@ -73,3 +78,8 @@ char *sha1_to_hex(const unsigned char *sha1)
78
79 return buffer;
80 }
81 +
82 +char *oid_to_hex(const struct object_id *oid)
83 +{
84 + return sha1_to_hex(oid->hash);
85 +}