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@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@1: "\t$(deps_config)\n\n" yann@1: "$(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@1: gs.len = 16; 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@1: size_t l = strlen(gs->s) + strlen(s) + 1; yann@1: if (l > gs->len) { yann@1: gs->s = realloc(gs->s, l); yann@1: gs->len = l; yann@1: } yann@1: strcat(gs->s, s); 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: