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 80 /* Allocate initial growable string */ 81 struct gstr str_new(void) 82 { 83 struct gstr gs; 84 gs.s = xmalloc(sizeof(char) * 64); 85 gs.len = 64; 86 gs.max_width = 0; 87 strcpy(gs.s, "\0"); 88 return gs; 89 } 90 91 /* Allocate and assign growable string */ 92 struct gstr str_assign(const char *s) 93 { 94 struct gstr gs; 95 gs.s = strdup(s); 96 gs.len = strlen(s) + 1; 97 gs.max_width = 0; 98 return gs; 99 } 100 101 /* Free storage for growable string */ 102 void str_free(struct gstr *gs) 103 { 104 if (gs->s) 105 free(gs->s); 106 gs->s = NULL; 107 gs->len = 0; 108 } 109 110 /* Append to growable string */ 111 void str_append(struct gstr *gs, const char *s) 112 { 113 size_t l; 114 if (s) { 115 l = strlen(gs->s) + strlen(s) + 1; 116 if (l > gs->len) { 117 gs->s = realloc(gs->s, l); 118 gs->len = l; 119 } 120 strcat(gs->s, s); 121 } 122 } 123 124 /* Append printf formatted string to growable string */ 125 void str_printf(struct gstr *gs, const char *fmt, ...) 126 { 127 va_list ap; 128 char s[10000]; /* big enough... */ 129 va_start(ap, fmt); 130 vsnprintf(s, sizeof(s), fmt, ap); 131 str_append(gs, s); 132 va_end(ap); 133 } 134 135 /* Retrieve value of growable string */ 136 const char *str_get(struct gstr *gs) 137 { 138 return gs->s; 139 } 140 141 void *xmalloc(size_t size) 142 { 143 void *p = malloc(size); 144 if (p) 145 return p; 146 fprintf(stderr, "Out of memory.\n"); 147 exit(1); 148 } 149 150 void *xcalloc(size_t nmemb, size_t size) 151 { 152 void *p = calloc(nmemb, size); 153 if (p) 154 return p; 155 fprintf(stderr, "Out of memory.\n"); 156 exit(1); 157 } 158 159 160