diff options
| author | Robin Haberkorn <rhaberkorn@fmsbw.de> | 2026-10-31 13:46:11 +0100 |
|---|---|---|
| committer | Robin Haberkorn <rhaberkorn@fmsbw.de> | 2026-10-31 21:13:19 +0100 |
| commit | 4aa2b717f9e050783b567540d9bb0193d692e3e9 (patch) | |
| tree | 39b3734c464655e6d1c21390945209a66f952654 /src/move-commands.c | |
| parent | e0bf13622b0922252439e3fa8b43df9877678d75 (diff) | |
support floating point numbers
* Extends the SciTECO type system. A number on the expression stack
or in a Q-register can be either an integer or a float.
* Floating point constants begin with a digit (like all other
numbers), are followed by a `.` and an optional fractional part.
Exponents cannot currently be written.
E.g. `1.` == `1.0`. But `.0` would still be `.,0`.
(!) To push an integer followed by dot, you must now write e.g. `1,.` or `1 .`.
* All of the basic arithmetic operators operate like this:
If both operands are integers, the result is also an integer (integer arithmetics).
If at least one of the operands is a float, the result is also a float (float arithmetics).
* All of the binary operators (AND, OR, XOR) always cast all
operands to integer and the result is always an integer as well.
* You can "cast" integers to float by `*1.` or `/1.`.
You can "cast" floats to integers using `#0`.
* Most commands still accept only integers. Floats are implicitly casted to integers.
Float-aware commands are: =, \, ^W, Qq, Uq, %q and the conditionals.
* `%q` will not change the current type of register q.
* Numeric part of "lexer.font" is now a float (in points).
* You cannot currently print octal and hexadecimal floats.
`==` and `===` are identical to `=` on floats.
* `===` is now printing hex integers in lower case.
This is because SciTECO's coding style for hex constants is also lower case.
* `--with-teco-integer` renamed to `--with-teco-number`.
Diffstat (limited to 'src/move-commands.c')
| -rw-r--r-- | src/move-commands.c | 26 |
1 files changed, 13 insertions, 13 deletions
diff --git a/src/move-commands.c b/src/move-commands.c index 868bb19..3a31b6b 100644 --- a/src/move-commands.c +++ b/src/move-commands.c @@ -55,7 +55,7 @@ teco_state_start_jump(teco_machine_main_t *ctx, GError **error) { teco_int_t v; - if (!teco_expressions_pop_num_calc(&v, 0, error)) + if (!teco_expressions_pop_int_calc(&v, 0, error)) return; gssize next_pos = teco_interface_glyphs2bytes_absdot(v); @@ -107,7 +107,7 @@ teco_state_start_move(teco_machine_main_t *ctx, GError **error) { teco_int_t v; - if (!teco_expressions_pop_num_calc(&v, teco_num_sign, error)) + if (!teco_expressions_pop_int_calc(&v, teco_num_sign, error)) return; teco_bool_t rc = teco_move_chars(v); @@ -132,7 +132,7 @@ teco_state_start_reverse(teco_machine_main_t *ctx, GError **error) { teco_int_t v; - if (!teco_expressions_pop_num_calc(&v, teco_num_sign, error)) + if (!teco_expressions_pop_int_calc(&v, teco_num_sign, error)) return; teco_bool_t rc = teco_move_chars(-v); @@ -191,7 +191,7 @@ teco_state_start_line(teco_machine_main_t *ctx, GError **error) { teco_int_t v; - if (!teco_expressions_pop_num_calc(&v, teco_num_sign, error)) + if (!teco_expressions_pop_int_calc(&v, teco_num_sign, error)) return; teco_bool_t rc = teco_move_lines(v); @@ -217,7 +217,7 @@ teco_state_start_back(teco_machine_main_t *ctx, GError **error) { teco_int_t v; - if (!teco_expressions_pop_num_calc(&v, teco_num_sign, error)) + if (!teco_expressions_pop_int_calc(&v, teco_num_sign, error)) return; teco_bool_t rc = teco_move_lines(-v); @@ -388,7 +388,7 @@ teco_state_start_words(teco_machine_main_t *ctx, const gchar *cmd, gint factor, return &teco_state_start; teco_int_t v; - if (!teco_expressions_pop_num_calc(&v, teco_num_sign, error)) + if (!teco_expressions_pop_int_calc(&v, teco_num_sign, error)) return NULL; sptr_t pos = teco_interface_ssm(SCI_GETCURRENTPOS, 0, 0); @@ -458,7 +458,7 @@ teco_state_start_delete_words(teco_machine_main_t *ctx, const gchar *cmd, gint f return &teco_state_start; teco_int_t v; - if (!teco_expressions_pop_num_calc(&v, teco_num_sign, error)) + if (!teco_expressions_pop_int_calc(&v, teco_num_sign, error)) return NULL; v *= factor; @@ -504,7 +504,7 @@ teco_state_start_kill(teco_machine_main_t *ctx, const gchar *cmd, gboolean by_li from = pos; if (by_lines) { teco_int_t line; - if (!teco_expressions_pop_num_calc(&line, teco_num_sign, error)) + if (!teco_expressions_pop_int_calc(&line, teco_num_sign, error)) return FALSE; line += teco_interface_ssm(SCI_LINEFROMPOSITION, from, 0); len = teco_interface_ssm(SCI_POSITIONFROMLINE, line, 0) - from; @@ -519,7 +519,7 @@ teco_state_start_kill(teco_machine_main_t *ctx, const gchar *cmd, gboolean by_li teco_current_doc_set_dot(teco_interface_bytes2glyphs_reldot(len)); } else { teco_int_t len_glyphs; - if (!teco_expressions_pop_num_calc(&len_glyphs, teco_num_sign, error)) + if (!teco_expressions_pop_int_calc(&len_glyphs, teco_num_sign, error)) return FALSE; gssize to = teco_interface_glyphs2bytes_reldot(len_glyphs); rc = teco_bool(to >= 0); @@ -533,9 +533,9 @@ teco_state_start_kill(teco_machine_main_t *ctx, const gchar *cmd, gboolean by_li from -= len; } } else { - teco_int_t to_glyphs = teco_expressions_pop_num(0); + teco_int_t to_glyphs = teco_expressions_pop_int(0); gssize to = teco_interface_glyphs2bytes_absdot(to_glyphs); - teco_int_t from_glyphs = teco_expressions_pop_num(0); + teco_int_t from_glyphs = teco_expressions_pop_int(0); from = teco_interface_glyphs2bytes_absdot(from_glyphs); len = to - from; rc = teco_bool(len >= 0 && from >= 0 && to >= 0); @@ -656,7 +656,7 @@ teco_state_control_lines2glyphs(teco_machine_main_t *ctx, GError **error) * FIXME: Could be optimized by directly calling * SCI_LINEFROMINDEXPOSITION. */ - pos = teco_interface_glyphs2bytes_absdot(teco_expressions_pop_num(0)); + pos = teco_interface_glyphs2bytes_absdot(teco_expressions_pop_int(0)); if (pos < 0) { teco_error_range_set(error, "^Q"); return; @@ -667,7 +667,7 @@ teco_state_control_lines2glyphs(teco_machine_main_t *ctx, GError **error) } else { teco_int_t v; - if (!teco_expressions_pop_num_calc(&v, teco_num_sign, error)) + if (!teco_expressions_pop_int_calc(&v, teco_num_sign, error)) return; sptr_t pos = teco_interface_ssm(SCI_GETCURRENTPOS, 0, 0); |
