Commit: c1ecb88aed169c4a3baabbeef7972e1910413c57
Parent: 61dff5f151e6b31211a1ad349c992880bbfea9c3
Author: Randy Palamar
Date: Tue, 8 Oct 2024 15:18:40 -0600
implement basic float formatting
scientific notation still to come
Diffstat:
M | ui.c | | | 8 | ++++---- |
M | util.c | | | 40 | +++++++++++++++++++++++++++++++--------- |
2 files changed, 35 insertions(+), 13 deletions(-)
diff --git a/ui.c b/ui.c
@@ -176,7 +176,7 @@ bmv_sprint(BPModifiableValue *bmv, Stream *s)
{
if (bmv->flags & MV_FLOAT) {
f32 *value = bmv->value;
- stream_append_f32(s, *value * bmv->scale);
+ stream_append_f64(s, *value * bmv->scale, 100);
} else {
ASSERT(bmv->flags & MV_INT);
i32 *value = bmv->value;
@@ -339,7 +339,7 @@ do_value_listing(s8 prefix, s8 suffix, f32 value, Font font, Arena a, Rect r)
v2 suffix_p = {.x = r.pos.x + r.size.w - suffix_s.w, .y = r.pos.y};
Stream buf = stream_alloc(&a, 64);
- stream_append_f32(&buf, value);
+ stream_append_f64(&buf, value, 100);
v2 txt_p = {.x = r.pos.x + LISTING_LEFT_COLUMN_WIDTH, .y = r.pos.y};
draw_text(font, prefix, r.pos, 0, colour_from_normalized(FG_COLOUR));
@@ -679,7 +679,7 @@ draw_ui(BeamformerCtx *ctx, Arena arena)
if (output_dim.x > 1e-6 && output_dim.y > 1e-6) {
Stream buf = stream_alloc(&arena, 64);
- stream_append_f32(&buf, -188.88f);
+ stream_append_f64(&buf, -188.8f, 10);
stream_append_s8(&buf, s8(" mm"));
v2 txt_s = measure_text(ctx->small_font, stream_to_s8(buf));
@@ -761,7 +761,7 @@ draw_ui(BeamformerCtx *ctx, Arena arena)
DrawLineEx(start_pos.rl, end_pos.rl, 3, colour_from_normalized(FG_COLOUR));
buf.widx = 0;
if (i == 0 && mm > 0) stream_append_s8(&buf, s8("+"));
- stream_append_f32(&buf, mm);
+ stream_append_f64(&buf, mm, 10);
stream_append_s8(&buf, s8(" mm"));
draw_text(ctx->small_font, stream_to_s8(buf), txt_pos,
rot[i], txt_colour);
diff --git a/util.c b/util.c
@@ -46,11 +46,21 @@ stream_to_s8(Stream s)
}
static void
+stream_append_byte(Stream *s, u8 b)
+{
+ s->errors |= s->widx + 1 > s->cap;
+ if (!s->errors)
+ s->data[s->widx++] = b;
+}
+
+static void
stream_append_s8(Stream *s, s8 str)
{
s->errors |= (s->cap - s->widx) <= str.len;
- for (size i = 0; !s->errors && i < str.len; i++)
- s->data[s->widx++] = str.data[i];
+ if (!s->errors) {
+ for (size i = 0; i < str.len; i++)
+ s->data[s->widx++] = str.data[i];
+ }
}
static void
@@ -84,17 +94,29 @@ stream_append_i64(Stream *s, i64 n)
}
static void
-stream_append_f32(Stream *s, f32 f)
+stream_append_f64(Stream *s, f64 f, i64 prec)
{
if (f < 0) {
- stream_append_s8(s, s8("-"));
+ stream_append_byte(s, '-');
f *= -1;
}
- /* TODO */
- size remaining = s->cap - s->widx;
- s->errors |= remaining <= snprintf(0, 0, "%0.02f", f);
- if (!s->errors)
- s->widx += snprintf((char *)(s->data + s->widx), remaining, "%0.02f", f);
+
+ /* NOTE: round last digit */
+ f += 0.5f / prec;
+
+ if (f >= (f64)(-1UL >> 1)) {
+ stream_append_s8(s, s8("inf"));
+ } else {
+ u64 integral = f;
+ u64 fraction = (f - integral) * prec;
+ stream_append_u64(s, integral);
+ stream_append_byte(s, '.');
+ for (i64 i = prec / 10; i > 1; i /= 10) {
+ if (i > fraction)
+ stream_append_byte(s, '0');
+ }
+ stream_append_u64(s, fraction);
+ }
}
static void