xref: /aosp_15_r20/external/toybox/kconfig/util.c (revision cf5a6c84e2b8763fc1a7db14496fd4742913b199)
1*cf5a6c84SAndroid Build Coastguard Worker /*
2*cf5a6c84SAndroid Build Coastguard Worker  * Copyright (C) 2002-2005 Roman Zippel <[email protected]>
3*cf5a6c84SAndroid Build Coastguard Worker  * Copyright (C) 2002-2005 Sam Ravnborg <[email protected]>
4*cf5a6c84SAndroid Build Coastguard Worker  *
5*cf5a6c84SAndroid Build Coastguard Worker  * Released under the terms of the GNU GPL v2.0.
6*cf5a6c84SAndroid Build Coastguard Worker  */
7*cf5a6c84SAndroid Build Coastguard Worker 
8*cf5a6c84SAndroid Build Coastguard Worker #include <string.h>
9*cf5a6c84SAndroid Build Coastguard Worker #include "lkc.h"
10*cf5a6c84SAndroid Build Coastguard Worker 
11*cf5a6c84SAndroid Build Coastguard Worker /* file already present in list? If not add it */
file_lookup(const char * name)12*cf5a6c84SAndroid Build Coastguard Worker struct file *file_lookup(const char *name)
13*cf5a6c84SAndroid Build Coastguard Worker {
14*cf5a6c84SAndroid Build Coastguard Worker 	struct file *file;
15*cf5a6c84SAndroid Build Coastguard Worker 
16*cf5a6c84SAndroid Build Coastguard Worker 	for (file = file_list; file; file = file->next) {
17*cf5a6c84SAndroid Build Coastguard Worker 		if (!strcmp(name, file->name))
18*cf5a6c84SAndroid Build Coastguard Worker 			return file;
19*cf5a6c84SAndroid Build Coastguard Worker 	}
20*cf5a6c84SAndroid Build Coastguard Worker 
21*cf5a6c84SAndroid Build Coastguard Worker 	file = malloc(sizeof(*file));
22*cf5a6c84SAndroid Build Coastguard Worker 	memset(file, 0, sizeof(*file));
23*cf5a6c84SAndroid Build Coastguard Worker 	file->name = strdup(name);
24*cf5a6c84SAndroid Build Coastguard Worker 	file->next = file_list;
25*cf5a6c84SAndroid Build Coastguard Worker 	file_list = file;
26*cf5a6c84SAndroid Build Coastguard Worker 	return file;
27*cf5a6c84SAndroid Build Coastguard Worker }
28*cf5a6c84SAndroid Build Coastguard Worker 
29*cf5a6c84SAndroid Build Coastguard Worker /* write a dependency file as used by kbuild to track dependencies */
file_write_dep(const char * name)30*cf5a6c84SAndroid Build Coastguard Worker int file_write_dep(const char *name)
31*cf5a6c84SAndroid Build Coastguard Worker {
32*cf5a6c84SAndroid Build Coastguard Worker 	struct file *file;
33*cf5a6c84SAndroid Build Coastguard Worker 	FILE *out;
34*cf5a6c84SAndroid Build Coastguard Worker 
35*cf5a6c84SAndroid Build Coastguard Worker 	if (!name)
36*cf5a6c84SAndroid Build Coastguard Worker 		name = ".kconfig.d";
37*cf5a6c84SAndroid Build Coastguard Worker 	out = fopen("..config.tmp", "w");
38*cf5a6c84SAndroid Build Coastguard Worker 	if (!out)
39*cf5a6c84SAndroid Build Coastguard Worker 		return 1;
40*cf5a6c84SAndroid Build Coastguard Worker 	fprintf(out, "deps_config := \\\n");
41*cf5a6c84SAndroid Build Coastguard Worker 	for (file = file_list; file; file = file->next) {
42*cf5a6c84SAndroid Build Coastguard Worker 		if (file->next)
43*cf5a6c84SAndroid Build Coastguard Worker 			fprintf(out, "\t%s \\\n", file->name);
44*cf5a6c84SAndroid Build Coastguard Worker 		else
45*cf5a6c84SAndroid Build Coastguard Worker 			fprintf(out, "\t%s\n", file->name);
46*cf5a6c84SAndroid Build Coastguard Worker 	}
47*cf5a6c84SAndroid Build Coastguard Worker 	fprintf(out, "\ninclude/config/auto.conf: \\\n"
48*cf5a6c84SAndroid Build Coastguard Worker 		     "\t$(deps_config)\n\n"
49*cf5a6c84SAndroid Build Coastguard Worker 		     "$(deps_config): ;\n");
50*cf5a6c84SAndroid Build Coastguard Worker 	fclose(out);
51*cf5a6c84SAndroid Build Coastguard Worker 	rename("..config.tmp", name);
52*cf5a6c84SAndroid Build Coastguard Worker 	return 0;
53*cf5a6c84SAndroid Build Coastguard Worker }
54*cf5a6c84SAndroid Build Coastguard Worker 
55*cf5a6c84SAndroid Build Coastguard Worker 
56*cf5a6c84SAndroid Build Coastguard Worker /* Allocate initial growable sting */
str_new(void)57*cf5a6c84SAndroid Build Coastguard Worker struct gstr str_new(void)
58*cf5a6c84SAndroid Build Coastguard Worker {
59*cf5a6c84SAndroid Build Coastguard Worker 	struct gstr gs;
60*cf5a6c84SAndroid Build Coastguard Worker 	gs.s = malloc(sizeof(char) * 64);
61*cf5a6c84SAndroid Build Coastguard Worker 	gs.len = 16;
62*cf5a6c84SAndroid Build Coastguard Worker 	strcpy(gs.s, "\0");
63*cf5a6c84SAndroid Build Coastguard Worker 	return gs;
64*cf5a6c84SAndroid Build Coastguard Worker }
65*cf5a6c84SAndroid Build Coastguard Worker 
66*cf5a6c84SAndroid Build Coastguard Worker /* Allocate and assign growable string */
str_assign(const char * s)67*cf5a6c84SAndroid Build Coastguard Worker struct gstr str_assign(const char *s)
68*cf5a6c84SAndroid Build Coastguard Worker {
69*cf5a6c84SAndroid Build Coastguard Worker 	struct gstr gs;
70*cf5a6c84SAndroid Build Coastguard Worker 	gs.s = strdup(s);
71*cf5a6c84SAndroid Build Coastguard Worker 	gs.len = strlen(s) + 1;
72*cf5a6c84SAndroid Build Coastguard Worker 	return gs;
73*cf5a6c84SAndroid Build Coastguard Worker }
74*cf5a6c84SAndroid Build Coastguard Worker 
75*cf5a6c84SAndroid Build Coastguard Worker /* Free storage for growable string */
str_free(struct gstr * gs)76*cf5a6c84SAndroid Build Coastguard Worker void str_free(struct gstr *gs)
77*cf5a6c84SAndroid Build Coastguard Worker {
78*cf5a6c84SAndroid Build Coastguard Worker 	if (gs->s)
79*cf5a6c84SAndroid Build Coastguard Worker 		free(gs->s);
80*cf5a6c84SAndroid Build Coastguard Worker 	gs->s = NULL;
81*cf5a6c84SAndroid Build Coastguard Worker 	gs->len = 0;
82*cf5a6c84SAndroid Build Coastguard Worker }
83*cf5a6c84SAndroid Build Coastguard Worker 
84*cf5a6c84SAndroid Build Coastguard Worker /* Append to growable string */
str_append(struct gstr * gs,const char * s)85*cf5a6c84SAndroid Build Coastguard Worker void str_append(struct gstr *gs, const char *s)
86*cf5a6c84SAndroid Build Coastguard Worker {
87*cf5a6c84SAndroid Build Coastguard Worker 	size_t l = strlen(gs->s) + strlen(s) + 1;
88*cf5a6c84SAndroid Build Coastguard Worker 	if (l > gs->len) {
89*cf5a6c84SAndroid Build Coastguard Worker 		gs->s   = realloc(gs->s, l);
90*cf5a6c84SAndroid Build Coastguard Worker 		gs->len = l;
91*cf5a6c84SAndroid Build Coastguard Worker 	}
92*cf5a6c84SAndroid Build Coastguard Worker 	strcat(gs->s, s);
93*cf5a6c84SAndroid Build Coastguard Worker }
94*cf5a6c84SAndroid Build Coastguard Worker 
95*cf5a6c84SAndroid Build Coastguard Worker /* Append printf formatted string to growable string */
str_printf(struct gstr * gs,const char * fmt,...)96*cf5a6c84SAndroid Build Coastguard Worker void str_printf(struct gstr *gs, const char *fmt, ...)
97*cf5a6c84SAndroid Build Coastguard Worker {
98*cf5a6c84SAndroid Build Coastguard Worker 	va_list ap;
99*cf5a6c84SAndroid Build Coastguard Worker 	char s[10000]; /* big enough... */
100*cf5a6c84SAndroid Build Coastguard Worker 	va_start(ap, fmt);
101*cf5a6c84SAndroid Build Coastguard Worker 	vsnprintf(s, sizeof(s), fmt, ap);
102*cf5a6c84SAndroid Build Coastguard Worker 	str_append(gs, s);
103*cf5a6c84SAndroid Build Coastguard Worker 	va_end(ap);
104*cf5a6c84SAndroid Build Coastguard Worker }
105*cf5a6c84SAndroid Build Coastguard Worker 
106*cf5a6c84SAndroid Build Coastguard Worker /* Retrieve value of growable string */
str_get(struct gstr * gs)107*cf5a6c84SAndroid Build Coastguard Worker const char *str_get(struct gstr *gs)
108*cf5a6c84SAndroid Build Coastguard Worker {
109*cf5a6c84SAndroid Build Coastguard Worker 	return gs->s;
110*cf5a6c84SAndroid Build Coastguard Worker }
111*cf5a6c84SAndroid Build Coastguard Worker 
112