<p>neels has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/libosmocore/+/20331">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">add osmo_float_str_to_micros and osmo_micros_to_float_str<br><br>This will be useful to handle latitude and longitude numbers for GAD, which is<br>the location estimate representation used for LCS (Location Services).<br><br>The VTY user interface will provide floating-point strings like "23.456" while<br>GAD stores them as micro-degress 23456000. The osmo_gad_to_str* will also<br>convert latitude and longitude to floating-point string.<br><br>Change-Id: Ib9aee749cd331712a4dcdadfb6a2dfa4c26da957<br>---<br>M include/osmocom/core/utils.h<br>M src/utils.c<br>M tests/utils/utils_test.c<br>M tests/utils/utils_test.ok<br>4 files changed, 279 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/31/20331/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/core/utils.h b/include/osmocom/core/utils.h</span><br><span>index 8619120..5e48ab8 100644</span><br><span>--- a/include/osmocom/core/utils.h</span><br><span>+++ b/include/osmocom/core/utils.h</span><br><span>@@ -279,6 +279,10 @@</span><br><span> </span><br><span> bool osmo_str_startswith(const char *str, const char *startswith_str);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+int osmo_float_str_to_micros(int32_t *val, const char *str);</span><br><span style="color: hsl(120, 100%, 40%);">+int osmo_micros_to_float_str_buf(char *buf, size_t buflen, int32_t val);</span><br><span style="color: hsl(120, 100%, 40%);">+char *osmo_micros_to_float_str_c(void *ctx, int32_t val);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /*! Translate a buffer function to a talloc context function.</span><br><span>  * This is the full function body of a char *foo_name_c(void *ctx, val...) function, implemented by an</span><br><span>  * int foo_name_buf(buf, buflen, val...) function:</span><br><span>diff --git a/src/utils.c b/src/utils.c</span><br><span>index 772b671..d97f835 100644</span><br><span>--- a/src/utils.c</span><br><span>+++ b/src/utils.c</span><br><span>@@ -30,6 +30,7 @@</span><br><span> #include <errno.h></span><br><span> #include <stdio.h></span><br><span> #include <inttypes.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <limits.h></span><br><span> </span><br><span> #include <osmocom/core/utils.h></span><br><span> #include <osmocom/core/bit64gen.h></span><br><span>@@ -1208,4 +1209,127 @@</span><br><span>   return strncmp(str, startswith_str, strlen(startswith_str)) == 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/*! Convert a string of a floating point number to a signed int with factor of a million.</span><br><span style="color: hsl(120, 100%, 40%);">+ * For example, convert "-1.23" to -1230000.</span><br><span style="color: hsl(120, 100%, 40%);">+ * The usable range is "-2147.483648" .. "2147.483647", resulting in -2147483648 .. 2147483647.</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[out] val  Returned integer value.</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] str  String of a float, like '-12.345'.</span><br><span style="color: hsl(120, 100%, 40%);">+ * \returns 0 on success, negative on error.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+int osmo_float_str_to_micros(int32_t *val, const char *str)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     const char *point;</span><br><span style="color: hsl(120, 100%, 40%);">+    char *endptr;</span><br><span style="color: hsl(120, 100%, 40%);">+ int32_t sign = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+     int32_t integer = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+  int32_t micros = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(val);</span><br><span style="color: hsl(120, 100%, 40%);">+     *val = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (!str || !str[0])</span><br><span style="color: hsl(120, 100%, 40%);">+          return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+       point = strchr(str, '.');</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (str[0] == '-') {</span><br><span style="color: hsl(120, 100%, 40%);">+          str = str + 1;</span><br><span style="color: hsl(120, 100%, 40%);">+                sign = -1;</span><br><span style="color: hsl(120, 100%, 40%);">+    } else if (str[0] == '+') {</span><br><span style="color: hsl(120, 100%, 40%);">+           str = str + 1;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+     if (strchr(str, '-') || strchr(str, '+'))</span><br><span style="color: hsl(120, 100%, 40%);">+             return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     if (!point || point > str) {</span><br><span style="color: hsl(120, 100%, 40%);">+               errno = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+            integer = strtol(str, &endptr, 10);</span><br><span style="color: hsl(120, 100%, 40%);">+               if ((errno == ERANGE && (integer == LONG_MAX || integer == LONG_MIN))</span><br><span style="color: hsl(120, 100%, 40%);">+             || (errno != 0 && integer == 0))</span><br><span style="color: hsl(120, 100%, 40%);">+                  return -ERANGE;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+             if ((point && endptr != point)</span><br><span style="color: hsl(120, 100%, 40%);">+                    || (!point && *endptr))</span><br><span style="color: hsl(120, 100%, 40%);">+                   return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (point && point[1] != '\0') {</span><br><span style="color: hsl(120, 100%, 40%);">+              /* limit the number of digits parsed to 6 */</span><br><span style="color: hsl(120, 100%, 40%);">+          char decimal[7];</span><br><span style="color: hsl(120, 100%, 40%);">+              int i;</span><br><span style="color: hsl(120, 100%, 40%);">+                OSMO_STRLCPY_ARRAY(decimal, point+1);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+               /* fill with zeros to make exactly 6 digits */</span><br><span style="color: hsl(120, 100%, 40%);">+                for (i = strlen(decimal); i < 6; i++)</span><br><span style="color: hsl(120, 100%, 40%);">+                      decimal[i] = '0';</span><br><span style="color: hsl(120, 100%, 40%);">+             decimal[6] = '\0';</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          errno = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+            micros = strtol(decimal, &endptr, 10);</span><br><span style="color: hsl(120, 100%, 40%);">+            if ((errno == ERANGE && (micros == LONG_MAX || micros == LONG_MIN))</span><br><span style="color: hsl(120, 100%, 40%);">+               || (errno != 0 && micros == 0))</span><br><span style="color: hsl(120, 100%, 40%);">+                   return -ERANGE;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+             if (*endptr)</span><br><span style="color: hsl(120, 100%, 40%);">+                  return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Do not surpass the resulting int32_t range of -2147483648..2147483647,</span><br><span style="color: hsl(120, 100%, 40%);">+      * i.e. -2147.483648 .. 2147.483647 */</span><br><span style="color: hsl(120, 100%, 40%);">+        if (integer > 2147)</span><br><span style="color: hsl(120, 100%, 40%);">+                return -ERANGE;</span><br><span style="color: hsl(120, 100%, 40%);">+       if (integer == 2147 && micros > 483647) {</span><br><span style="color: hsl(120, 100%, 40%);">+          /* Special case for INT32_MIN, because "-1 * 2147483648" can't be calculated in int32_t. */</span><br><span style="color: hsl(120, 100%, 40%);">+             if (sign < 0 && micros == 483648) {</span><br><span style="color: hsl(120, 100%, 40%);">+                        *val = -2147483648;</span><br><span style="color: hsl(120, 100%, 40%);">+                   return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+             return -ERANGE;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   *val = sign * (integer * 1000000 + micros);</span><br><span style="color: hsl(120, 100%, 40%);">+   return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/*! Convert an integer with a factor of a million to a floating point string.</span><br><span style="color: hsl(120, 100%, 40%);">+ * For example, convert -1230000 to "-1.23".</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[out] buf  Buffer to write string to.</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] buflen  sizeof(buf).</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] val  Value to convert to float.</span><br><span style="color: hsl(120, 100%, 40%);">+ * \returns number of chars that would be written, like snprintf().</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+int osmo_micros_to_float_str_buf(char *buf, size_t buflen, int32_t val)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        struct osmo_strbuf sb = { .buf = buf, .len = buflen };</span><br><span style="color: hsl(120, 100%, 40%);">+        /* -INT32_MIN > INT32_MAX, so use uint32_t */</span><br><span style="color: hsl(120, 100%, 40%);">+      int64_t v = val;</span><br><span style="color: hsl(120, 100%, 40%);">+      if (v < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+               OSMO_STRBUF_PRINTF(sb, "-");</span><br><span style="color: hsl(120, 100%, 40%);">+                v = -v;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   OSMO_STRBUF_PRINTF(sb, "%" PRId64, v / 1000000);</span><br><span style="color: hsl(120, 100%, 40%);">+    v %= 1000000;</span><br><span style="color: hsl(120, 100%, 40%);">+ if (v) {</span><br><span style="color: hsl(120, 100%, 40%);">+              /* skip trailing zeros */</span><br><span style="color: hsl(120, 100%, 40%);">+             int w = 6;</span><br><span style="color: hsl(120, 100%, 40%);">+            while (!(v % 10)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                   v /= 10;</span><br><span style="color: hsl(120, 100%, 40%);">+                      w--;</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+             OSMO_STRBUF_PRINTF(sb, ".%0*" PRId64, w, v);</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+     return sb.chars_needed;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/*! Convert an integer with a factor of a million to a floating point string.</span><br><span style="color: hsl(120, 100%, 40%);">+ * For example, convert -1230000 to "-1.23".</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] ctx  Talloc ctx to allocate string buffer from.</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] val  Value to convert to float.</span><br><span style="color: hsl(120, 100%, 40%);">+ * \returns resulting string, dynamically allocated.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+char *osmo_micros_to_float_str_c(void *ctx, int32_t val)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     OSMO_NAME_C_IMPL(ctx, 16, "ERROR", osmo_micros_to_float_str_buf, val)</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /*! @} */</span><br><span>diff --git a/tests/utils/utils_test.c b/tests/utils/utils_test.c</span><br><span>index 9ff023b..ecf13a8 100644</span><br><span>--- a/tests/utils/utils_test.c</span><br><span>+++ b/tests/utils/utils_test.c</span><br><span>@@ -1443,6 +1443,105 @@</span><br><span>     }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+struct float_str_to_micros_test {</span><br><span style="color: hsl(120, 100%, 40%);">+ const char *str;</span><br><span style="color: hsl(120, 100%, 40%);">+      int32_t expect_val;</span><br><span style="color: hsl(120, 100%, 40%);">+   int expect_err;</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+struct float_str_to_micros_test float_str_to_micros_tests[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+  { "0", 0 },</span><br><span style="color: hsl(120, 100%, 40%);">+ { "1", 1000000 },</span><br><span style="color: hsl(120, 100%, 40%);">+   { "12.345", 12345000 },</span><br><span style="color: hsl(120, 100%, 40%);">+     { "+12.345", 12345000 },</span><br><span style="color: hsl(120, 100%, 40%);">+    { "-12.345", -12345000 },</span><br><span style="color: hsl(120, 100%, 40%);">+   { "0.345", 345000 },</span><br><span style="color: hsl(120, 100%, 40%);">+        { ".345", 345000 },</span><br><span style="color: hsl(120, 100%, 40%);">+ { "-0.345", -345000 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { "-.345", -345000 },</span><br><span style="color: hsl(120, 100%, 40%);">+       { "12.", 12000000 },</span><br><span style="color: hsl(120, 100%, 40%);">+        { "-180", -180000000 },</span><br><span style="color: hsl(120, 100%, 40%);">+     { "180", 180000000 },</span><br><span style="color: hsl(120, 100%, 40%);">+       { "360", 360000000 },</span><br><span style="color: hsl(120, 100%, 40%);">+       { "123.4567890123", 123456789 },</span><br><span style="color: hsl(120, 100%, 40%);">+    { "123.4567890123456789012345", 123456789 },</span><br><span style="color: hsl(120, 100%, 40%);">+        { "2147.483647", 2147483647 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { "-2147.483647", -2147483647 },</span><br><span style="color: hsl(120, 100%, 40%);">+    { "-2147.483648", -2147483648 },</span><br><span style="color: hsl(120, 100%, 40%);">+    { "2147.483648", .expect_err = -ERANGE },</span><br><span style="color: hsl(120, 100%, 40%);">+   { "-2147.483649", .expect_err = -ERANGE },</span><br><span style="color: hsl(120, 100%, 40%);">+  { "10000", .expect_err = -ERANGE },</span><br><span style="color: hsl(120, 100%, 40%);">+ { "-10000", .expect_err = -ERANGE },</span><br><span style="color: hsl(120, 100%, 40%);">+        { "9999999999999", .expect_err = -ERANGE },</span><br><span style="color: hsl(120, 100%, 40%);">+ { "-9999999999999", .expect_err = -ERANGE },</span><br><span style="color: hsl(120, 100%, 40%);">+        { "1.2.3", .expect_err = -EINVAL },</span><br><span style="color: hsl(120, 100%, 40%);">+ { "foo", .expect_err = -EINVAL },</span><br><span style="color: hsl(120, 100%, 40%);">+   { "1.foo", .expect_err = -EINVAL },</span><br><span style="color: hsl(120, 100%, 40%);">+ { "1.foo", .expect_err = -EINVAL },</span><br><span style="color: hsl(120, 100%, 40%);">+ { "12.-345", .expect_err = -EINVAL },</span><br><span style="color: hsl(120, 100%, 40%);">+       { "-12.-345", .expect_err = -EINVAL },</span><br><span style="color: hsl(120, 100%, 40%);">+      { "12.+345", .expect_err = -EINVAL },</span><br><span style="color: hsl(120, 100%, 40%);">+       { "+12.+345", .expect_err = -EINVAL },</span><br><span style="color: hsl(120, 100%, 40%);">+      { "", .expect_err = -EINVAL },</span><br><span style="color: hsl(120, 100%, 40%);">+      { NULL, .expect_err = -EINVAL },</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+void test_float_str_to_micros()</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      const struct float_str_to_micros_test *t;</span><br><span style="color: hsl(120, 100%, 40%);">+     printf("--- %s\n", __func__);</span><br><span style="color: hsl(120, 100%, 40%);">+       for (t = float_str_to_micros_tests;</span><br><span style="color: hsl(120, 100%, 40%);">+        (t - float_str_to_micros_tests) < ARRAY_SIZE(float_str_to_micros_tests);</span><br><span style="color: hsl(120, 100%, 40%);">+           t++) {</span><br><span style="color: hsl(120, 100%, 40%);">+           int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+               int32_t val;</span><br><span style="color: hsl(120, 100%, 40%);">+          rc = osmo_float_str_to_micros(&val, t->str);</span><br><span style="color: hsl(120, 100%, 40%);">+           printf("osmo_float_str_to_micros(%s) -> rc=%d val=%d\n", osmo_quote_str(t->str, -1), rc, val);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+              if (rc != t->expect_err)</span><br><span style="color: hsl(120, 100%, 40%);">+                   printf("  ERROR: expected rc=%d\n", t->expect_err);</span><br><span style="color: hsl(120, 100%, 40%);">+              if (val != t->expect_val)</span><br><span style="color: hsl(120, 100%, 40%);">+                  printf("  ERROR: expected val=%d\n", t->expect_val);</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct micros_to_float_str_test {</span><br><span style="color: hsl(120, 100%, 40%);">+     int32_t val;</span><br><span style="color: hsl(120, 100%, 40%);">+  const char *expect_str;</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+struct micros_to_float_str_test micros_to_float_str_tests[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+  { 0, "0" },</span><br><span style="color: hsl(120, 100%, 40%);">+ { 1000000, "1" },</span><br><span style="color: hsl(120, 100%, 40%);">+   { -1000000, "-1" },</span><br><span style="color: hsl(120, 100%, 40%);">+ { 1000001, "1.000001" },</span><br><span style="color: hsl(120, 100%, 40%);">+    { -1000001, "-1.000001" },</span><br><span style="color: hsl(120, 100%, 40%);">+  { 1000100, "1.0001" },</span><br><span style="color: hsl(120, 100%, 40%);">+      { -1010000, "-1.01" },</span><br><span style="color: hsl(120, 100%, 40%);">+      { 1100000, "1.1" },</span><br><span style="color: hsl(120, 100%, 40%);">+ { 10000000, "10" },</span><br><span style="color: hsl(120, 100%, 40%);">+ { -10000000, "-10" },</span><br><span style="color: hsl(120, 100%, 40%);">+       { 100000000, "100" },</span><br><span style="color: hsl(120, 100%, 40%);">+       { -100000000, "-100" },</span><br><span style="color: hsl(120, 100%, 40%);">+     { 2147483647, "2147.483647" },</span><br><span style="color: hsl(120, 100%, 40%);">+      { -2147483648, "-2147.483648" },</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+void test_micros_to_float_str()</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    const struct micros_to_float_str_test *t;</span><br><span style="color: hsl(120, 100%, 40%);">+     printf("--- %s\n", __func__);</span><br><span style="color: hsl(120, 100%, 40%);">+       for (t = micros_to_float_str_tests;</span><br><span style="color: hsl(120, 100%, 40%);">+        (t - micros_to_float_str_tests) < ARRAY_SIZE(micros_to_float_str_tests);</span><br><span style="color: hsl(120, 100%, 40%);">+           t++) {</span><br><span style="color: hsl(120, 100%, 40%);">+           char buf[128];</span><br><span style="color: hsl(120, 100%, 40%);">+                int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+               rc = osmo_micros_to_float_str_buf(buf, sizeof(buf), t->val);</span><br><span style="color: hsl(120, 100%, 40%);">+               printf("osmo_micros_to_float_str_buf(%d) -> rc=%d str=%s\n", t->val, rc, osmo_quote_str(buf, -1));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          if (rc != strlen(buf))</span><br><span style="color: hsl(120, 100%, 40%);">+                        printf("  ERROR: expected rc=%zu\n", strlen(buf));</span><br><span style="color: hsl(120, 100%, 40%);">+          if (strcmp(buf, t->expect_str))</span><br><span style="color: hsl(120, 100%, 40%);">+                    printf("  ERROR: expected str=%s\n", osmo_quote_str(t->expect_str, -1));</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> int main(int argc, char **argv)</span><br><span> {</span><br><span>       static const struct log_info log_info = {};</span><br><span>@@ -1468,5 +1567,7 @@</span><br><span>  name_c_impl_test();</span><br><span>  osmo_print_n_test();</span><br><span>         osmo_strnchr_test();</span><br><span style="color: hsl(120, 100%, 40%);">+  test_float_str_to_micros();</span><br><span style="color: hsl(120, 100%, 40%);">+   test_micros_to_float_str();</span><br><span>  return 0;</span><br><span> }</span><br><span>diff --git a/tests/utils/utils_test.ok b/tests/utils/utils_test.ok</span><br><span>index f1b07fa..50972be 100644</span><br><span>--- a/tests/utils/utils_test.ok</span><br><span>+++ b/tests/utils/utils_test.ok</span><br><span>@@ -505,3 +505,53 @@</span><br><span> osmo_strnchr("foo=bar", 0, '=') -> -1</span><br><span> osmo_strnchr("foo", 9, '=') -> -1</span><br><span> osmo_strnchr("foo", 9, '\0') -> 3</span><br><span style="color: hsl(120, 100%, 40%);">+--- test_float_str_to_micros</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_float_str_to_micros("0") -> rc=0 val=0</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_float_str_to_micros("1") -> rc=0 val=1000000</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_float_str_to_micros("12.345") -> rc=0 val=12345000</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_float_str_to_micros("+12.345") -> rc=0 val=12345000</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_float_str_to_micros("-12.345") -> rc=0 val=-12345000</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_float_str_to_micros("0.345") -> rc=0 val=345000</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_float_str_to_micros(".345") -> rc=0 val=345000</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_float_str_to_micros("-0.345") -> rc=0 val=-345000</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_float_str_to_micros("-.345") -> rc=0 val=-345000</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_float_str_to_micros("12.") -> rc=0 val=12000000</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_float_str_to_micros("-180") -> rc=0 val=-180000000</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_float_str_to_micros("180") -> rc=0 val=180000000</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_float_str_to_micros("360") -> rc=0 val=360000000</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_float_str_to_micros("123.4567890123") -> rc=0 val=123456789</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_float_str_to_micros("123.4567890123456789012345") -> rc=0 val=123456789</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_float_str_to_micros("2147.483647") -> rc=0 val=2147483647</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_float_str_to_micros("-2147.483647") -> rc=0 val=-2147483647</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_float_str_to_micros("-2147.483648") -> rc=0 val=-2147483648</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_float_str_to_micros("2147.483648") -> rc=-34 val=0</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_float_str_to_micros("-2147.483649") -> rc=-34 val=0</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_float_str_to_micros("10000") -> rc=-34 val=0</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_float_str_to_micros("-10000") -> rc=-34 val=0</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_float_str_to_micros("9999999999999") -> rc=-34 val=0</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_float_str_to_micros("-9999999999999") -> rc=-34 val=0</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_float_str_to_micros("1.2.3") -> rc=-22 val=0</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_float_str_to_micros("foo") -> rc=-22 val=0</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_float_str_to_micros("1.foo") -> rc=-22 val=0</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_float_str_to_micros("1.foo") -> rc=-22 val=0</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_float_str_to_micros("12.-345") -> rc=-22 val=0</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_float_str_to_micros("-12.-345") -> rc=-22 val=0</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_float_str_to_micros("12.+345") -> rc=-22 val=0</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_float_str_to_micros("+12.+345") -> rc=-22 val=0</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_float_str_to_micros("") -> rc=-22 val=0</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_float_str_to_micros(NULL) -> rc=-22 val=0</span><br><span style="color: hsl(120, 100%, 40%);">+--- test_micros_to_float_str</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_micros_to_float_str_buf(0) -> rc=1 str="0"</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_micros_to_float_str_buf(1000000) -> rc=1 str="1"</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_micros_to_float_str_buf(-1000000) -> rc=2 str="-1"</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_micros_to_float_str_buf(1000001) -> rc=8 str="1.000001"</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_micros_to_float_str_buf(-1000001) -> rc=9 str="-1.000001"</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_micros_to_float_str_buf(1000100) -> rc=6 str="1.0001"</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_micros_to_float_str_buf(-1010000) -> rc=5 str="-1.01"</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_micros_to_float_str_buf(1100000) -> rc=3 str="1.1"</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_micros_to_float_str_buf(10000000) -> rc=2 str="10"</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_micros_to_float_str_buf(-10000000) -> rc=3 str="-10"</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_micros_to_float_str_buf(100000000) -> rc=3 str="100"</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_micros_to_float_str_buf(-100000000) -> rc=4 str="-100"</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_micros_to_float_str_buf(2147483647) -> rc=11 str="2147.483647"</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_micros_to_float_str_buf(-2147483648) -> rc=12 str="-2147.483648"</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/libosmocore/+/20331">change 20331</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/libosmocore/+/20331"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: libosmocore </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: Ib9aee749cd331712a4dcdadfb6a2dfa4c26da957 </div>
<div style="display:none"> Gerrit-Change-Number: 20331 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>