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