]> Dogcows Code - chaz/yoink/blobdiff - src/stlplus/strings/string_float.cpp
testing new non-autotools build system
[chaz/yoink] / src / stlplus / strings / string_float.cpp
diff --git a/src/stlplus/strings/string_float.cpp b/src/stlplus/strings/string_float.cpp
new file mode 100644 (file)
index 0000000..0de056f
--- /dev/null
@@ -0,0 +1,96 @@
+////////////////////////////////////////////////////////////////////////////////\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
This page took 0.021746 seconds and 4 git commands to generate.