162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (C) 2002-2005 Roman Zippel <zippel@linux-m68k.org>
462306a36Sopenharmony_ci * Copyright (C) 2002-2005 Sam Ravnborg <sam@ravnborg.org>
562306a36Sopenharmony_ci */
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci#include <stdarg.h>
862306a36Sopenharmony_ci#include <stdlib.h>
962306a36Sopenharmony_ci#include <string.h>
1062306a36Sopenharmony_ci#include "lkc.h"
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci/* file already present in list? If not add it */
1362306a36Sopenharmony_cistruct file *file_lookup(const char *name)
1462306a36Sopenharmony_ci{
1562306a36Sopenharmony_ci	struct file *file;
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci	for (file = file_list; file; file = file->next) {
1862306a36Sopenharmony_ci		if (!strcmp(name, file->name)) {
1962306a36Sopenharmony_ci			return file;
2062306a36Sopenharmony_ci		}
2162306a36Sopenharmony_ci	}
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ci	file = xmalloc(sizeof(*file));
2462306a36Sopenharmony_ci	memset(file, 0, sizeof(*file));
2562306a36Sopenharmony_ci	file->name = xstrdup(name);
2662306a36Sopenharmony_ci	file->next = file_list;
2762306a36Sopenharmony_ci	file_list = file;
2862306a36Sopenharmony_ci	return file;
2962306a36Sopenharmony_ci}
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ci/* Allocate initial growable string */
3262306a36Sopenharmony_cistruct gstr str_new(void)
3362306a36Sopenharmony_ci{
3462306a36Sopenharmony_ci	struct gstr gs;
3562306a36Sopenharmony_ci	gs.s = xmalloc(sizeof(char) * 64);
3662306a36Sopenharmony_ci	gs.len = 64;
3762306a36Sopenharmony_ci	gs.max_width = 0;
3862306a36Sopenharmony_ci	strcpy(gs.s, "\0");
3962306a36Sopenharmony_ci	return gs;
4062306a36Sopenharmony_ci}
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ci/* Free storage for growable string */
4362306a36Sopenharmony_civoid str_free(struct gstr *gs)
4462306a36Sopenharmony_ci{
4562306a36Sopenharmony_ci	if (gs->s)
4662306a36Sopenharmony_ci		free(gs->s);
4762306a36Sopenharmony_ci	gs->s = NULL;
4862306a36Sopenharmony_ci	gs->len = 0;
4962306a36Sopenharmony_ci}
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_ci/* Append to growable string */
5262306a36Sopenharmony_civoid str_append(struct gstr *gs, const char *s)
5362306a36Sopenharmony_ci{
5462306a36Sopenharmony_ci	size_t l;
5562306a36Sopenharmony_ci	if (s) {
5662306a36Sopenharmony_ci		l = strlen(gs->s) + strlen(s) + 1;
5762306a36Sopenharmony_ci		if (l > gs->len) {
5862306a36Sopenharmony_ci			gs->s = xrealloc(gs->s, l);
5962306a36Sopenharmony_ci			gs->len = l;
6062306a36Sopenharmony_ci		}
6162306a36Sopenharmony_ci		strcat(gs->s, s);
6262306a36Sopenharmony_ci	}
6362306a36Sopenharmony_ci}
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_ci/* Append printf formatted string to growable string */
6662306a36Sopenharmony_civoid str_printf(struct gstr *gs, const char *fmt, ...)
6762306a36Sopenharmony_ci{
6862306a36Sopenharmony_ci	va_list ap;
6962306a36Sopenharmony_ci	char s[10000]; /* big enough... */
7062306a36Sopenharmony_ci	va_start(ap, fmt);
7162306a36Sopenharmony_ci	vsnprintf(s, sizeof(s), fmt, ap);
7262306a36Sopenharmony_ci	str_append(gs, s);
7362306a36Sopenharmony_ci	va_end(ap);
7462306a36Sopenharmony_ci}
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_ci/* Retrieve value of growable string */
7762306a36Sopenharmony_cichar *str_get(struct gstr *gs)
7862306a36Sopenharmony_ci{
7962306a36Sopenharmony_ci	return gs->s;
8062306a36Sopenharmony_ci}
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_civoid *xmalloc(size_t size)
8362306a36Sopenharmony_ci{
8462306a36Sopenharmony_ci	void *p = malloc(size);
8562306a36Sopenharmony_ci	if (p)
8662306a36Sopenharmony_ci		return p;
8762306a36Sopenharmony_ci	fprintf(stderr, "Out of memory.\n");
8862306a36Sopenharmony_ci	exit(1);
8962306a36Sopenharmony_ci}
9062306a36Sopenharmony_ci
9162306a36Sopenharmony_civoid *xcalloc(size_t nmemb, size_t size)
9262306a36Sopenharmony_ci{
9362306a36Sopenharmony_ci	void *p = calloc(nmemb, size);
9462306a36Sopenharmony_ci	if (p)
9562306a36Sopenharmony_ci		return p;
9662306a36Sopenharmony_ci	fprintf(stderr, "Out of memory.\n");
9762306a36Sopenharmony_ci	exit(1);
9862306a36Sopenharmony_ci}
9962306a36Sopenharmony_ci
10062306a36Sopenharmony_civoid *xrealloc(void *p, size_t size)
10162306a36Sopenharmony_ci{
10262306a36Sopenharmony_ci	p = realloc(p, size);
10362306a36Sopenharmony_ci	if (p)
10462306a36Sopenharmony_ci		return p;
10562306a36Sopenharmony_ci	fprintf(stderr, "Out of memory.\n");
10662306a36Sopenharmony_ci	exit(1);
10762306a36Sopenharmony_ci}
10862306a36Sopenharmony_ci
10962306a36Sopenharmony_cichar *xstrdup(const char *s)
11062306a36Sopenharmony_ci{
11162306a36Sopenharmony_ci	char *p;
11262306a36Sopenharmony_ci
11362306a36Sopenharmony_ci	p = strdup(s);
11462306a36Sopenharmony_ci	if (p)
11562306a36Sopenharmony_ci		return p;
11662306a36Sopenharmony_ci	fprintf(stderr, "Out of memory.\n");
11762306a36Sopenharmony_ci	exit(1);
11862306a36Sopenharmony_ci}
11962306a36Sopenharmony_ci
12062306a36Sopenharmony_cichar *xstrndup(const char *s, size_t n)
12162306a36Sopenharmony_ci{
12262306a36Sopenharmony_ci	char *p;
12362306a36Sopenharmony_ci
12462306a36Sopenharmony_ci	p = strndup(s, n);
12562306a36Sopenharmony_ci	if (p)
12662306a36Sopenharmony_ci		return p;
12762306a36Sopenharmony_ci	fprintf(stderr, "Out of memory.\n");
12862306a36Sopenharmony_ci	exit(1);
12962306a36Sopenharmony_ci}
130