diff options
Diffstat (limited to 'hex.c')
-rw-r--r-- | hex.c | 75 |
1 files changed, 61 insertions, 14 deletions
@@ -47,40 +47,82 @@ int hex_to_bytes(unsigned char *binary, const char *hex, size_t len) return 0; } -int get_sha1_hex(const char *hex, unsigned char *sha1) +static int get_hash_hex_algop(const char *hex, unsigned char *hash, + const struct git_hash_algo *algop) { int i; - for (i = 0; i < the_hash_algo->rawsz; i++) { + for (i = 0; i < algop->rawsz; i++) { int val = hex2chr(hex); if (val < 0) return -1; - *sha1++ = val; + *hash++ = val; hex += 2; } return 0; } +int get_sha1_hex(const char *hex, unsigned char *sha1) +{ + return get_hash_hex_algop(hex, sha1, the_hash_algo); +} + +int get_oid_hex_algop(const char *hex, struct object_id *oid, + const struct git_hash_algo *algop) +{ + return get_hash_hex_algop(hex, oid->hash, algop); +} + +/* + * NOTE: This function relies on hash algorithms being in order from shortest + * length to longest length. + */ +int get_oid_hex_any(const char *hex, struct object_id *oid) +{ + int i; + for (i = GIT_HASH_NALGOS - 1; i > 0; i--) { + if (!get_hash_hex_algop(hex, oid->hash, &hash_algos[i])) + return i; + } + return GIT_HASH_UNKNOWN; +} + int get_oid_hex(const char *hex, struct object_id *oid) { - return get_sha1_hex(hex, oid->hash); + return get_oid_hex_algop(hex, oid, the_hash_algo); } -int parse_oid_hex(const char *hex, struct object_id *oid, const char **end) +int parse_oid_hex_algop(const char *hex, struct object_id *oid, + const char **end, + const struct git_hash_algo *algop) { - int ret = get_oid_hex(hex, oid); + int ret = get_hash_hex_algop(hex, oid->hash, algop); if (!ret) - *end = hex + the_hash_algo->hexsz; + *end = hex + algop->hexsz; + return ret; +} + +int parse_oid_hex_any(const char *hex, struct object_id *oid, const char **end) +{ + int ret = get_oid_hex_any(hex, oid); + if (ret) + *end = hex + hash_algos[ret].hexsz; return ret; } -char *sha1_to_hex_r(char *buffer, const unsigned char *sha1) +int parse_oid_hex(const char *hex, struct object_id *oid, const char **end) +{ + return parse_oid_hex_algop(hex, oid, end, the_hash_algo); +} + +char *hash_to_hex_algop_r(char *buffer, const unsigned char *hash, + const struct git_hash_algo *algop) { static const char hex[] = "0123456789abcdef"; char *buf = buffer; int i; - for (i = 0; i < the_hash_algo->rawsz; i++) { - unsigned int val = *sha1++; + for (i = 0; i < algop->rawsz; i++) { + unsigned int val = *hash++; *buf++ = hex[val >> 4]; *buf++ = hex[val & 0xf]; } @@ -91,18 +133,23 @@ char *sha1_to_hex_r(char *buffer, const unsigned char *sha1) char *oid_to_hex_r(char *buffer, const struct object_id *oid) { - return sha1_to_hex_r(buffer, oid->hash); + return hash_to_hex_algop_r(buffer, oid->hash, the_hash_algo); } -char *sha1_to_hex(const unsigned char *sha1) +char *hash_to_hex_algop(const unsigned char *hash, const struct git_hash_algo *algop) { static int bufno; static char hexbuffer[4][GIT_MAX_HEXSZ + 1]; bufno = (bufno + 1) % ARRAY_SIZE(hexbuffer); - return sha1_to_hex_r(hexbuffer[bufno], sha1); + return hash_to_hex_algop_r(hexbuffer[bufno], hash, algop); +} + +char *hash_to_hex(const unsigned char *hash) +{ + return hash_to_hex_algop(hash, the_hash_algo); } char *oid_to_hex(const struct object_id *oid) { - return sha1_to_hex(oid->hash); + return hash_to_hex_algop(oid->hash, the_hash_algo); } |