Commit 91b69454 authored by Masahiro Yamada's avatar Masahiro Yamada
Browse files

kconfig: use generic macros to implement symbol hashtable



Use helper macros in hashtable.h for generic hashtable implementation.

We can git rid of the hash head index of for_all_symbols().

Signed-off-by: default avatarMasahiro Yamada <masahiroy@kernel.org>
parent cc25cfc5
Loading
Loading
Loading
Loading
+6 −6
Original line number Diff line number Diff line
@@ -14,6 +14,7 @@
#include <sys/time.h>
#include <errno.h>

#include "internal.h"
#include "lkc.h"

static void conf(struct menu *menu);
@@ -171,7 +172,7 @@ enum conf_def_mode {
static bool conf_set_all_new_symbols(enum conf_def_mode mode)
{
	struct symbol *sym, *csym;
	int i, cnt;
	int cnt;
	/*
	 * can't go as the default in switch-case below, otherwise gcc whines
	 * about -Wmaybe-uninitialized
@@ -226,7 +227,7 @@ static bool conf_set_all_new_symbols(enum conf_def_mode mode)
		}
	}

	for_all_symbols(i, sym) {
	for_all_symbols(sym) {
		if (sym_has_value(sym) || sym->flags & SYMBOL_VALID)
			continue;
		switch (sym_get_type(sym)) {
@@ -278,14 +279,14 @@ static bool conf_set_all_new_symbols(enum conf_def_mode mode)
	 * and the rest to no.
	 */
	if (mode != def_random) {
		for_all_symbols(i, csym) {
		for_all_symbols(csym) {
			if ((sym_is_choice(csym) && !sym_has_value(csym)) ||
			    sym_is_choice_value(csym))
				csym->flags |= SYMBOL_NEED_SET_CHOICE_VALUES;
		}
	}

	for_all_symbols(i, csym) {
	for_all_symbols(csym) {
		if (sym_has_value(csym) || !sym_is_choice(csym))
			continue;

@@ -304,9 +305,8 @@ static bool conf_set_all_new_symbols(enum conf_def_mode mode)
static void conf_rewrite_tristates(tristate old_val, tristate new_val)
{
	struct symbol *sym;
	int i;

	for_all_symbols(i, sym) {
	for_all_symbols(sym) {
		if (sym_get_type(sym) == S_TRISTATE &&
		    sym->def[S_DEF_USER].tri == old_val)
			sym->def[S_DEF_USER].tri = new_val;
+12 −13
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@
#include <time.h>
#include <unistd.h>

#include "internal.h"
#include "lkc.h"

struct gstr autoconf_cmd;
@@ -322,7 +323,7 @@ int conf_read_simple(const char *name, int def)
	size_t  line_asize = 0;
	char *p, *val;
	struct symbol *sym;
	int i, def_flags;
	int def_flags;
	const char *warn_unknown, *sym_name;

	warn_unknown = getenv("KCONFIG_WARN_UNKNOWN_SYMBOLS");
@@ -380,7 +381,7 @@ int conf_read_simple(const char *name, int def)
	conf_warnings = 0;

	def_flags = SYMBOL_DEF << def;
	for_all_symbols(i, sym) {
	for_all_symbols(sym) {
		sym->flags |= SYMBOL_CHANGED;
		sym->flags &= ~(def_flags|SYMBOL_VALID);
		if (sym_is_choice(sym))
@@ -489,7 +490,6 @@ int conf_read(const char *name)
{
	struct symbol *sym;
	int conf_unsaved = 0;
	int i;

	conf_set_changed(false);

@@ -500,7 +500,7 @@ int conf_read(const char *name)

	sym_calc_value(modules_sym);

	for_all_symbols(i, sym) {
	for_all_symbols(sym) {
		sym_calc_value(sym);
		if (sym_is_choice(sym) || (sym->flags & SYMBOL_NO_WRITE))
			continue;
@@ -524,7 +524,7 @@ int conf_read(const char *name)
		/* maybe print value in verbose mode... */
	}

	for_all_symbols(i, sym) {
	for_all_symbols(sym) {
		if (sym_has_value(sym) && !sym_is_choice_value(sym)) {
			/* Reset values of generates values, so they'll appear
			 * as new, if they should become visible, but that
@@ -862,7 +862,6 @@ int conf_write(const char *name)
	const char *str;
	char tmpname[PATH_MAX + 1], oldname[PATH_MAX + 1];
	char *env;
	int i;
	bool need_newline = false;

	if (!name)
@@ -946,7 +945,7 @@ int conf_write(const char *name)
	}
	fclose(out);

	for_all_symbols(i, sym)
	for_all_symbols(sym)
		sym->flags &= ~SYMBOL_WRITTEN;

	if (*tmpname) {
@@ -1016,7 +1015,7 @@ static int conf_touch_deps(void)
{
	const char *name, *tmp;
	struct symbol *sym;
	int res, i;
	int res;

	name = conf_get_autoconfig_name();
	tmp = strrchr(name, '/');
@@ -1030,7 +1029,7 @@ static int conf_touch_deps(void)
	conf_read_simple(name, S_DEF_AUTO);
	sym_calc_value(modules_sym);

	for_all_symbols(i, sym) {
	for_all_symbols(sym) {
		sym_calc_value(sym);
		if ((sym->flags & SYMBOL_NO_WRITE) || !sym->name)
			continue;
@@ -1096,7 +1095,7 @@ static int __conf_write_autoconf(const char *filename,
	char tmp[PATH_MAX];
	FILE *file;
	struct symbol *sym;
	int ret, i;
	int ret;

	if (make_parent_dir(filename))
		return -1;
@@ -1113,7 +1112,7 @@ static int __conf_write_autoconf(const char *filename,

	conf_write_heading(file, comment_style);

	for_all_symbols(i, sym)
	for_all_symbols(sym)
		if ((sym->flags & SYMBOL_WRITE) && sym->name)
			print_symbol(file, sym);

@@ -1136,7 +1135,7 @@ int conf_write_autoconf(int overwrite)
{
	struct symbol *sym;
	const char *autoconf_name = conf_get_autoconfig_name();
	int ret, i;
	int ret;

	if (!overwrite && is_present(autoconf_name))
		return 0;
@@ -1148,7 +1147,7 @@ int conf_write_autoconf(int overwrite)
	if (conf_touch_deps())
		return 1;

	for_all_symbols(i, sym)
	for_all_symbols(sym)
		sym_calc_value(sym);

	ret = __conf_write_autoconf(conf_get_autoheader_name(),
+4 −5
Original line number Diff line number Diff line
@@ -17,6 +17,8 @@ extern "C" {
#include <stdbool.h>
#endif

#include "list_types.h"

typedef enum tristate {
	no, mod, yes
} tristate;
@@ -74,8 +76,8 @@ enum {
 * SYMBOL_CHOICE bit set in 'flags'.
 */
struct symbol {
	/* The next symbol in the same bucket in the symbol hash table */
	struct symbol *next;
	/* link node for the hash table */
	struct hlist_node node;

	/* The name of the symbol, e.g. "FOO" for 'config FOO' */
	char *name;
@@ -124,8 +126,6 @@ struct symbol {
	struct expr_value implied;
};

#define for_all_symbols(i, sym) for (i = 0; i < SYMBOL_HASHSIZE; i++) for (sym = symbol_hash[i]; sym; sym = sym->next)

#define SYMBOL_CONST      0x0001  /* symbol is const */
#define SYMBOL_CHECK      0x0008  /* used during dependency checking */
#define SYMBOL_CHOICE     0x0010  /* start of a choice block (null name) */
@@ -150,7 +150,6 @@ struct symbol {
#define SYMBOL_NEED_SET_CHOICE_VALUES  0x100000

#define SYMBOL_MAXLENGTH	256
#define SYMBOL_HASHSIZE		9973

/* A property represent the config options that can be associated
 * with a config "symbol".
+9 −0
Original line number Diff line number Diff line
@@ -2,6 +2,15 @@
#ifndef INTERNAL_H
#define INTERNAL_H

#include "hashtable.h"

#define SYMBOL_HASHSIZE		(1U << 14)

extern HASHTABLE_DECLARE(sym_hashtable, SYMBOL_HASHSIZE);

#define for_all_symbols(sym) \
	hash_for_each(sym_hashtable, sym, node)

struct menu;

extern struct menu *current_menu, *current_entry;
+0 −2
Original line number Diff line number Diff line
@@ -18,8 +18,6 @@ void conf_set_message_callback(void (*fn)(const char *s));
bool conf_errors(void);

/* symbol.c */
extern struct symbol * symbol_hash[SYMBOL_HASHSIZE];

struct symbol * sym_lookup(const char *name, int flags);
struct symbol * sym_find(const char *name);
void print_symbol_for_listconfig(struct symbol *sym);
Loading