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 #include "lkc.h" 11 12 /* file already present in list? If not add it */ 13 struct file *file_lookup(const char *name) 14 { 15 struct file *file; 16 17 for (file = file_list; file; file = file->next) { 18 if (!strcmp(name, file->name)) { 19 return file; 20 } 21 } 22 23 file = xmalloc(sizeof(*file)); 24 memset(file, 0, sizeof(*file)); 25 file->name = xstrdup(name); 26 file->next = file_list; 27 file_list = file; 28 return file; 29 } 30 31 /* Allocate initial growable string */ 32 struct gstr str_new(void) 33 { 34 struct gstr gs; 35 gs.s = xmalloc(sizeof(char) * 64); 36 gs.len = 64; 37 gs.max_width = 0; 38 strcpy(gs.s, "\0"); 39 return gs; 40 } 41 42 /* Free storage for growable string */ 43 void str_free(struct gstr *gs) 44 { 45 if (gs->s) 46 free(gs->s); 47 gs->s = NULL; 48 gs->len = 0; 49 } 50 51 /* Append to growable string */ 52 void str_append(struct gstr *gs, const char *s) 53 { 54 size_t l; 55 if (s) { 56 l = strlen(gs->s) + strlen(s) + 1; 57 if (l > gs->len) { 58 gs->s = xrealloc(gs->s, l); 59 gs->len = l; 60 } 61 strcat(gs->s, s); 62 } 63 } 64 65 /* Append printf formatted string to growable string */ 66 void str_printf(struct gstr *gs, const char *fmt, ...) 67 { 68 va_list ap; 69 char s[10000]; /* big enough... */ 70 va_start(ap, fmt); 71 vsnprintf(s, sizeof(s), fmt, ap); 72 str_append(gs, s); 73 va_end(ap); 74 } 75 76 /* Retrieve value of growable string */ 77 const char *str_get(struct gstr *gs) 78 { 79 return gs->s; 80 } 81 82 void *xmalloc(size_t size) 83 { 84 void *p = malloc(size); 85 if (p) 86 return p; 87 fprintf(stderr, "Out of memory.\n"); 88 exit(1); 89 } 90 91 void *xcalloc(size_t nmemb, size_t size) 92 { 93 void *p = calloc(nmemb, size); 94 if (p) 95 return p; 96 fprintf(stderr, "Out of memory.\n"); 97 exit(1); 98 } 99 100 void *xrealloc(void *p, size_t size) 101 { 102 p = realloc(p, size); 103 if (p) 104 return p; 105 fprintf(stderr, "Out of memory.\n"); 106 exit(1); 107 } 108 109 char *xstrdup(const char *s) 110 { 111 char *p; 112 113 p = strdup(s); 114 if (p) 115 return p; 116 fprintf(stderr, "Out of memory.\n"); 117 exit(1); 118 } 119 120 char *xstrndup(const char *s, size_t n) 121 { 122 char *p; 123 124 p = strndup(s, n); 125 if (p) 126 return p; 127 fprintf(stderr, "Out of memory.\n"); 128 exit(1); 129 } 130