aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/ex_eval_defs.h
diff options
context:
space:
mode:
authorJosh Rahm <rahm@google.com>2022-08-19 12:26:08 -0600
committerJosh Rahm <rahm@google.com>2022-08-19 13:06:41 -0600
commita7237662f96933efe29eed8212464571e3778cd0 (patch)
tree27930202726b4251437c8cfa53069f65b4db90dc /src/nvim/ex_eval_defs.h
parent02292344929069ea63c0bb872cc22d552d86b67f (diff)
parentb2f979b30beac67906b2dd717fcb6a34f46f5e54 (diff)
downloadrneovim-tmp.tar.gz
rneovim-tmp.tar.bz2
rneovim-tmp.zip
Merge branch 'master' of https://github.com/neovim/neovim into rahmtmp
Diffstat (limited to 'src/nvim/ex_eval_defs.h')
-rw-r--r--src/nvim/ex_eval_defs.h79
1 files changed, 79 insertions, 0 deletions
diff --git a/src/nvim/ex_eval_defs.h b/src/nvim/ex_eval_defs.h
new file mode 100644
index 0000000000..9da0c9ad12
--- /dev/null
+++ b/src/nvim/ex_eval_defs.h
@@ -0,0 +1,79 @@
+#ifndef NVIM_EX_EVAL_DEFS_H
+#define NVIM_EX_EVAL_DEFS_H
+
+#include "nvim/pos.h" // for linenr_T
+
+/// There is no CSF_IF, the lack of CSF_WHILE, CSF_FOR and CSF_TRY means ":if"
+/// was used.
+enum {
+ CSF_TRUE = 0x0001, ///< condition was TRUE
+ CSF_ACTIVE = 0x0002, ///< current state is active
+ CSF_ELSE = 0x0004, ///< ":else" has been passed
+ CSF_WHILE = 0x0008, ///< is a ":while"
+ CSF_FOR = 0x0010, ///< is a ":for"
+
+ CSF_TRY = 0x0100, ///< is a ":try"
+ CSF_FINALLY = 0x0200, ///< ":finally" has been passed
+ CSF_THROWN = 0x0800, ///< exception thrown to this try conditional
+ CSF_CAUGHT = 0x1000, ///< exception caught by this try conditional
+ CSF_FINISHED = 0x2000, ///< CSF_CAUGHT was handled by finish_exception()
+ CSF_SILENT = 0x4000, ///< "emsg_silent" reset by ":try"
+};
+// Note that CSF_ELSE is only used when CSF_TRY and CSF_WHILE are unset
+// (an ":if"), and CSF_SILENT is only used when CSF_TRY is set.
+
+/// What's pending for being reactivated at the ":endtry" of this try
+/// conditional:
+enum {
+ CSTP_NONE = 0, ///< nothing pending in ":finally" clause
+ CSTP_ERROR = 1, ///< an error is pending
+ CSTP_INTERRUPT = 2, ///< an interrupt is pending
+ CSTP_THROW = 4, ///< a throw is pending
+ CSTP_BREAK = 8, ///< ":break" is pending
+ CSTP_CONTINUE = 16, ///< ":continue" is pending
+ CSTP_RETURN = 24, ///< ":return" is pending
+ CSTP_FINISH = 32, ///< ":finish" is pending
+};
+
+/// A list of error messages that can be converted to an exception. "throw_msg"
+/// is only set in the first element of the list. Usually, it points to the
+/// original message stored in that element, but sometimes it points to a later
+/// message in the list. See cause_errthrow().
+typedef struct msglist msglist_T;
+struct msglist {
+ char *msg; ///< original message, allocated
+ char *throw_msg; ///< msg to throw: usually original one
+ char *sfile; ///< value from estack_sfile(), allocated
+ linenr_T slnum; ///< line number for "sfile"
+ msglist_T *next; ///< next of several messages in a row
+};
+
+/// The exception types.
+typedef enum {
+ ET_USER, ///< exception caused by ":throw" command
+ ET_ERROR, ///< error exception
+ ET_INTERRUPT, ///< interrupt exception triggered by Ctrl-C
+} except_type_T;
+
+/// Structure describing an exception.
+/// (don't use "struct exception", it's used by the math library).
+typedef struct vim_exception except_T;
+struct vim_exception {
+ except_type_T type; ///< exception type
+ char *value; ///< exception value
+ msglist_T *messages; ///< message(s) causing error exception
+ char *throw_name; ///< name of the throw point
+ linenr_T throw_lnum; ///< line number of the throw point
+ except_T *caught; ///< next exception on the caught stack
+};
+
+/// Structure to save the error/interrupt/exception state between calls to
+/// enter_cleanup() and leave_cleanup(). Must be allocated as an automatic
+/// variable by the (common) caller of these functions.
+typedef struct cleanup_stuff cleanup_T;
+struct cleanup_stuff {
+ int pending; ///< error/interrupt/exception state
+ except_T *exception; ///< exception value
+};
+
+#endif // NVIM_EX_EVAL_DEFS_H