Commit 871d6573 authored by Masahiro Yamada's avatar Masahiro Yamada
Browse files

fixdep: refactor hash table lookup



Change the hash table code so it will be easier to add the second table.

Signed-off-by: default avatarMasahiro Yamada <masahiroy@kernel.org>
Reviewed-by: default avatarMiguel Ojeda <ojeda@kernel.org>
Tested-by: default avatarMiguel Ojeda <ojeda@kernel.org>
parent 2185242f
Loading
Loading
Loading
Loading
+25 −22
Original line number Diff line number Diff line
@@ -113,7 +113,7 @@ struct item {
};

#define HASHSZ 256
static struct item *hashtab[HASHSZ];
static struct item *config_hashtab[HASHSZ];

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;
}

/*
 * 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.
 */
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);

@@ -158,17 +144,34 @@ static void define_config(const char *name, int len, unsigned int hash)
	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.
 */
static void use_config(const char *m, int slen)
{
	unsigned int hash = strhash(m, slen);

	if (is_defined_config(m, slen, hash))
	if (in_hashtable(m, slen, config_hashtab))
		return;

	define_config(m, slen, hash);
	/* Print out a dependency path from a symbol name. */
	printf("    $(wildcard include/config/%.*s) \\\n", slen, m);
}