kconfig/util.c
author Arnaud Lacombe <lacombar@gmail.com>
Tue Aug 03 06:17:51 2010 +0200 (2010-08-03)
changeset 2064 f5ebe8c429dc
parent 1 eeea35fbf182
child 2448 a103abae1560
permissions -rw-r--r--
libc/uClibc: add uClibc 0.9.30.3

This version has been released a couple of month ago, but it never reached
crosstool-ng tree. This may be linked to the fact that the current 0.9.30.2,
once patched, has nothing much different from 0.9.30.3, released.

I'm not including any patch with this upgrade, on purpose.

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