From e46352bc614cf9777ca76deb47330fb408bc1a23 Mon Sep 17 00:00:00 2001 From: Robin Haberkorn Date: Sat, 2 Aug 2025 13:16:16 +0300 Subject: fixed serious bug with certain alternative string termination chars in commands with multiple string arguments MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * When `@`-modifying a command with several string arguments and choosing `{` as the alternative string termination character, the parser would get totally confused. Any sequence of `{` would be ignored and only the first non-`{` would become the termination character. Consequently you also couldn't choose a new terminator after the closing `}`. So even a documented code example from sciteco(7) wouldn't work. The same was true when using $ (escape) or ^A as the alternative termination character. * We can now correctly parse e.g. `@FR{foo}{bar}` or `@FR$foo$bar$` (even though the latter one is quite pointless). * has probably been broken forever (has been broken even before v2.0). * Whitespace is now ignored in front of alternative termination characters as in TECO-64, so we can also write `@S /foo/` or even ``` @^Um { !* blabla *! } ``` I wanted to disallow whitespace termination characters, so the alternative would have been to throw an error. The new implementation at least adds some functionality. * Avoid redundancies when parsing no-op characters via teco_is_noop(). I assume that this is inlined and drawn into any jump-table what would be generated for the switch-statement in teco_state_start_input(). * Alternative termination characters are still case-folded, even if they are Unicode glyphs, so `@IЖfooж` would work and insert `foo`. This should perhaps be restricted to ANSI characters? --- src/goto-commands.c | 3 +++ 1 file changed, 3 insertions(+) (limited to 'src/goto-commands.c') diff --git a/src/goto-commands.c b/src/goto-commands.c index 97c58d0..d95886d 100644 --- a/src/goto-commands.c +++ b/src/goto-commands.c @@ -218,6 +218,9 @@ teco_state_blockcomment_input(teco_machine_main_t *ctx, gunichar chr, GError **e TECO_DEFINE_STATE_COMMENT(teco_state_blockcomment); +/* + * `!!` line comments are inspired by TECO-64. + */ static teco_state_t * teco_state_eolcomment_input(teco_machine_main_t *ctx, gunichar chr, GError **error) { -- cgit v1.2.3