find-dialog.c: Replace exp10 with our own integer version
authorJohn Darrington <john@darrington.wattle.id.au>
Sat, 20 Jun 2020 05:17:06 +0000 (07:17 +0200)
committerJohn Darrington <john@darrington.wattle.id.au>
Sat, 20 Jun 2020 05:17:03 +0000 (07:17 +0200)
A previous commit introduced the use of exp10 from the standard
math library.  However the use cases here don't need floating
point operands, and it's smaller and faster to implement our
own integer version.

src/ui/gui/find-dialog.c

index 2ff619a60a25c0c974dcc62092a97a7a40d9f540..e617280739153a28c7445bf7b96568b2ac2c8f65 100644 (file)
@@ -452,6 +452,18 @@ struct regexp_comparator
   regex_t re;
 };
 
+/* Returns 10 raised to the power of X.
+   X must be a non-negative integer.  */
+static inline int
+int_pow10 (int x)
+{
+  int ret = 1;
+  assert (x >= 0);
+  while (x--)
+    ret *= 10;
+
+  return ret;
+}
 
 static bool
 value_compare (const struct comparator *cmptr,
@@ -460,7 +472,7 @@ value_compare (const struct comparator *cmptr,
   const struct numeric_comparator *nc = (const struct numeric_comparator *) cmptr;
   const struct fmt_spec *fs = var_get_print_format (cmptr->var);
 
-  double c = nearbyint (v->f * exp10 (fs->d));
+  double c = nearbyint (v->f * int_pow10 (fs->d));
 
   return c == nc->rounded_ref;
 }
@@ -592,7 +604,7 @@ numeric_comparator_create (const struct variable *var, const char *target)
 
   union value val;
   text_to_value (target, var, &val);
-  nc->rounded_ref = nearbyint (val.f * exp10 (fs->d));
+  nc->rounded_ref = nearbyint (val.f * int_pow10 (fs->d));
   value_destroy (&val, var_get_width (var));
 
   return cmptr;