diff options
author | Robin Haberkorn <robin.haberkorn@googlemail.com> | 2025-07-18 01:41:28 +0300 |
---|---|---|
committer | Robin Haberkorn <robin.haberkorn@googlemail.com> | 2025-07-18 01:41:28 +0300 |
commit | 5d4368584ecd447b953e8853dbeaee4282700970 (patch) | |
tree | 290d9034f542e615155fb514cb23f15620474f2d /src | |
parent | 45b9dea901cec7045be1a98f61d48d41dc965a9f (diff) | |
download | sciteco-5d4368584ecd447b953e8853dbeaee4282700970.tar.gz |
support <:]q> (pop Q-Register) for getting a success/failure boolean
* Could be used to check whether the stack is currently empty,
although peeking would be cumbersome: `:]q"S [q !...! | !...! '`
* This is from DEC TECO-11.
Diffstat (limited to 'src')
-rw-r--r-- | src/core-commands.c | 3 | ||||
-rw-r--r-- | src/qreg-commands.c | 17 |
2 files changed, 16 insertions, 4 deletions
diff --git a/src/core-commands.c b/src/core-commands.c index 8e31ae3..ae51ecc 100644 --- a/src/core-commands.c +++ b/src/core-commands.c @@ -639,7 +639,8 @@ teco_state_start_input(teco_machine_main_t *ctx, gunichar chr, GError **error) .modifier_at = TRUE, .modifier_colon = 1}, ['['] = {&teco_state_pushqreg}, - [']'] = {&teco_state_popqreg}, + [']'] = {&teco_state_popqreg, + .modifier_colon = 1}, ['G'] = {&teco_state_getqregstring}, ['Q'] = {&teco_state_queryqreg, .modifier_colon = 1}, diff --git a/src/qreg-commands.c b/src/qreg-commands.c index 9407e6c..1d2766f 100644 --- a/src/qreg-commands.c +++ b/src/qreg-commands.c @@ -99,18 +99,29 @@ teco_state_popqreg_got_register(teco_machine_main_t *ctx, teco_qreg_t *qreg, { teco_state_expectqreg_reset(ctx); - return ctx->flags.mode == TECO_MODE_NORMAL && - !teco_qreg_stack_pop(qreg, error) ? NULL : &teco_state_start; + if (ctx->flags.mode > TECO_MODE_NORMAL) + return &teco_state_start; + + if (!teco_machine_main_eval_colon(ctx)) + return !teco_qreg_stack_pop(qreg, error) ? NULL : &teco_state_start; + teco_expressions_push(teco_bool(teco_qreg_stack_pop(qreg, NULL))); + return &teco_state_start; } -/*$ "]" "]q" pop +/*$ "]" "]q" ":]q" pop * ]q -- Restore Q-Register + * :]q -> Success|Failure * * Restore Q-Register <q> by replacing its contents * with the contents of the register saved on top of * the Q-Register push-down stack. * The stack entry is popped. * + * When colon-modified, \fB]\fP returns a success boolean + * (-1) if there was a register to pop. + * If the stack was empty, a failure boolean (0) is returned + * instead of throwing an error. + * * In interactive mode, the original contents of <q> * are not immediately reclaimed but are kept in memory * to support rubbing out the command. |