util.c
1 /* 2 * Copyright (C) 2002-2005 Roman Zippel <zippel@linux-m68k.org> 3 * Copyright (C) 2002-2005 Sam Ravnborg <sam@ravnborg.org> 4 * 5 * Released under the terms of the GNU GPL v2.0. 6 */ 7 8 #include <stdarg.h> 9 #include <stdlib.h> 10 #include <string.h> 11 #include "lkc.h" 12 13 /* file already present in list? If not add it */ 14 struct file *file_lookup(const char *name) 15 { 16 struct file *file; 17 const char *file_name = sym_expand_string_value(name); 18 19 for (file = file_list; file; file = file->next) { 20 if (!strcmp(name, file->name)) { 21 free((void *)file_name); 22 return file; 23 } 24 } 25 26 file = xmalloc(sizeof(*file)); 27 memset(file, 0, sizeof(*file)); 28 file->name = file_name; 29 file->next = file_list; 30 file_list = file; 31 return file; 32 } 33 34 /* write a dependency file as used by kbuild to track dependencies */ 35 int file_write_dep(const char *name) 36 { 37 struct symbol *sym, *env_sym; 38 struct expr *e; 39 struct file *file; 40 FILE *out; 41 42 if (!name) 43 name = ".kconfig.d"; 44 out = fopen("..config.tmp", "w"); 45 if (!out) 46 return 1; 47 fprintf(out, "deps_config := \\\n"); 48 for (file = file_list; file; file = file->next) { 49 if (file->next) 50 fprintf(out, "\t%s \\\n", file->name); 51 else 52 fprintf(out, "\t%s\n", file->name); 53 } 54 fprintf(out, "\n%s: \\\n" 55 "\t$(deps_config)\n\n", conf_get_autoconfig_name()); 56 57 expr_list_for_each_sym(sym_env_list, e, sym) { 58 struct property *prop; 59 const char *value; 60 61 prop = sym_get_env_prop(sym); 62 env_sym = prop_get_symbol(prop); 63 if (!env_sym) 64 continue; 65 value = getenv(env_sym->name); 66 if (!value) 67 value = ""; 68 fprintf(out, "ifneq \"$(%s)\" \"%s\"\n", env_sym->name, value); 69 fprintf(out, "%s: FORCE\n", conf_get_autoconfig_name()); 70 fprintf(out, "endif\n"); 71 } 72 73 fprintf(out, "\n$(deps_config): ;\n"); 74 fclose(out); 75 rename("..config.tmp", name); 76 return 0; 77 } 78 79 /* Allocate initial growable string */ 80 struct gstr str_new(void) 81 { 82 struct gstr gs; 83 gs.s = xmalloc(sizeof(char) * 64); 84 gs.len = 64; 85 gs.max_width = 0; 86 strcpy(gs.s, "\0"); 87 return gs; 88 } 89 90 /* Allocate and assign growable string */ 91 struct gstr str_assign(const char *s) 92 { 93 struct gstr gs; 94 gs.s = strdup(s); 95 gs.len = strlen(s) + 1; 96 gs.max_width = 0; 97 return gs; 98 } 99 100 /* Free storage for growable string */ 101 void str_free(struct gstr *gs) 102 { 103 if (gs->s) 104 free(gs->s); 105 gs->s = NULL; 106 gs->len = 0; 107 } 108 109 /* Append to growable string */ 110 void str_append(struct gstr *gs, const char *s) 111 { 112 size_t l; 113 if (s) { 114 l = strlen(gs->s) + strlen(s) + 1; 115 if (l > gs->len) { 116 gs->s = realloc(gs->s, l); 117 gs->len = l; 118 } 119 strcat(gs->s, s); 120 } 121 } 122 123 /* Append printf formatted string to growable string */ 124 void str_printf(struct gstr *gs, const char *fmt, ...) 125 { 126 va_list ap; 127 char s[10000]; /* big enough... */ 128 va_start(ap, fmt); 129 vsnprintf(s, sizeof(s), fmt, ap); 130 str_append(gs, s); 131 va_end(ap); 132 } 133 134 /* Retrieve value of growable string */ 135 const char *str_get(struct gstr *gs) 136 { 137 return gs->s; 138 } 139 140 void *xmalloc(size_t size) 141 { 142 void *p = malloc(size); 143 if (p) 144 return p; 145 fprintf(stderr, "Out of memory.\n"); 146 exit(1); 147 } 148 149 void *xcalloc(size_t nmemb, size_t size) 150 { 151 void *p = calloc(nmemb, size); 152 if (p) 153 return p; 154 fprintf(stderr, "Out of memory.\n"); 155 exit(1); 156 }