altos/scheme: Rework display/write code
[fw/altos] / src / scheme / ao_scheme_float.c
index 541f02644f37f51043210968fe82585325e3e8c3..d8501548c9c61760ea7a875be50d9f1b50528655 100644 (file)
@@ -15,6 +15,8 @@
 #include "ao_scheme.h"
 #include <math.h>
 
+#ifdef AO_SCHEME_FEATURE_FLOAT
+
 static void float_mark(void *addr)
 {
        (void) addr;
@@ -39,12 +41,17 @@ const struct ao_scheme_type ao_scheme_float_type = {
        .name = "float",
 };
 
+#ifndef FLOAT_FORMAT
+#define FLOAT_FORMAT "%g"
+#endif
+
 void
-ao_scheme_float_write(ao_poly p)
+ao_scheme_float_write(ao_poly p, bool write)
 {
        struct ao_scheme_float *f = ao_scheme_poly_float(p);
        float   v = f->value;
 
+       (void) write;
        if (isnanf(v))
                printf("+nan.0");
        else if (isinff(v)) {
@@ -54,7 +61,7 @@ ao_scheme_float_write(ao_poly p)
                        printf("+");
                printf("inf.0");
        } else
-               printf ("%g", f->value);
+               printf (FLOAT_FORMAT, v);
 }
 
 float
@@ -63,10 +70,10 @@ ao_scheme_poly_number(ao_poly p)
        switch (ao_scheme_poly_base_type(p)) {
        case AO_SCHEME_INT:
                return ao_scheme_poly_int(p);
+       case AO_SCHEME_BIGINT:
+               return ao_scheme_poly_bigint(p)->value;
        case AO_SCHEME_OTHER:
                switch (ao_scheme_other_type(ao_scheme_poly_other(p))) {
-               case AO_SCHEME_BIGINT:
-                       return ao_scheme_bigint_int(ao_scheme_poly_bigint(p)->value);
                case AO_SCHEME_FLOAT:
                        return ao_scheme_poly_float(p)->value;
                }
@@ -146,3 +153,4 @@ ao_scheme_do_sqrt(struct ao_scheme_cons *cons)
                return ao_scheme_error(AO_SCHEME_INVALID, "%s: non-numeric", ao_scheme_poly_atom(_ao_scheme_atom_sqrt)->name);
        return ao_scheme_float_get(sqrtf(ao_scheme_poly_number(value)));
 }
+#endif