diff options
Diffstat (limited to 'src/builtins/printf_builtin.cpp')
-rw-r--r-- | src/builtins/printf_builtin.cpp | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/src/builtins/printf_builtin.cpp b/src/builtins/printf_builtin.cpp index db40fff..0d2ef1c 100644 --- a/src/builtins/printf_builtin.cpp +++ b/src/builtins/printf_builtin.cpp @@ -41,23 +41,33 @@ int printf_builtin::exec(const std::vector<std::string>& bash_args) std::stringstream format_string; cppbash_builtin::transform_escapes(*begin, format_string, false); boost::format formatter(format_string.str()); + formatter.exceptions(boost::io::all_error_bits ^ boost::io::too_few_args_bit); + + std::stringstream output; for(auto iter = begin + 1; iter != bash_args.end(); ++iter) - formatter = formatter % *iter; + try + { + formatter = formatter % *iter; + } + catch(const boost::io::too_many_args& e) + { + output << formatter; + formatter.parse(format_string.str()); + formatter = formatter % *iter; + } + output << formatter; if(!(bash_args[0][0] == '-')) { - *_out_stream << formatter; + *_out_stream << output.str(); } else if(bash_args[0] == "-v") { - std::stringstream output; - output << formatter; _walker.set_value(bash_args[1], output.str()); } else { throw libbash::illegal_argument_exception("printf: invalid option: " + bash_args[0]); } - return 0; } |