1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
|
#include <ostream>
#include <iostream>
#include <memory>
#include <stdarg.h>
class oformstream: public std::ostream // 6
{
public:
oformstream(std::streambuf *buf) // 10
:
std::ostream(buf)
{}
oformstream &
form(char const *fmt, ...) // 16
{
va_list list;
va_start(list, fmt);
return vform(fmt, list);
}
oformstream &
vform(char const *fmt, va_list list) // 24
{
size_t size = 128; // 26
while (true) // 28
{
std::auto_ptr<char> buf(new char[size]);// 30
va_list vlist = list;
int n = // 32
vsnprintf (buf.get(), size, fmt, vlist);
if (n > -1 && n < size) // 35
{
write(buf.get(), n);
return *this;
}
if ((size <<= 1) == 0) // 41
{
std::cerr << "vform() buffer maximum reached\n";
exit(1);
}
}
}
};
|