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 */ 17 static HASHTABLE_DEFINE(file_hashtable, 1U << 11); 18 19 struct file { 20 struct hlist_node node; 21 char name[]; 22 }; 23 24 /* file already present in list? If not add it */ 25 const 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 */ 49 struct 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 */ 60 void 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 */ 68 void 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 */ 82 void 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 */ 93 char *str_get(const struct gstr *gs) 94 { 95 return gs->s; 96 } 97