projects
/
carl9170fw.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
kconfig: rename file_write_dep and move it to confdata.c
[carl9170fw.git]
/
config
/
preprocess.c
diff --git
a/config/preprocess.c
b/config/preprocess.c
index 5ee58eeb9a7d954d8d5b849211835147a88da8dc..5ca2df790d3cfa5f4253a33a303219aaa8fc4394 100644
(file)
--- a/
config/preprocess.c
+++ b/
config/preprocess.c
@@
-114,6
+114,11
@@
static char *do_error_if(int argc, char *argv[])
return NULL;
}
return NULL;
}
+static char *do_filename(int argc, char *argv[])
+{
+ return xstrdup(current_file->name);
+}
+
static char *do_info(int argc, char *argv[])
{
printf("%s\n", argv[0]);
static char *do_info(int argc, char *argv[])
{
printf("%s\n", argv[0]);
@@
-121,6
+126,15
@@
static char *do_info(int argc, char *argv[])
return xstrdup("");
}
return xstrdup("");
}
+static char *do_lineno(int argc, char *argv[])
+{
+ char buf[16];
+
+ sprintf(buf, "%d", yylineno);
+
+ return xstrdup(buf);
+}
+
static char *do_shell(int argc, char *argv[])
{
FILE *p;
static char *do_shell(int argc, char *argv[])
{
FILE *p;
@@
-142,7
+156,7
@@
static char *do_shell(int argc, char *argv[])
nread--;
/* remove trailing new lines */
nread--;
/* remove trailing new lines */
- while (buf[nread - 1] == '\n')
+ while (
nread > 0 &&
buf[nread - 1] == '\n')
nread--;
buf[nread] = 0;
nread--;
buf[nread] = 0;
@@
-173,7
+187,9
@@
static char *do_warning_if(int argc, char *argv[])
static const struct function function_table[] = {
/* Name MIN MAX Function */
{ "error-if", 2, 2, do_error_if },
static const struct function function_table[] = {
/* Name MIN MAX Function */
{ "error-if", 2, 2, do_error_if },
+ { "filename", 0, 0, do_filename },
{ "info", 1, 1, do_info },
{ "info", 1, 1, do_info },
+ { "lineno", 0, 0, do_lineno },
{ "shell", 1, 1, do_shell },
{ "warning-if", 2, 2, do_warning_if },
};
{ "shell", 1, 1, do_shell },
{ "warning-if", 2, 2, do_warning_if },
};
@@
-213,6
+229,7
@@
struct variable {
char *name;
char *value;
enum variable_flavor flavor;
char *name;
char *value;
enum variable_flavor flavor;
+ int exp_count;
struct list_head node;
};
struct list_head node;
};
@@
-237,11
+254,22
@@
static char *variable_expand(const char *name, int argc, char *argv[])
if (!v)
return NULL;
if (!v)
return NULL;
+ if (argc == 0 && v->exp_count)
+ pperror("Recursive variable '%s' references itself (eventually)",
+ name);
+
+ if (v->exp_count > 1000)
+ pperror("Too deep recursive expansion");
+
+ v->exp_count++;
+
if (v->flavor == VAR_RECURSIVE)
res = expand_string_with_args(v->value, argc, argv);
else
res = xstrdup(v->value);
if (v->flavor == VAR_RECURSIVE)
res = expand_string_with_args(v->value, argc, argv);
else
res = xstrdup(v->value);
+ v->exp_count--;
+
return res;
}
return res;
}
@@
-268,6
+296,7
@@
void variable_add(const char *name, const char *value,
v = xmalloc(sizeof(*v));
v->name = xstrdup(name);
v = xmalloc(sizeof(*v));
v->name = xstrdup(name);
+ v->exp_count = 0;
list_add_tail(&v->node, &variable_list);
}
list_add_tail(&v->node, &variable_list);
}