fish-shell/tests/printf.in
Fabian Homborg 0bde698f81 printf: Don't die on incomplete conversions
POSIX dictates here that incomplete conversions, like in

    printf %d\n 15.2

or

    printf %d 14g

are still printed along with any error.

This seems alright, as it allows users to silence stderr to accept incomplete conversions.

This commit implements it, but what's a bit weird is the ordering between stdout and stderr,
causing the error to be printed _after_, like

    15
    14
    15.1: value not completely converted
    14,2: value not completely converted

but that seems like a general issue with how we buffer the streams.

(I know that nonfatal_error is a copy of most of fatal_error - I tried
differently, and va_* is weird)

Fixes #5532.
2019-03-17 17:00:55 +01:00

79 lines
2.3 KiB
Fish

printf "Hello %d %i %f %F %g %G\n" 1 2 3 4 5 6
printf "%x %X %o %llu\n" 10 11 8 -1
# %a has OS-dependent output - see #1139
#printf "%a %A\n" 14 15
printf "%c %s\n" a hello
printf "%c%c%c\n" hello … o
printf "%e %E\n" 5 6
printf "%20d\n" 50
printf "%-20d%d\n" 5 10
printf "%*d\n" 10 100
printf "%%\"\\\n"
printf "%s\b%s\n" x y
printf "abc\rdef\n"
printf "Msg1\fMsg2\n"
printf "foo\vbar\vbaz\n"
printf "\111 \x50 \u0051 \U00000052"
echo
echo "Test escapes"
# \c escape means "stop printing"
printf 'a\cb'
echo
# Bogus printf specifier, should produce no stdout
printf "%5" 10 2>/dev/null
# Octal escapes produce literal bytes, not characters
# \376 is 0xFE
printf '\376' | display_bytes
# Verify that floating point conversions and output work correctly with
# different combinations of locales and floating point strings. See issue
# #3334. This starts by assuming an locale using english conventions.
printf '%e\n' "1.23" # should succeed, output should be 1.230000e+00
printf '%e\n' "2,34" # should fail
# Try to use one of several locales that use a comma as the decimal mark
# rather than the period used in english speaking locales. If we don't find
# one installed we simply don't run this test.
#
# musl currently does not have a `locale` command, so we also skip it then.
set -l locales (command -sq locale; and locale -a)
set -l acceptable_locales bg_BG de_DE es_ES fr_FR ru_RU
set -l numeric_locale
for locale in {$acceptable_locales}.{UTF-8,UTF8}
if string match -i -q $locale $locales
set numeric_locale $locale
break
end
end
if set -q numeric_locale[1]
set -x LC_NUMERIC $numeric_locale
printf '%e\n' "3,45" # should succeed, output should be 3,450000e+00
printf '%e\n' "4.56" # should succeed, output should be 4,560000e+00
else
echo '3,450000e+00'
echo '4,560000e+00'
end
# Verify long long ints are handled correctly. See issue #3352.
printf 'long hex1 %x\n' 498216206234
printf 'long hex2 %X\n' 498216206234
printf 'long hex3 %X\n' 0xABCDEF1234567890
printf 'long hex4 %X\n' 0xABCDEF12345678901
printf 'long decimal %d\n' 498216206594
printf 'long signed %d\n' -498216206595
printf 'long signed to unsigned %u\n' -498216206596
# Verify numeric conversion still happens even if it couldn't be fully converted
printf '%d\n' 15.1
echo $status