From 665a267a4b9c318fa2ea3b32523392c715c9fd74 Mon Sep 17 00:00:00 2001 From: psmith Date: Thu, 30 Jan 2003 06:21:36 +0000 Subject: [PATCH] Enhancement (bug #2407) Make error messages more clear. --- ChangeLog | 10 ++++++++ expand.c | 14 +++++----- function.c | 36 +++++++++++--------------- tests/ChangeLog | 5 ++++ tests/scripts/functions/word | 61 ++++++++++++++++++++++++++++++++------------ variable.h | 2 +- 6 files changed, 81 insertions(+), 47 deletions(-) diff --git a/ChangeLog b/ChangeLog index 903a64f..8f7aef2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2003-01-30 Paul D. Smith + + * function.c (check_numeric): Combine the is_numeric() function + into this function, since it's only called from one place. + Constify this function. Have it print the incorrect string in the + error message. Fixes bug #2407. + (strip_whitespace): Constify. + (func_if): Constify. + * expand.c (expand_argument): Constify. + 2003-01-29 Paul D. Smith Fix bug # 2169, also reported by other people on various systems. diff --git a/expand.c b/expand.c index ac4ccda..922b1e3 100644 --- a/expand.c +++ b/expand.c @@ -411,7 +411,7 @@ variable_expand (char *line) variable-expansion that is in progress. */ char * -expand_argument (char *str, char *end) +expand_argument (const char *str, const char *end) { char *tmp; @@ -419,13 +419,11 @@ expand_argument (char *str, char *end) return xstrdup(""); if (!end || *end == '\0') - tmp = str; - else - { - tmp = (char *) alloca (end - str + 1); - bcopy (str, tmp, end - str); - tmp[end - str] = '\0'; - } + return allocated_variable_expand ((char *)str); + + tmp = (char *) alloca (end - str + 1); + bcopy (str, tmp, end - str); + tmp[end - str] = '\0'; return allocated_variable_expand (tmp); } diff --git a/function.c b/function.c index a6a04d4..2edac74 100644 --- a/function.c +++ b/function.c @@ -673,35 +673,29 @@ func_words (char *o, char **argv, const char *funcname) return o; } -char * -strip_whitespace (char **begpp, char **endpp) +static char * +strip_whitespace (const char **begpp, const char **endpp) { while (isspace ((unsigned char)**begpp) && *begpp <= *endpp) (*begpp) ++; while (isspace ((unsigned char)**endpp) && *endpp >= *begpp) (*endpp) --; - return *begpp; + return (char *)*begpp; } -int -is_numeric (char *p) +static void +check_numeric (const char *s, const char *message) { - char *end = p + strlen (p) - 1; - char *beg = p; - strip_whitespace (&p, &end); - - while (p <= end) - if (!ISDIGIT (*(p++))) /* ISDIGIT only evals its arg once: see make.h. */ - return 0; + const char *end = s + strlen (s) - 1; + const char *beg = s; + strip_whitespace (&s, &end); - return (end - beg >= 0); -} + for (; s <= end; ++s) + if (!ISDIGIT (*s)) /* ISDIGIT only evals its arg once: see make.h. */ + break; -void -check_numeric (char *s, char *message) -{ - if (!is_numeric (s)) - fatal (reading_file, message); + if (s <= end || end - beg < 0) + fatal (reading_file, "%s: '%s'", message, beg); } @@ -1134,8 +1128,8 @@ func_sort (char *o, char **argv, const char *funcname) static char * func_if (char *o, char **argv, const char *funcname) { - char *begp = argv[0]; - char *endp = begp + strlen (argv[0]); + const char *begp = argv[0]; + const char *endp = begp + strlen (argv[0]); int result = 0; /* Find the result of the condition: if we have a value, and it's not diff --git a/tests/ChangeLog b/tests/ChangeLog index 2533bb8..fe09610 100644 --- a/tests/ChangeLog +++ b/tests/ChangeLog @@ -1,3 +1,8 @@ +2003-01-30 Paul D. Smith + + * scripts/functions/word: Test error handling for word and + wordlist functions (bug #2407). + 2003-01-22 Paul D. Smith * scripts/functions/call: Test recursive argument masking (bug diff --git a/tests/scripts/functions/word b/tests/scripts/functions/word index 36e5102..5083cec 100644 --- a/tests/scripts/functions/word +++ b/tests/scripts/functions/word @@ -6,9 +6,6 @@ Produce a variable with a large number of words in it, determine the number of words, and then read each one back.\n"; open(MAKEFILE,"> $makefile"); - -# The Contents of the MAKEFILE ... - print MAKEFILE <<'EOF'; string := word.pl general_test2.pl FORCE.pl word.pl generic_test.perl MAKEFILES_variable.pl string2 := $(string) $(string) $(string) $(string) $(string) $(string) $(string) @@ -28,18 +25,9 @@ all: @echo $(wordlist 100, 110, $(string)) @echo $(wordlist 7, 10, $(string2)) EOF - - - -# END of Contents of MAKEFILE - close(MAKEFILE); &run_make_with_options($makefile, "", &get_logfile); - -# Create the answer to what should be produced by this Makefile - -# COMPARE RESULTS $answer = "6\n" ."2058\n" ."word.pl\n" @@ -51,13 +39,52 @@ $answer = "6\n" ."word.pl general_test2.pl FORCE.pl word.pl generic_test.perl MAKEFILES_variable.pl\n" ."generic_test.perl MAKEFILES_variable.pl\n" ."\n" - ."word.pl general_test2.pl FORCE.pl word.pl\n" -; + ."word.pl general_test2.pl FORCE.pl word.pl\n"; +&compare_output($answer, &get_logfile(1)); + + +# Test error conditions + +$makefile2 = &get_tmpfile; + +open(MAKEFILE, "> $makefile2"); +print MAKEFILE <<'EOF'; +FOO = foo bar biz baz + +word-e1: ; @echo $(word ,$(FOO)) +word-e2: ; @echo $(word abc ,$(FOO)) +word-e3: ; @echo $(word 1a,$(FOO)) -# In this call to compare output, you should use the call &get_logfile(1) -# to send the name of the last logfile created. You may also use -# the special call &get_logfile(1) which returns the same as &get_logfile(1). +wordlist-e1: ; @echo $(wordlist ,,$(FOO)) +wordlist-e2: ; @echo $(wordlist abc ,,$(FOO)) +wordlist-e3: ; @echo $(wordlist 1, 12a ,$(FOO)) + +EOF + +close(MAKEFILE); + +&run_make_with_options($makefile2, 'word-e1', &get_logfile, 512); +$answer = "$makefile2:3: *** non-numeric first argument to `word' function: ''. Stop.\n"; +&compare_output($answer, &get_logfile(1)); + +&run_make_with_options($makefile2, 'word-e2', &get_logfile, 512); +$answer = "$makefile2:4: *** non-numeric first argument to `word' function: 'abc '. Stop.\n"; +&compare_output($answer, &get_logfile(1)); + +&run_make_with_options($makefile2, 'word-e3', &get_logfile, 512); +$answer = "$makefile2:5: *** non-numeric first argument to `word' function: '1a'. Stop.\n"; +&compare_output($answer, &get_logfile(1)); + +&run_make_with_options($makefile2, 'wordlist-e1', &get_logfile, 512); +$answer = "$makefile2:7: *** non-numeric first argument to `wordlist' function: ''. Stop.\n"; +&compare_output($answer, &get_logfile(1)); + +&run_make_with_options($makefile2, 'wordlist-e2', &get_logfile, 512); +$answer = "$makefile2:8: *** non-numeric first argument to `wordlist' function: 'abc '. Stop.\n"; +&compare_output($answer, &get_logfile(1)); +&run_make_with_options($makefile2, 'wordlist-e3', &get_logfile, 512); +$answer = "$makefile2:9: *** non-numeric second argument to `wordlist' function: ' 12a '. Stop.\n"; &compare_output($answer, &get_logfile(1)); # This tells the test driver that the perl test script executed properly. diff --git a/variable.h b/variable.h index f96bd62..5ce1944 100644 --- a/variable.h +++ b/variable.h @@ -104,7 +104,7 @@ extern char *variable_expand PARAMS ((char *line)); extern char *allocated_variable_expand_for_file PARAMS ((char *line, struct file *file)); #define allocated_variable_expand(line) \ allocated_variable_expand_for_file (line, (struct file *) 0) -extern char *expand_argument PARAMS ((char *str, char *end)); +extern char *expand_argument PARAMS ((const char *str, const char *end)); extern char *variable_expand_string PARAMS ((char *line, char *string, long length)); extern void install_variable_buffer PARAMS ((char **bufp, unsigned int *lenp)); -- 2.11.4.GIT