blob: 615ae0691d070b4bdc110fecad3a0c484d2b234c [file] [log] [blame]
brian m. carlsonf18f8162017-03-11 22:28:18 +00001#ifndef HASH_H
2#define HASH_H
3
Elijah Newrend1cbe1e2023-04-22 20:17:20 +00004#include "hash-ll.h"
Jeff King3fa6f2a2020-12-04 13:51:39 -05005#include "repository.h"
brian m. carlsonf50e7662017-11-12 21:28:52 +00006
Jeff Kingc0566d72019-06-20 03:41:45 -04007#define the_hash_algo the_repository->hash_algo
8
brian m. carlson5a6dce72021-04-26 01:02:55 +00009static inline int hashcmp(const unsigned char *sha1, const unsigned char *sha2)
Jeff King3fa6f2a2020-12-04 13:51:39 -050010{
brian m. carlson5a6dce72021-04-26 01:02:55 +000011 return hashcmp_algop(sha1, sha2, the_hash_algo);
Jeff King3fa6f2a2020-12-04 13:51:39 -050012}
13
brian m. carlson5a6dce72021-04-26 01:02:55 +000014static inline int oidcmp(const struct object_id *oid1, const struct object_id *oid2)
15{
16 const struct git_hash_algo *algop;
17 if (!oid1->algo)
18 algop = the_hash_algo;
19 else
20 algop = &hash_algos[oid1->algo];
21 return hashcmp_algop(oid1->hash, oid2->hash, algop);
22}
23
brian m. carlson5a6dce72021-04-26 01:02:55 +000024static inline int hasheq(const unsigned char *sha1, const unsigned char *sha2)
25{
26 return hasheq_algop(sha1, sha2, the_hash_algo);
27}
28
Jeff King3fa6f2a2020-12-04 13:51:39 -050029static inline int oideq(const struct object_id *oid1, const struct object_id *oid2)
30{
brian m. carlson5a6dce72021-04-26 01:02:55 +000031 const struct git_hash_algo *algop;
32 if (!oid1->algo)
33 algop = the_hash_algo;
34 else
35 algop = &hash_algos[oid1->algo];
36 return hasheq_algop(oid1->hash, oid2->hash, algop);
Jeff King3fa6f2a2020-12-04 13:51:39 -050037}
38
39static inline int is_null_oid(const struct object_id *oid)
40{
brian m. carlson14228442021-04-26 01:02:56 +000041 return oideq(oid, null_oid());
Jeff King3fa6f2a2020-12-04 13:51:39 -050042}
43
44static inline void hashcpy(unsigned char *sha_dst, const unsigned char *sha_src)
45{
46 memcpy(sha_dst, sha_src, the_hash_algo->rawsz);
47}
48
Matheus Tavares3d20ed22021-05-17 16:49:03 -030049/* Like oidcpy() but zero-pads the unused bytes in dst's hash array. */
50static inline void oidcpy_with_padding(struct object_id *dst,
Eric Wong90e07f02021-07-07 23:10:18 +000051 const struct object_id *src)
Matheus Tavares3d20ed22021-05-17 16:49:03 -030052{
53 size_t hashsz;
54
55 if (!src->algo)
56 hashsz = the_hash_algo->rawsz;
57 else
58 hashsz = hash_algos[src->algo].rawsz;
59
60 memcpy(dst->hash, src->hash, hashsz);
61 memset(dst->hash + hashsz, 0, GIT_MAX_RAWSZ - hashsz);
62 dst->algo = src->algo;
63}
64
Jeff King3fa6f2a2020-12-04 13:51:39 -050065static inline void hashclr(unsigned char *hash)
66{
67 memset(hash, 0, the_hash_algo->rawsz);
68}
69
70static inline void oidclr(struct object_id *oid)
71{
72 memset(oid->hash, 0, GIT_MAX_RAWSZ);
brian m. carlson5a6dce72021-04-26 01:02:55 +000073 oid->algo = hash_algo_by_ptr(the_hash_algo);
Jeff King3fa6f2a2020-12-04 13:51:39 -050074}
75
76static inline void oidread(struct object_id *oid, const unsigned char *hash)
77{
78 memcpy(oid->hash, hash, the_hash_algo->rawsz);
brian m. carlson5a6dce72021-04-26 01:02:55 +000079 oid->algo = hash_algo_by_ptr(the_hash_algo);
Jeff King3fa6f2a2020-12-04 13:51:39 -050080}
81
82static inline int is_empty_blob_sha1(const unsigned char *sha1)
83{
84 return hasheq(sha1, the_hash_algo->empty_blob->hash);
85}
86
87static inline int is_empty_blob_oid(const struct object_id *oid)
88{
89 return oideq(oid, the_hash_algo->empty_blob);
90}
91
92static inline int is_empty_tree_sha1(const unsigned char *sha1)
93{
94 return hasheq(sha1, the_hash_algo->empty_tree->hash);
95}
96
97static inline int is_empty_tree_oid(const struct object_id *oid)
98{
99 return oideq(oid, the_hash_algo->empty_tree);
100}
101
brian m. carlsonf18f8162017-03-11 22:28:18 +0000102#endif