From ee3d37a591cf2db3dd1444b2c1e2fcb041f68d33 Mon Sep 17 00:00:00 2001 From: Paul Smith Date: Tue, 4 Nov 2003 07:40:29 +0000 Subject: Fix bugs 5798 and 6195. --- ChangeLog | 9 +++++++++ expand.c | 10 ++++++++++ function.c | 11 ++++++++--- tests/ChangeLog | 7 +++++++ tests/scripts/functions/eval | 25 +++++++++++++++++++++++++ tests/scripts/functions/if | 24 +++++++++++++----------- 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 + + * 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 * 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 + + * 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 * 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 <