On Mon, Oct 15, 2018 at 02:18:49AM +0000, brian m. carlson wrote: > There are several ways we might refer to a hash algorithm: by name, such > as in the config file; by format ID, such as in a pack; or internally, > by a pointer to the hash_algos array. Provide functions to look up hash > algorithms based on these various forms and return the internal constant > used for them. If conversion to another form is necessary, this > internal constant can be used to look up the proper data in the > hash_algos array. > > Signed-off-by: brian m. carlson <sandals@xxxxxxxxxxxxxxxxxxxx> > --- > hash.h | 13 +++++++++++++ > sha1-file.c | 21 +++++++++++++++++++++ > 2 files changed, 34 insertions(+) > > diff --git a/hash.h b/hash.h > index 7c8238bc2e..90f4344619 100644 > --- a/hash.h > +++ b/hash.h > @@ -98,4 +98,17 @@ struct git_hash_algo { > }; > extern const struct git_hash_algo hash_algos[GIT_HASH_NALGOS]; > > +/* > + * Return a GIT_HASH_* constant based on the name. Returns GIT_HASH_UNKNOWN if > + * the name doesn't match a known algorithm. > + */ > +int hash_algo_by_name(const char *name); > +/* Identical, except based on the format ID. */ > +int hash_algo_by_id(uint32_t format_id); > +/* Identical, except for a pointer to struct git_hash_algo. */ > +inline int hash_algo_by_ptr(const struct git_hash_algo *p) This has to be declared as static, otherwise the linker will error out when building without optimization: LINK git libgit.a(commit-graph.o): In function `oid_version': /home/szeder/src/git/commit-graph.c:48: undefined reference to `hash_algo_by_ptr' libgit.a(hex.o): In function `hash_to_hex': /home/szeder/src/git/hex.c:123: undefined reference to `hash_algo_by_ptr' libgit.a(hex.o): In function `oid_to_hex': /home/szeder/src/git/hex.c:128: undefined reference to `hash_algo_by_ptr' collect2: error: ld returned 1 exit status Makefile:2055: recipe for target 'git' failed make: *** [git] Error 1 > +{ > + return p - hash_algos; > +} > + > #endif > diff --git a/sha1-file.c b/sha1-file.c > index e29825f259..3a75d515eb 100644 > --- a/sha1-file.c > +++ b/sha1-file.c > @@ -122,6 +122,27 @@ const char *empty_blob_oid_hex(void) > return oid_to_hex_r(buf, the_hash_algo->empty_blob); > } > > +int hash_algo_by_name(const char *name) > +{ > + int i; > + if (!name) > + return GIT_HASH_UNKNOWN; > + for (i = 1; i < GIT_HASH_NALGOS; i++) > + if (!strcmp(name, hash_algos[i].name)) > + return i; > + return GIT_HASH_UNKNOWN; > +} > + > +int hash_algo_by_id(uint32_t format_id) > +{ > + int i; > + for (i = 1; i < GIT_HASH_NALGOS; i++) > + if (format_id == hash_algos[i].format_id) > + return i; > + return GIT_HASH_UNKNOWN; > +} > + > + > /* > * This is meant to hold a *small* number of objects that you would > * want read_sha1_file() to be able to return, but yet you do not want