diff options
author | Robin Haberkorn <robin.haberkorn@googlemail.com> | 2025-08-31 02:24:11 +0300 |
---|---|---|
committer | Robin Haberkorn <robin.haberkorn@googlemail.com> | 2025-08-31 02:24:11 +0300 |
commit | 9425ad37ec95a40dc039169031259161c92cc217 (patch) | |
tree | 11525a5d372eba9feac20b6ff47ef91e5cbc3b47 /src/core-commands.c | |
parent | e82dc6639e829490cb11267fa4a49ef97c6459ae (diff) | |
download | sciteco-9425ad37ec95a40dc039169031259161c92cc217.tar.gz |
support <:O>: if a label is not found, continue execution after the go-to statement
* this is a SciTECO extension - it's not in TECO-11
* Allows for select-case-like constructs with default-clauses as in
:Os.^EQa$
!* default *!
!s.foo!
!* ... *!
!s.bar!
!* ... *!
* Consistent with nOlabel0,label1,...$ if <n> is out of range.
Unfortunately this form of computed goto is not applicable when
"selecting" by strings or non-consecutive integers.
* In order to continue after the <:O> statement, we must keep the
program counter along with the label we were looking for.
At the end of the macro, the PC is restored instead of throwing
an error.
* Since that would be very inefficient in loops - where potentially
all iterations would result in rescanning till the end of the
macro - we now store a completed-flag in the goto table.
If it is set while trying to :O to an unknown label, we can
just continue execution.
Diffstat (limited to 'src/core-commands.c')
-rw-r--r-- | src/core-commands.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/src/core-commands.c b/src/core-commands.c index 5fe960b..8ce7a24 100644 --- a/src/core-commands.c +++ b/src/core-commands.c @@ -633,7 +633,7 @@ teco_state_start_input(teco_machine_main_t *ctx, gunichar chr, GError **error) ['$'] = {&teco_state_escape}, ['!'] = {&teco_state_label}, ['O'] = {&teco_state_goto, - .modifier_at = TRUE}, + .modifier_at = TRUE, .modifier_colon = 1}, ['^'] = {&teco_state_control, .modifier_at = TRUE, .modifier_colon = 2}, ['F'] = {&teco_state_fcommand, |