diff options
Diffstat (limited to 'src/qreg-commands.c')
| -rw-r--r-- | src/qreg-commands.c | 42 |
1 files changed, 26 insertions, 16 deletions
diff --git a/src/qreg-commands.c b/src/qreg-commands.c index 0c4c8d4..14cc95f 100644 --- a/src/qreg-commands.c +++ b/src/qreg-commands.c @@ -294,7 +294,7 @@ teco_state_queryqreg_got_register(teco_machine_main_t *ctx, teco_qreg_t *qreg, if (teco_expressions_args() > 0) { /* Query character from Q-Register string */ - teco_int_t pos = teco_expressions_pop_num(0); + teco_int_t pos = teco_expressions_pop_int(0); if (pos < 0) { teco_error_range_set(error, "Q"); return NULL; @@ -305,12 +305,13 @@ teco_state_queryqreg_got_register(teco_machine_main_t *ctx, teco_qreg_t *qreg, return NULL; teco_expressions_push(c); } else { - /* Query integer */ - teco_int_t value; + /* Query number */ + teco_number_t value; + gboolean is_float; - if (!qreg->vtable->get_integer(qreg, &value, error)) + if (!qreg->vtable->get_number(qreg, &value, &is_float, error)) return NULL; - teco_expressions_push(value); + teco_expressions_push_num(value, is_float); } return &teco_state_start; @@ -407,7 +408,7 @@ teco_state_setqregstring_nobuilding_done(teco_machine_main_t *ctx, start = buffer = g_malloc(args*6); for (gint i = args; i > 0; i--) { - teco_int_t chr = teco_expressions_peek_num(i-1); + teco_int_t chr = teco_expressions_peek_int(i-1); if (chr < 0 || !g_unichar_validate(chr)) { teco_error_codepoint_set(error, "^U"); return NULL; @@ -416,12 +417,12 @@ teco_state_setqregstring_nobuilding_done(teco_machine_main_t *ctx, } /* we pop only now since we had to peek in reverse order */ for (gint i = 0; i < args; i++) - teco_expressions_pop_num(0); + teco_expressions_pop_num(0, NULL); } else { buffer = g_malloc(args); for (gint i = 0; i < args; i++) { - teco_int_t chr = teco_expressions_pop_num(0); + teco_int_t chr = teco_expressions_pop_int(0); if (chr < 0 || chr > 0xFF) { teco_error_codepoint_set(error, "^U"); return NULL; @@ -607,9 +608,12 @@ teco_state_setqreginteger_got_register(teco_machine_main_t *ctx, teco_qreg_t *qr if (!teco_expressions_eval(FALSE, error)) return NULL; if (teco_expressions_args() || teco_num_sign < 0) { - teco_int_t v; - if (!teco_expressions_pop_num_calc(&v, teco_num_sign, error) || - !qreg->vtable->set_integer(qreg, v, error)) + teco_number_t v; + gboolean is_float; + + if (!teco_expressions_pop_num_calc(&v, &is_float, teco_num_sign, error)) + return NULL; + if (!qreg->vtable->set_number(qreg, v, is_float, error)) return NULL; if (teco_machine_main_eval_colon(ctx) > 0) @@ -654,13 +658,19 @@ teco_state_increaseqreg_got_register(teco_machine_main_t *ctx, teco_qreg_t *qreg if (ctx->flags.mode > TECO_MODE_NORMAL) return &teco_state_start; - teco_int_t value, add; + teco_number_t value, add; + gboolean value_is_float, add_is_float; - if (!qreg->vtable->get_integer(qreg, &value, error) || - !teco_expressions_pop_num_calc(&add, teco_num_sign, error) || - !qreg->vtable->set_integer(qreg, value += add, error)) + if (!qreg->vtable->get_number(qreg, &value, &value_is_float, error) || + !teco_expressions_pop_num_calc(&add, &add_is_float, teco_num_sign, error)) + return NULL; + if (value_is_float) + value.f += add_is_float ? add.f : add.i; + else + value.i += add_is_float ? (teco_int_t)add.f : add.i; + if (!qreg->vtable->set_number(qreg, value, value_is_float, error)) return NULL; - teco_expressions_push(value); + teco_expressions_push_num(value, value_is_float); return &teco_state_start; } |
