diff options
Diffstat (limited to 'src/lib/stdio.C')
-rw-r--r-- | src/lib/stdio.C | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/src/lib/stdio.C b/src/lib/stdio.C new file mode 100644 index 000000000..2cdd23d85 --- /dev/null +++ b/src/lib/stdio.C @@ -0,0 +1,44 @@ +#include <stdint.h> +#include <stdio.h> +#include <util/sprintf.H> +#include <util/functor.H> + +class SprintfBuffer +{ + public: + int putc(int c) + { + if ('\b' == c) + { + iv_pos--; + } + else + { + iv_buffer[iv_pos++] = c; + } + return c; + } + + explicit SprintfBuffer(char* buf) : iv_pos(0), iv_buffer(buf) {}; + + private: + size_t iv_pos; + char * iv_buffer; +}; + +int sprintf(char *str, const char * format, ...) +{ + using Util::mem_ptr_fun; + using Util::vasprintf; + + va_list args; + va_start(args, format); + + SprintfBuffer console(str); + size_t count = vasprintf(mem_ptr_fun(console, &SprintfBuffer::putc), + format, args); + + va_end(args); + + return count; +} |