mirror of
https://github.com/tbsdtv/linux_media.git
synced 2025-07-23 20:51:03 +02:00
fixdep: refactor hash table lookup
Change the hash table code so it will be easier to add the second table. Signed-off-by: Masahiro Yamada <masahiroy@kernel.org> Reviewed-by: Miguel Ojeda <ojeda@kernel.org> Tested-by: Miguel Ojeda <ojeda@kernel.org>
This commit is contained in:
@@ -113,7 +113,7 @@ struct item {
|
|||||||
};
|
};
|
||||||
|
|
||||||
#define HASHSZ 256
|
#define HASHSZ 256
|
||||||
static struct item *hashtab[HASHSZ];
|
static struct item *config_hashtab[HASHSZ];
|
||||||
|
|
||||||
static unsigned int strhash(const char *str, unsigned int sz)
|
static unsigned int strhash(const char *str, unsigned int sz)
|
||||||
{
|
{
|
||||||
@@ -125,25 +125,11 @@ static unsigned int strhash(const char *str, unsigned int sz)
|
|||||||
return hash;
|
return hash;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Lookup a value in the configuration string.
|
|
||||||
*/
|
|
||||||
static int is_defined_config(const char *name, int len, unsigned int hash)
|
|
||||||
{
|
|
||||||
struct item *aux;
|
|
||||||
|
|
||||||
for (aux = hashtab[hash % HASHSZ]; aux; aux = aux->next) {
|
|
||||||
if (aux->hash == hash && aux->len == len &&
|
|
||||||
memcmp(aux->name, name, len) == 0)
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Add a new value to the configuration string.
|
* Add a new value to the configuration string.
|
||||||
*/
|
*/
|
||||||
static void define_config(const char *name, int len, unsigned int hash)
|
static void add_to_hashtable(const char *name, int len, unsigned int hash,
|
||||||
|
struct item *hashtab[])
|
||||||
{
|
{
|
||||||
struct item *aux = malloc(sizeof(*aux) + len);
|
struct item *aux = malloc(sizeof(*aux) + len);
|
||||||
|
|
||||||
@@ -158,17 +144,34 @@ static void define_config(const char *name, int len, unsigned int hash)
|
|||||||
hashtab[hash % HASHSZ] = aux;
|
hashtab[hash % HASHSZ] = aux;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Lookup a string in the hash table. If found, just return true.
|
||||||
|
* If not, add it to the hashtable and return false.
|
||||||
|
*/
|
||||||
|
static bool in_hashtable(const char *name, int len, struct item *hashtab[])
|
||||||
|
{
|
||||||
|
struct item *aux;
|
||||||
|
unsigned int hash = strhash(name, len);
|
||||||
|
|
||||||
|
for (aux = hashtab[hash % HASHSZ]; aux; aux = aux->next) {
|
||||||
|
if (aux->hash == hash && aux->len == len &&
|
||||||
|
memcmp(aux->name, name, len) == 0)
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
add_to_hashtable(name, len, hash, hashtab);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Record the use of a CONFIG_* word.
|
* Record the use of a CONFIG_* word.
|
||||||
*/
|
*/
|
||||||
static void use_config(const char *m, int slen)
|
static void use_config(const char *m, int slen)
|
||||||
{
|
{
|
||||||
unsigned int hash = strhash(m, slen);
|
if (in_hashtable(m, slen, config_hashtab))
|
||||||
|
return;
|
||||||
|
|
||||||
if (is_defined_config(m, slen, hash))
|
|
||||||
return;
|
|
||||||
|
|
||||||
define_config(m, slen, hash);
|
|
||||||
/* Print out a dependency path from a symbol name. */
|
/* Print out a dependency path from a symbol name. */
|
||||||
printf(" $(wildcard include/config/%.*s) \\\n", slen, m);
|
printf(" $(wildcard include/config/%.*s) \\\n", slen, m);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user