--- /dev/null
+#ifndef STLPLUS_DPRINTF\r
+#define STLPLUS_DPRINTF\r
+////////////////////////////////////////////////////////////////////////////////\r
+\r
+// Author: Andy Rushton\r
+// Copyright: (c) Southampton University 1999-2004\r
+// (c) Andy Rushton 2004-2009\r
+// License: BSD License, see ../docs/license.html\r
+\r
+// Provides an sprintf-like function acting on STL strings. The 'd' in dprintf\r
+// stands for "dynamic" in that the string is a dynamic string whereas a char*\r
+// buffer would be static (in size that is, not static in C terms).\r
+\r
+// The obvious solution to the problem of in-memory formatted output is to use\r
+// sprintf(), but this is a potentially dangerous operation since it will quite\r
+// happily charge off the end of the string it is printing to and thereby\r
+// corrupt memory. This kind of buffer-overflow vulnerability is the source of\r
+// most security failures exploited by virus-writers. It means that sprintf\r
+// should *never* be used and should be made obsolete.\r
+\r
+// In any case, using arbitrary-sized fixed-length buffers is not part of any\r
+// quality-orientated design philosophy.\r
+\r
+// Most operating systems now have a safe version of sprintf, but this is\r
+// non-standard. The functions in this file are platform-independent interfaces\r
+// to the underlying safe implementation.\r
+\r
+// I would like to make this set of functions obsolete too, since I believe the\r
+// C runtime should be deprecated in favour of C++ runtime which uses dynamic\r
+// strings and can handle exceptions. However, there is as yet no C++\r
+// equivalent functionality to some of the string-handling available through\r
+// the printf-like functions, so it has to stay for now.\r
+\r
+// int dprintf (std::string& buffer, const char* format, ...);\r
+\r
+// Formats the message by appending to the std::string buffer according to\r
+// the formatting codes in the format string. The return int is the number\r
+// of characters generated by this call, i.e. the increase in the length of\r
+// the std::string.\r
+\r
+// int vdprintf (std::string& buffer, const char* format, va_list args);\r
+\r
+// As above, but using a pre-initialised va_args argument list. Useful for\r
+// nesting dprintf calls within variable argument functions.\r
+\r
+// std::string dformat (const char* format, ...);\r
+\r
+// Similar to dprintf() above, except the result is formatted into a new\r
+// std::string which is returned by the function. Very useful for inline\r
+// calls within an iostream expression.\r
+\r
+// e.g. cout << "Total: " << dformat("%6i",t) << endl;\r
+\r
+// std::string vdformat (const char* format, va_list);\r
+ \r
+// As above, but using a pre-initialised va_args argument list. Useful for nesting\r
+// dformat calls within variable argument functions.\r
+\r
+// The format string supports the following format codes as in the C runtime library:\r
+\r
+// % [ flags ] [ field ] [ . precision ] [ modifier ] [ conversion ]\r
+\r
+// flags:\r
+// - - left justified\r
+// + - print sign for +ve numbers\r
+// ' ' - leading space where + sign would be\r
+// 0 - leading zeros to width of field\r
+// # - alternate format\r
+\r
+// field:\r
+// a numeric argument specifying the field width - default = 0\r
+// * means take the next va_arg as the field width - if negative then left justify\r
+\r
+// precision:\r
+// a numeric argument the meaning of which depends on the conversion -\r
+// - %s - max characters from a string - default = strlen()\r
+// - %e, %f - decimal places to be displayed - default = 6\r
+// - %g - significant digits to be displayed - default = 6\r
+// - all integer conversions - minimum digits to display - default = 0\r
+// * means take the next va_arg as the field width - if negative then left justify\r
+\r
+// modifier:\r
+// h - short or unsigned short\r
+// l - long or unsigned long\r
+// L - long double\r
+\r
+// conversions:\r
+// d, i - short/int/long as decimal\r
+// u - short/int/long as unsigned decimal\r
+// o - short/int/long as unsigned octal - # adds leading 0\r
+// x, X - short/int/long as unsigned hexadecimal - # adds leading 0x\r
+// c - char\r
+// s - char*\r
+// f - double/long double as fixed point\r
+// e, E - double/long double as floating point\r
+// g, G - double/long double as fixed point/floating point depending on value\r
+// p - void* as unsigned hexadecimal\r
+// % - literal %\r
+// n - int* as recipient of length of formatted string so far\r
+\r
+////////////////////////////////////////////////////////////////////////////////\r
+#include "portability_fixes.hpp"\r
+#include <string>\r
+#include <stdexcept>\r
+#include <stdarg.h>\r
+\r
+namespace stlplus\r
+{\r
+\r
+ // format by appending to a string and return the increase in length\r
+ // if there is an error, return a negative number and leave the string unchanged\r
+ int dprintf (std::string& formatted, const char* format, ...);\r
+ int vdprintf (std::string& formatted, const char* format, va_list args);\r
+\r
+ // format into a new string and return the result\r
+ // if there is an error, throw an exception\r
+ std::string dformat (const char* format, ...) throw(std::invalid_argument);\r
+ std::string vdformat (const char* format, va_list) throw(std::invalid_argument);\r
+\r
+} // end namespace stlplus\r
+\r
+#endif\r