summaryrefslogtreecommitdiffstats
path: root/src/libixion/global.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/libixion/global.cpp')
-rw-r--r--src/libixion/global.cpp103
1 files changed, 103 insertions, 0 deletions
diff --git a/src/libixion/global.cpp b/src/libixion/global.cpp
new file mode 100644
index 0000000..1100bcb
--- /dev/null
+++ b/src/libixion/global.cpp
@@ -0,0 +1,103 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "ixion/global.hpp"
+#include "ixion/address.hpp"
+#include "ixion/matrix.hpp"
+#include "ixion/cell.hpp"
+#include "ixion/exceptions.hpp"
+#include "ixion/formula_result.hpp"
+
+#include <iostream>
+#include <cstdlib>
+#include <sstream>
+#include <fstream>
+#include <chrono>
+
+using namespace std;
+
+namespace ixion {
+
+double get_current_time()
+{
+ unsigned long usec_since_epoch =
+ std::chrono::duration_cast<std::chrono::microseconds>(
+ std::chrono::system_clock::now().time_since_epoch()).count();
+
+ return usec_since_epoch / 1000000.0;
+}
+
+double to_double(std::string_view s)
+{
+ const char* p = s.data();
+ std::size_t n = s.size();
+
+ if (!n)
+ return 0.0;
+
+ // First, use the standard C API.
+ const char* p_last_check = p + n;
+ char* p_last;
+ double val = strtod(p, &p_last);
+ if (p_last == p_last_check)
+ return val;
+
+ // If that fails, do the manual conversion, which may introduce rounding
+ // errors. Revise this to reduce the amount of rounding error.
+ bool dot = false;
+ double frac = 1.0;
+ double sign = 1.0;
+ for (size_t i = 0; i < n; ++i, ++p)
+ {
+ if (i == 0)
+ {
+ if (*p == '+')
+ // Skip this.
+ continue;
+
+ if (*p == '-')
+ {
+ sign = -1.0;
+ continue;
+ }
+ }
+ if (*p == '.')
+ {
+ if (dot)
+ // Second dot is not allowed.
+ break;
+ dot = true;
+ continue;
+ }
+
+ if (*p < '0' || '9' < *p)
+ // not a digit. End the parse.
+ break;
+
+ int digit = *p - '0';
+ if (dot)
+ {
+ frac *= 0.1;
+ val += digit * frac;
+ }
+ else
+ {
+ val *= 10.0;
+ val += digit;
+ }
+ }
+ return sign*val;
+}
+
+bool to_bool(std::string_view s)
+{
+ return s == "true";
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */