scripts/kconfig/symbol.c
Source file repositories/reference/linux-study-clean/scripts/kconfig/symbol.c
File Facts
- System
- Linux kernel
- Corpus path
scripts/kconfig/symbol.c- Extension
.c- Size
- 29701 bytes
- Lines
- 1367
- Domain
- Support Tooling And Documentation
- Bucket
- scripts
- Inferred role
- Support Tooling And Documentation: implementation source
- Status
- source implementation candidate
Why This File Exists
Repository support layer: documentation, build tooling, samples, user-space helper tools, generated initramfs support, licenses, and validation utilities.
- Repository support layer: documentation, build tooling, samples, user-space helper tools, generated initramfs support, licenses, and validation utilities.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
sys/types.hctype.hstdlib.hstring.hregex.hhash.hxalloc.hinternal.hlkc.h
Detected Declarations
struct sym_matchfunction sym_get_typefunction for_all_defaultsfunction for_all_propertiesfunction sym_get_range_valfunction sym_validate_rangefunction sym_set_changedfunction sym_set_all_changedfunction sym_calc_visibilityfunction menu_for_each_sub_entryfunction list_for_each_entry_reversefunction menu_for_each_sub_entryfunction sym_warn_unmet_depfunction sym_dep_errorsfunction sym_calc_valuefunction sym_clear_all_validfunction sym_tristate_within_rangefunction sym_set_tristate_valuefunction choice_set_valuefunction menu_for_each_sub_entryfunction sym_toggle_tristate_valuefunction sym_string_validfunction sym_string_within_rangefunction sym_set_string_valuefunction sym_is_changeablefunction sym_is_choice_valuefunction hash_for_each_possiblefunction hash_for_each_possiblefunction sym_rel_compfunction for_all_symbolsfunction dep_stack_insertfunction dep_stack_removefunction sym_check_print_recursivefunction menu_for_each_sub_entryfunction menu_for_each_sub_entry
Annotated Snippet
struct sym_match {
struct symbol *sym;
off_t so, eo;
};
/* Compare matched symbols as thus:
* - first, symbols that match exactly
* - then, alphabetical sort
*/
static int sym_rel_comp(const void *sym1, const void *sym2)
{
const struct sym_match *s1 = sym1;
const struct sym_match *s2 = sym2;
int exact1, exact2;
/* Exact match:
* - if matched length on symbol s1 is the length of that symbol,
* then this symbol should come first;
* - if matched length on symbol s2 is the length of that symbol,
* then this symbol should come first.
* Note: since the search can be a regexp, both symbols may match
* exactly; if this is the case, we can't decide which comes first,
* and we fallback to sorting alphabetically.
*/
exact1 = (s1->eo - s1->so) == strlen(s1->sym->name);
exact2 = (s2->eo - s2->so) == strlen(s2->sym->name);
if (exact1 && !exact2)
return -1;
if (!exact1 && exact2)
return 1;
/* As a fallback, sort symbols alphabetically */
return strcmp(s1->sym->name, s2->sym->name);
}
struct symbol **sym_re_search(const char *pattern)
{
struct symbol *sym, **sym_arr = NULL;
struct sym_match *sym_match_arr = NULL;
int i, cnt, size;
regex_t re;
regmatch_t match[1];
cnt = size = 0;
/* Skip if empty */
if (strlen(pattern) == 0)
return NULL;
if (regcomp(&re, pattern, REG_EXTENDED|REG_ICASE))
return NULL;
for_all_symbols(sym) {
if (sym->flags & SYMBOL_CONST || !sym->name)
continue;
if (regexec(&re, sym->name, 1, match, 0))
continue;
if (cnt >= size) {
void *tmp;
size += 16;
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);
/* As regexec returned 0, we know we have a match, so
* we can use match[0].rm_[se]o without further checks
*/
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);
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[cnt] = NULL;
}
sym_re_search_free:
/* sym_match_arr can be NULL if no match, but free(NULL) is OK */
free(sym_match_arr);
regfree(&re);
return sym_arr;
}
/*
* When we check for recursive dependencies we use a stack to save
Annotation
- Immediate include surface: `sys/types.h`, `ctype.h`, `stdlib.h`, `string.h`, `regex.h`, `hash.h`, `xalloc.h`, `internal.h`.
- Detected declarations: `struct sym_match`, `function sym_get_type`, `function for_all_defaults`, `function for_all_properties`, `function sym_get_range_val`, `function sym_validate_range`, `function sym_set_changed`, `function sym_set_all_changed`, `function sym_calc_visibility`, `function menu_for_each_sub_entry`.
- Atlas domain: Support Tooling And Documentation / scripts.
- Implementation status: source implementation candidate.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.