[PATCH v2 02/10] 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 sand...@crustytoothpaste.net --- cache.h | 32 hex.c | 16 +--- 2 files changed, 41 insertions(+), 7 deletions(-) diff --git a/cache.h b/cache.h index 6582c35..95206a3 100644 --- a/cache.h +++ b/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); diff --git a/hex.c b/hex.c index cfd9d72..899b74a 100644 --- a/hex.c +++ b/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); +} -- 2.2.1.209.g41e5f3a -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH v2 02/10] Define utility functions for object IDs.
On 03/08/2015 12:23 AM, brian m. carlson wrote: 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 sand...@crustytoothpaste.net --- I'm not very excited about having to put the #include in the middle of cache.h. The alternative, of course, is to move enum object_type up, which I can do if necessary. Another alternative is to simply move the struct object_id definitions to cache.h instead of object.h, which might be cleaner. I'm interested in hearing opinions about the best way to go forward. cache.h | 37 + hex.c | 16 +--- 2 files changed, 46 insertions(+), 7 deletions(-) diff --git a/cache.h b/cache.h index 761c570..f9addcc 100644 --- a/cache.h +++ b/cache.h [...] @@ -724,20 +729,42 @@ static inline int hashcmp(const unsigned char *sha1, const unsigned char *sha2) return 0; } +static inline int oidcmp(const struct object_id *o1, const struct object_id *o2) +{ + return hashcmp(o1-sha1, o2-sha1); +} + Maybe rename o1 - oid1 and o2 - oid2 just to make things blindingly obvious? [...] Michael -- Michael Haggerty mhag...@alum.mit.edu -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH v2 02/10] Define utility functions for object IDs.
On Sun, Mar 8, 2015 at 6:23 AM, brian m. carlson sand...@crustytoothpaste.net wrote: 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 sand...@crustytoothpaste.net --- I'm not very excited about having to put the #include in the middle of cache.h. The alternative, of course, is to move enum object_type up, which I can do if necessary. Another alternative is to simply move the struct object_id definitions to cache.h instead of object.h, which might be cleaner. I'm interested in hearing opinions about the best way to go forward. I think declaring struct object_id in cache.h would be simplest. Another alternative is do it in git-compat-util.h. This is not the first abuse of git-compat-util.h (because it's included everywhere). starts_with(), ends_with() and friends are already in git-compat-util.h -- Duy -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH v2 02/10] Define utility functions for object IDs.
On Sun, Mar 08, 2015 at 04:57:36PM +0700, Duy Nguyen wrote: On Sun, Mar 8, 2015 at 6:23 AM, brian m. carlson sand...@crustytoothpaste.net wrote: I'm not very excited about having to put the #include in the middle of cache.h. The alternative, of course, is to move enum object_type up, which I can do if necessary. Another alternative is to simply move the struct object_id definitions to cache.h instead of object.h, which might be cleaner. I'm interested in hearing opinions about the best way to go forward. I think declaring struct object_id in cache.h would be simplest. Another alternative is do it in git-compat-util.h. This is not the first abuse of git-compat-util.h (because it's included everywhere). starts_with(), ends_with() and friends are already in git-compat-util.h cache.h is so ubiquitous due to the hash* functions that I didn't need to include it anywhere, so I don't see a reason to abuse git-compat-util.h for that purpose. -- brian m. carlson / brian with sandals: Houston, Texas, US +1 832 623 2791 | http://www.crustytoothpaste.net/~bmc | My opinion only OpenPGP: RSA v4 4096b: 88AC E9B2 9196 305B A994 7552 F1BA 225C 0223 B187 signature.asc Description: Digital signature
[PATCH v2 02/10] 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 sand...@crustytoothpaste.net --- I'm not very excited about having to put the #include in the middle of cache.h. The alternative, of course, is to move enum object_type up, which I can do if necessary. Another alternative is to simply move the struct object_id definitions to cache.h instead of object.h, which might be cleaner. I'm interested in hearing opinions about the best way to go forward. cache.h | 37 + hex.c | 16 +--- 2 files changed, 46 insertions(+), 7 deletions(-) diff --git a/cache.h b/cache.h index 761c570..f9addcc 100644 --- a/cache.h +++ b/cache.h @@ -368,6 +368,11 @@ static inline enum object_type object_type(unsigned int mode) OBJ_BLOB; } +/* This must go before the oid* functions, but after the declaration of enum + * object_type. + */ +#include object.h + /* Double-check local_repo_env below if you add to this list. */ #define GIT_DIR_ENVIRONMENT GIT_DIR #define GIT_NAMESPACE_ENVIRONMENT GIT_NAMESPACE @@ -710,13 +715,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; } @@ -724,20 +729,42 @@ static inline int hashcmp(const unsigned char *sha1, const unsigned char *sha2) return 0; } +static inline int oidcmp(const struct object_id *o1, const struct object_id *o2) +{ + return hashcmp(o1-sha1, o2-sha1); +} + 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-sha1, 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-sha1, src-sha1); +} + 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-sha1); +} + + #define EMPTY_TREE_SHA1_HEX \ 4b825dc642cb6eb9a060e54bf8d69288fbee4904 #define EMPTY_TREE_SHA1_BIN_LITERAL \ @@ -944,8 +971,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); diff --git a/hex.c b/hex.c index cfd9d72..7e25a88 100644 --- a/hex.c +++ b/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-sha1); +} + 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; -