18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * Copyright (C) 2002-2005 Roman Zippel <zippel@linux-m68k.org>
48c2ecf20Sopenharmony_ci * Copyright (C) 2002-2005 Sam Ravnborg <sam@ravnborg.org>
58c2ecf20Sopenharmony_ci */
68c2ecf20Sopenharmony_ci
78c2ecf20Sopenharmony_ci#include <stdarg.h>
88c2ecf20Sopenharmony_ci#include <stdlib.h>
98c2ecf20Sopenharmony_ci#include <string.h>
108c2ecf20Sopenharmony_ci#include "lkc.h"
118c2ecf20Sopenharmony_ci
128c2ecf20Sopenharmony_ci/* file already present in list? If not add it */
138c2ecf20Sopenharmony_cistruct file *file_lookup(const char *name)
148c2ecf20Sopenharmony_ci{
158c2ecf20Sopenharmony_ci	struct file *file;
168c2ecf20Sopenharmony_ci
178c2ecf20Sopenharmony_ci	for (file = file_list; file; file = file->next) {
188c2ecf20Sopenharmony_ci		if (!strcmp(name, file->name)) {
198c2ecf20Sopenharmony_ci			return file;
208c2ecf20Sopenharmony_ci		}
218c2ecf20Sopenharmony_ci	}
228c2ecf20Sopenharmony_ci
238c2ecf20Sopenharmony_ci	file = xmalloc(sizeof(*file));
248c2ecf20Sopenharmony_ci	memset(file, 0, sizeof(*file));
258c2ecf20Sopenharmony_ci	file->name = xstrdup(name);
268c2ecf20Sopenharmony_ci	file->next = file_list;
278c2ecf20Sopenharmony_ci	file_list = file;
288c2ecf20Sopenharmony_ci	return file;
298c2ecf20Sopenharmony_ci}
308c2ecf20Sopenharmony_ci
318c2ecf20Sopenharmony_ci/* Allocate initial growable string */
328c2ecf20Sopenharmony_cistruct gstr str_new(void)
338c2ecf20Sopenharmony_ci{
348c2ecf20Sopenharmony_ci	struct gstr gs;
358c2ecf20Sopenharmony_ci	gs.s = xmalloc(sizeof(char) * 64);
368c2ecf20Sopenharmony_ci	gs.len = 64;
378c2ecf20Sopenharmony_ci	gs.max_width = 0;
388c2ecf20Sopenharmony_ci	strcpy(gs.s, "\0");
398c2ecf20Sopenharmony_ci	return gs;
408c2ecf20Sopenharmony_ci}
418c2ecf20Sopenharmony_ci
428c2ecf20Sopenharmony_ci/* Free storage for growable string */
438c2ecf20Sopenharmony_civoid str_free(struct gstr *gs)
448c2ecf20Sopenharmony_ci{
458c2ecf20Sopenharmony_ci	if (gs->s)
468c2ecf20Sopenharmony_ci		free(gs->s);
478c2ecf20Sopenharmony_ci	gs->s = NULL;
488c2ecf20Sopenharmony_ci	gs->len = 0;
498c2ecf20Sopenharmony_ci}
508c2ecf20Sopenharmony_ci
518c2ecf20Sopenharmony_ci/* Append to growable string */
528c2ecf20Sopenharmony_civoid str_append(struct gstr *gs, const char *s)
538c2ecf20Sopenharmony_ci{
548c2ecf20Sopenharmony_ci	size_t l;
558c2ecf20Sopenharmony_ci	if (s) {
568c2ecf20Sopenharmony_ci		l = strlen(gs->s) + strlen(s) + 1;
578c2ecf20Sopenharmony_ci		if (l > gs->len) {
588c2ecf20Sopenharmony_ci			gs->s = xrealloc(gs->s, l);
598c2ecf20Sopenharmony_ci			gs->len = l;
608c2ecf20Sopenharmony_ci		}
618c2ecf20Sopenharmony_ci		strcat(gs->s, s);
628c2ecf20Sopenharmony_ci	}
638c2ecf20Sopenharmony_ci}
648c2ecf20Sopenharmony_ci
658c2ecf20Sopenharmony_ci/* Append printf formatted string to growable string */
668c2ecf20Sopenharmony_civoid str_printf(struct gstr *gs, const char *fmt, ...)
678c2ecf20Sopenharmony_ci{
688c2ecf20Sopenharmony_ci	va_list ap;
698c2ecf20Sopenharmony_ci	char s[10000]; /* big enough... */
708c2ecf20Sopenharmony_ci	va_start(ap, fmt);
718c2ecf20Sopenharmony_ci	vsnprintf(s, sizeof(s), fmt, ap);
728c2ecf20Sopenharmony_ci	str_append(gs, s);
738c2ecf20Sopenharmony_ci	va_end(ap);
748c2ecf20Sopenharmony_ci}
758c2ecf20Sopenharmony_ci
768c2ecf20Sopenharmony_ci/* Retrieve value of growable string */
778c2ecf20Sopenharmony_ciconst char *str_get(struct gstr *gs)
788c2ecf20Sopenharmony_ci{
798c2ecf20Sopenharmony_ci	return gs->s;
808c2ecf20Sopenharmony_ci}
818c2ecf20Sopenharmony_ci
828c2ecf20Sopenharmony_civoid *xmalloc(size_t size)
838c2ecf20Sopenharmony_ci{
848c2ecf20Sopenharmony_ci	void *p = malloc(size);
858c2ecf20Sopenharmony_ci	if (p)
868c2ecf20Sopenharmony_ci		return p;
878c2ecf20Sopenharmony_ci	fprintf(stderr, "Out of memory.\n");
888c2ecf20Sopenharmony_ci	exit(1);
898c2ecf20Sopenharmony_ci}
908c2ecf20Sopenharmony_ci
918c2ecf20Sopenharmony_civoid *xcalloc(size_t nmemb, size_t size)
928c2ecf20Sopenharmony_ci{
938c2ecf20Sopenharmony_ci	void *p = calloc(nmemb, size);
948c2ecf20Sopenharmony_ci	if (p)
958c2ecf20Sopenharmony_ci		return p;
968c2ecf20Sopenharmony_ci	fprintf(stderr, "Out of memory.\n");
978c2ecf20Sopenharmony_ci	exit(1);
988c2ecf20Sopenharmony_ci}
998c2ecf20Sopenharmony_ci
1008c2ecf20Sopenharmony_civoid *xrealloc(void *p, size_t size)
1018c2ecf20Sopenharmony_ci{
1028c2ecf20Sopenharmony_ci	p = realloc(p, size);
1038c2ecf20Sopenharmony_ci	if (p)
1048c2ecf20Sopenharmony_ci		return p;
1058c2ecf20Sopenharmony_ci	fprintf(stderr, "Out of memory.\n");
1068c2ecf20Sopenharmony_ci	exit(1);
1078c2ecf20Sopenharmony_ci}
1088c2ecf20Sopenharmony_ci
1098c2ecf20Sopenharmony_cichar *xstrdup(const char *s)
1108c2ecf20Sopenharmony_ci{
1118c2ecf20Sopenharmony_ci	char *p;
1128c2ecf20Sopenharmony_ci
1138c2ecf20Sopenharmony_ci	p = strdup(s);
1148c2ecf20Sopenharmony_ci	if (p)
1158c2ecf20Sopenharmony_ci		return p;
1168c2ecf20Sopenharmony_ci	fprintf(stderr, "Out of memory.\n");
1178c2ecf20Sopenharmony_ci	exit(1);
1188c2ecf20Sopenharmony_ci}
1198c2ecf20Sopenharmony_ci
1208c2ecf20Sopenharmony_cichar *xstrndup(const char *s, size_t n)
1218c2ecf20Sopenharmony_ci{
1228c2ecf20Sopenharmony_ci	char *p;
1238c2ecf20Sopenharmony_ci
1248c2ecf20Sopenharmony_ci	p = strndup(s, n);
1258c2ecf20Sopenharmony_ci	if (p)
1268c2ecf20Sopenharmony_ci		return p;
1278c2ecf20Sopenharmony_ci	fprintf(stderr, "Out of memory.\n");
1288c2ecf20Sopenharmony_ci	exit(1);
1298c2ecf20Sopenharmony_ci}
130