diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/decimal.c | 25 | ||||
-rw-r--r-- | src/decimal.h | 26 | ||||
-rw-r--r-- | src/node.c | 3 |
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 @@ -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; |