aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/error.h
diff options
context:
space:
mode:
authorRobin Haberkorn <robin.haberkorn@googlemail.com>2025-08-31 02:24:11 +0300
committerRobin Haberkorn <robin.haberkorn@googlemail.com>2025-08-31 02:24:11 +0300
commit9425ad37ec95a40dc039169031259161c92cc217 (patch)
tree11525a5d372eba9feac20b6ff47ef91e5cbc3b47 /src/error.h
parente82dc6639e829490cb11267fa4a49ef97c6459ae (diff)
downloadsciteco-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/error.h')
-rw-r--r--src/error.h9
1 files changed, 9 insertions, 0 deletions
diff --git a/src/error.h b/src/error.h
index b4f92ad..2a12733 100644
--- a/src/error.h
+++ b/src/error.h
@@ -42,6 +42,7 @@ typedef enum {
TECO_ERROR_SYNTAX,
TECO_ERROR_MODIFIER,
TECO_ERROR_ARGEXPECTED,
+ TECO_ERROR_LABEL,
TECO_ERROR_CODEPOINT,
TECO_ERROR_MOVE,
TECO_ERROR_WORDS,
@@ -92,6 +93,14 @@ teco_error_argexpected_set(GError **error, const gchar *cmd)
}
static inline void
+teco_error_label_set(GError **error, const gchar *name, gsize len)
+{
+ g_autofree gchar *label_printable = teco_string_echo(name, len);
+ g_set_error(error, TECO_ERROR, TECO_ERROR_LABEL,
+ "Label \"%s\" not found", label_printable);
+}
+
+static inline void
teco_error_codepoint_set(GError **error, const gchar *cmd)
{
g_set_error(error, TECO_ERROR, TECO_ERROR_CODEPOINT,