xref: /linux-6.15/scripts/kconfig/util.c (revision a16219bd)
10c874100SMasahiro Yamada // SPDX-License-Identifier: GPL-2.0
21da177e4SLinus Torvalds /*
31da177e4SLinus Torvalds  * Copyright (C) 2002-2005 Roman Zippel <[email protected]>
41da177e4SLinus Torvalds  * Copyright (C) 2002-2005 Sam Ravnborg <[email protected]>
51da177e4SLinus Torvalds  */
61da177e4SLinus Torvalds 
710a4b277SArnaud Lacombe #include <stdarg.h>
802d95c96SArnaud Lacombe #include <stdlib.h>
91da177e4SLinus Torvalds #include <string.h>
10980c9e19SMasahiro Yamada 
11*a16219bdSMasahiro Yamada #include <hash.h>
12fbaf242cSMasahiro Yamada #include <hashtable.h>
13a9d83d74SMasahiro Yamada #include <xalloc.h>
141da177e4SLinus Torvalds #include "lkc.h"
151da177e4SLinus Torvalds 
16980c9e19SMasahiro Yamada /* hash table of all parsed Kconfig files */
17980c9e19SMasahiro Yamada static HASHTABLE_DEFINE(file_hashtable, 1U << 11);
18980c9e19SMasahiro Yamada 
195b058034SMasahiro Yamada struct file {
20980c9e19SMasahiro Yamada 	struct hlist_node node;
215b058034SMasahiro Yamada 	char name[];
225b058034SMasahiro Yamada };
235b058034SMasahiro Yamada 
241da177e4SLinus Torvalds /* file already present in list? If not add it */
file_lookup(const char * name)255b058034SMasahiro Yamada const char *file_lookup(const char *name)
261da177e4SLinus Torvalds {
271da177e4SLinus Torvalds 	struct file *file;
286676c5bcSMasahiro Yamada 	size_t len;
29*a16219bdSMasahiro Yamada 	int hash = hash_str(name);
301da177e4SLinus Torvalds 
31980c9e19SMasahiro Yamada 	hash_for_each_possible(file_hashtable, file, node, hash)
32980c9e19SMasahiro Yamada 		if (!strcmp(name, file->name))
335b058034SMasahiro Yamada 			return file->name;
341da177e4SLinus Torvalds 
356676c5bcSMasahiro Yamada 	len = strlen(name);
366676c5bcSMasahiro Yamada 	file = xmalloc(sizeof(*file) + len + 1);
371da177e4SLinus Torvalds 	memset(file, 0, sizeof(*file));
386676c5bcSMasahiro Yamada 	memcpy(file->name, name, len);
396676c5bcSMasahiro Yamada 	file->name[len] = '\0';
40980c9e19SMasahiro Yamada 
41980c9e19SMasahiro Yamada 	hash_add(file_hashtable, &file->node, hash);
42526396b7SMasahiro Yamada 
43526396b7SMasahiro Yamada 	str_printf(&autoconf_cmd, "\t%s \\\n", name);
44526396b7SMasahiro Yamada 
455b058034SMasahiro Yamada 	return file->name;
461da177e4SLinus Torvalds }
471da177e4SLinus Torvalds 
4831a2d31dSThomas Weber /* Allocate initial growable string */
str_new(void)491da177e4SLinus Torvalds struct gstr str_new(void)
501da177e4SLinus Torvalds {
511da177e4SLinus Torvalds 	struct gstr gs;
52177acf78SAlan Cox 	gs.s = xmalloc(sizeof(char) * 64);
53107f43a0SChristophe Jaillet 	gs.len = 64;
54da60fbbcSVadim Bendebury (вб) 	gs.max_width = 0;
551da177e4SLinus Torvalds 	strcpy(gs.s, "\0");
561da177e4SLinus Torvalds 	return gs;
571da177e4SLinus Torvalds }
581da177e4SLinus Torvalds 
591da177e4SLinus Torvalds /* Free storage for growable string */
str_free(struct gstr * gs)601da177e4SLinus Torvalds void str_free(struct gstr *gs)
611da177e4SLinus Torvalds {
621da177e4SLinus Torvalds 	free(gs->s);
631da177e4SLinus Torvalds 	gs->s = NULL;
641da177e4SLinus Torvalds 	gs->len = 0;
651da177e4SLinus Torvalds }
661da177e4SLinus Torvalds 
671da177e4SLinus Torvalds /* Append to growable string */
str_append(struct gstr * gs,const char * s)681da177e4SLinus Torvalds void str_append(struct gstr *gs, const char *s)
691da177e4SLinus Torvalds {
70a67cb131SSam Ravnborg 	size_t l;
71a67cb131SSam Ravnborg 	if (s) {
72a67cb131SSam Ravnborg 		l = strlen(gs->s) + strlen(s) + 1;
731da177e4SLinus Torvalds 		if (l > gs->len) {
74d717f24dSMasahiro Yamada 			gs->s = xrealloc(gs->s, l);
751da177e4SLinus Torvalds 			gs->len = l;
761da177e4SLinus Torvalds 		}
771da177e4SLinus Torvalds 		strcat(gs->s, s);
781da177e4SLinus Torvalds 	}
79a67cb131SSam Ravnborg }
801da177e4SLinus Torvalds 
811da177e4SLinus Torvalds /* Append printf formatted string to growable string */
str_printf(struct gstr * gs,const char * fmt,...)821da177e4SLinus Torvalds void str_printf(struct gstr *gs, const char *fmt, ...)
831da177e4SLinus Torvalds {
841da177e4SLinus Torvalds 	va_list ap;
851da177e4SLinus Torvalds 	char s[10000]; /* big enough... */
861da177e4SLinus Torvalds 	va_start(ap, fmt);
871da177e4SLinus Torvalds 	vsnprintf(s, sizeof(s), fmt, ap);
881da177e4SLinus Torvalds 	str_append(gs, s);
891da177e4SLinus Torvalds 	va_end(ap);
901da177e4SLinus Torvalds }
911da177e4SLinus Torvalds 
924a4efbdeSMatt Mackall /* Retrieve value of growable string */
str_get(const struct gstr * gs)936425e3b2SMasahiro Yamada char *str_get(const struct gstr *gs)
941da177e4SLinus Torvalds {
951da177e4SLinus Torvalds 	return gs->s;
961da177e4SLinus Torvalds }
97