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