at for-next 1.9 kB view raw
1// SPDX-License-Identifier: GPL-2.0 2/* 3 * Copyright (C) 2002-2005 Roman Zippel <zippel@linux-m68k.org> 4 * Copyright (C) 2002-2005 Sam Ravnborg <sam@ravnborg.org> 5 */ 6 7#include <stdarg.h> 8#include <stdlib.h> 9#include <string.h> 10 11#include <hash.h> 12#include <hashtable.h> 13#include <xalloc.h> 14#include "lkc.h" 15 16/* hash table of all parsed Kconfig files */ 17static HASHTABLE_DEFINE(file_hashtable, 1U << 11); 18 19struct file { 20 struct hlist_node node; 21 char name[]; 22}; 23 24/* file already present in list? If not add it */ 25const char *file_lookup(const char *name) 26{ 27 struct file *file; 28 size_t len; 29 int hash = hash_str(name); 30 31 hash_for_each_possible(file_hashtable, file, node, hash) 32 if (!strcmp(name, file->name)) 33 return file->name; 34 35 len = strlen(name); 36 file = xmalloc(sizeof(*file) + len + 1); 37 memset(file, 0, sizeof(*file)); 38 memcpy(file->name, name, len); 39 file->name[len] = '\0'; 40 41 hash_add(file_hashtable, &file->node, hash); 42 43 str_printf(&autoconf_cmd, "\t%s \\\n", name); 44 45 return file->name; 46} 47 48/* Allocate initial growable string */ 49struct gstr str_new(void) 50{ 51 struct gstr gs; 52 gs.s = xmalloc(sizeof(char) * 64); 53 gs.len = 64; 54 gs.max_width = 0; 55 strcpy(gs.s, "\0"); 56 return gs; 57} 58 59/* Free storage for growable string */ 60void str_free(struct gstr *gs) 61{ 62 free(gs->s); 63 gs->s = NULL; 64 gs->len = 0; 65} 66 67/* Append to growable string */ 68void str_append(struct gstr *gs, const char *s) 69{ 70 size_t l; 71 if (s) { 72 l = strlen(gs->s) + strlen(s) + 1; 73 if (l > gs->len) { 74 gs->s = xrealloc(gs->s, l); 75 gs->len = l; 76 } 77 strcat(gs->s, s); 78 } 79} 80 81/* Append printf formatted string to growable string */ 82void str_printf(struct gstr *gs, const char *fmt, ...) 83{ 84 va_list ap; 85 char s[10000]; /* big enough... */ 86 va_start(ap, fmt); 87 vsnprintf(s, sizeof(s), fmt, ap); 88 str_append(gs, s); 89 va_end(ap); 90} 91 92/* Retrieve value of growable string */ 93char *str_get(const struct gstr *gs) 94{ 95 return gs->s; 96}