xref: /openbmc/u-boot/scripts/kconfig/util.c (revision e91610da7c8a9fe42f3e5a75f06c3d1a0cb5f815)
10a9064fbSMasahiro Yamada /*
20a9064fbSMasahiro Yamada  * Copyright (C) 2002-2005 Roman Zippel <zippel@linux-m68k.org>
30a9064fbSMasahiro Yamada  * Copyright (C) 2002-2005 Sam Ravnborg <sam@ravnborg.org>
40a9064fbSMasahiro Yamada  *
50a9064fbSMasahiro Yamada  * Released under the terms of the GNU GPL v2.0.
60a9064fbSMasahiro Yamada  */
70a9064fbSMasahiro Yamada 
80a9064fbSMasahiro Yamada #include <stdarg.h>
90a9064fbSMasahiro Yamada #include <stdlib.h>
100a9064fbSMasahiro Yamada #include <string.h>
110a9064fbSMasahiro Yamada #include "lkc.h"
120a9064fbSMasahiro Yamada 
130a9064fbSMasahiro Yamada /* file already present in list? If not add it */
file_lookup(const char * name)140a9064fbSMasahiro Yamada struct file *file_lookup(const char *name)
150a9064fbSMasahiro Yamada {
160a9064fbSMasahiro Yamada 	struct file *file;
17*e91610daSEugeniu Rosca 	char *file_name = sym_expand_string_value(name);
180a9064fbSMasahiro Yamada 
190a9064fbSMasahiro Yamada 	for (file = file_list; file; file = file->next) {
200a9064fbSMasahiro Yamada 		if (!strcmp(name, file->name)) {
21*e91610daSEugeniu Rosca 			free(file_name);
220a9064fbSMasahiro Yamada 			return file;
230a9064fbSMasahiro Yamada 		}
240a9064fbSMasahiro Yamada 	}
250a9064fbSMasahiro Yamada 
260a9064fbSMasahiro Yamada 	file = xmalloc(sizeof(*file));
270a9064fbSMasahiro Yamada 	memset(file, 0, sizeof(*file));
280a9064fbSMasahiro Yamada 	file->name = file_name;
290a9064fbSMasahiro Yamada 	file->next = file_list;
300a9064fbSMasahiro Yamada 	file_list = file;
310a9064fbSMasahiro Yamada 	return file;
320a9064fbSMasahiro Yamada }
330a9064fbSMasahiro Yamada 
340a9064fbSMasahiro Yamada /* write a dependency file as used by kbuild to track dependencies */
file_write_dep(const char * name)350a9064fbSMasahiro Yamada int file_write_dep(const char *name)
360a9064fbSMasahiro Yamada {
370a9064fbSMasahiro Yamada 	struct symbol *sym, *env_sym;
380a9064fbSMasahiro Yamada 	struct expr *e;
390a9064fbSMasahiro Yamada 	struct file *file;
400a9064fbSMasahiro Yamada 	FILE *out;
410a9064fbSMasahiro Yamada 
420a9064fbSMasahiro Yamada 	if (!name)
430a9064fbSMasahiro Yamada 		name = ".kconfig.d";
440a9064fbSMasahiro Yamada 	out = fopen("..config.tmp", "w");
450a9064fbSMasahiro Yamada 	if (!out)
460a9064fbSMasahiro Yamada 		return 1;
470a9064fbSMasahiro Yamada 	fprintf(out, "deps_config := \\\n");
480a9064fbSMasahiro Yamada 	for (file = file_list; file; file = file->next) {
490a9064fbSMasahiro Yamada 		if (file->next)
500a9064fbSMasahiro Yamada 			fprintf(out, "\t%s \\\n", file->name);
510a9064fbSMasahiro Yamada 		else
520a9064fbSMasahiro Yamada 			fprintf(out, "\t%s\n", file->name);
530a9064fbSMasahiro Yamada 	}
540a9064fbSMasahiro Yamada 	fprintf(out, "\n%s: \\\n"
550a9064fbSMasahiro Yamada 		     "\t$(deps_config)\n\n", conf_get_autoconfig_name());
560a9064fbSMasahiro Yamada 
570a9064fbSMasahiro Yamada 	expr_list_for_each_sym(sym_env_list, e, sym) {
580a9064fbSMasahiro Yamada 		struct property *prop;
590a9064fbSMasahiro Yamada 		const char *value;
600a9064fbSMasahiro Yamada 
610a9064fbSMasahiro Yamada 		prop = sym_get_env_prop(sym);
620a9064fbSMasahiro Yamada 		env_sym = prop_get_symbol(prop);
630a9064fbSMasahiro Yamada 		if (!env_sym)
640a9064fbSMasahiro Yamada 			continue;
650a9064fbSMasahiro Yamada 		value = getenv(env_sym->name);
660a9064fbSMasahiro Yamada 		if (!value)
670a9064fbSMasahiro Yamada 			value = "";
680a9064fbSMasahiro Yamada 		fprintf(out, "ifneq \"$(%s)\" \"%s\"\n", env_sym->name, value);
690a9064fbSMasahiro Yamada 		fprintf(out, "%s: FORCE\n", conf_get_autoconfig_name());
700a9064fbSMasahiro Yamada 		fprintf(out, "endif\n");
710a9064fbSMasahiro Yamada 	}
720a9064fbSMasahiro Yamada 
730a9064fbSMasahiro Yamada 	fprintf(out, "\n$(deps_config): ;\n");
740a9064fbSMasahiro Yamada 	fclose(out);
750a9064fbSMasahiro Yamada 	rename("..config.tmp", name);
760a9064fbSMasahiro Yamada 	return 0;
770a9064fbSMasahiro Yamada }
780a9064fbSMasahiro Yamada 
790a9064fbSMasahiro Yamada 
800a9064fbSMasahiro Yamada /* Allocate initial growable string */
str_new(void)810a9064fbSMasahiro Yamada struct gstr str_new(void)
820a9064fbSMasahiro Yamada {
830a9064fbSMasahiro Yamada 	struct gstr gs;
840a9064fbSMasahiro Yamada 	gs.s = xmalloc(sizeof(char) * 64);
850a9064fbSMasahiro Yamada 	gs.len = 64;
860a9064fbSMasahiro Yamada 	gs.max_width = 0;
870a9064fbSMasahiro Yamada 	strcpy(gs.s, "\0");
880a9064fbSMasahiro Yamada 	return gs;
890a9064fbSMasahiro Yamada }
900a9064fbSMasahiro Yamada 
910a9064fbSMasahiro Yamada /* Free storage for growable string */
str_free(struct gstr * gs)920a9064fbSMasahiro Yamada void str_free(struct gstr *gs)
930a9064fbSMasahiro Yamada {
940a9064fbSMasahiro Yamada 	if (gs->s)
950a9064fbSMasahiro Yamada 		free(gs->s);
960a9064fbSMasahiro Yamada 	gs->s = NULL;
970a9064fbSMasahiro Yamada 	gs->len = 0;
980a9064fbSMasahiro Yamada }
990a9064fbSMasahiro Yamada 
1000a9064fbSMasahiro Yamada /* Append to growable string */
str_append(struct gstr * gs,const char * s)1010a9064fbSMasahiro Yamada void str_append(struct gstr *gs, const char *s)
1020a9064fbSMasahiro Yamada {
1030a9064fbSMasahiro Yamada 	size_t l;
1040a9064fbSMasahiro Yamada 	if (s) {
1050a9064fbSMasahiro Yamada 		l = strlen(gs->s) + strlen(s) + 1;
1060a9064fbSMasahiro Yamada 		if (l > gs->len) {
107*e91610daSEugeniu Rosca 			gs->s = xrealloc(gs->s, l);
1080a9064fbSMasahiro Yamada 			gs->len = l;
1090a9064fbSMasahiro Yamada 		}
1100a9064fbSMasahiro Yamada 		strcat(gs->s, s);
1110a9064fbSMasahiro Yamada 	}
1120a9064fbSMasahiro Yamada }
1130a9064fbSMasahiro Yamada 
1140a9064fbSMasahiro Yamada /* Append printf formatted string to growable string */
str_printf(struct gstr * gs,const char * fmt,...)1150a9064fbSMasahiro Yamada void str_printf(struct gstr *gs, const char *fmt, ...)
1160a9064fbSMasahiro Yamada {
1170a9064fbSMasahiro Yamada 	va_list ap;
1180a9064fbSMasahiro Yamada 	char s[10000]; /* big enough... */
1190a9064fbSMasahiro Yamada 	va_start(ap, fmt);
1200a9064fbSMasahiro Yamada 	vsnprintf(s, sizeof(s), fmt, ap);
1210a9064fbSMasahiro Yamada 	str_append(gs, s);
1220a9064fbSMasahiro Yamada 	va_end(ap);
1230a9064fbSMasahiro Yamada }
1240a9064fbSMasahiro Yamada 
1250a9064fbSMasahiro Yamada /* Retrieve value of growable string */
str_get(struct gstr * gs)1260a9064fbSMasahiro Yamada const char *str_get(struct gstr *gs)
1270a9064fbSMasahiro Yamada {
1280a9064fbSMasahiro Yamada 	return gs->s;
1290a9064fbSMasahiro Yamada }
1300a9064fbSMasahiro Yamada 
xmalloc(size_t size)1310a9064fbSMasahiro Yamada void *xmalloc(size_t size)
1320a9064fbSMasahiro Yamada {
1330a9064fbSMasahiro Yamada 	void *p = malloc(size);
1340a9064fbSMasahiro Yamada 	if (p)
1350a9064fbSMasahiro Yamada 		return p;
1360a9064fbSMasahiro Yamada 	fprintf(stderr, "Out of memory.\n");
1370a9064fbSMasahiro Yamada 	exit(1);
1380a9064fbSMasahiro Yamada }
1390a9064fbSMasahiro Yamada 
xcalloc(size_t nmemb,size_t size)1400a9064fbSMasahiro Yamada void *xcalloc(size_t nmemb, size_t size)
1410a9064fbSMasahiro Yamada {
1420a9064fbSMasahiro Yamada 	void *p = calloc(nmemb, size);
1430a9064fbSMasahiro Yamada 	if (p)
1440a9064fbSMasahiro Yamada 		return p;
1450a9064fbSMasahiro Yamada 	fprintf(stderr, "Out of memory.\n");
1460a9064fbSMasahiro Yamada 	exit(1);
1470a9064fbSMasahiro Yamada }
148*e91610daSEugeniu Rosca 
xrealloc(void * p,size_t size)149*e91610daSEugeniu Rosca void *xrealloc(void *p, size_t size)
150*e91610daSEugeniu Rosca {
151*e91610daSEugeniu Rosca 	p = realloc(p, size);
152*e91610daSEugeniu Rosca 	if (p)
153*e91610daSEugeniu Rosca 		return p;
154*e91610daSEugeniu Rosca 	fprintf(stderr, "Out of memory.\n");
155*e91610daSEugeniu Rosca 	exit(1);
156*e91610daSEugeniu Rosca }
157*e91610daSEugeniu Rosca 
xstrdup(const char * s)158*e91610daSEugeniu Rosca char *xstrdup(const char *s)
159*e91610daSEugeniu Rosca {
160*e91610daSEugeniu Rosca 	char *p;
161*e91610daSEugeniu Rosca 
162*e91610daSEugeniu Rosca 	p = strdup(s);
163*e91610daSEugeniu Rosca 	if (p)
164*e91610daSEugeniu Rosca 		return p;
165*e91610daSEugeniu Rosca 	fprintf(stderr, "Out of memory.\n");
166*e91610daSEugeniu Rosca 	exit(1);
167*e91610daSEugeniu Rosca }
168