]> git.ipfire.org Git - thirdparty/git.git/blobdiff - hex.c
The sixth batch
[thirdparty/git.git] / hex.c
diff --git a/hex.c b/hex.c
index fd7f00c43f969a30a76fe8ac8bf2255ac0320676..da51e64929a4f4973406d001a66e5ec72e76e628 100644 (file)
--- a/hex.c
+++ b/hex.c
@@ -47,32 +47,73 @@ 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;
+}
+
+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)
 {