aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/decimal.c25
-rw-r--r--src/decimal.h26
-rw-r--r--src/node.c3
3 files changed, 53 insertions, 1 deletions
diff --git a/src/decimal.c b/src/decimal.c
new file mode 100644
index 00000000..7f78c8a7
--- /dev/null
+++ b/src/decimal.c
@@ -0,0 +1,25 @@
+/*
+ Copyright 2019 David Robillard <http://drobilla.net>
+
+ Permission to use, copy, modify, and/or distribute this software for any
+ purpose with or without fee is hereby granted, provided that the above
+ copyright notice and this permission notice appear in all copies.
+
+ THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+*/
+
+#include "decimal.h"
+
+#include "int_math.h"
+
+int
+serd_count_digits(const uint64_t i)
+{
+ return i == 0 ? 1 : (int)serd_ilog10(i) + 1;
+}
diff --git a/src/decimal.h b/src/decimal.h
new file mode 100644
index 00000000..11e6a9bf
--- /dev/null
+++ b/src/decimal.h
@@ -0,0 +1,26 @@
+/*
+ Copyright 2019 David Robillard <http://drobilla.net>
+
+ Permission to use, copy, modify, and/or distribute this software for any
+ purpose with or without fee is hereby granted, provided that the above
+ copyright notice and this permission notice appear in all copies.
+
+ THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+*/
+
+#ifndef SERD_DECIMAL_H
+#define SERD_DECIMAL_H
+
+#include <stdint.h>
+
+/// Return the number of decimal digits required to represent `n`
+int
+serd_count_digits(uint64_t i);
+
+#endif // SERD_DECIMAL_H
diff --git a/src/node.c b/src/node.c
index 633f4567..b362aaa8 100644
--- a/src/node.c
+++ b/src/node.c
@@ -16,6 +16,7 @@
#include "node.h"
+#include "decimal.h"
#include "namespaces.h"
#include "static_nodes.h"
#include "string_utils.h"
@@ -640,7 +641,7 @@ serd_new_integer(int64_t i, const SerdNode* datatype)
{
const SerdNode* type = datatype ? datatype : &serd_xsd_integer.node;
uint64_t abs_i = (uint64_t)((i < 0) ? -i : i);
- const unsigned digits = serd_digits((double)abs_i);
+ const unsigned digits = (unsigned)serd_count_digits(abs_i);
const size_t type_len = serd_node_total_size(type);
const size_t total_len = digits + 2 + type_len;