Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 508382a0 authored by Yann E. MORIN's avatar Yann E. MORIN
Browse files

kconfig: simplify symbol-search code



There is no need for a double indirection in the temporary array that
stores the internediate search results.

Reported-by: default avatarJean Delvare <jdelvare@suse.de>
Signed-off-by: default avatar"Yann E. MORIN" <yann.morin.1998@free.fr>
Reviewed-by: default avatarJean Delvare <jdelvare@suse.de>
parent 1407f97a
Loading
Loading
Loading
Loading
+11 −19
Original line number Diff line number Diff line
@@ -965,8 +965,8 @@ struct sym_match {
 */
static int sym_rel_comp(const void *sym1, const void *sym2)
{
	struct sym_match *s1 = *(struct sym_match **)sym1;
	struct sym_match *s2 = *(struct sym_match **)sym2;
	const struct sym_match *s1 = sym1;
	const struct sym_match *s2 = sym2;
	int exact1, exact2;

	/* Exact match:
@@ -992,7 +992,7 @@ static int sym_rel_comp(const void *sym1, const void *sym2)
struct symbol **sym_re_search(const char *pattern)
{
	struct symbol *sym, **sym_arr = NULL;
	struct sym_match **sym_match_arr = NULL;
	struct sym_match *sym_match_arr = NULL;
	int i, cnt, size;
	regex_t re;
	regmatch_t match[1];
@@ -1005,7 +1005,6 @@ struct symbol **sym_re_search(const char *pattern)
		return NULL;

	for_all_symbols(i, sym) {
		struct sym_match *tmp_sym_match;
		if (sym->flags & SYMBOL_CONST || !sym->name)
			continue;
		if (regexec(&re, sym->name, 1, match, 0))
@@ -1013,38 +1012,31 @@ struct symbol **sym_re_search(const char *pattern)
		if (cnt >= size) {
			void *tmp;
			size += 16;
			tmp = realloc(sym_match_arr, size * sizeof(struct sym_match *));
			tmp = realloc(sym_match_arr, size * sizeof(struct sym_match));
			if (!tmp)
				goto sym_re_search_free;
			sym_match_arr = tmp;
		}
		sym_calc_value(sym);
		tmp_sym_match = (struct sym_match*)malloc(sizeof(struct sym_match));
		if (!tmp_sym_match)
			goto sym_re_search_free;
		tmp_sym_match->sym = sym;
		/* As regexec returned 0, we know we have a match, so
		 * we can use match[0].rm_[se]o without further checks
		 */
		tmp_sym_match->so = match[0].rm_so;
		tmp_sym_match->eo = match[0].rm_eo;
		sym_match_arr[cnt++] = tmp_sym_match;
		sym_match_arr[cnt].so = match[0].rm_so;
		sym_match_arr[cnt].eo = match[0].rm_eo;
		sym_match_arr[cnt++].sym = sym;
	}
	if (sym_match_arr) {
		qsort(sym_match_arr, cnt, sizeof(struct sym_match*), sym_rel_comp);
		qsort(sym_match_arr, cnt, sizeof(struct sym_match), sym_rel_comp);
		sym_arr = malloc((cnt+1) * sizeof(struct symbol));
		if (!sym_arr)
			goto sym_re_search_free;
		for (i = 0; i < cnt; i++)
			sym_arr[i] = sym_match_arr[i]->sym;
			sym_arr[i] = sym_match_arr[i].sym;
		sym_arr[cnt] = NULL;
	}
sym_re_search_free:
	if (sym_match_arr) {
		for (i = 0; i < cnt; i++)
			free(sym_match_arr[i]);
	/* sym_match_arr can be NULL if no match, but free(NULL) is OK */
	free(sym_match_arr);
	}
	regfree(&re);

	return sym_arr;