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