-////////////////////////////////////////////////////////////////////////////////\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
-// Notes:\r
-\r
-// Feb 2007: Rewritten in terms of platform-specific fixes to the\r
-// buffer-overflow problem. Using native functions for this has the added\r
-// benefit of giving access to other features of the C-runtime such as Unicode\r
-// support.\r
-\r
-////////////////////////////////////////////////////////////////////////////////\r
-\r
-#include "dprintf.hpp"\r
-#include <stdio.h>\r
-#include <limits.h>\r
-#include <float.h>\r
-#include <ctype.h>\r
-#include <stdlib.h>\r
-\r
-////////////////////////////////////////////////////////////////////////////////\r
-\r
-namespace stlplus\r
-{\r
-\r
-////////////////////////////////////////////////////////////////////////////////\r
-\r
- int vdprintf(std::string& formatted, const char* format, va_list args)\r
- {\r
-#ifdef MSWINDOWS\r
- int length = 0;\r
- char* buffer = 0;\r
- for(int buffer_length = 256; ; buffer_length*=2)\r
- {\r
- buffer = (char*)malloc(buffer_length);\r
- if (!buffer) return -1;\r
- length = _vsnprintf(buffer, buffer_length-1, format, args);\r
- if (length >= 0)\r
- {\r
- buffer[length] = 0;\r
- formatted += std::string(buffer);\r
- free(buffer);\r
- break;\r
- }\r
- free(buffer);\r
- }\r
- return length;\r
-#else\r
- char* buffer = 0;\r
- int length = vasprintf(&buffer, format, args);\r
- if (!buffer) return -1;\r
- if (length >= 0)\r
- formatted += std::string(buffer);\r
- free(buffer);\r
- return length;\r
-#endif\r
- }\r
-\r
- int dprintf(std::string& formatted, const char* format, ...)\r
- {\r
- va_list args;\r
- va_start(args, format);\r
- int result = vdprintf(formatted, format, args);\r
- va_end(args);\r
- return result;\r
- }\r
-\r
- std::string vdformat(const char* format, va_list args) throw(std::invalid_argument)\r
- {\r
- std::string formatted;\r
- int length = vdprintf(formatted, format, args);\r
- if (length < 0) throw std::invalid_argument("dprintf");\r
- return formatted;\r
- }\r
-\r
- std::string dformat(const char* format, ...) throw(std::invalid_argument)\r
- {\r
- std::string formatted;\r
- va_list args;\r
- va_start(args, format);\r
- int length = vdprintf(formatted, format, args);\r
- va_end(args);\r
- if (length < 0) throw std::invalid_argument("dprintf");\r
- return formatted;\r
- }\r
-\r
-////////////////////////////////////////////////////////////////////////////////\r
-\r
-} // end namespace stlplus\r
+////////////////////////////////////////////////////////////////////////////////
+
+// Author: Andy Rushton
+// Copyright: (c) Southampton University 1999-2004
+// (c) Andy Rushton 2004-2009
+// License: BSD License, see ../docs/license.html
+
+// Notes:
+
+// Feb 2007: Rewritten in terms of platform-specific fixes to the
+// buffer-overflow problem. Using native functions for this has the added
+// benefit of giving access to other features of the C-runtime such as Unicode
+// support.
+
+////////////////////////////////////////////////////////////////////////////////
+
+#include "dprintf.hpp"
+#include <stdio.h>
+#include <limits.h>
+#include <float.h>
+#include <ctype.h>
+#include <stdlib.h>
+
+////////////////////////////////////////////////////////////////////////////////
+
+namespace stlplus
+{
+
+////////////////////////////////////////////////////////////////////////////////
+
+ int vdprintf(std::string& formatted, const char* format, va_list args)
+ {
+#ifdef MSWINDOWS
+ int length = 0;
+ char* buffer = 0;
+ for(int buffer_length = 256; ; buffer_length*=2)
+ {
+ buffer = (char*)malloc(buffer_length);
+ if (!buffer) return -1;
+ length = _vsnprintf(buffer, buffer_length-1, format, args);
+ if (length >= 0)
+ {
+ buffer[length] = 0;
+ formatted += std::string(buffer);
+ free(buffer);
+ break;
+ }
+ free(buffer);
+ }
+ return length;
+#else
+ char* buffer = 0;
+ int length = vasprintf(&buffer, format, args);
+ if (!buffer) return -1;
+ if (length >= 0)
+ formatted += std::string(buffer);
+ free(buffer);
+ return length;
+#endif
+ }
+
+ int dprintf(std::string& formatted, const char* format, ...)
+ {
+ va_list args;
+ va_start(args, format);
+ int result = vdprintf(formatted, format, args);
+ va_end(args);
+ return result;
+ }
+
+ std::string vdformat(const char* format, va_list args) throw(std::invalid_argument)
+ {
+ std::string formatted;
+ int length = vdprintf(formatted, format, args);
+ if (length < 0) throw std::invalid_argument("dprintf");
+ return formatted;
+ }
+
+ std::string dformat(const char* format, ...) throw(std::invalid_argument)
+ {
+ std::string formatted;
+ va_list args;
+ va_start(args, format);
+ int length = vdprintf(formatted, format, args);
+ va_end(args);
+ if (length < 0) throw std::invalid_argument("dprintf");
+ return formatted;
+ }
+
+////////////////////////////////////////////////////////////////////////////////
+
+} // end namespace stlplus