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 */ 14struct 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 */ 35int 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 */ 81struct 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 */ 92void 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 */ 101void 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 */ 115void 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 */ 126const char *str_get(struct gstr *gs) 127{ 128 return gs->s; 129} 130 131void *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 140void *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