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