Home | History | Annotate | Download | only in kconfig
      1 /*
      2  * Copyright (C) 2002-2005 Roman Zippel <zippel (at) linux-m68k.org>
      3  * Copyright (C) 2002-2005 Sam Ravnborg <sam (at) ravnborg.org>
      4  *
      5  * Released under the terms of the GNU GPL v2.0.
      6  */
      7 
      8 #include <string.h>
      9 #include "lkc.h"
     10 
     11 /* file already present in list? If not add it */
     12 struct file *file_lookup(const char *name)
     13 {
     14 	struct file *file;
     15 
     16 	for (file = file_list; file; file = file->next) {
     17 		if (!strcmp(name, file->name))
     18 			return file;
     19 	}
     20 
     21 	file = malloc(sizeof(*file));
     22 	memset(file, 0, sizeof(*file));
     23 	file->name = strdup(name);
     24 	file->next = file_list;
     25 	file_list = file;
     26 	return file;
     27 }
     28 
     29 /* write a dependency file as used by kbuild to track dependencies */
     30 int file_write_dep(const char *name)
     31 {
     32 	struct file *file;
     33 	FILE *out;
     34 
     35 	if (!name)
     36 		name = ".kconfig.d";
     37 	out = fopen("..config.tmp", "w");
     38 	if (!out)
     39 		return 1;
     40 	fprintf(out, "deps_config := \\\n");
     41 	for (file = file_list; file; file = file->next) {
     42 		if (file->next)
     43 			fprintf(out, "\t%s \\\n", file->name);
     44 		else
     45 			fprintf(out, "\t%s\n", file->name);
     46 	}
     47 	fprintf(out, "\ninclude/config/auto.conf: \\\n"
     48 		     "\t$(deps_config)\n\n"
     49 		     "$(deps_config): ;\n");
     50 	fclose(out);
     51 	rename("..config.tmp", name);
     52 	return 0;
     53 }
     54 
     55 
     56 /* Allocate initial growable sting */
     57 struct gstr str_new(void)
     58 {
     59 	struct gstr gs;
     60 	gs.s = malloc(sizeof(char) * 64);
     61 	gs.len = 16;
     62 	strcpy(gs.s, "\0");
     63 	return gs;
     64 }
     65 
     66 /* Allocate and assign growable string */
     67 struct gstr str_assign(const char *s)
     68 {
     69 	struct gstr gs;
     70 	gs.s = strdup(s);
     71 	gs.len = strlen(s) + 1;
     72 	return gs;
     73 }
     74 
     75 /* Free storage for growable string */
     76 void str_free(struct gstr *gs)
     77 {
     78 	if (gs->s)
     79 		free(gs->s);
     80 	gs->s = NULL;
     81 	gs->len = 0;
     82 }
     83 
     84 /* Append to growable string */
     85 void str_append(struct gstr *gs, const char *s)
     86 {
     87 	size_t l = strlen(gs->s) + strlen(s) + 1;
     88 	if (l > gs->len) {
     89 		gs->s   = realloc(gs->s, l);
     90 		gs->len = l;
     91 	}
     92 	strcat(gs->s, s);
     93 }
     94 
     95 /* Append printf formatted string to growable string */
     96 void str_printf(struct gstr *gs, const char *fmt, ...)
     97 {
     98 	va_list ap;
     99 	char s[10000]; /* big enough... */
    100 	va_start(ap, fmt);
    101 	vsnprintf(s, sizeof(s), fmt, ap);
    102 	str_append(gs, s);
    103 	va_end(ap);
    104 }
    105 
    106 /* Retrieve value of growable string */
    107 const char *str_get(struct gstr *gs)
    108 {
    109 	return gs->s;
    110 }
    111 
    112