xref: /openbmc/linux/scripts/kconfig/util.c (revision 7ae9fb1b7ecbb5d85d07857943f677fd1a559b18)
10c874100SMasahiro Yamada // SPDX-License-Identifier: GPL-2.0
21da177e4SLinus Torvalds /*
31da177e4SLinus Torvalds  * Copyright (C) 2002-2005 Roman Zippel <zippel@linux-m68k.org>
41da177e4SLinus Torvalds  * Copyright (C) 2002-2005 Sam Ravnborg <sam@ravnborg.org>
51da177e4SLinus Torvalds  */
61da177e4SLinus Torvalds 
710a4b277SArnaud Lacombe #include <stdarg.h>
802d95c96SArnaud Lacombe #include <stdlib.h>
91da177e4SLinus Torvalds #include <string.h>
101da177e4SLinus Torvalds #include "lkc.h"
111da177e4SLinus Torvalds 
121da177e4SLinus Torvalds /* file already present in list? If not add it */
file_lookup(const char * name)131da177e4SLinus Torvalds struct file *file_lookup(const char *name)
141da177e4SLinus Torvalds {
151da177e4SLinus Torvalds 	struct file *file;
161da177e4SLinus Torvalds 
171da177e4SLinus Torvalds 	for (file = file_list; file; file = file->next) {
18c7abe863SArnaud Lacombe 		if (!strcmp(name, file->name)) {
191da177e4SLinus Torvalds 			return file;
201da177e4SLinus Torvalds 		}
21c7abe863SArnaud Lacombe 	}
221da177e4SLinus Torvalds 
23177acf78SAlan Cox 	file = xmalloc(sizeof(*file));
241da177e4SLinus Torvalds 	memset(file, 0, sizeof(*file));
25bb222ceeSMasahiro Yamada 	file->name = xstrdup(name);
261da177e4SLinus Torvalds 	file->next = file_list;
271da177e4SLinus Torvalds 	file_list = file;
281da177e4SLinus Torvalds 	return file;
291da177e4SLinus Torvalds }
301da177e4SLinus Torvalds 
3131a2d31dSThomas Weber /* Allocate initial growable string */
str_new(void)321da177e4SLinus Torvalds struct gstr str_new(void)
331da177e4SLinus Torvalds {
341da177e4SLinus Torvalds 	struct gstr gs;
35177acf78SAlan Cox 	gs.s = xmalloc(sizeof(char) * 64);
36107f43a0SChristophe Jaillet 	gs.len = 64;
37da60fbbcSVadim Bendebury (вб) 	gs.max_width = 0;
381da177e4SLinus Torvalds 	strcpy(gs.s, "\0");
391da177e4SLinus Torvalds 	return gs;
401da177e4SLinus Torvalds }
411da177e4SLinus Torvalds 
421da177e4SLinus Torvalds /* Free storage for growable string */
str_free(struct gstr * gs)431da177e4SLinus Torvalds void str_free(struct gstr *gs)
441da177e4SLinus Torvalds {
451da177e4SLinus Torvalds 	if (gs->s)
461da177e4SLinus Torvalds 		free(gs->s);
471da177e4SLinus Torvalds 	gs->s = NULL;
481da177e4SLinus Torvalds 	gs->len = 0;
491da177e4SLinus Torvalds }
501da177e4SLinus Torvalds 
511da177e4SLinus Torvalds /* Append to growable string */
str_append(struct gstr * gs,const char * s)521da177e4SLinus Torvalds void str_append(struct gstr *gs, const char *s)
531da177e4SLinus Torvalds {
54a67cb131SSam Ravnborg 	size_t l;
55a67cb131SSam Ravnborg 	if (s) {
56a67cb131SSam Ravnborg 		l = strlen(gs->s) + strlen(s) + 1;
571da177e4SLinus Torvalds 		if (l > gs->len) {
58d717f24dSMasahiro Yamada 			gs->s = xrealloc(gs->s, l);
591da177e4SLinus Torvalds 			gs->len = l;
601da177e4SLinus Torvalds 		}
611da177e4SLinus Torvalds 		strcat(gs->s, s);
621da177e4SLinus Torvalds 	}
63a67cb131SSam Ravnborg }
641da177e4SLinus Torvalds 
651da177e4SLinus Torvalds /* Append printf formatted string to growable string */
str_printf(struct gstr * gs,const char * fmt,...)661da177e4SLinus Torvalds void str_printf(struct gstr *gs, const char *fmt, ...)
671da177e4SLinus Torvalds {
681da177e4SLinus Torvalds 	va_list ap;
691da177e4SLinus Torvalds 	char s[10000]; /* big enough... */
701da177e4SLinus Torvalds 	va_start(ap, fmt);
711da177e4SLinus Torvalds 	vsnprintf(s, sizeof(s), fmt, ap);
721da177e4SLinus Torvalds 	str_append(gs, s);
731da177e4SLinus Torvalds 	va_end(ap);
741da177e4SLinus Torvalds }
751da177e4SLinus Torvalds 
764a4efbdeSMatt Mackall /* Retrieve value of growable string */
str_get(struct gstr * gs)77*4d980fd1SMasahiro Yamada char *str_get(struct gstr *gs)
781da177e4SLinus Torvalds {
791da177e4SLinus Torvalds 	return gs->s;
801da177e4SLinus Torvalds }
811da177e4SLinus Torvalds 
xmalloc(size_t size)82177acf78SAlan Cox void *xmalloc(size_t size)
83177acf78SAlan Cox {
84177acf78SAlan Cox 	void *p = malloc(size);
85177acf78SAlan Cox 	if (p)
86177acf78SAlan Cox 		return p;
87177acf78SAlan Cox 	fprintf(stderr, "Out of memory.\n");
88177acf78SAlan Cox 	exit(1);
89177acf78SAlan Cox }
90177acf78SAlan Cox 
xcalloc(size_t nmemb,size_t size)91177acf78SAlan Cox void *xcalloc(size_t nmemb, size_t size)
92177acf78SAlan Cox {
93177acf78SAlan Cox 	void *p = calloc(nmemb, size);
94177acf78SAlan Cox 	if (p)
95177acf78SAlan Cox 		return p;
96177acf78SAlan Cox 	fprintf(stderr, "Out of memory.\n");
97177acf78SAlan Cox 	exit(1);
98177acf78SAlan Cox }
99d717f24dSMasahiro Yamada 
xrealloc(void * p,size_t size)100d717f24dSMasahiro Yamada void *xrealloc(void *p, size_t size)
101d717f24dSMasahiro Yamada {
102d717f24dSMasahiro Yamada 	p = realloc(p, size);
103d717f24dSMasahiro Yamada 	if (p)
104d717f24dSMasahiro Yamada 		return p;
105d717f24dSMasahiro Yamada 	fprintf(stderr, "Out of memory.\n");
106d717f24dSMasahiro Yamada 	exit(1);
107d717f24dSMasahiro Yamada }
108cd81fc82SMasahiro Yamada 
xstrdup(const char * s)109cd81fc82SMasahiro Yamada char *xstrdup(const char *s)
110cd81fc82SMasahiro Yamada {
111cd81fc82SMasahiro Yamada 	char *p;
112cd81fc82SMasahiro Yamada 
113cd81fc82SMasahiro Yamada 	p = strdup(s);
114cd81fc82SMasahiro Yamada 	if (p)
115cd81fc82SMasahiro Yamada 		return p;
116cd81fc82SMasahiro Yamada 	fprintf(stderr, "Out of memory.\n");
117cd81fc82SMasahiro Yamada 	exit(1);
118cd81fc82SMasahiro Yamada }
119104daea1SMasahiro Yamada 
xstrndup(const char * s,size_t n)120104daea1SMasahiro Yamada char *xstrndup(const char *s, size_t n)
121104daea1SMasahiro Yamada {
122104daea1SMasahiro Yamada 	char *p;
123104daea1SMasahiro Yamada 
124104daea1SMasahiro Yamada 	p = strndup(s, n);
125104daea1SMasahiro Yamada 	if (p)
126104daea1SMasahiro Yamada 		return p;
127104daea1SMasahiro Yamada 	fprintf(stderr, "Out of memory.\n");
128104daea1SMasahiro Yamada 	exit(1);
129104daea1SMasahiro Yamada }
130