yann@1: /* yann@1: * Copyright (C) 2002-2005 Roman Zippel yann@1: * Copyright (C) 2002-2005 Sam Ravnborg yann@1: * yann@1: * Released under the terms of the GNU GPL v2.0. yann@1: */ yann@1: yann@1: #include yann@1: #include "lkc.h" yann@1: yann@1: /* file already present in list? If not add it */ yann@1: struct file *file_lookup(const char *name) yann@1: { yann@1: struct file *file; yann@1: yann@1: for (file = file_list; file; file = file->next) { yann@1: if (!strcmp(name, file->name)) yann@1: return file; yann@1: } yann@1: yann@1: file = malloc(sizeof(*file)); yann@1: memset(file, 0, sizeof(*file)); yann@1: file->name = strdup(name); yann@1: file->next = file_list; yann@1: file_list = file; yann@1: return file; yann@1: } yann@1: yann@1: /* write a dependency file as used by kbuild to track dependencies */ yann@1: int file_write_dep(const char *name) yann@1: { yann@943: struct symbol *sym, *env_sym; yann@943: struct expr *e; yann@1: struct file *file; yann@1: FILE *out; yann@1: yann@1: if (!name) yann@1: name = ".kconfig.d"; yann@1: out = fopen("..config.tmp", "w"); yann@1: if (!out) yann@1: return 1; yann@1: fprintf(out, "deps_config := \\\n"); yann@1: for (file = file_list; file; file = file->next) { yann@1: if (file->next) yann@1: fprintf(out, "\t%s \\\n", file->name); yann@1: else yann@1: fprintf(out, "\t%s\n", file->name); yann@1: } yann@1: fprintf(out, "\ninclude/config/auto.conf: \\\n" yann@943: "\t$(deps_config)\n\n"); yann@943: yann@943: expr_list_for_each_sym(sym_env_list, e, sym) { yann@943: struct property *prop; yann@943: const char *value; yann@943: yann@943: prop = sym_get_env_prop(sym); yann@943: env_sym = prop_get_symbol(prop); yann@943: if (!env_sym) yann@943: continue; yann@943: value = getenv(env_sym->name); yann@943: if (!value) yann@943: value = ""; yann@943: fprintf(out, "ifneq \"$(%s)\" \"%s\"\n", env_sym->name, value); yann@943: fprintf(out, "include/config/auto.conf: FORCE\n"); yann@943: fprintf(out, "endif\n"); yann@943: } yann@943: yann@943: fprintf(out, "\n$(deps_config): ;\n"); yann@1: fclose(out); yann@1: rename("..config.tmp", name); yann@1: return 0; yann@1: } yann@1: yann@1: yann@1: /* Allocate initial growable sting */ yann@1: struct gstr str_new(void) yann@1: { yann@1: struct gstr gs; yann@1: gs.s = malloc(sizeof(char) * 64); yann@943: gs.len = 64; yann@1: strcpy(gs.s, "\0"); yann@1: return gs; yann@1: } yann@1: yann@1: /* Allocate and assign growable string */ yann@1: struct gstr str_assign(const char *s) yann@1: { yann@1: struct gstr gs; yann@1: gs.s = strdup(s); yann@1: gs.len = strlen(s) + 1; yann@1: return gs; yann@1: } yann@1: yann@1: /* Free storage for growable string */ yann@1: void str_free(struct gstr *gs) yann@1: { yann@1: if (gs->s) yann@1: free(gs->s); yann@1: gs->s = NULL; yann@1: gs->len = 0; yann@1: } yann@1: yann@1: /* Append to growable string */ yann@1: void str_append(struct gstr *gs, const char *s) yann@1: { yann@943: size_t l; yann@943: if (s) { yann@943: l = strlen(gs->s) + strlen(s) + 1; yann@943: if (l > gs->len) { yann@943: gs->s = realloc(gs->s, l); yann@943: gs->len = l; yann@943: } yann@943: strcat(gs->s, s); yann@1: } yann@1: } yann@1: yann@1: /* Append printf formatted string to growable string */ yann@1: void str_printf(struct gstr *gs, const char *fmt, ...) yann@1: { yann@1: va_list ap; yann@1: char s[10000]; /* big enough... */ yann@1: va_start(ap, fmt); yann@1: vsnprintf(s, sizeof(s), fmt, ap); yann@1: str_append(gs, s); yann@1: va_end(ap); yann@1: } yann@1: yann@1: /* Retrieve value of growable string */ yann@1: const char *str_get(struct gstr *gs) yann@1: { yann@1: return gs->s; yann@1: } yann@1: