summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog9
-rw-r--r--expand.c10
-rw-r--r--function.c11
-rw-r--r--tests/ChangeLog7
-rw-r--r--tests/scripts/functions/eval25
-rw-r--r--tests/scripts/functions/if24
6 files changed, 72 insertions, 14 deletions
diff --git a/ChangeLog b/ChangeLog
index e56732a..4a28b1c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2003-11-02 Paul D. Smith <psmith@gnu.org>
+
+ * function.c (func_if): Strip all the trailing whitespace from the
+ condition, then don't expand it. Fixed bug # 5798.
+
+ * expand.c (recursively_expand_for_file): If we're expanding a
+ variable with no file context, then use the variable's context.
+ Fixes bug # 6195.
+
2003-10-21 Paul D. Smith <psmith@gnu.org>
* main.c (log_working_directory): Add newlines to printf()s.
diff --git a/expand.c b/expand.c
index 922b1e3..8f9f4b1 100644
--- a/expand.c
+++ b/expand.c
@@ -97,6 +97,7 @@ recursively_expand_for_file (struct variable *v, struct file *file)
{
char *value;
struct variable_set_list *save = 0;
+ int set_reading = 0;
if (v->expanding)
{
@@ -114,6 +115,13 @@ recursively_expand_for_file (struct variable *v, struct file *file)
current_variable_set_list = file->variables;
}
+ /* If we have no other file-reading context, use the variable's context. */
+ if (!reading_file)
+ {
+ set_reading = 1;
+ reading_file = &v->fileinfo;
+ }
+
v->expanding = 1;
if (v->append)
value = allocated_variable_append (v);
@@ -121,6 +129,8 @@ recursively_expand_for_file (struct variable *v, struct file *file)
value = allocated_variable_expand (v->value);
v->expanding = 0;
+ if (set_reading)
+ reading_file = 0;
if (file)
current_variable_set_list = save;
diff --git a/function.c b/function.c
index d05a5bb..8100a8f 100644
--- a/function.c
+++ b/function.c
@@ -678,6 +678,11 @@ func_words (char *o, char **argv, const char *funcname)
return o;
}
+/* Set begpp to point to the first non-whitespace character of the string,
+ * and endpp to point to the last non-whitespace character of the string.
+ * If the string is empty or contains nothing but whitespace, endpp will be
+ * begpp-1.
+ */
static char *
strip_whitespace (const char **begpp, const char **endpp)
{
@@ -1134,7 +1139,7 @@ static char *
func_if (char *o, char **argv, const char *funcname)
{
const char *begp = argv[0];
- const char *endp = begp + strlen (argv[0]);
+ const char *endp = begp + strlen (argv[0]) - 1;
int result = 0;
/* Find the result of the condition: if we have a value, and it's not
@@ -1143,9 +1148,9 @@ func_if (char *o, char **argv, const char *funcname)
strip_whitespace (&begp, &endp);
- if (begp < endp)
+ if (begp <= endp)
{
- char *expansion = expand_argument (begp, NULL);
+ char *expansion = expand_argument (begp, endp+1);
result = strlen (expansion);
free (expansion);
diff --git a/tests/ChangeLog b/tests/ChangeLog
index 3880e8a..0f6da1b 100644
--- a/tests/ChangeLog
+++ b/tests/ChangeLog
@@ -1,3 +1,10 @@
+2003-11-02 Paul D. Smith <psmith@gnu.org>
+
+ * scripts/functions/if: Test if on conditionals with trailing
+ whitespace--bug #5798.
+
+ * scripts/functions/eval: Test eval in a non-file context--bug #6195.
+
2003-04-19 Paul D. Smith <psmith@gnu.org>
* scripts/features/patspecific_vars: Test multiple patterns
diff --git a/tests/scripts/functions/eval b/tests/scripts/functions/eval
index cfb27b2..372aaf8 100644
--- a/tests/scripts/functions/eval
+++ b/tests/scripts/functions/eval
@@ -109,4 +109,29 @@ close(MAKEFILE);
$answer = "[ 9 8 7 6 5 4 3 2 1 0 ]\n";
&compare_output($answer,&get_logfile(1));
+
+# TEST eval with no filename context.
+# The trick here is that because EVAR is taken from the environment, it must
+# be evaluated before every command is invoked. Make sure that works, when
+# we have no file context for reading_file (bug # 6195)
+
+$makefile4 = &get_tmpfile;
+
+open(MAKEFILE,"> $makefile4");
+
+print MAKEFILE <<'EOF';
+EVAR = $(eval FOBAR = 1)
+all: ; @echo "OK"
+
+EOF
+
+close(MAKEFILE);
+
+$ENV{EVAR} = '1';
+&run_make_with_options($makefile4, "", &get_logfile);
+$answer = "OK\n";
+&compare_output($answer,&get_logfile(1));
+
+delete $ENV{EVAR};
+
1;
diff --git a/tests/scripts/functions/if b/tests/scripts/functions/if
index fa2d0df..8604e4f 100644
--- a/tests/scripts/functions/if
+++ b/tests/scripts/functions/if
@@ -8,24 +8,26 @@ open(MAKEFILE, "> $makefile");
print MAKEFILE <<EOMAKE;
NEQ = \$(subst \$1,,\$2)
+e =
all:
-\t\@echo \$(if ,true,false)
-\t\@echo \$(if ,true,)
-\t\@echo \$(if ,true)
-\t\@echo \$(if z,true,false)
-\t\@echo \$(if z,true,\$(shell echo hi))
-\t\@echo \$(if ,\$(shell echo hi),false)
-\t\@echo \$(if \$(call NEQ,a,b),true,false)
-\t\@echo \$(if \$(call NEQ,a,a),true,false)
-\t\@echo \$(if z,true,fal,se) hi
-\t\@echo \$(if ,true,fal,se)there
+\t\@echo 1 \$(if ,true,false)
+\t\@echo 2 \$(if ,true,)
+\t\@echo 3 \$(if ,true)
+\t\@echo 4 \$(if z,true,false)
+\t\@echo 5 \$(if z,true,\$(shell echo hi))
+\t\@echo 6 \$(if ,\$(shell echo hi),false)
+\t\@echo 7 \$(if \$(call NEQ,a,b),true,false)
+\t\@echo 8 \$(if \$(call NEQ,a,a),true,false)
+\t\@echo 9 \$(if z,true,fal,se) hi
+\t\@echo 10 \$(if ,true,fal,se)there
+\t\@echo 11 \$(if \$(e) ,true,false)
EOMAKE
close(MAKEFILE);
&run_make_with_options($makefile, "", &get_logfile);
-$answer = "false\n\n\ntrue\ntrue\nfalse\ntrue\nfalse\ntrue hi\nfal,sethere\n";
+$answer = "1 false\n2\n3\n4 true\n5 true\n6 false\n7 true\n8 false\n9 true hi\n10 fal,sethere\n11 false\n";
&compare_output($answer, &get_logfile(1));
1;