From: Chet Ramey Date: Tue, 26 Nov 2024 16:44:30 +0000 (-0500) Subject: add warning message for null arg to printf %d; update command -v help string; Makefil... X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=49c2670226b045746d66765b23af37c1c7ba5597;p=thirdparty%2Fbash.git add warning message for null arg to printf %d; update command -v help string; Makefile updates to uninstall directories --- diff --git a/CWRU/CWRU.chlog b/CWRU/CWRU.chlog index 025ec9dd..aa0c70e9 100644 --- a/CWRU/CWRU.chlog +++ b/CWRU/CWRU.chlog @@ -10690,3 +10690,30 @@ Makefile.in depends on it - uninstall-headers: remove $(HYBRID_HEADERS); fix typo in recipe + 11/21 + ----- +builtins/printf.def + - chk_converror: inline function to use for single place to check + for numeric overflow, change callers to use it + + 11/25 + ----- +doc/bash.1,doc/bashref.texi + - minor updates to the section on bracket expressions in pattern + matching + +builtins/command.def + - update -v help string to indicate that the output is a single word + Report from Andrew Davis + + 11/26 + ----- +builtins/printf.def + - chk_converr: add check for no characters being converted at all, + print same warning message as if *ep != 0. This covers the case of + an empty string argument. + Report by Paul Eggert + +Makefile.in,doc/Makefile.in + - uninstall: make sure the bash-specific directories created by + `make install' are emptied and removed diff --git a/Makefile.in b/Makefile.in index 9685b852..30237239 100644 --- a/Makefile.in +++ b/Makefile.in @@ -74,6 +74,7 @@ YACC = @YACC@ SHELL = @MAKE_SHELL@ CP = cp RM = rm -f +RMDIR = rmdir AR = @AR@ ARFLAGS = @ARFLAGS@ RANLIB = @RANLIB@ @@ -964,6 +965,10 @@ install-headers: maybe-install-headers done -$(INSTALL_DATA) $(SUPPORT_DIR)/bash.pc $(DESTDIR)$(pkgconfigdir)/bash.pc +uninstall-headers-dirs: + -$(RMDIR) $(DESTDIR)$(headersdir)/builtins $(DESTDIR)$(headersdir)/include + -$(RMDIR) $(DESTDIR)$(headersdir) + uninstall-headers: -( cd $(DESTDIR)$(headersdir) && $(RM) $(INSTALLED_HEADERS) ) -( cd $(DESTDIR)$(headersdir)/include && $(RM) $(INSTALLED_INCLUDE_HEADERS) ) @@ -974,6 +979,9 @@ uninstall-headers: ( cd $(DESTDIR)$(headersdir) && $(RM) $$(basename "$$hf") ) \ done -( $(RM) $(DESTDIR)$(pkgconfigdir)/bash.pc ) + # uninstall-headers-dirs + -$(RMDIR) $(DESTDIR)$(headersdir)/builtins $(DESTDIR)$(headersdir)/include + -$(RMDIR) $(DESTDIR)$(headersdir) uninstall: .made $(RM) $(DESTDIR)$(bindir)/$(Program) $(DESTDIR)$(bindir)/bashbug @@ -984,6 +992,7 @@ uninstall: .made infodir=$(infodir) htmldir=$(htmldir) DESTDIR=$(DESTDIR) $@ ) -( cd $(PO_DIR) ; $(MAKE) $(BASH_MAKEFLAGS) DESTDIR=$(DESTDIR) $@ ) -( cd $(LOADABLES_DIR) && $(MAKE) $(BASH_MAKEFLAGS) DESTDIR=$(DESTDIR) $@ ) + -$(RMDIR) $(DESTDIR)$(loadablesdir) $(DESTDIR)$(docdir) .PHONY: basic-clean clean maintainer-clean distclean mostlyclean maybe-clean diff --git a/builtins/command.def b/builtins/command.def index 4f980592..e820bc2e 100644 --- a/builtins/command.def +++ b/builtins/command.def @@ -32,7 +32,8 @@ on disk when a function with the same name exists. Options: -p use a default value for PATH that is guaranteed to find all of the standard utilities - -v print a description of COMMAND similar to the `type' builtin + -v print a single-word indicating the command or filename that + invokes COMMAND -V print a more verbose description of each COMMAND Exit Status: diff --git a/builtins/printf.def b/builtins/printf.def index d7fc8f87..0ba0e634 100644 --- a/builtins/printf.def +++ b/builtins/printf.def @@ -1355,6 +1355,24 @@ getstr (void) return ret; } +/* POSIX.2 says ``...a diagnostic message shall be written to standard + error, and the utility shall not exit with a zero exit status, but + shall continue processing any remaining operands and shall write the + value accumulated at the time the error was detected to standard + output.'' */ + +static inline void +chk_converror (char *s, char *ep) +{ + if (*ep || ep == s) + { + sh_invalidnum (s); + conversion_error = 1; + } + else if (errno == ERANGE) + printf_erange (s); +} + /* Don't call getintmax here because it may consume an argument on error, and we call this to get field width/precision arguments. */ static int @@ -1372,15 +1390,10 @@ getint (int overflow_retval) errno = 0; ret = strtoimax (garglist->word->word, &ep, 0); - overflow = (errno == ERANGE) || (ret < INT_MIN || ret > INT_MAX); + if (overflow = (errno == ERANGE) || (ret < INT_MIN || ret > INT_MAX)) + errno = ERANGE; /* force errno */ - if (*ep) - { - sh_invalidnum (garglist->word->word); - conversion_error = 1; - } - else if (overflow) - printf_erange (garglist->word->word); + chk_converror (garglist->word->word, ep); garglist = garglist->next; return (overflow ? overflow_retval : (int)ret); @@ -1401,21 +1414,7 @@ getintmax (void) errno = 0; ret = strtoimax (garglist->word->word, &ep, 0); - if (*ep) - { - sh_invalidnum (garglist->word->word); - /* POSIX.2 says ``...a diagnostic message shall be written to standard - error, and the utility shall not exit with a zero exit status, but - shall continue processing any remaining operands and shall write the - value accumulated at the time the error was detected to standard - output.'' Yecch. */ -#if 0 - ret = 0; /* return partially-converted value from strtoimax */ -#endif - conversion_error = 1; - } - else if (errno == ERANGE) - printf_erange (garglist->word->word); + chk_converror (garglist->word->word, ep); garglist = garglist->next; return (ret); @@ -1435,18 +1434,8 @@ getuintmax (void) errno = 0; ret = strtoumax (garglist->word->word, &ep, 0); - - if (*ep) - { - sh_invalidnum (garglist->word->word); -#if 0 - /* Same POSIX.2 conversion error requirements as getintmax(). */ - ret = 0; -#endif - conversion_error = 1; - } - else if (errno == ERANGE) - printf_erange (garglist->word->word); + + chk_converror (garglist->word->word, ep); garglist = garglist->next; return (ret); @@ -1467,13 +1456,7 @@ getdouble (void) errno = 0; ret = strtod (garglist->word->word, &ep); - if (*ep) - { - sh_invalidnum (garglist->word->word); - conversion_error = 1; - } - else if (errno == ERANGE) - printf_erange (garglist->word->word); + chk_converror (garglist->word->word, ep); garglist = garglist->next; return (ret); @@ -1494,17 +1477,7 @@ getfloatmax (void) errno = 0; ret = strtofltmax (garglist->word->word, &ep); - if (*ep) - { - sh_invalidnum (garglist->word->word); -#if 0 - /* Same thing about POSIX.2 conversion error requirements. */ - ret = 0; -#endif - conversion_error = 1; - } - else if (errno == ERANGE) - printf_erange (garglist->word->word); + chk_converror (garglist->word->word, ep); garglist = garglist->next; return (ret); diff --git a/doc/Makefile.in b/doc/Makefile.in index 8b6b6ed9..0b278bba 100644 --- a/doc/Makefile.in +++ b/doc/Makefile.in @@ -304,7 +304,7 @@ uninstall: -$(RM) $(DESTDIR)$(man1dir)/bash_builtins${man1ext} $(RM) $(DESTDIR)$(infodir)/bash.info # run install-info if it is present to update the info directory - if $(SHELL) -c 'install-info --version' >/dev/null 2>&1; then \ + -if $(SHELL) -c 'install-info --version' >/dev/null 2>&1; then \ install-info --delete --dir-file=$(DESTDIR)$(infodir)/dir $(DESTDIR)$(infodir)/bash.info; \ else true; fi -( cd $(DESTDIR)$(docdir) && $(RM) $(OTHER_INSTALLED_DOCS) ) diff --git a/doc/bash.1 b/doc/bash.1 index 27ed4057..5a48ab1a 100644 --- a/doc/bash.1 +++ b/doc/bash.1 @@ -4264,7 +4264,9 @@ Matches any single character. .TP .BR [ .\|.\|. ] .PD -Matches any one of the enclosed characters. +Matches any one of the characters enclosed between the brackets. +This is known as a \fIbracket expression\fP +and matches a single character. A pair of characters separated by a hyphen denotes a \fIrange expression\fP; any character that falls between those two characters, inclusive, @@ -4276,14 +4278,12 @@ is a or a .B \*^ then any character not within the range matches. -A -.B \- -may be matched by including it as the first or last character -in the set. -A -.B ] -may be matched by including it as the first character -in the set. +To match a +.BR \- , +include it as the first or last character in the set. +To match a +.BR ] , +include it as the first character in the set. .IP The sorting order of characters in range expressions, and the characters included in the range, @@ -4308,10 +4308,7 @@ or enable the .B globasciiranges shell option. .IP -Within -.B [ -and -.BR ] , +Within a bracket expression, \fIcharacter classes\fP can be specified using the syntax \fB[:\fP\fIclass\fP\fB:]\fP, where \fIclass\fP is one of the following classes defined in the POSIX standard: @@ -4327,19 +4324,13 @@ print punct space upper word xdigit A character class matches any character belonging to that class. The \fBword\fP character class matches letters, digits, and the character _. .IP -Within -.B [ -and -.BR ] , +Within a bracket expression, an \fIequivalence class\fP can be specified using the syntax \fB[=\fP\fIc\fP\fB=]\fP, which matches all characters with the same collation weight (as defined by the current locale) as the character \fIc\fP. .IP -Within -.B [ -and -.BR ] , +Within a bracket expression, the syntax \fB[.\fP\fIsymbol\fP\fB.]\fP matches the collating symbol \fIsymbol\fP. .RE @@ -13137,12 +13128,12 @@ Aliases are confusing in some uses. .PP Shell builtin commands and functions are not stoppable/restartable. .PP -Compound commands and command sequences of the form +Compound commands and command lists of the form .Q "a ; b ; c" -are not handled gracefully when process suspension is attempted. +are not handled gracefully when combined with process suspension. When a process is stopped, the shell immediately executes the next -command in the sequence. -It suffices to place the sequence of commands between parentheses to +command in the list or breaks out of any existing loops. +It suffices to enclose the command in parentheses to force it into a subshell, which may be stopped as a unit, or to start the command in the background and immediately bring it into the foreground. diff --git a/doc/bashref.texi b/doc/bashref.texi index f171e329..a76017ae 100644 --- a/doc/bashref.texi +++ b/doc/bashref.texi @@ -3053,12 +3053,14 @@ directories and subdirectories. @item ? Matches any single character. @item [@dots{}] -Matches any one of the enclosed characters. +Matches any one of the characters enclosed between the brackets. +This is known as a @dfn{bracket expression} +and matches a single character. A pair of characters separated by a hyphen denotes a @dfn{range expression}; any character that falls between those two characters, inclusive, using the current locale's collating sequence and character set, matches. If the first character following the -@samp{[} is a @samp{!} or a @samp{^} +@samp{[} is a @samp{!} or a @samp{^} then any character not within the range matches. To match a @samp{@minus{}}, include it as the first or last character in the set. @@ -3081,7 +3083,7 @@ force the use of the C locale by setting the @env{LC_COLLATE} or @env{LC_ALL} environment variable to the value @samp{C}, or enable the @code{globasciiranges} shell option. -Within @samp{[} and @samp{]}, @dfn{character classes} can be specified +Within a bracket expression, @dfn{character classes} can be specified using the syntax @code{[:}@var{class}@code{:]}, where @var{class} is one of the following classes defined in the @sc{posix} standard: @@ -3094,12 +3096,21 @@ A character class matches any character belonging to that class. The @code{word} character class matches letters, digits, and the character @samp{_}. -Within @samp{[} and @samp{]}, an @dfn{equivalence class} can be +For instance, the following pattern will match any character belonging +to the @code{space} character class in the current locale, then any +upper case letter or @samp{!}, a dot, and finally any lower case letter +or a hyphen. + +@example +[[:space:]][[:upper:]!].[-[:lower:]] +@end example + +Within a bracket expression, an @dfn{equivalence class} can be specified using the syntax @code{[=}@var{c}@code{=]}, which matches all characters with the same collation weight (as defined by the current locale) as the character @var{c}. -Within @samp{[} and @samp{]}, the syntax @code{[.}@var{symbol}@code{.]} +Within a bracket expression, the syntax @code{[.}@var{symbol}@code{.]} matches the collating symbol @var{symbol}. @end table diff --git a/doc/version.texi b/doc/version.texi index f68242d8..da5abcf8 100644 --- a/doc/version.texi +++ b/doc/version.texi @@ -2,10 +2,10 @@ Copyright (C) 1988-2024 Free Software Foundation, Inc. @end ignore -@set LASTCHANGE Wed Oct 23 11:32:20 EDT 2024 +@set LASTCHANGE Mon Nov 25 15:20:23 EST 2024 @set EDITION 5.3 @set VERSION 5.3 -@set UPDATED 23 October 2024 -@set UPDATED-MONTH October 2024 +@set UPDATED 25 November 2024 +@set UPDATED-MONTH November 2024 diff --git a/tests/printf.right b/tests/printf.right index 7c2e19a5..46d94edd 100644 --- a/tests/printf.right +++ b/tests/printf.right @@ -169,6 +169,12 @@ xx 9223372036854775807 ./printf.tests: line 365: printf: -9223372036854775815: Result too large -9223372036854775808 +./printf.tests: line 368: printf: +: invalid number +0 +./printf.tests: line 369: printf: z: invalid number +0 +./printf.tests: line 370: printf: : invalid number +0 one one\ctwo 4\.2 diff --git a/tests/printf.tests b/tests/printf.tests index af03960a..8127406a 100644 --- a/tests/printf.tests +++ b/tests/printf.tests @@ -364,6 +364,11 @@ TOOSMALL=-9223372036854775815 printf '%d\n' "$TOOBIG" printf '%d\n' "$TOOSMALL" +# arguments that are not completely converted generate warning messages +printf '%d\n' + +printf '%d\n' z +printf '%d\n' '' + # tests variable assignment with -v ${THIS_SH} ./printf1.sub ${THIS_SH} ./printf2.sub