printf.sh revision 1.6 1 1.6 kre # $NetBSD: printf.sh,v 1.6 2020/04/24 14:29:19 kre Exp $
2 1.1 kre #
3 1.1 kre # Copyright (c) 2018 The NetBSD Foundation, Inc.
4 1.1 kre # All rights reserved.
5 1.1 kre #
6 1.1 kre # Redistribution and use in source and binary forms, with or without
7 1.1 kre # modification, are permitted provided that the following conditions
8 1.1 kre # are met:
9 1.1 kre # 1. Redistributions of source code must retain the above copyright
10 1.1 kre # notice, this list of conditions and the following disclaimer.
11 1.1 kre # 2. Redistributions in binary form must reproduce the above copyright
12 1.1 kre # notice, this list of conditions and the following disclaimer in the
13 1.1 kre # documentation and/or other materials provided with the distribution.
14 1.1 kre #
15 1.1 kre # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
16 1.1 kre # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
17 1.1 kre # TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
18 1.1 kre # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
19 1.1 kre # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20 1.1 kre # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21 1.1 kre # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22 1.1 kre # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23 1.1 kre # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24 1.1 kre # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25 1.1 kre # POSSIBILITY OF SUCH DAMAGE.
26 1.1 kre #
27 1.1 kre
28 1.1 kre Running_under_ATF=false
29 1.1 kre test -n "${Atf_Shell}" && test -n "${Atf_Check}" && Running_under_ATF=true
30 1.1 kre
31 1.1 kre Tests=
32 1.1 kre
33 1.1 kre # create a test case:
34 1.1 kre # "$1" is basic test name, "$2" is description
35 1.1 kre define()
36 1.1 kre {
37 1.1 kre NAME=$1; shift
38 1.1 kre
39 1.1 kre if $Running_under_ATF
40 1.1 kre then
41 1.1 kre eval "${NAME}_head() { set descr 'Tests printf: $*'; }"
42 1.1 kre eval "${NAME}_body() { ${NAME} ; }"
43 1.1 kre else
44 1.1 kre eval "TEST_${NAME}_MSG="'"$*"'
45 1.1 kre fi
46 1.1 kre
47 1.1 kre Tests="${Tests} ${NAME}"
48 1.1 kre }
49 1.1 kre
50 1.1 kre
51 1.1 kre # 1st arg is printf format conversion specifier
52 1.1 kre # other args (if any) are args to that format
53 1.1 kre # returns success if that conversion specifier is supported, false otherwise
54 1.1 kre supported()
55 1.1 kre {
56 1.1 kre FMT="$1"; shift
57 1.1 kre
58 1.1 kre case "$#" in
59 1.1 kre 0) set -- 123;; # provide an arg for format to use
60 1.1 kre esac
61 1.1 kre
62 1.1 kre (do_printf >/dev/null 2>&1 "%${FMT}" "$@")
63 1.1 kre }
64 1.1 kre
65 1.1 kre LastErrorTest=
66 1.1 kre
67 1.1 kre $Running_under_ATF || {
68 1.1 kre
69 1.1 kre # Provide functions to emulate (roughly) what ATF gives us
70 1.1 kre # (that we actually use)
71 1.1 kre
72 1.1 kre atf_skip() {
73 1.1 kre echo >&2 "${CurrentTest} skipped: ${MSG} $*"
74 1.1 kre }
75 1.1 kre atf_fail() {
76 1.1 kre if [ "${CurrentTest}" != "${LastErrorTest}" ]
77 1.1 kre then
78 1.1 kre echo >&2 "======== In Test ${CurrentTest}:"
79 1.1 kre LastErrorTest="${CurrentTest}"
80 1.1 kre fi
81 1.1 kre echo >&2 "${CurrentTest} FAIL: ${MSG} $*"
82 1.1 kre RVAL=1
83 1.1 kre }
84 1.1 kre atf_require_prog() {
85 1.1 kre # Just allow progs we want to run to be, or not be, found
86 1.1 kre return 0
87 1.1 kre }
88 1.1 kre }
89 1.1 kre
90 1.1 kre # 1st arg is the result expected, remaining args are handed to do_printf
91 1.1 kre # to execute, fail if result does not match the expected result (treated
92 1.1 kre # as a sh pattern), or if do_printf fails
93 1.1 kre expect()
94 1.1 kre {
95 1.1 kre WANT="$1"; shift
96 1.1 kre negated=false
97 1.1 kre
98 1.1 kre case "${WANT}" in
99 1.1 kre ('!') WANT="$1"; negated=true; shift;;
100 1.1 kre esac
101 1.1 kre
102 1.1 kre RES="$( do_printf "$@" 2>&3 && echo X )" || atf_fail "$* ... Exit $?"
103 1.1 kre
104 1.1 kre RES=${RES%X} # hack to defeat \n removal from $() output
105 1.1 kre
106 1.1 kre if $negated
107 1.1 kre then
108 1.1 kre case "${RES}" in
109 1.1 kre (${WANT})
110 1.1 kre atf_fail \
111 1.1 kre "$* ... Expected anything but <<${WANT}>>, Received <<${RES}>>"
112 1.1 kre ;;
113 1.1 kre (*)
114 1.1 kre ;;
115 1.1 kre esac
116 1.1 kre else
117 1.1 kre case "${RES}" in
118 1.1 kre (${WANT})
119 1.1 kre ;;
120 1.1 kre (*)
121 1.5 kre atf_fail "$* ... Expected <<${WANT}>> Received <<${RES}>>"
122 1.1 kre ;;
123 1.1 kre esac
124 1.1 kre fi
125 1.1 kre return 0
126 1.1 kre }
127 1.1 kre
128 1.1 kre # a variant which allows for two possible results
129 1.1 kre # It would be nice to have just one function, and allow the pattern
130 1.1 kre # to contain alternatives ... but that would require use of eval
131 1.1 kre # to parse, and that then gets tricky with quoting the pattern.
132 1.1 kre # and we only ever need two (so far anyway), so this is easier...
133 1.1 kre expect2()
134 1.1 kre {
135 1.1 kre WANT1="$1"; shift
136 1.1 kre WANT2="$1"; shift
137 1.1 kre
138 1.1 kre RES="$( do_printf "$@" 2>&3 && echo X )" || atf_fail "$* ... Exit $?"
139 1.1 kre
140 1.1 kre RES=${RES%X} # hack to defeat \n removal from $() output
141 1.1 kre
142 1.1 kre case "${RES}" in
143 1.1 kre (${WANT1} | ${WANT2})
144 1.1 kre ;;
145 1.1 kre (*)
146 1.1 kre atf_fail \
147 1.1 kre "$* ... Expected <<${WANT1}|${WANT2}>> Received <<${RES}>>"
148 1.1 kre ;;
149 1.1 kre esac
150 1.1 kre return 0
151 1.1 kre }
152 1.1 kre
153 1.1 kre expect_fail()
154 1.1 kre {
155 1.1 kre WANT="$1"; shift # we do not really expect this, but ...
156 1.1 kre
157 1.1 kre RES=$( do_printf "$@" 2>/dev/null && echo X ) && {
158 1.1 kre RES=${RES%X}
159 1.1 kre case "${RES}" in
160 1.1 kre (${WANT})
161 1.1 kre atf_fail \
162 1.1 kre "$* ... success${WANT:+ with expected <<${WANT}>>}"
163 1.1 kre ;;
164 1.1 kre ('')
165 1.1 kre atf_fail "$* ... success (without output)"
166 1.1 kre ;;
167 1.1 kre (*)
168 1.1 kre atf_fail "$* ... success with <<${RES}>> (not <<${WANT}>>)"
169 1.1 kre ;;
170 1.1 kre esac
171 1.1 kre
172 1.1 kre RVAL=1
173 1.1 kre return 0
174 1.1 kre }
175 1.1 kre
176 1.1 kre RES=$( do_printf "$@" 2>&1 >/dev/null )
177 1.1 kre STAT=$?
178 1.1 kre test -z "${RES}" &&
179 1.1 kre atf_fail "$* ... failed (${STAT}) without error message"
180 1.1 kre
181 1.6 kre RES="$( do_printf "$@" 2>/dev/null || : ; echo X )"
182 1.1 kre RES=${RES%X} # hack to defeat \n removal from $() output
183 1.1 kre
184 1.1 kre case "${RES}" in
185 1.1 kre (${WANT})
186 1.1 kre # All is good, printf failed, sent a message to stderr
187 1.1 kre # and printed what it should to stdout
188 1.1 kre ;;
189 1.1 kre (*)
190 1.1 kre atf_fail \
191 1.1 kre "$* ... should fail with <<${WANT}>> did exit(${STAT}) with <<${RES}>>"
192 1.1 kre ;;
193 1.1 kre esac
194 1.1 kre return 0
195 1.1 kre }
196 1.1 kre
197 1.1 kre ##########################################################################
198 1.1 kre ##########################################################################
199 1.1 kre #
200 1.1 kre # Actual tests follow
201 1.1 kre #
202 1.1 kre ##########################################################################
203 1.1 kre ##########################################################################
204 1.1 kre
205 1.1 kre basic()
206 1.1 kre {
207 1.1 kre setmsg basic
208 1.1 kre
209 1.4 kre if (do_printf >/dev/null 2>&1)
210 1.4 kre then
211 1.4 kre atf_fail "with no args successful"
212 1.4 kre fi
213 1.4 kre if test -n "$( do_printf 2>/dev/null )"
214 1.4 kre then
215 1.4 kre atf_fail "with no args produces text on stdout"
216 1.4 kre fi
217 1.4 kre if test -z "$( do_printf 2>&1 )"
218 1.4 kre then
219 1.4 kre atf_fail "with no args no err/usage message"
220 1.4 kre fi
221 1.4 kre
222 1.4 kre for A in - -- X 1
223 1.1 kre do
224 1.1 kre if (do_printf "%${A}%" >/dev/null 2>&1)
225 1.1 kre then
226 1.1 kre atf_fail "%${A}% successful"
227 1.1 kre fi
228 1.1 kre done
229 1.1 kre
230 1.1 kre expect abcd abcd
231 1.1 kre expect % %%
232 1.1 kre expect xxx%yyy xxx%%yyy
233 1.4 kre expect -123 -123
234 1.1 kre
235 1.1 kre # technically these are all unspecified, but the only rational thing
236 1.1 kre expect_fail '' %3%
237 1.1 kre expect_fail a a%.%
238 1.1 kre expect_fail '' '%*%b' # cannot continue after bad format
239 1.1 kre expect_fail a a%-%b # hence 'b' is not part of output
240 1.1 kre
241 1.1 kre return $RVAL
242 1.1 kre }
243 1.1 kre define basic 'basic functionality'
244 1.1 kre
245 1.1 kre format_escapes()
246 1.1 kre {
247 1.1 kre setmsg format_escapes
248 1.1 kre
249 1.1 kre expect "${BSL}" '\\'
250 1.1 kre expect '?' '\\' # must be just 1 char
251 1.1 kre
252 1.1 kre expect "${NL}" '\n'
253 1.1 kre expect " " '\t' # a literal <tab> in " "
254 1.1 kre
255 1.1 kre expect "0" '\60'
256 1.1 kre expect "1" '\061'
257 1.1 kre expect "21" '\0621'
258 1.1 kre expect "${NL}" '\12'
259 1.1 kre expect "" '\1'
260 1.1 kre
261 1.1 kre expect "" '\b'
262 1.1 kre expect "" '\f'
264 1.1 kre expect "
" '\r'
266 1.1 kre expect "" '\a'
267 1.1 kre expect "" '\v'
269 1.1 kre
270 1.1 kre expect "hello${NL}world${NL}!!${NL}" 'hello\nworld\n\a\a!!\n'
271 1.1 kre
272 1.1 kre atf_require_prog wc
273 1.1 kre atf_require_prog od
274 1.1 kre atf_require_prog tr
275 1.1 kre
276 1.1 kre for fmt in '\0' '\00' '\000'
277 1.1 kre do
278 1.1 kre RES=$(( $( do_printf "${fmt}" | wc -c ) ))
279 1.1 kre if [ "${RES}" -ne 1 ]
280 1.1 kre then
281 1.1 kre atf_fail "'${fmt}' output $RES bytes, expected 1"
282 1.1 kre elif [ $(( $( do_printf "${fmt}" | od -A n -to1 ) )) -ne 0 ]
283 1.1 kre then
284 1.1 kre RES="$( do_printf "${fmt}" | od -A n -to1 | tr -d ' ')"
285 1.1 kre atf_fail \
286 1.1 kre "'${fmt}' output was '\\${RES}' should be '\\000'"
287 1.1 kre fi
288 1.1 kre done
289 1.1 kre
290 1.1 kre # There are no expected failures here, as all other \Z
291 1.1 kre # sequences produce unspecified results -- anything is OK.
292 1.1 kre
293 1.1 kre return $RVAL
294 1.1 kre }
295 1.1 kre define format_escapes "backslash escapes in format string"
296 1.1 kre
297 1.1 kre s_strings()
298 1.1 kre {
299 1.1 kre setmsg s_strings
300 1.1 kre
301 1.1 kre # The # and 0 flags produce undefined results (so don't test)
302 1.1 kre # The + and ' ' flags are ignored (only apply to signed conversions)
303 1.1 kre
304 1.1 kre expect abcd %s abcd
305 1.1 kre expect ' a' %3s a
306 1.1 kre expect 'a ' %-3s a
307 1.1 kre expect abcd %3s abcd
308 1.1 kre expect abcd %-3s abcd
309 1.1 kre
310 1.1 kre expect a %.1s abcd
311 1.1 kre expect ab %.2s abcd
312 1.1 kre expect abc %.3s abcd
313 1.1 kre expect abcd %.4s abcd
314 1.1 kre expect abcd %.5s abcd
315 1.1 kre expect abcd %.6s abcd
316 1.1 kre
317 1.1 kre expect ' a' %4.1s abcd
318 1.1 kre expect ' ab' %4.2s abcd
319 1.1 kre expect ' abc' %4.3s abcd
320 1.1 kre expect abcd %4.4s abcd
321 1.1 kre expect abcd %4.5s abcd
322 1.1 kre expect abcd %4.6s abcd
323 1.1 kre
324 1.1 kre expect ' a' %7.1s abcd
325 1.1 kre expect 'ab ' %-7.2s abcd
326 1.1 kre expect ' abc' %7.3s abcd
327 1.1 kre expect ' abcd' %7.4s abcd
328 1.1 kre expect 'abcd ' %-7.5s abcd
329 1.1 kre expect ' abcd' %7.6s abcd
330 1.1 kre
331 1.1 kre expect 'aba a' %.2s%.1s%2.1s abcd abcd abcd
332 1.1 kre
333 1.1 kre expect 123 %s 123
334 1.1 kre expect 1 %.1s 123
335 1.1 kre expect 12 %+.2s 123
336 1.1 kre expect -1 %+.2s -123
337 1.1 kre expect 12 '% .2s' 123
338 1.1 kre expect -1 '%+.2s' -123
339 1.1 kre
340 1.1 kre expect '' %s ''
341 1.1 kre expect ' ' %1s ''
342 1.1 kre expect ' ' %6s ''
343 1.1 kre expect ' ' %2.1s ''
344 1.1 kre expect '' %.0s abcd
345 1.1 kre expect ' ' %2.0s abcd
346 1.1 kre expect ' ' %-3.0s abcd
347 1.1 kre
348 1.1 kre # %s is just so boring! There are no possible failures to test.
349 1.1 kre
350 1.1 kre return $RVAL
351 1.1 kre }
352 1.1 kre define s_strings "%s string output"
353 1.1 kre
354 1.1 kre c_chars()
355 1.1 kre {
356 1.1 kre setmsg c_chars
357 1.1 kre
358 1.1 kre expect a '%c' a
359 1.1 kre expect a '%c' abc
360 1.1 kre expect 'ad' '%c%c' abc def
361 1.1 kre expect '@ a@a @' "@%3c@%-3c@" a a
362 1.1 kre expect '@ a@a @' "@%2c@%-4c@" a a
363 1.1 kre
364 1.1 kre # do not test with '' (null string) as operand to %c
365 1.1 kre # as whether that produces \0 or nothing is unspecified.
366 1.1 kre # (test NetBSD specific behaviour in NetBSD specific test)
367 1.1 kre
368 1.1 kre return $RVAL
369 1.1 kre }
370 1.1 kre define c_chars '%c (character) format conversions'
371 1.1 kre
372 1.1 kre d_decimal()
373 1.1 kre {
374 1.1 kre setmsg d_decimal
375 1.1 kre
376 1.1 kre expect 0 '%d' 0
377 1.1 kre expect 1 '%d' 1
378 1.1 kre expect 999 '%d' 999
379 1.1 kre expect -77 '%d' -77
380 1.1 kre expect 51 '%d' 0x33
381 1.1 kre expect 51 '%d' 063
382 1.1 kre
383 1.1 kre expect ' 2' '%4d' 2
384 1.1 kre expect '0002' '%04d' 2
385 1.1 kre expect '-002' '%04d' -2
386 1.1 kre expect '2 ' '%-4d' 2
387 1.1 kre expect ' 02' '%4.2d' 2
388 1.1 kre expect ' 22' '%4.2d' 22
389 1.1 kre expect ' 222' '%4.2d' 222
390 1.1 kre expect '2222' '%4.2d' 2222
391 1.1 kre expect '22222' '%4.2d' 22222
392 1.1 kre expect ' -02' '%4.2d' -2
393 1.1 kre expect '02 ' '%-4.2d' 2
394 1.1 kre expect '-02 ' '%-4.2d' -2
395 1.1 kre expect '22 ' '%-4.2d' 22
396 1.1 kre expect '222 ' '%-4.2d' 222
397 1.1 kre expect '2222' '%-4.2d' 2222
398 1.1 kre expect '22222' '%-4.2d' 22222
399 1.1 kre expect 1 '%.0d' 1
400 1.1 kre expect '' '%.0d' 0
401 1.1 kre expect '' '%.d' 0
402 1.1 kre expect ' ' '%3.d' 0
403 1.1 kre expect ' ' '%-4.d' 0
404 1.1 kre expect ' ' '%05.d' 0
405 1.1 kre
406 1.1 kre expect 65 '%d' "'A"
407 1.1 kre expect 065 '%03d' "'A"
408 1.3 kre expect 49 '%d' "'1"
409 1.1 kre expect 45 '%d' "'-1"
410 1.1 kre expect 43 '%d' "'+1"
411 1.1 kre expect 00 '%.2d' "'"
412 1.1 kre
413 1.1 kre expect 68 '%d' '"D'
414 1.1 kre expect 069 '%03d' '"E'
415 1.1 kre expect 51 '%d' '"3'
416 1.1 kre expect 45 '%d' '"-3'
417 1.1 kre expect 43 '%d' '"+3'
418 1.1 kre
419 1.1 kre expect -1 '% d' -1
420 1.1 kre expect ' 1' '% d' 1
421 1.1 kre expect -1 '% 1d' -1
422 1.1 kre expect ' 1' '% 1d' 1
423 1.1 kre expect -1 '% 0d' -1
424 1.1 kre expect ' 1' '% 0d' 1
425 1.1 kre expect ' -1' '% 5d' -1
426 1.1 kre expect ' 1' '% 5d' 1
427 1.1 kre expect ' 01' '%0 3d' 1
428 1.1 kre expect '-01' '%0 3d' -1
429 1.1 kre expect ' 03' '% 4.2d' 3
430 1.1 kre expect ' -03' '% 4.2d' -3
431 1.1 kre
432 1.1 kre expect -1 '%+d' -1
433 1.1 kre expect +1 '%+d' 1
434 1.1 kre expect ' -7' '%+3d' -7
435 1.1 kre expect ' +7' '%+3d' 7
436 1.1 kre expect ' -02' '%+4.2d' -2
437 1.1 kre expect ' +02' '%+4.2d' 2
438 1.1 kre expect '-09 ' '%-+4.2d' -9
439 1.1 kre expect '+09 ' '%+-4.2d' 9
440 1.1 kre
441 1.1 kre # space flag is ignored if + is given, so same results as just above
442 1.1 kre expect -1 '%+ d' -1
443 1.1 kre expect +1 '%+ d' 1
444 1.1 kre expect ' -7' '%+ 3d' -7
445 1.1 kre expect ' +7' '%+ 3d' 7
446 1.1 kre expect ' -02' '%+ 4.2d' -2
447 1.1 kre expect ' +02' '%+ 4.2d' 2
448 1.1 kre expect '-09 ' '%- +4.2d' -9
449 1.1 kre expect '+09 ' '% +-4.2d' 9
450 1.1 kre
451 1.1 kre expect_fail '0' %d junk
452 1.1 kre expect_fail '123' %d 123kb
453 1.1 kre expect_fail '15' %d 0xfooD
454 1.1 kre
455 1.1 kre expect_fail '0 1 2' %d%2d%2d junk 1 2
456 1.1 kre expect_fail '3 1 2' %d%2d%2d 3 1+1 2
457 1.1 kre
458 1.1 kre return $RVAL
459 1.1 kre }
460 1.1 kre define d_decimal '%d (decimal integer) conversions'
461 1.1 kre
462 1.1 kre i_decimal()
463 1.1 kre {
464 1.1 kre setmsg i_decimal
465 1.1 kre
466 1.1 kre supported i || {
467 1.1 kre atf_skip "%i conversion not supported"
468 1.1 kre return $RVAL
469 1.1 kre }
470 1.1 kre
471 1.1 kre expect 0 '%i' 0
472 1.1 kre expect 1 '%i' 1
473 1.1 kre expect 999 '%i' 999
474 1.1 kre expect -77 '%i' -77
475 1.1 kre expect 51 '%i' 0x33
476 1.1 kre expect 51 '%i' 063
477 1.3 kre expect '02 ' '%-4.2i' 2
478 1.3 kre expect ' +02' '%+ 4.2i' 2
479 1.1 kre
480 1.1 kre expect 0 '%i' '"'
481 1.1 kre
482 1.1 kre expect_fail '0' %i x22
483 1.1 kre expect_fail '123' %i 123Mb
484 1.1 kre expect_fail '15' %i 0xfooD
485 1.1 kre
486 1.1 kre return $RVAL
487 1.1 kre }
488 1.1 kre define i_decimal '%i (decimal integer) conversions'
489 1.1 kre
490 1.1 kre u_unsigned()
491 1.1 kre {
492 1.1 kre setmsg u_unsigned
493 1.1 kre
494 1.1 kre # Only tests of negative numbers are that we do not
495 1.1 kre # fail, and do not get a '-' in the result
496 1.1 kre
497 1.1 kre # This is because the number of bits available is not defined
498 1.1 kre # so we cannot anticipate what value a negative number will
499 1.1 kre # produce when interpreted as unsigned (unlike hex and octal
500 1.1 kre # where we can at least examine the least significant bits)
501 1.1 kre
502 1.1 kre expect 0 '%u' 0
503 1.1 kre expect 1 '%u' 1
504 1.1 kre expect 999 '%u' 999
505 1.1 kre expect 51 '%u' 0x33
506 1.1 kre expect 51 '%u' 063
507 1.1 kre
508 1.1 kre expect ! '-*' '%u' -77
509 1.1 kre
510 1.1 kre expect ' 2' '%4u' 2
511 1.1 kre expect '0002' '%04u' 2
512 1.1 kre expect '2 ' '%-4u' 2
513 1.1 kre expect ' 02' '%4.2u' 2
514 1.1 kre expect ' 22' '%4.2u' 22
515 1.1 kre expect ' 222' '%4.2u' 222
516 1.1 kre expect '2222' '%4.2u' 2222
517 1.1 kre expect '22222' '%4.2u' 22222
518 1.1 kre expect '02 ' '%-4.2u' 2
519 1.1 kre expect '22 ' '%-4.2u' 22
520 1.1 kre expect '222 ' '%-4.2u' 222
521 1.1 kre expect '2222' '%-4.2u' 2222
522 1.1 kre expect '22222' '%-4.2u' 22222
523 1.1 kre expect 1 '%.0u' 1
524 1.1 kre expect '' '%.0u' 0
525 1.1 kre expect '' '%.u' 0
526 1.1 kre expect ' ' '%3.u' 0
527 1.1 kre expect ' ' '%-4.u' 0
528 1.1 kre expect ' ' '%05.u' 0
529 1.1 kre
530 1.1 kre expect 65 '%u' "'A"
531 1.1 kre expect 065 '%03u' "'A"
532 1.1 kre expect 49 '%u' "'1"
533 1.1 kre expect 45 '%u' "'-1"
534 1.1 kre expect 43 '%u' "'+1"
535 1.1 kre
536 1.1 kre expect 68 '%u' '"D'
537 1.1 kre expect 069 '%03u' '"E'
538 1.1 kre expect 51 '%u' '"3'
539 1.1 kre expect 45 '%u' '"-3'
540 1.1 kre expect 43 '%u' '"+3'
541 1.1 kre
542 1.1 kre # Note that the ' ' and '+' flags only apply to signed conversions
543 1.1 kre # so they should be simply ignored for '%u'
544 1.1 kre expect 1 '% u' 1
545 1.1 kre expect 1 '% 1u' 1
546 1.1 kre expect 1 '% 0u' 1
547 1.1 kre expect ' 1' '% 5u' 1
548 1.1 kre expect 001 '%0 3u' 1
549 1.1 kre expect ' 03' '% 4.2u' 3
550 1.1 kre
551 1.1 kre expect ! '-*' '% u' -1
552 1.1 kre
553 1.1 kre expect 1 '%+u' 1
554 1.1 kre expect ' 7' '%+3u' 7
555 1.1 kre expect ' 02' '%+4.2u' 2
556 1.1 kre expect '09 ' '%+-4.2u' 9
557 1.1 kre
558 1.1 kre expect ! '-*' '%+u' -7
559 1.1 kre
560 1.1 kre expect_fail '0' %u junk
561 1.1 kre expect_fail '123' %u 123kb
562 1.1 kre expect_fail '15' %u 0xfooD
563 1.1 kre
564 1.1 kre expect_fail '0 1 2' %u%2u%2u junk 1 2
565 1.1 kre expect_fail '3 1 2' %u%2u%2u 3 1+1 2
566 1.1 kre
567 1.1 kre return $RVAL
568 1.1 kre }
569 1.1 kre define u_unsigned '%u (unsigned decimal integer) conversions'
570 1.1 kre
571 1.1 kre o_octal()
572 1.1 kre {
573 1.1 kre setmsg o_octal
574 1.1 kre
575 1.1 kre expect 0 '%o' 0
576 1.1 kre expect 1 '%o' 1
577 1.1 kre expect 1747 '%o' 999
578 1.1 kre expect 63 '%o' 0x33
579 1.1 kre expect 63 '%o' 063
580 1.1 kre
581 1.1 kre expect ' 2' '%4o' 2
582 1.1 kre expect '0002' '%04o' 2
583 1.1 kre expect '2 ' '%-4o' 2
584 1.1 kre expect ' 02' '%4.2o' 2
585 1.1 kre expect '02 ' '%-4.2o' 2
586 1.1 kre expect 1 '%.0o' 1
587 1.1 kre expect '' '%.0o' 0
588 1.1 kre
589 1.1 kre expect ' 3' %3o 03
590 1.1 kre expect ' 33' %3o 033
591 1.1 kre expect '333' %3o 0333
592 1.1 kre expect '3333' %3o 03333
593 1.1 kre expect '33333' %3o 033333
594 1.1 kre
595 1.1 kre expect '4 ' %-3o 04
596 1.1 kre expect '45 ' %-3o 045
597 1.1 kre expect '456' %-3o 0456
598 1.1 kre expect '4567' %-3o 04567
599 1.1 kre expect '45670' %-3o 045670
600 1.1 kre
601 1.1 kre expect '04 ' %#-3o 04
602 1.1 kre expect '045' %-#3o 045
603 1.1 kre expect '0456' %#-3o 0456
604 1.1 kre expect '04567' %-#3o 04567
605 1.1 kre expect '045670' %#-3o 045670
606 1.1 kre
607 1.1 kre expect 101 '%o' "'A"
608 1.1 kre expect 0101 '%04o' "'A"
609 1.1 kre expect 61 '%o' "'1"
610 1.1 kre expect 55 '%o' "'-1"
611 1.1 kre expect 53 '%o' "'+1"
612 1.1 kre
613 1.1 kre expect 01747 '%#o' 999
614 1.1 kre expect ' 02' '%#4o' 2
615 1.1 kre expect '02 ' '%#-4.2o' 2
616 1.1 kre expect 0101 '%#o' "'A"
617 1.1 kre expect 0101 '%#04o' "'A"
618 1.1 kre expect 061 '%#o' "'1"
619 1.1 kre expect 055 '%#o' "'-1"
620 1.1 kre expect 053 '%#o' "'+1"
621 1.1 kre expect 063 '%#o' 063
622 1.1 kre
623 1.1 kre # negative numbers are allowed, but printed as unsigned.
624 1.1 kre # Since we have no fixed integer width, we don't know
625 1.1 kre # how many upper 1 bits there will be, so only check the
626 1.1 kre # low 21 bits ...
627 1.1 kre expect '*7777777' '%o' -1
628 1.1 kre expect '*7777776' '%04o' -2
629 1.1 kre expect '*7777770' '%7o' -8
630 1.1 kre expect '0*7777700' '%#o' -0100
631 1.1 kre expect '*7777663' '%o' -77
632 1.1 kre
633 1.1 kre return $RVAL
634 1.1 kre }
635 1.1 kre define o_octal '%o (octal integer) conversions'
636 1.1 kre
637 1.1 kre x_hex()
638 1.1 kre {
639 1.1 kre setmsg x_hex
640 1.1 kre
641 1.1 kre expect 0 '%x' 0
642 1.1 kre expect 1 '%x' 1
643 1.1 kre expect 3e7 '%x' 999
644 1.1 kre expect 33 '%x' 0x33
645 1.1 kre expect 33 '%x' 063
646 1.1 kre
647 1.1 kre expect ' 2' '%4x' 2
648 1.1 kre expect '0002' '%04x' 2
649 1.1 kre expect '2 ' '%-4x' 2
650 1.1 kre expect ' 02' '%4.2x' 2
651 1.1 kre expect '02 ' '%-4.2x' 2
652 1.1 kre expect 1 '%.0x' 1
653 1.1 kre expect '' '%.0x' 0
654 1.1 kre
655 1.1 kre expect 41 '%x' "'A"
656 1.1 kre expect 041 '%03x' "'A"
657 1.1 kre expect 31 '%x' "'1"
658 1.1 kre expect 2d '%x' "'-1"
659 1.1 kre expect 2b '%x' "'+1"
660 1.1 kre
661 1.1 kre expect ' face ' '%5x ' 64206
662 1.1 kre
663 1.1 kre # The 'alternate representation' (# flag) inserts 0x unless value==0
664 1.1 kre
665 1.1 kre expect 0 %#x 0
666 1.1 kre expect 0x1 %#x 1
667 1.1 kre
668 1.1 kre # We can also print negative numbers (treated as unsigned)
669 1.1 kre # but as there is no defined integer width for printf(1)
670 1.1 kre # we don't know how many F's in FFF...FFF for -1, so just
671 1.1 kre # validate the bottom 24 bits, and assume the rest will be OK.
672 1.1 kre # (tests above will fail if printf can't handle at least 32 bits)
673 1.1 kre
674 1.1 kre expect '*ffffff' %x -1
675 1.1 kre expect '*fffff0' %x -16
676 1.1 kre expect '*fff00f' %x -4081
677 1.1 kre expect '*fff00d' %x -4083
678 1.1 kre expect '*fffabc' %x -1348
679 1.1 kre expect '*ff3502' %x -0xCAFE
680 1.1 kre
681 1.1 kre expect_fail '0 1 2' %x%2x%2x junk 1 2
682 1.1 kre expect_fail '3 1 2' %x%2x%2x 3 1+1 2
683 1.1 kre
684 1.1 kre return $RVAL
685 1.1 kre }
686 1.1 kre define x_hex '%x (hexadecimal output) conversions'
687 1.1 kre
688 1.1 kre X_hex()
689 1.1 kre {
690 1.1 kre setmsg X_hex
691 1.1 kre
692 1.1 kre # The only difference between %x and %X ix the case of
693 1.1 kre # the alpha digits, so just do minimal testing of that...
694 1.1 kre
695 1.1 kre expect 3E7 %X 999
696 1.1 kre expect 2D %X "'-1"
697 1.1 kre expect 2B %X "'+1"
698 1.1 kre expect ' FACE ' '%5X ' 64206
699 1.1 kre expect DEADBEEF %X 3735928559
700 1.1 kre
701 1.1 kre expect 1234FEDC %X 0x1234fedc
702 1.1 kre
703 1.1 kre expect '*FFCAFE' %X -13570
704 1.1 kre expect '*FFFFFE' %X -2
705 1.1 kre
706 1.1 kre return $RVAL
707 1.1 kre }
708 1.1 kre define X_hex '%X (hexadecimal output) conversions'
709 1.1 kre
710 1.1 kre f_floats()
711 1.1 kre {
712 1.1 kre setmsg f_floats
713 1.1 kre
714 1.1 kre supported f || {
715 1.1 kre atf_skip "%f conversion not supported"
716 1.1 kre return $RVAL
717 1.1 kre }
718 1.1 kre
719 1.1 kre expect 0.000000 %f 0
720 1.1 kre expect 1.000000 %f 1
721 1.1 kre expect 1.500000 %f 1.5
722 1.1 kre expect -1.000000 %f -1
723 1.1 kre expect -1.500000 %f -1.5
724 1.1 kre
725 1.1 kre expect 44.000000 %f 44
726 1.1 kre expect -43.000000 %f -43
727 1.1 kre expect '3.33333?' %f 3.333333333333333
728 1.1 kre expect '0.78539?' %f .7853981633974483
729 1.1 kre expect '0.00012?' %f .000123456789
730 1.1 kre expect '1234.56789?' %f 1234.56789
731 1.1 kre
732 1.1 kre expect 0 %.0f 0
733 1.1 kre expect 1 %.0f 1
734 1.1 kre expect 1. %#.0f 1.1
735 1.1 kre expect 0. %#.0f 0
736 1.1 kre expect 1. %#.0f 1
737 1.1 kre expect 1. %#.0f 1.2
738 1.1 kre
739 1.1 kre expect 0.0 %.1f 0
740 1.1 kre expect 1.0 %.1f 1
741 1.1 kre expect 1.1 %#.1f 1.1
742 1.1 kre expect 0.0 %#.1f 0
743 1.1 kre expect 1.2 %#.1f 1.2
744 1.1 kre
745 1.1 kre expect ' 0.0' %6.1f 0
746 1.1 kre expect ' 1.0' %6.1f 1
747 1.1 kre expect ' -1.0' %6.1f -1
748 1.1 kre
749 1.1 kre expect '0000.0' %06.1f 0
750 1.1 kre expect '0001.0' %06.1f 1
751 1.1 kre expect '-001.0' %06.1f -1
752 1.1 kre
753 1.1 kre expect ' +0.0' %+6.1f 0
754 1.1 kre expect ' +1.0' %+6.1f 1
755 1.1 kre expect ' -1.0' %+6.1f -1
756 1.1 kre
757 1.1 kre expect ' 0.0' '% 6.1f' 0
758 1.1 kre expect ' 1.0' '% 6.1f' 1
759 1.1 kre expect ' -1.0' '% 6.1f' -1
760 1.1 kre
761 1.1 kre expect ' 000.0' '%0 6.1f' 0
762 1.1 kre expect ' 001.0' '% 06.1f' 1
763 1.1 kre expect '-001.0' '%0 6.1f' -1
764 1.1 kre
765 1.1 kre expect '+000.0' '%0+6.1f' 0
766 1.1 kre expect '+001.0' '%+06.1f' 1
767 1.1 kre expect '-001.0' '%0+6.1f' -1
768 1.1 kre
769 1.1 kre expect '0000000.00' %010.2f 0
770 1.1 kre expect '-000009.00' %010.2f -9
771 1.1 kre
772 1.1 kre expect '0.0 ' %-10.1f 0
773 1.1 kre expect '1.0 ' %-10.1f 1
774 1.1 kre expect '-1.0 ' %-10.1f -1
775 1.1 kre
776 1.1 kre expect '0.00 ' %-10.2f 0
777 1.1 kre expect '-9.00 ' %-10.2f -9
778 1.1 kre
779 1.1 kre expect '0.0 ' %-010.1f 0
780 1.1 kre expect '1.0 ' %-010.1f 1
781 1.1 kre expect '-1.0 ' %-010.1f -1
782 1.1 kre
783 1.1 kre expect '0.00 ' %-6.2f 0
784 1.1 kre expect '-9.00 ' %-6.2f -9
785 1.1 kre
786 1.1 kre expect '0.00 ' %-010.2f 0
787 1.1 kre expect '-9.00 ' %-010.2f -9
788 1.1 kre
789 1.1 kre expect ' 0' %7.0f 0
790 1.1 kre expect '1 ' %-7.0f 1
791 1.1 kre expect ' 0.' %#7.0f 0
792 1.1 kre expect ' 1.' %#7.0f 1
793 1.1 kre expect ' 1.' %#7.0f 1.1
794 1.1 kre expect ' 1.' %#7.0f 1.2
795 1.1 kre expect ' -1.' %#7.0f -1.2
796 1.1 kre expect '1. ' %-#7.0f 1.1
797 1.1 kre expect '0. ' %#-7.0f 0
798 1.1 kre expect '1. ' %-#7.0f 1
799 1.1 kre expect '1. ' %#-7.0f 1.2
800 1.1 kre expect '-1. ' %#-7.0f -1.2
801 1.1 kre expect ' +0' %+7.0f 0
802 1.1 kre expect '+1 ' %-+7.0f 1
803 1.1 kre expect ' +1.' %+#7.0f 1.1
804 1.1 kre expect ' +0.' %#+7.0f 0
805 1.1 kre expect ' +1.' %+#7.0f 1
806 1.1 kre expect ' +1.' %#+7.0f 1.2
807 1.1 kre expect ' -1.' %#+7.0f -1.2
808 1.1 kre expect ' 0' '% 7.0f' 0
809 1.1 kre expect ' 1 ' '%- 7.0f' 1
810 1.1 kre expect '-1 ' '%- 7.0f' -1
811 1.1 kre expect ' 1.' '% #7.0f' 1.1
812 1.1 kre expect ' 0.' '%# 7.0f' 0
813 1.1 kre expect ' 1.' '% #7.0f' 1
814 1.1 kre expect ' 1.' '%# 7.0f' 1.2
815 1.1 kre expect ' -1.' '%# 7.0f' -1.2
816 1.1 kre
817 1.1 kre expect2 inf infinity %f infinity
818 1.1 kre expect2 inf infinity %f Infinity
819 1.1 kre expect2 inf infinity %f INF
820 1.1 kre expect2 -inf -infinity %f -INF
821 1.1 kre expect2 ' inf' infinity %5f INF
822 1.1 kre expect2 ' inf' ' infinity' %9.4f INF
823 1.1 kre expect2 'inf ' 'infinity ' %-11.1f INF
824 1.1 kre expect2 ' inf' infinity %05f INF
825 1.1 kre expect2 ' inf' infinity %05f +INF
826 1.1 kre expect2 ' -inf' -infinity %05f -INF
827 1.1 kre expect2 'inf ' infinity %-5f INF
828 1.1 kre expect2 ' +inf' +infinity %+5f INF
829 1.1 kre expect2 ' +inf' +infinity %+5f +INF
830 1.1 kre expect2 ' -inf' -infinity %+5f -INF
831 1.1 kre expect2 ' inf' infinity '% 5f' INF
832 1.1 kre expect2 ' inf' infinity '% 5f' +INF
833 1.1 kre expect2 ' -inf' -infinity '% 5f' -INF
834 1.1 kre
835 1.1 kre expect2 nan 'nan(*)' %f NaN
836 1.1 kre expect2 nan 'nan(*)' %f -NaN
837 1.1 kre expect2 ' nan' 'nan(*)' %5f nan
838 1.1 kre expect2 'nan ' 'nan(*)' %-5f NAN
839 1.1 kre
840 1.1 kre expect_fail '0.0 1.0 2.0' %.1f%4.1f%4.1f junk 1 2
841 1.1 kre expect_fail '3.0 1.0 2.0' %.1f%4.1f%4.1f 3 1+1 2
842 1.1 kre
843 1.1 kre return $RVAL
844 1.1 kre }
845 1.1 kre define f_floats '%f (floating) conversions'
846 1.1 kre
847 1.1 kre F_floats()
848 1.1 kre {
849 1.1 kre setmsg F_floats
850 1.1 kre
851 1.1 kre # The only difference between %f and %f is how Inf and NaN
852 1.1 kre # are printed ... so just test a couple of those and
853 1.1 kre # a couple of the others above (to verify nothing else changes)
854 1.1 kre
855 1.1 kre supported F || {
856 1.1 kre atf_skip "%F conversion not supported"
857 1.1 kre return $RVAL
858 1.1 kre }
859 1.1 kre
860 1.1 kre expect '0.78539?' %F .7853981633974483
861 1.1 kre expect '0.00012?' %F .000123456789
862 1.1 kre expect '1234.56789?' %F 1234.56789
863 1.1 kre
864 1.1 kre expect2 INF INFINITY %F infinity
865 1.1 kre expect2 -INF -INFINITY %F -INFINITY
866 1.1 kre expect2 NAN 'NAN(*)' %F NaN
867 1.1 kre
868 1.1 kre return $RVAL
869 1.1 kre }
870 1.1 kre define F_floats '%F (floating) conversions'
871 1.1 kre
872 1.1 kre e_floats()
873 1.1 kre {
874 1.1 kre setmsg e_floats
875 1.1 kre
876 1.1 kre supported e || {
877 1.1 kre atf_skip "%e conversion not supported"
878 1.1 kre return $RVAL
879 1.1 kre }
880 1.1 kre
881 1.1 kre expect 0.000000e+00 %e 0
882 1.1 kre expect 1.000000e+00 %e 1
883 1.1 kre expect 1.500000e+00 %e 1.5
884 1.1 kre expect -1.000000e+00 %e -1
885 1.1 kre expect -1.500000e+00 %e -1.5
886 1.1 kre
887 1.1 kre expect 4.400000e+01 %e 44
888 1.1 kre expect -4.300000e+01 %e -43
889 1.1 kre expect '3.33333?e+00' %e 3.333333333333333
890 1.1 kre expect '7.85398?e-01' %e .7853981633974483
891 1.1 kre expect '1.23456?e-04' %e .000123456789
892 1.1 kre expect '1.23456?e+03' %e 1234.56789
893 1.1 kre
894 1.1 kre expect 0e+00 %.0e 0
895 1.1 kre expect 1e+00 %.0e 1
896 1.1 kre expect 1.e+00 %#.0e 1.1
897 1.1 kre expect 0.e+00 %#.0e 0
898 1.1 kre expect 1.e+00 %#.0e 1
899 1.1 kre expect 1.e+00 %#.0e 1.2
900 1.1 kre
901 1.1 kre expect 0.0e+00 %.1e 0
902 1.1 kre expect 1.0e+00 %.1e 1
903 1.1 kre expect 1.1e+00 %#.1e 1.1
904 1.1 kre expect 0.0e+00 %#.1e 0
905 1.1 kre expect 1.2e+00 %#.1e 1.2
906 1.1 kre
907 1.1 kre expect ' 0.0e+00' %10.1e 0
908 1.1 kre expect ' 1.0e+00' %10.1e 1
909 1.1 kre expect ' -1.0e+00' %10.1e -1
910 1.1 kre
911 1.1 kre expect '0000.0e+00' %010.1e 0
912 1.1 kre expect '0001.0e+00' %010.1e 1
913 1.1 kre expect '-001.0e+00' %010.1e -1
914 1.1 kre
915 1.1 kre expect ' +0.0e+00' %+10.1e 0
916 1.1 kre expect ' +1.0e+00' %+10.1e 1
917 1.1 kre expect ' -1.0e+00' %+10.1e -1
918 1.1 kre
919 1.1 kre expect ' 0.0e+00' '% 10.1e' 0
920 1.1 kre expect ' 1.0e+00' '% 10.1e' 1
921 1.1 kre expect ' -1.0e+00' '% 10.1e' -1
922 1.1 kre
923 1.1 kre expect ' 000.0e+00' '%0 10.1e' 0
924 1.1 kre expect ' 001.0e+00' '% 010.1e' 1
925 1.1 kre expect '-001.0e+00' '%0 10.1e' -1
926 1.1 kre
927 1.1 kre expect '000.00e+00' %010.2e 0
928 1.1 kre expect '-09.00e+00' %010.2e -9
929 1.1 kre
930 1.1 kre expect '0.0e+00 ' %-10.1e 0
931 1.1 kre expect '1.0e+00 ' %-10.1e 1
932 1.1 kre expect '-1.0e+00 ' %-10.1e -1
933 1.1 kre
934 1.1 kre expect '+0.0e+00 ' %-+10.1e 0
935 1.1 kre expect '+1.0e+00 ' %+-10.1e 1
936 1.1 kre expect '-1.0e+00 ' %+-10.1e -1
937 1.1 kre
938 1.1 kre expect ' +0.0e+00' '%+ 10.1e' 0
939 1.1 kre expect ' +1.0e+00' '% +10.1e' 1
940 1.1 kre expect ' -1.0e+00' '%+ 10.1e' -1
941 1.1 kre
942 1.1 kre expect '0.00e+00 ' %-10.2e 0
943 1.1 kre expect '-9.00e+00 ' %-10.2e -9
944 1.1 kre
945 1.1 kre expect '0.0e+00 ' %-010.1e 0
946 1.1 kre expect '1.0e+00 ' %0-10.1e 1
947 1.1 kre expect '-1.0e+00 ' %-010.1e -1
948 1.1 kre
949 1.1 kre expect '0.00e+00 ' %-010.2e 0
950 1.1 kre expect '-9.00e+00 ' %-010.2e -9
951 1.1 kre
952 1.1 kre expect ' 0e+00' %7.0e 0
953 1.1 kre expect '1e+00 ' %-7.0e 1
954 1.1 kre expect ' 1.e+00' %#7.0e 1.1
955 1.1 kre expect ' 0.e+00' %#7.0e 0
956 1.1 kre expect ' 1.e+00' %#7.0e 1
957 1.1 kre expect ' 1.e+00' %#7.0e 1.2
958 1.1 kre expect '-1.e+00' %#7.0e -1.2
959 1.1 kre expect '1.e+00 ' %-#7.0e 1.1
960 1.1 kre expect '0.e+00 ' %#-7.0e 0
961 1.1 kre expect '1.e+00 ' %-#7.0e 1
962 1.1 kre expect '1.e+00 ' %#-7.0e 1.2
963 1.1 kre expect '-1.e+00' %#-7.0e -1.2
964 1.1 kre expect ' +0e+00' %+7.0e 0
965 1.1 kre expect '+1e+00 ' %-+7.0e 1
966 1.1 kre expect '+1.e+00' %+#7.0e 1.1
967 1.1 kre expect '+0.e+00' %#+7.0e 0
968 1.1 kre expect '+1.e+00' %+#7.0e 1
969 1.1 kre expect '+1.e+00' %#+7.0e 1.2
970 1.1 kre expect '-1.e+00' %#+7.0e -1.2
971 1.1 kre expect ' 0e+00' '% 7.0e' 0
972 1.1 kre expect ' 1e+00 ' '%- 7.0e' 1
973 1.1 kre expect '-1e+00 ' '%- 7.0e' -1
974 1.1 kre expect ' 1.e+00' '% #7.0e' 1.1
975 1.1 kre expect ' 0.e+00' '%# 7.0e' 0
976 1.1 kre expect ' 1.e+00' '% #7.0e' 1
977 1.1 kre expect ' 1.e+00' '%# 7.0e' 1.2
978 1.1 kre expect '-1.e+00' '%# 7.0e' -1.2
979 1.1 kre
980 1.1 kre expect2 inf infinity %e inf
981 1.1 kre expect2 inf infinity %e Infinity
982 1.1 kre expect2 inf infinity %e INF
983 1.1 kre expect2 -inf -infinity %e -INF
984 1.1 kre expect2 ' inf' -infinity %5e INF
985 1.1 kre expect2 ' inf' -infinity %9.4e INF
986 1.1 kre expect2 ' inf' infinity %05e INF
987 1.1 kre expect2 ' inf' infinity %05e +INF
988 1.1 kre expect2 ' -inf' -infinity %05e -INF
989 1.1 kre expect2 'inf ' infinity %-5e INF
990 1.1 kre expect2 ' +inf' +infinity %+5e INF
991 1.1 kre expect2 ' +inf' +infinity %+5e +INF
992 1.1 kre expect2 ' -inf' -infinity %+5e -INF
993 1.1 kre expect2 ' inf' infinity '% 5e' INF
994 1.1 kre expect2 ' inf' infinity '% 5e' +INF
995 1.1 kre expect2 ' -inf' -infinity '% 5e' -INF
996 1.1 kre
997 1.1 kre expect2 nan 'nan(*)' %e NaN
998 1.1 kre expect2 nan 'nan(*)' %e -NaN
999 1.1 kre expect2 ' nan' 'nan(*)' %5e nan
1000 1.1 kre expect2 'nan ' 'nan(*)' %-5e NAN
1001 1.1 kre
1002 1.1 kre expect_fail 0.000000e+00 '%e' NOT-E
1003 1.1 kre expect_fail 1.200000e+00 '%e' 1.2Gb
1004 1.1 kre
1005 1.1 kre return $RVAL
1006 1.1 kre }
1007 1.1 kre define e_floats "%e floating point conversions"
1008 1.1 kre
1009 1.1 kre E_floats()
1010 1.1 kre {
1011 1.1 kre setmsg E_floats
1012 1.1 kre
1013 1.1 kre supported E || {
1014 1.1 kre atf_skip "%E conversion not supported"
1015 1.1 kre return $RVAL
1016 1.1 kre }
1017 1.1 kre
1018 1.1 kre # don't bother duplicating all the above, the only differences
1019 1.1 kre # should be 'E' instead of 'e', and INF/NAN (for inf/nan)
1020 1.1 kre # so just pick a few...
1021 1.1 kre
1022 1.1 kre expect 0.000000E+00 %E 0
1023 1.1 kre expect -4.300000E+01 %E -43
1024 1.1 kre expect 1E+00 %.0E 1
1025 1.1 kre expect 1.E+00 %#.0E 1
1026 1.1 kre expect '-9.00E+00 ' %-010.2E -9
1027 1.1 kre expect2 INF INFINITY %E InFinity
1028 1.1 kre expect2 NAN 'NAN(*)' %E NaN
1029 1.1 kre
1030 1.1 kre return $RVAL
1031 1.1 kre }
1032 1.1 kre define E_floats "%E floating point conversions"
1033 1.1 kre
1034 1.1 kre
1035 1.1 kre g_floats()
1036 1.1 kre {
1037 1.1 kre setmsg g_floats
1038 1.1 kre
1039 1.1 kre supported g || {
1040 1.1 kre atf_skip "%g conversion not supported"
1041 1.1 kre return $RVAL
1042 1.1 kre }
1043 1.1 kre
1044 1.1 kre # for a value writtem in %e format, which has an exponent of x
1045 1.1 kre # then %.Pg will produce 'f' format if x >= -4, and P > x,
1046 1.1 kre # otherwise it produces 'e' format.
1047 1.1 kre # When 'f' is used, the precision associated is P-x-1
1048 1.1 kre # when 'e' is used, the precision is P-1
1049 1.1 kre
1050 1.1 kre # then trailing 0's are deleted (unless # flag is present)
1051 1.1 kre
1052 1.1 kre # since we have other tests for 'f' and 'e' formats, rather
1053 1.1 kre # than testing lots of random numbers, instead test that the
1054 1.1 kre # switchover between 'f' and 'e' works properly.
1055 1.1 kre
1056 1.1 kre expect 1 %.1g 1 # p = 1, x = 0 : %.0f
1057 1.1 kre expect 0.5 %.1g 0.5 # p = 1, x = -1: %.1f
1058 1.1 kre expect 1 %.2g 1 # p = 2, x = 0 : %.1f
1059 1.1 kre expect 0.5 %.2g 0.5 # p = 2, x = -1: %.2f
1060 1.1 kre
1061 1.1 kre expect 1 %g 1 # p = 6, x = 0 : %.5f
1062 1.1 kre expect -0.5 %g -0.5 # p = 6, x = -1: %.6f
1063 1.1 kre
1064 1.1 kre expect 0.001234 %.4g 0.001234 # p= 4, x = -3: %.6f
1065 1.1 kre
1066 1.1 kre expect 9999 %.4g 9999 # p = 4, x = 3 : %.0f
1067 1.1 kre expect 9999 %.5g 9999 # p = 5, x = 3 : %.1f
1068 1.1 kre
1069 1.1 kre expect 1. %#.1g 1 # p = 1, x = 0 : %.0f
1070 1.1 kre expect 0.5 %#.1g 0.5 # p = 1, x = -1: %.1f
1071 1.1 kre expect 1.0 %#.2g 1 # p = 2, x = 0 : %.1f
1072 1.1 kre expect 0.50 %#.2g 0.5 # p = 2, x = -1: %.2f
1073 1.1 kre
1074 1.1 kre expect 1.00000 %#g 1 # p = 6, x = 0 : %.5f
1075 1.1 kre expect -0.500000 %#g -0.5 # p = 6, x = -1: %.6f
1076 1.1 kre
1077 1.1 kre expect 0.001234 %#.4g 0.001234 # p= 4, x = -3: %.6f
1078 1.1 kre
1079 1.1 kre expect 9999. %#.4g 9999 # p = 4, x = 3 : %.0f
1080 1.1 kre expect 9999.0 %#.5g 9999 # p = 5, x = 3 : %.1f
1081 1.1 kre
1082 1.3 kre expect 4.4?e+03 %.3g 4444 # p = 3, x = 3 : %.2e
1083 1.3 kre expect 1.2e-05 %.2g 0.000012 # p = 2, x = -5: $.1e
1084 1.3 kre
1085 1.3 kre expect 1e+10 %g 10000000000
1086 1.3 kre expect 1e+10 %g 1e10
1087 1.3 kre expect 1e+10 %g 1e+10
1088 1.3 kre expect 1e-10 %g 1e-10
1089 1.3 kre expect 10000000000 %.11g 10000000000
1090 1.3 kre expect 10000000000. %#.11g 10000000000
1091 1.3 kre expect 1e+99 %g 1e99
1092 1.1 kre expect 1e+100 %g 1e100
1093 1.1 kre expect 1e-100 %g 1e-100
1094 1.1 kre
1095 1.1 kre expect2 inf infinity %g Infinity
1096 1.1 kre expect2 -inf -infinity %g -INF
1097 1.1 kre expect2 nan 'nan(*)' %g NaN
1098 1.1 kre
1099 1.1 kre return $RVAL
1100 1.1 kre }
1101 1.1 kre define g_floats '%g (floating) conversions'
1102 1.1 kre
1103 1.1 kre G_floats()
1104 1.1 kre {
1105 1.1 kre setmsg G_floats
1106 1.1 kre
1107 1.1 kre supported G || {
1108 1.1 kre atf_skip "%G conversion not supported"
1109 1.1 kre return $RVAL
1110 1.1 kre }
1111 1.1 kre
1112 1.1 kre # 'G' uses 'F' or 'E' instead or 'f' or 'e'.
1113 1.1 kre
1114 1.1 kre # F is different from f only for INF/inf NAN/nan which there is
1115 1.1 kre # no point testing here (those simply use F/f format, tested there.
1116 1.1 kre # E is different for those, and also uses 'E' for the exponent
1117 1.1 kre # That is the only thing to test, so ...
1118 1.1 kre
1119 1.1 kre expect 1.2E-05 %.2G 0.000012 # p = 2, x = -5: $.1e
1120 1.1 kre
1121 1.1 kre expect2 INF INFINITY %G Infinity
1122 1.1 kre expect2 -INF -INFINITY %G -INF
1123 1.1 kre expect2 NAN 'NAN(*)' %G NaN
1124 1.1 kre
1125 1.1 kre return $RVAL
1126 1.4 kre }
1127 1.1 kre define G_floats '%G (floating) conversions'
1128 1.1 kre
1129 1.1 kre # It is difficult to test correct results from the %a conversions,
1130 1.1 kre # as they depend upon the underlying floating point format (not
1131 1.1 kre # necessarily IEEE) and other factors chosen by the implementation,
1132 1.1 kre # eg: the (floating) number 1 could be 0x8p-3 0x4p-2 0x1p-1 even
1133 1.1 kre # assuming IEEE formats wnen using %.0a. But we can test 0
1134 1.1 kre a_floats()
1135 1.1 kre {
1136 1.1 kre setmsg a_floats
1137 1.1 kre
1138 1.1 kre supported a || {
1139 1.1 kre atf_skip "%a conversion not supported"
1140 1.1 kre return $RVAL
1141 1.1 kre }
1142 1.1 kre
1143 1.1 kre expect 0x0p+0 '%.0a' 0
1144 1.1 kre expect 0x0.p+0 '%#.0a' 0
1145 1.1 kre expect 0x0.000p+0 '%.3a' 0
1146 1.1 kre expect '0x?.*p+*' '%a' 123
1147 1.1 kre expect '0x?.*p-*' '%a' 0.123
1148 1.1 kre
1149 1.1 kre # We can check that the %a result can be used as input to %f
1150 1.1 kre # and obtain the original value (nb: input must be in %.4f format)
1151 1.1 kre
1152 1.1 kre for VAL in 1.0000 2.0000 3.0000 4.0000 0.5000 0.1000 1000.0000 \
1153 1.1 kre 777777.0000 0.1234 -1.0000 -0.2500 -123.4567
1154 1.1 kre do
1155 1.1 kre A_STRING=$( do_printf '%a' "${VAL}" 2>&3 )
1156 1.1 kre
1157 1.1 kre expect "${VAL}" "%.4f" "${A_STRING}"
1158 1.1 kre done
1159 1.1 kre
1160 1.1 kre expect_fail 0x0p+0 %a trash
1161 1.1 kre expect_fail 0x0.p+0 %#a trash
1162 1.1 kre expect_fail X0x0p+0Y X%aY trash
1163 1.1 kre expect_fail 0x0p+00x0p+0 %a%a trash garbage
1164 1.1 kre
1165 1.1 kre return $RVAL
1166 1.1 kre }
1167 1.1 kre define a_floats '%a floating conversion'
1168 1.1 kre
1169 1.1 kre A_floats()
1170 1.1 kre {
1171 1.1 kre setmsg A_floats
1172 1.1 kre
1173 1.1 kre supported A || {
1174 1.1 kre atf_skip "%A conversion not supported"
1175 1.1 kre return $RVAL
1176 1.1 kre }
1177 1.1 kre
1178 1.1 kre expect 0X0P+0 '%.0A' 0
1179 1.1 kre expect 0X0.P+0 '%#.0A' 0
1180 1.1 kre expect 0X0.000P+0 '%.3A' 0
1181 1.1 kre expect '0X?.*P+*' '%A' 123
1182 1.1 kre expect '0X?.*P-*' '%A' 0.123
1183 1.1 kre
1184 1.1 kre for VAL in 1.0000 2.0000 3.0000 4.0000 0.5000 0.1000 1000.0000 \
1185 1.1 kre 777777.0000 0.1234 -1.0000 -0.2500 -123.4567
1186 1.1 kre do
1187 1.1 kre A_STRING=$( do_printf '%A' "${VAL}" 2>&3 )
1188 1.1 kre
1189 1.1 kre expect "${VAL}" "%.4f" "${A_STRING}"
1190 1.1 kre done
1191 1.1 kre
1192 1.1 kre expect_fail 0X0P+0 %A trash
1193 1.1 kre expect_fail 0X0.P+0 %#A trash
1194 1.1 kre expect_fail X0X0P+0X X%AX trash
1195 1.1 kre expect_fail 0X0P+00X0P+0 %A%A trash garbage
1196 1.1 kre
1197 1.1 kre return $RVAL
1198 1.1 kre }
1199 1.1 kre define A_floats '%A floating conversion'
1200 1.1 kre
1201 1.1 kre missing_args()
1202 1.1 kre {
1203 1.1 kre setmsg missing_args
1204 1.1 kre
1205 1.1 kre # Note: missing string arg is replaced by "" and behaviour
1206 1.1 kre # of %c is either nothing or '\0' in that case, so avoid
1207 1.1 kre # testing missing arg for %c.
1208 1.1 kre
1209 1.1 kre
1210 1.1 kre expect '' %s
1211 1.1 kre expect '' %b
1212 1.1 kre expect 0 %d
1213 1.1 kre expect 0 %o
1214 1.1 kre expect 0 %x
1215 1.1 kre expect 0 %#o
1216 1.1 kre expect 0 %#X
1217 1.1 kre
1218 1.1 kre expect 'xxxyyyzzz' '%syyy%szzz' xxx
1219 1.1 kre expect 'a=1, b=0' 'a=%d, b=%d' 1
1220 1.1 kre
1221 1.1 kre expect 000000 %d%u%i%x%o%X
1222 1.1 kre expect 437000 %d%u%i%x%o%X 4 3 7
1223 1.1 kre
1224 1.1 kre if supported f
1225 1.1 kre then
1226 1.1 kre expect 0.000000 %f
1227 1.1 kre expect 'x=0.0' '%s=%.1f' x
1228 1.1 kre fi
1229 1.1 kre
1230 1.1 kre return $RVAL
1231 1.1 kre }
1232 1.1 kre define missing_args "format string when there are no more args"
1233 1.1 kre
1234 1.1 kre repeated_format()
1235 1.1 kre {
1236 1.1 kre setmsg repeated_format
1237 1.1 kre
1238 1.1 kre expect abcd %s a b c d
1239 1.1 kre expect 1234 %d 1 2 3 4
1240 1.1 kre expect ' 1 2 3 4' %2d 1 2 3 4
1241 1.1 kre expect abcd %.1s aaa bbb ccc ddd
1242 1.1 kre expect ' a=1 b=2 c=3' %2s=%d a 1 b 2 c 3
1243 1.1 kre expect "hello${NL}world${NL}" '%s\n' hello world
1244 1.1 kre expect "a${NL}b${NL}c${NL}d${NL}" '%.1s\n' aaa bbb ccc ddd
1245 1.1 kre
1246 1.1 kre expect "\
1247 1.1 kre 1.00"'
1248 1.1 kre 9.75
1249 1.1 kre -3.00
1250 1.1 kre 999.99
1251 1.1 kre -101.01'"${NL}" '%7.2f\n' 1 9.75 -3 999.99 -101.01
1252 1.1 kre
1253 1.1 kre expect " 1 010x1${NL} 220260x16${NL} 9201340x5c${NL}" \
1254 1.1 kre '%3d%#3o%#3x\n' 1 1 1 22 22 22 92 92 92
1255 1.1 kre
1256 1.1 kre expect ' 1 2 3 4 5' %2d 1 2 3 4 5
1257 1.1 kre expect ' 1 2 3 4 5 0' %2d%2d%2d 1 2 3 4 5
1258 1.1 kre
1259 1.1 kre
1260 1.1 kre return $RVAL
1261 1.1 kre }
1262 1.1 kre define repeated_format 'format string is reused until all args used'
1263 1.1 kre
1264 1.1 kre b_SysV_echo()
1265 1.1 kre {
1266 1.1 kre setmsg b_SysV_echo
1267 1.1 kre
1268 1.1 kre # Basic formatting
1269 1.1 kre
1270 1.1 kre expect '' %b ''
1271 1.1 kre expect '' %.0b abcd
1272 1.1 kre expect abcd %b abcd
1273 1.1 kre expect ' ab' %3.2b abcd
1274 1.1 kre expect 'a ' %-3.1b abcd
1275 1.1 kre expect ' ' %3.0b abcd
1276 1.1 kre
1277 1.1 kre # The simple stuff. nb: no \c tests, it has a whole test case to itself
1278 1.1 kre
1279 1.1 kre expect "${BSL} ${NL}" %b '\\\t\n'
1280 1.1 kre expect '
' %b '\a\v\r\f\b'
1284 1.1 kre expect 'ABC' %b '\01A\002\0102\0003C'
1285 1.1 kre expect "a${NL}b${NL}" %b 'a\nb\n'
1286 1.1 kre
1287 1.1 kre # and unlikely to occur IRL
1288 1.1 kre expect " ab
" %7.4b 'ab\r\bxy\t\t\n'
1290 1.1 kre expect "111 " %-6.3b '\00611\061\01\n\t\n'
1291 1.1 kre
1292 1.1 kre # and last, that pesky \0
1293 1.1 kre
1294 1.1 kre atf_require_prog wc
1295 1.1 kre atf_require_prog sed
1296 1.1 kre
1297 1.1 kre for fmt in '\0' '\00' '\000' '\0000'
1298 1.1 kre do
1299 1.1 kre if [ $( do_printf %b "${fmt}" | wc -c ) -ne 1 ]
1300 1.1 kre then
1301 1.1 kre atf_fail \
1302 1.1 kre "%b '${fmt}' did not output exactly 1 character (byte)"
1303 1.1 kre elif [ $(( $( do_printf %b "${fmt}" | od -A n -to1 ) )) -ne 0 ]
1304 1.1 kre then
1305 1.1 kre atf_require_prog od
1306 1.1 kre atf_require_prog tr
1307 1.1 kre
1308 1.1 kre RES="$(do_printf %b "${fmt}" | od -An -to1 | tr -d ' ')"
1309 1.1 kre atf_fail \
1310 1.1 kre "%b '${fmt}' output was '\\${RES}' should be '\\000'"
1311 1.1 kre fi
1312 1.1 kre
1313 1.1 kre for xt in "x${fmt}" "${fmt}q" "x${fmt}q" "${fmt}\\0" \
1314 1.1 kre "${fmt}|\\0|\\0|" "${fmt}${fmt}" "+${fmt}-${fmt}*"
1315 1.1 kre do
1316 1.1 kre # nb: we "know" here that the only \'s are \0's
1317 1.1 kre # nb: not do_printf, we are not testing ...
1318 1.1 kre bsl=$( printf %s "${xt}" | sed -e 's/\\00*/X/g' )
1319 1.1 kre xl=${#bsl}
1320 1.1 kre
1321 1.1 kre RES=$(( $( do_printf %b "${xt}" | wc -c ) ))
1322 1.1 kre
1323 1.1 kre if [ "${RES}" -ne "${xl}" ]
1324 1.1 kre then
1325 1.1 kre atf_fail \
1326 1.1 kre "%b '${xt}' output ${RES} chars, expected ${xl}"
1327 1.1 kre fi
1328 1.1 kre done
1329 1.1 kre
1330 1.1 kre test ${#fmt} -lt 5 && continue
1331 1.1 kre
1332 1.1 kre if [ $( do_printf %b "${fmt}1" | wc -c ) -ne 2 ]
1333 1.1 kre then
1334 1.1 kre atf_fail \
1335 1.1 kre "%b '${fmt}1' did not output exactly 2 characters"
1336 1.1 kre fi
1337 1.1 kre done
1338 1.1 kre
1339 1.1 kre return $RVAL
1340 1.1 kre }
1341 1.1 kre define b_SysV_echo '%b format - emulate SysV echo escapes'
1342 1.1 kre
1343 1.1 kre b_SysV_echo_backslash_c()
1344 1.1 kre {
1345 1.1 kre setmsg b_SysV_echo_backslash_c
1346 1.1 kre
1347 1.1 kre # test \c in arg to printf %b .. causes instant death...
1348 1.1 kre
1349 1.1 kre expect ab %b 'ab\cdef'
1350 1.1 kre expect ab a%bc 'b\cd'
1351 1.1 kre
1352 1.2 kre expect abcd %s%c%x%b a bcd 12 'd\c'
1353 1.2 kre expect ad %.1s%x%b%c%x all 13 '\cars' cost 12
1354 1.2 kre expect "a${NL}b" '%b\n' a 'b\c' d '\ce'
1355 1.2 kre
1356 1.2 kre # This is undefined, though would be nice if we could rely upon it
1357 1.2 kre # expect "abcd" %.1b 'a\c' 'b\c' 'c\c' 'd\c' '\c' e
1358 1.2 kre
1359 1.2 kre # Check for interference from one instance of execution of
1360 1.2 kre # a builtin printf execution to another
1361 1.1 kre # (this makes no sense to test for standalone printf, and for which
1362 1.1 kre # the tests don't handle ';' magic args, so this would not work)
1363 1.1 kre if $BUILTIN_TEST
1364 1.1 kre then
1365 1.1 kre expect abcdefjklmno %s%b%s abc 'def\c' ghi ';' %s%s jkl mno
1366 1.1 kre fi
1367 1.1 kre
1368 1.1 kre return $RVAL
1369 1.1 kre }
1370 1.1 kre define b_SysV_echo_backslash_c 'Use of \c in arg to %b format'
1371 1.1 kre
1372 1.1 kre indirect_width()
1373 1.1 kre {
1374 1.1 kre setmsg indirect_width
1375 1.1 kre
1376 1.1 kre supported '*d' 5 123 || {
1377 1.1 kre atf_skip "%*d not supported (indirect field width)"
1378 1.1 kre return $RVAL
1379 1.1 kre }
1380 1.1 kre
1381 1.1 kre lpad= rpad= zpad=
1382 1.1 kre for i in 1 2 3 4 5 6 7 8 9 10
1383 1.1 kre do
1384 1.1 kre expect "${lpad}7" '%*d' "$i" 7
1385 1.1 kre expect "6${rpad}" '%-*d' "$i" 6
1386 1.1 kre expect "${zpad}5" '%0*d' "$i" 5
1387 1.1 kre
1388 1.1 kre lpad="${lpad} "
1389 1.1 kre rpad="${rpad} "
1390 1.1 kre zpad="${zpad}0"
1391 1.1 kre done
1392 1.1 kre
1393 1.1 kre return $RVAL
1394 1.1 kre }
1395 1.1 kre define indirect_width "using * to get field width from arg"
1396 1.1 kre
1397 1.1 kre indirect_precision()
1398 1.1 kre {
1399 1.1 kre setmsg indirect_precision
1400 1.1 kre
1401 1.1 kre supported '.*d' 5 123 || {
1402 1.1 kre atf_skip "%.*d not supported (indirect precision)"
1403 1.1 kre return $RVAL
1404 1.1 kre }
1405 1.1 kre
1406 1.1 kre res= zpad=.
1407 1.1 kre for i in 0 1 2 3 4 5 6 7 8 9
1408 1.1 kre do
1409 1.1 kre expect "${res}" '%.*s' "$i" aaaaaaaaaaaaaaaa
1410 1.1 kre res="${res}a"
1411 1.1 kre
1412 1.1 kre expect "3${zpad}" '%#.*f' "$i" 3
1413 1.1 kre zpad="${zpad}0"
1414 1.1 kre done
1415 1.1 kre
1416 1.1 kre return $RVAL
1417 1.1 kre }
1418 1.1 kre define indirect_precision 'Using .* as to get precision from arg'
1419 1.1 kre
1420 1.1 kre indirect_both()
1421 1.1 kre {
1422 1.1 kre setmsg indirect_both
1423 1.1 kre
1424 1.1 kre supported '*.*d' 5 2 123 || {
1425 1.1 kre atf_skip "%*.*d not supported (indirect width & precision)"
1426 1.1 kre return $RVAL
1427 1.1 kre }
1428 1.1 kre
1429 1.1 kre res=
1430 1.1 kre for i in 1 2 3 4 5 6 7 8
1431 1.1 kre do
1432 1.1 kre res="${res}z"
1433 1.1 kre expect " ${res}" '%*.*s' $(( $i + 2 )) "$i" zzzzzzzzzzz
1434 1.1 kre done
1435 1.1 kre
1436 1.1 kre expect ' ab: 9: 1.20' "%*.*s:%*d:%*.*f" 4 2 abcde 3 9 5 2 1.2
1437 1.1 kre
1438 1.1 kre return $RVAL
1439 1.1 kre }
1440 1.1 kre define indirect_both 'Using *.* as to get width & precision from args'
1441 1.1 kre
1442 1.1 kre q_quoting()
1443 1.1 kre {
1444 1.1 kre setmsg q_quoting
1445 1.1 kre
1446 1.1 kre if ! supported q
1447 1.1 kre then
1448 1.1 kre atf_skip '%q format not supported'
1449 1.1 kre return $RVAL
1450 1.1 kre fi
1451 1.1 kre
1452 1.1 kre # Testing quoting isn't as straightforward as many of the
1453 1.1 kre # others, as there is no specific form in which the output
1454 1.1 kre # is required to appear
1455 1.1 kre
1456 1.1 kre # Instead, we will apply %q to various strings, and then
1457 1.1 kre # process them again in this shell, and see if the string
1458 1.1 kre # we get back is the same as the string we started with.
1459 1.1 kre
1460 1.1 kre for string in \
1461 1.1 kre abcd \
1462 1.1 kre 'hello world' \
1463 1.1 kre '# a comment ....' \
1464 1.1 kre '' \
1465 1.1 kre 'a* b* c*' \
1466 1.1 kre 'ls | wc' \
1467 1.1 kre '[<> # | { ~.** } $@]' \
1468 1.1 kre '( who & echo $! )'
1469 1.1 kre do
1470 1.1 kre QUOTED="$(do_printf %q "$string")"
1471 1.1 kre
1472 1.1 kre eval "RES=${QUOTED}"
1473 1.1 kre
1474 1.1 kre if [ "${RES}" != "${string}" ]
1475 1.1 kre then
1476 1.1 kre atf_fail \
1477 1.1 kre "%q <<${string}>> as <<${QUOTED}>> makes <<${RES}>>"
1478 1.1 kre continue
1479 1.1 kre fi
1480 1.1 kre
1481 1.1 kre QUOTED="$(do_printf %-32q "$string")"
1482 1.1 kre
1483 1.1 kre if [ ${#QUOTED} -lt 32 ]
1484 1.1 kre then
1485 1.1 kre atf-fail \
1486 1.1 kre "%-32q <<${string}>> short result (${#QUOTED}) <<${QUOTED}>>"
1487 1.1 kre
1488 1.1 kre fi
1489 1.1 kre
1490 1.1 kre eval "RES=${QUOTED}"
1491 1.1 kre if [ "${RES}" != "${string}" ]
1492 1.1 kre then
1493 1.1 kre atf_fail \
1494 1.1 kre "%-32q <<${string}>> as <<${QUOTED}>> makes <<${RES}>>"
1495 1.1 kre continue
1496 1.1 kre fi
1497 1.1 kre done
1498 1.1 kre
1499 1.1 kre # %q is a variant of %s, but using field width (except as above),
1500 1.1 kre # and especially precision makes no sense, and is implrmented so
1501 1.1 kre # badly that testing it would be hopeless. Other flags do nothing.
1502 1.1 kre
1503 1.1 kre return $RVAL
1504 1.1 kre }
1505 1.1 kre define q_quoting '%q quote string suitably for sh processing'
1506 1.1 kre
1507 1.1 kre NetBSD_extensions()
1508 1.1 kre {
1509 1.1 kre setmsg NetBSD_extensions
1510 1.1 kre
1511 1.1 kre if $BUILTIN_TEST
1512 1.1 kre then
1513 1.1 kre # what matters if $TEST_SH is a NetBSD sh
1514 1.1 kre ${TEST_SH} -c 'test -n "$NETBSD_SHELL"' || {
1515 1.1 kre atf_skip \
1516 1.1 kre "- ${TEST_SH%% *} is not a (modern) NetBSD shell"
1517 1.1 kre return $RVAL
1518 1.1 kre }
1519 1.1 kre fi
1520 1.1 kre if ! supported '*.*%%_._' 78 66
1521 1.1 kre then
1522 1.1 kre if $BUILTIN_TEST
1523 1.1 kre then
1524 1.1 kre atf_skip \
1525 1.1 kre "- ${TEST_SH%% *} is not a (modern enough) NetBSD shell"
1526 1.1 kre else
1527 1.1 kre atf_skip "- ${PRINTF} is not a (modern) NetBSD printf"
1528 1.1 kre fi
1529 1.1 kre return $RVAL
1530 1.1 kre fi
1531 1.1 kre
1532 1.1 kre # Even in the most modern NetBSD printf the data length modifiers
1533 1.1 kre # might not be supported.
1534 1.1 kre
1535 1.1 kre if supported zd
1536 1.1 kre then
1537 1.1 kre expect 88888 %jd 88888
1538 1.1 kre expect 88888 %ld 88888
1539 1.1 kre expect 88888 %lld 88888
1540 1.1 kre expect 88888 %Ld 88888
1541 1.1 kre expect 88888 %td 88888
1542 1.1 kre expect 88888 %zd 88888
1543 1.1 kre
1544 1.1 kre expect 23352 %hd 88888
1545 1.1 kre expect 56 %hhd 88888
1546 1.1 kre
1547 1.1 kre expect 300000 %jd 300000
1548 1.1 kre expect 300000 %Ld 300000
1549 1.1 kre expect -27680 %hd 300000
1550 1.1 kre expect -32 %hhd 300000
1551 1.1 kre
1552 1.1 kre expect 15b38 %jx 88888
1553 1.1 kre expect 5b38 %hx 88888
1554 1.1 kre expect 38 %hhx 88888
1555 1.1 kre
1556 1.3 kre expect 93e0 %hx 300000
1557 1.3 kre expect e0 %hhx 300000
1558 1.3 kre
1559 1.3 kre # to test modifiers attached to floats we'd need to
1560 1.3 kre # verify float support, so don't bother...
1561 1.3 kre fi
1562 1.3 kre
1563 1.3 kre expect 6.500000e+01 '%e' "'A"
1564 1.1 kre expect 6.5e+01 '%.1e' "'A"
1565 1.1 kre expect 5e+01 '%.0e' "'1"
1566 1.1 kre expect 4.50e+01 '%.2e' "'-1"
1567 1.1 kre expect 4.300e+01 '%.3e' "'+1"
1568 1.1 kre expect 99.000000 '%f' '"c"
1569 1.1 kre expect 97 '%g' '"a"
1570 1.1 kre
1571 1.1 kre # NetBSD (non-POSIX) format excape extensions
1572 1.1 kre expect '' '\e'
1573 1.1 kre expect '' '\E'
1574 1.1 kre expect '' '\e\E'
1575 1.1 kre
1576 1.1 kre # NetBSD (non-POSIX) %b string escape extensions
1577 1.1 kre expect '' %b '\^A\^a\1'
1578 1.1 kre expect 'S4=X' %b '\1234\75X'
1579 1.1 kre expect 'xz' %b 'x\M-Yz'
1580 1.1 kre expect 'xz' %b 'x\M^wz'
1581 1.1 kre expect 'ab' %b 'a\^?b'
1582 1.1 kre expect '--' %b '-\M^?-'
1583 1.1 kre
1584 1.1 kre expect 'A1b2c3D4' '\x411%b\x444' '\x622\x633'
1585 1.1 kre expect '"'\' %b\\\' '\"\e'
1586 1.1 kre expect '+' %b '\x1+\x3'
1587 1.1 kre expect '[1m' %b '\E[\61\x6d'
1588 1.1 kre
1589 1.1 kre expect_fail "${BSL}" '\'
1590 1.1 kre expect_fail '@' '\@'
1591 1.1 kre expect_fail '%' '\%'
1592 1.1 kre expect_fail "${BSL}" %b '\'
1593 1.1 kre expect_fail '@' %b '\@'
1594 1.1 kre
1595 1.1 kre # This is unspecified in posix:
1596 1.1 kre # If arg string uses no args, but there are some, run format just once
1597 1.1 kre expect 'hello world' 'hello world' a b c d
1598 1.1 kre
1599 1.1 kre # Same as in format_escapes, but for \x (hex) constants
1600 1.1 kre atf_require_prog wc
1601 1.1 kre atf_require_prog od
1602 1.1 kre atf_require_prog tr
1603 1.1 kre
1604 1.1 kre for fmt in '\x0' '\x00'
1605 1.1 kre do
1606 1.1 kre if [ $( do_printf "${fmt}" | wc -c ) -ne 1 ]
1607 1.1 kre then
1608 1.1 kre atf_fail \
1609 1.1 kre "printf '${fmt}' did not output exactly 1 character (byte)"
1610 1.1 kre elif [ $(( $( do_printf "${fmt}" | od -A n -to1 ) )) -ne 0 ]
1611 1.1 kre then
1612 1.1 kre
1613 1.1 kre RES="$( do_printf "${fmt}" | od -A n -to1 | tr -d ' ')"
1614 1.1 kre atf_fail \
1615 1.1 kre "printf '${fmt}' output was '\\${RES}' should be '\\000'"
1616 1.1 kre fi
1617 1.1 kre done
1618 1.1 kre
1619 1.1 kre # We get different results here from the builtin and command
1620 1.1 kre # versions of printf ... OK, as which result is unspecified.
1621 1.1 kre if $BUILTIN_TEST
1622 1.1 kre then
1623 1.1 kre if [ $( do_printf %c '' | wc -c ) -ne 0 ]
1624 1.1 kre then
1625 1.1 kre atf_require_prog sed
1626 1.1 kre
1627 1.1 kre RES="$( do_printf %c '' |
1628 1.1 kre od -A n -to1 |
1629 1.1 kre sed -e 's/ [0-9]/\\&/g' -e 's/ //g' )"
1630 1.1 kre atf_fail \
1631 1.1 kre "printf %c '' did not output nothing: got '${RES}'"
1632 1.1 kre fi
1633 1.1 kre else
1634 1.1 kre if [ $( do_printf %c '' | wc -c ) -ne 1 ]
1635 1.1 kre then
1636 1.1 kre atf_require_prog sed
1637 1.1 kre
1638 1.1 kre RES="$( do_printf %c '' |
1639 1.1 kre od -A n -to1 |
1640 1.1 kre sed -e 's/ [0-9]/\\&/g' -e 's/ //g' )"
1641 1.1 kre atf_fail \
1642 1.1 kre "printf %c '' did not output nothing: got '${RES}'"
1643 1.1 kre elif [ $(( $( do_printf %c '' | od -A n -to1 ) )) -ne 0 ]
1644 1.1 kre then
1645 1.1 kre RES="$( do_printf %c '' | od -A n -to1 | tr -d ' ')"
1646 1.1 kre atf_fail \
1647 1.1 kre "printf %c '' output was '\\${RES}' should be '\\000'"
1648 1.1 kre fi
1649 1.1 kre fi
1650 1.1 kre
1651 1.1 kre return $RVAL
1652 1.1 kre }
1653 1.1 kre define NetBSD_extensions "Local NetBSD additions to printf"
1654 1.1 kre
1655 1.1 kre B_string_expand()
1656 1.1 kre {
1657 1.1 kre setmsg B_string_expand
1658 1.1 kre
1659 1.1 kre if ! supported B
1660 1.1 kre then
1661 1.1 kre atf_skip "%B format not supported"
1662 1.1 kre return $RVAL
1663 1.1 kre fi
1664 1.1 kre
1665 1.1 kre # Even if %B is supported, it is not necessarily *our* %B ...
1666 1.1 kre
1667 1.1 kre if $BUILTIN_TEST
1668 1.1 kre then
1669 1.1 kre # what matters if $TEST_SH is a NetBSD sh
1670 1.1 kre ${TEST_SH} -c 'test -n "$NETBSD_SHELL"' || {
1671 1.1 kre atf_skip \
1672 1.1 kre "- ${TEST_SH%% *} is not a (modern) NetBSD shell"
1673 1.1 kre return $RVAL
1674 1.1 kre }
1675 1.1 kre else
1676 1.1 kre atf_require_prog uname
1677 1.1 kre
1678 1.1 kre SYS="$(uname -s)"
1679 1.1 kre case "${SYS}" in
1680 1.1 kre (NetBSD) ;;
1681 1.1 kre (*) atf_skip "- Not NetBSD (is $SYS), %B format unspecified"
1682 1.1 kre return $RVAL
1683 1.1 kre ;;
1684 1.1 kre esac
1685 1.1 kre fi
1686 1.1 kre
1687 1.1 kre # The trivial stuff...
1688 1.1 kre expect abcd %B abcd
1689 1.1 kre expect ' abcd' %5B abcd
1690 1.1 kre expect 'abcd ' %-5B abcd
1691 1.1 kre expect ab %.2B abcd
1692 1.1 kre expect ' ab' %5.2B abcd
1693 1.1 kre expect 'ab ' %-5.2B abcd
1694 1.1 kre
1695 1.1 kre # Next the semi-trivial
1696 1.1 kre expect "abcd${BSL}n" %B "abcd${NL}"
1697 1.1 kre expect "ab${BSL}tcd" %B "ab cd"
1698 1.1 kre expect "${BSL}\"${BSL}e${BSL}a${BSL}b${BSL}f${BSL}r${BSL}v" \
1699 1.1 kre %B '"
'
1703 1.1 kre expect "${BSL}'${BSL}^?" %B \'''
1704 1.1 kre expect "${BSL}^A${BSL}^B" %B ''
1705 1.1 kre expect "x${BSL}M-Yz" %B 'xz'
1706 1.1 kre expect "-${BSL}M^W-" %B '--'
1707 1.1 kre expect ":${BSL}M^?:" %B '::'
1708 1.1 kre
1709 1.1 kre # Then, more or less nonsense
1710 1.1 kre expect " abcd${BSL}n" %9B "abcd${NL}"
1711 1.1 kre expect "ab${BSL}tcd " %-9B "ab cd"
1712 1.1 kre expect " ${BSL}'${BSL}^?" %6B \'''
1713 1.1 kre expect "${BSL}^A${BSL}^B " %-7B ''
1714 1.1 kre expect " -${BSL}M^W-" %8B '--'
1715 1.1 kre expect ":${BSL}M^?: " %-8B '::'
1716 1.1 kre
1717 1.1 kre # and finally, the absurd, ridiculous, and bizarre (useless)
1718 1.1 kre expect "abcd${BSL}" %.5B "abcd${NL}"
1719 1.1 kre expect "ab${BSL}" %.3B "ab cd"
1720 1.1 kre expect "${BSL}\"${BSL}" %.3B '"
'
1724 1.1 kre expect "${BSL}" %.1B \'''
1725 1.1 kre expect "${BSL}^" %.2B ''
1726 1.1 kre expect "x${BSL}M-" %.4B 'xz'
1727 1.1 kre expect "-${BSL}M^" %.4B '--'
1728 1.1 kre expect ":${BSL}M" %.3B '::'
1729 1.1 kre
1730 1.1 kre return $RVAL
1731 1.1 kre }
1732 1.1 kre define B_string_expand "NetBSD specific %B string expansion"
1733 1.1 kre
1734 1.1 kre
1735 1.1 kre #############################################################################
1736 1.1 kre #############################################################################
1737 1.1 kre #
1738 1.1 kre # The code to make the tests above actually run starts here...
1739 1.1 kre #
1740 1.1 kre
1741 1.1 kre # if setup fails, then ignore any test names on command line
1742 1.1 kre # Just run the (one) test that setup() established
1743 1.1 kre setup || set --
1744 1.1 kre
1745 1.1 kre NL='
1746 1.1 kre '
1747 1.1 kre # test how the shell we're running handles quoted patterns in vars
1748 1.1 kre # Note: it is not our task here to diagnose the broken shell
1749 1.1 kre B1='\'
1750 1.1 kre B2='\\'
1751 1.1 kre case "${B1}" in
1752 1.1 kre (${B2}) BSL="${B2}";; # This one is correct
1753 1.1 kre (${B1}) BSL="${B1}";; # but some shells can't handle that
1754 1.1 kre (*) BSL=BROKEN_SHELL;; # !!!
1755 1.1 kre esac
1756 1.1 kre
1757 1.1 kre if $Running_under_ATF
1758 1.1 kre then
1759 1.1 kre # When in ATF, just add the test cases, and finish, and ATF
1760 1.1 kre # will take care of running everything
1761 1.1 kre
1762 1.1 kre atf_init_test_cases() {
1763 1.1 kre
1764 1.1 kre for T in $Tests
1765 1.3 kre do
1766 1.1 kre atf_add_test_case "$T"
1767 1.1 kre done
1768 1.1 kre return 0
1769 1.1 kre }
1770 1.1 kre exec 3>&2
1771 1.1 kre else
1772 1.1 kre # When not in AFT, we need to do it all here...
1773 1.1 kre
1774 1.1 kre Failed=
1775 1.1 kre Failures=0
1776 1.1 kre
1777 1.1 kre STDERR=$(mktemp ${TMPDIR:-/tmp}/Test-XXXXXX)
1778 1.1 kre trap "rm -f '${STDERR}'" EXIT
1779 1.1 kre exec 3>"${STDERR}"
1780 1.1 kre
1781 1.1 kre case "$#" in
1782 1.1 kre (0) set -- $Tests ;;
1783 1.1 kre esac
1784 1.1 kre
1785 1.1 kre for T
1786 1.1 kre do
1787 1.1 kre $T || {
1788 1.1 kre Failed="${Failed}${Failed:+${NL}} ${T} : "
1789 1.1 kre eval Failed='${Failed}${TEST_'"${T}"'_MSG}'
1790 1.1 kre Failures=$(( $Failures + 1 ))
1791 1.1 kre }
1792 1.1 kre done
1793 1.1 kre if [ $Failures -gt 0 ]
1794 1.1 kre then
1795 1.1 kre s=s
1796 1.1 kre test $Failures -eq 1 && s=
1797 1.1 kre
1798 1.1 kre exec >&2
1799 1.1 kre echo
1800 1.1 kre echo =================================================
1801 1.1 kre echo
1802 1.1 kre echo "$Failures test$s failed:"
1803 echo "$Failed"
1804 echo
1805 echo =================================================
1806
1807 if test -s "${STDERR}"
1808 then
1809 echo
1810 echo The following appeared on stderr during the tests:
1811 echo
1812 cat "${STDERR}"
1813 fi
1814 fi
1815 fi
1816