diff --git a/basis/formatting/formatting-tests.factor b/basis/formatting/formatting-tests.factor index 0d70484b0b..413a524b67 100755 --- a/basis/formatting/formatting-tests.factor +++ b/basis/formatting/formatting-tests.factor @@ -3,7 +3,7 @@ USING: calendar kernel formatting tools.test system ; IN: formatting.tests -[ "%s" printf ] must-infer +[ "%s" printf ] must-infer [ "%s" sprintf ] must-infer [ "" ] [ "" sprintf ] unit-test @@ -21,6 +21,8 @@ IN: formatting.tests [ "1.2346" ] [ 1.23456789 "%.4f" sprintf ] unit-test [ " 1.23" ] [ 1.23456789 "%6.2f" sprintf ] unit-test +{ "foo: 1 bar: 2" } [ { 1 2 3 } "foo: %d bar: %s" vsprintf ] unit-test + os windows? [ [ "1.234000e+008" ] [ 123400000 "%e" sprintf ] unit-test [ "-1.234000e+008" ] [ -123400000 "%e" sprintf ] unit-test diff --git a/basis/formatting/formatting.factor b/basis/formatting/formatting.factor index c7e51581ad..c2169bac2b 100644 --- a/basis/formatting/formatting.factor +++ b/basis/formatting/formatting.factor @@ -98,6 +98,15 @@ MACRO: printf ( format-string -- ) : sprintf ( format-string -- result ) [ printf ] with-string-writer ; inline +: vprintf ( seq format-string -- ) + parse-printf reverse! [ + first dup string? + [ '[ _ write ] ] [ '[ unclip-slice @ write ] ] if + ] map concat call( x -- x ) drop ; + +: vsprintf ( seq format-string -- result ) + [ vprintf ] with-string-writer ; inline + string 2 CHAR: 0 pad-head ; inline