diff options
-rw-r--r-- | ChangeLog | 9 | ||||
-rw-r--r-- | expand.c | 10 | ||||
-rw-r--r-- | function.c | 11 | ||||
-rw-r--r-- | tests/ChangeLog | 7 | ||||
-rw-r--r-- | tests/scripts/functions/eval | 25 | ||||
-rw-r--r-- | tests/scripts/functions/if | 24 |
6 files changed, 72 insertions, 14 deletions
@@ -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. @@ -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; @@ -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; |