From e286a674419d31cb0757dd2f8307d8b4756cf1f9 Mon Sep 17 00:00:00 2001 From: Bernhard Reutner-Fischer Date: Sun, 3 Nov 2013 23:27:46 +0100 Subject: pull kconfig from linux-3.11 Signed-off-by: Bernhard Reutner-Fischer --- extra/config/util.c | 68 +++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 58 insertions(+), 10 deletions(-) (limited to 'extra/config/util.c') diff --git a/extra/config/util.c b/extra/config/util.c index 3cc9f9369..f1374e6de 100644 --- a/extra/config/util.c +++ b/extra/config/util.c @@ -5,6 +5,8 @@ * Released under the terms of the GNU GPL v2.0. */ +#include +#include #include #include "lkc.h" @@ -12,15 +14,18 @@ struct file *file_lookup(const char *name) { struct file *file; + const char *file_name = sym_expand_string_value(name); for (file = file_list; file; file = file->next) { - if (!strcmp(name, file->name)) + if (!strcmp(name, file->name)) { + free((void *)file_name); return file; + } } - file = malloc(sizeof(*file)); + file = xmalloc(sizeof(*file)); memset(file, 0, sizeof(*file)); - file->name = strdup(name); + file->name = file_name; file->next = file_list; file_list = file; return file; @@ -32,11 +37,15 @@ int file_write_dep(const char *name) struct symbol *sym, *env_sym; struct expr *e; struct file *file; + char tmpf[PATH_MAX+1]; FILE *out; if (!name) name = ".kconfig.d"; - out = fopen("..config.tmp", "w"); + strcpy(tmpf, name); + dir_name(tmpf); + strcat(tmpf, "..config.tmp"); + out = fopen(tmpf, "w"); if (!out) return 1; fprintf(out, "deps_config := \\\n"); @@ -46,8 +55,8 @@ int file_write_dep(const char *name) else fprintf(out, "\t%s\n", file->name); } - fprintf(out, "\ninclude/config/auto.conf: \\\n" - "\t$(deps_config)\n\n"); + fprintf(out, "\n%s: \\\n" + "\t$(deps_config)\n\n", conf_get_autoconfig_name()); expr_list_for_each_sym(sym_env_list, e, sym) { struct property *prop; @@ -61,23 +70,24 @@ int file_write_dep(const char *name) if (!value) value = ""; fprintf(out, "ifneq \"$(%s)\" \"%s\"\n", env_sym->name, value); - fprintf(out, "include/config/auto.conf: FORCE\n"); + fprintf(out, "%s: FORCE\n", conf_get_autoconfig_name()); fprintf(out, "endif\n"); } fprintf(out, "\n$(deps_config): ;\n"); fclose(out); - rename("..config.tmp", name); + rename(tmpf, name); return 0; } -/* Allocate initial growable sting */ +/* Allocate initial growable string */ struct gstr str_new(void) { struct gstr gs; - gs.s = malloc(sizeof(char) * 64); + gs.s = xmalloc(sizeof(char) * 64); gs.len = 64; + gs.max_width = 0; strcpy(gs.s, "\0"); return gs; } @@ -88,6 +98,7 @@ struct gstr str_assign(const char *s) struct gstr gs; gs.s = strdup(s); gs.len = strlen(s) + 1; + gs.max_width = 0; return gs; } @@ -131,3 +142,40 @@ const char *str_get(struct gstr *gs) return gs->s; } +void *xmalloc(size_t size) +{ + void *p = malloc(size); + if (p) + return p; + fprintf(stderr, "Out of memory.\n"); + exit(1); +} + +void *xcalloc(size_t nmemb, size_t size) +{ + void *p = calloc(nmemb, size); + if (p) + return p; + fprintf(stderr, "Out of memory.\n"); + exit(1); +} + +/* basename, dirname - parse pathname components */ +char *dir_name(char *path) +{ + char *slash = strrchr(path, '/'); + int size = 0; + if (slash) + size = slash - path + 1; + path[size] = 0; + return path; +} +char *base_name(char *path) +{ + char *slash = strrchr(path, '/'); + if (slash) + path += slash - path + 1; + return path; + +} + -- cgit v1.2.3