-////////////////////////////////////////////////////////////////////////////////\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
+////////////////////////////////////////////////////////////////////////////////
+
+// Author: Andy Rushton
+// Copyright: (c) Southampton University 1999-2004
+// (c) Andy Rushton 2004-2009
+// License: BSD License, see ../docs/license.html
+
+////////////////////////////////////////////////////////////////////////////////
+#include "string_float.hpp"
+#include <stdlib.h>
+#include <ctype.h>
+#include <stdarg.h>
+#include <stdio.h>
+
+namespace stlplus
+{
+
+ // added as a local copy to break the dependency on the portability library
+ static std::string local_dformat(const char* format, ...) throw(std::invalid_argument)
+ {
+ std::string formatted;
+ va_list args;
+ va_start(args, format);
+#ifdef MSWINDOWS
+ int length = 0;
+ char* buffer = 0;
+ for(int buffer_length = 256; ; buffer_length*=2)
+ {
+ buffer = (char*)malloc(buffer_length);
+ if (!buffer) throw std::invalid_argument("string_float");
+ length = _vsnprintf(buffer, buffer_length-1, format, args);
+ if (length >= 0)
+ {
+ buffer[length] = 0;
+ formatted += std::string(buffer);
+ free(buffer);
+ break;
+ }
+ free(buffer);
+ }
+#else
+ char* buffer = 0;
+ int length = vasprintf(&buffer, format, args);
+ if (!buffer) throw std::invalid_argument("string_float");
+ if (length >= 0)
+ formatted += std::string(buffer);
+ free(buffer);
+#endif
+ va_end(args);
+ if (length < 0) throw std::invalid_argument("string_float");
+ return formatted;
+ }
+
+ ////////////////////////////////////////////////////////////////////////////////
+ // floating-point types
+
+ std::string float_to_string(float f, real_display_t display, unsigned width, unsigned precision)
+ throw(std::invalid_argument)
+ {
+ return double_to_string((double)f, display, width, precision);
+ }
+
+ std::string double_to_string(double f, real_display_t display, unsigned width, unsigned precision)
+ throw(std::invalid_argument)
+ {
+ switch(display)
+ {
+ case display_fixed:
+ return local_dformat("%*.*f", width, precision, f);
+ case display_floating:
+ return local_dformat("%*.*e", width, precision, f);
+ case display_mixed:
+ return local_dformat("%*.*g", width, precision, f);
+ default:
+ throw std::invalid_argument("invalid radix display value");
+ }
+ }
+
+ ////////////////////////////////////////////////////////////////////////////////
+
+ float string_to_float(const std::string& value)
+ throw(std::invalid_argument)
+ {
+ return (float)string_to_double(value);
+ }
+
+ double string_to_double(const std::string& value)
+ throw(std::invalid_argument)
+ {
+ // TODO - error checking
+ return strtod(value.c_str(), 0);
+ }
+
+ ////////////////////////////////////////////////////////////////////////////////
+
+} // end namespace stlplus