--- /dev/null
+////////////////////////////////////////////////////////////////////////////////\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
+////////////////////////////////////////////////////////////////////////////////\r
+#include "string_float.hpp"\r
+#include <stdlib.h>\r
+#include <ctype.h>\r
+#include <stdarg.h>\r
+#include <stdio.h>\r
+\r
+namespace stlplus\r
+{\r
+\r
+ // added as a local copy to break the dependency on the portability library\r
+ static std::string local_dformat(const char* format, ...) throw(std::invalid_argument)\r
+ {\r
+ std::string formatted;\r
+ va_list args;\r
+ va_start(args, format);\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) throw std::invalid_argument("string_float");\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
+#else\r
+ char* buffer = 0;\r
+ int length = vasprintf(&buffer, format, args);\r
+ if (!buffer) throw std::invalid_argument("string_float");\r
+ if (length >= 0)\r
+ formatted += std::string(buffer);\r
+ free(buffer);\r
+#endif\r
+ va_end(args);\r
+ if (length < 0) throw std::invalid_argument("string_float");\r
+ return formatted;\r
+ }\r
+\r
+ ////////////////////////////////////////////////////////////////////////////////\r
+ // floating-point types\r
+\r
+ std::string float_to_string(float f, real_display_t display, unsigned width, unsigned precision)\r
+ throw(std::invalid_argument)\r
+ {\r
+ return double_to_string((double)f, display, width, precision);\r
+ }\r
+\r
+ std::string double_to_string(double f, real_display_t display, unsigned width, unsigned precision)\r
+ throw(std::invalid_argument)\r
+ {\r
+ switch(display)\r
+ {\r
+ case display_fixed:\r
+ return local_dformat("%*.*f", width, precision, f);\r
+ case display_floating:\r
+ return local_dformat("%*.*e", width, precision, f);\r
+ case display_mixed:\r
+ return local_dformat("%*.*g", width, precision, f);\r
+ default:\r
+ throw std::invalid_argument("invalid radix display value");\r
+ }\r
+ }\r
+\r
+ ////////////////////////////////////////////////////////////////////////////////\r
+\r
+ float string_to_float(const std::string& value)\r
+ throw(std::invalid_argument)\r
+ {\r
+ return (float)string_to_double(value);\r
+ }\r
+\r
+ double string_to_double(const std::string& value)\r
+ throw(std::invalid_argument)\r
+ {\r
+ // TODO - error checking\r
+ return strtod(value.c_str(), 0);\r
+ }\r
+\r
+ ////////////////////////////////////////////////////////////////////////////////\r
+\r
+} // end namespace stlplus\r