scripts/kconfig/util.c
Source file repositories/reference/linux-study-clean/scripts/kconfig/util.c
File Facts
- System
- Linux kernel
- Corpus path
scripts/kconfig/util.c- Extension
.c- Size
- 2552 bytes
- Lines
- 122
- 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
stdarg.hstdlib.hstring.hhash.hhashtable.hxalloc.hlkc.h
Detected Declarations
struct filefunction die_duplicated_includefunction hash_for_each_possiblefunction str_newfunction str_freefunction str_appendfunction str_printf
Annotated Snippet
struct file {
struct hlist_node node;
struct {
const char *name;
int lineno;
} parent;
char name[];
};
static void die_duplicated_include(struct file *file,
const char *parent, int lineno)
{
fprintf(stderr,
"%s:%d: error: repeated inclusion of %s\n"
"%s:%d: note: location of first inclusion of %s\n",
parent, lineno, file->name,
file->parent.name, file->parent.lineno, file->name);
exit(1);
}
/* file already present in list? If not add it */
const char *file_lookup(const char *name,
const char *parent_name, int parent_lineno)
{
const char *parent = NULL;
struct file *file;
size_t len;
int hash = hash_str(name);
if (parent_name)
parent = file_lookup(parent_name, NULL, 0);
hash_for_each_possible(file_hashtable, file, node, hash)
if (!strcmp(name, file->name)) {
if (!parent_name)
return file->name;
die_duplicated_include(file, parent, parent_lineno);
}
len = strlen(name);
file = xmalloc(sizeof(*file) + len + 1);
memset(file, 0, sizeof(*file));
memcpy(file->name, name, len);
file->name[len] = '\0';
file->parent.name = parent;
file->parent.lineno = parent_lineno;
hash_add(file_hashtable, &file->node, hash);
str_printf(&autoconf_cmd, "\t%s \\\n", name);
return file->name;
}
/* Allocate initial growable string */
struct gstr str_new(void)
{
struct gstr gs;
gs.s = xmalloc(sizeof(char) * 64);
gs.len = 64;
gs.max_width = 0;
strcpy(gs.s, "\0");
return gs;
}
/* Free storage for growable string */
void str_free(struct gstr *gs)
{
free(gs->s);
gs->s = NULL;
gs->len = 0;
}
/* Append to growable string */
void str_append(struct gstr *gs, const char *s)
{
size_t l;
if (s) {
l = strlen(gs->s) + strlen(s) + 1;
if (l > gs->len) {
gs->s = xrealloc(gs->s, l);
gs->len = l;
}
strcat(gs->s, s);
}
}
/* Append printf formatted string to growable string */
void str_printf(struct gstr *gs, const char *fmt, ...)
{
Annotation
- Immediate include surface: `stdarg.h`, `stdlib.h`, `string.h`, `hash.h`, `hashtable.h`, `xalloc.h`, `lkc.h`.
- Detected declarations: `struct file`, `function die_duplicated_include`, `function hash_for_each_possible`, `function str_new`, `function str_free`, `function str_append`, `function str_printf`.
- 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.