1#ifndef NVIM_API_PRIVATE_HELPERS_H
2#define NVIM_API_PRIVATE_HELPERS_H
3
4#include <stdbool.h>
5
6#include "nvim/api/private/defs.h"
7#include "nvim/vim.h"
8#include "nvim/getchar.h"
9#include "nvim/memory.h"
10#include "nvim/ex_eval.h"
11#include "nvim/lib/kvec.h"
12
13#define OBJECT_OBJ(o) o
14
15#define BOOLEAN_OBJ(b) ((Object) { \
16 .type = kObjectTypeBoolean, \
17 .data.boolean = b })
18
19#define INTEGER_OBJ(i) ((Object) { \
20 .type = kObjectTypeInteger, \
21 .data.integer = i })
22
23#define FLOAT_OBJ(f) ((Object) { \
24 .type = kObjectTypeFloat, \
25 .data.floating = f })
26
27#define STRING_OBJ(s) ((Object) { \
28 .type = kObjectTypeString, \
29 .data.string = s })
30
31#define BUFFER_OBJ(s) ((Object) { \
32 .type = kObjectTypeBuffer, \
33 .data.integer = s })
34
35#define WINDOW_OBJ(s) ((Object) { \
36 .type = kObjectTypeWindow, \
37 .data.integer = s })
38
39#define TABPAGE_OBJ(s) ((Object) { \
40 .type = kObjectTypeTabpage, \
41 .data.integer = s })
42
43#define ARRAY_OBJ(a) ((Object) { \
44 .type = kObjectTypeArray, \
45 .data.array = a })
46
47#define DICTIONARY_OBJ(d) ((Object) { \
48 .type = kObjectTypeDictionary, \
49 .data.dictionary = d })
50
51#define LUAREF_OBJ(r) ((Object) { \
52 .type = kObjectTypeLuaRef, \
53 .data.luaref = r })
54
55#define NIL ((Object) {.type = kObjectTypeNil})
56
57#define PUT(dict, k, v) \
58 kv_push(dict, ((KeyValuePair) { .key = cstr_to_string(k), .value = v }))
59
60#define ADD(array, item) \
61 kv_push(array, item)
62
63#define STATIC_CSTR_AS_STRING(s) ((String) {.data = s, .size = sizeof(s) - 1})
64
65/// Create a new String instance, putting data in allocated memory
66///
67/// @param[in] s String to work with. Must be a string literal.
68#define STATIC_CSTR_TO_STRING(s) ((String){ \
69 .data = xmemdupz(s, sizeof(s) - 1), \
70 .size = sizeof(s) - 1 })
71
72// Helpers used by the generated msgpack-rpc api wrappers
73#define api_init_boolean
74#define api_init_integer
75#define api_init_float
76#define api_init_string = STRING_INIT
77#define api_init_buffer
78#define api_init_window
79#define api_init_tabpage
80#define api_init_object = NIL
81#define api_init_array = ARRAY_DICT_INIT
82#define api_init_dictionary = ARRAY_DICT_INIT
83
84#define api_free_boolean(value)
85#define api_free_integer(value)
86#define api_free_float(value)
87#define api_free_buffer(value)
88#define api_free_window(value)
89#define api_free_tabpage(value)
90
91/// Structure used for saving state for :try
92///
93/// Used when caller is supposed to be operating when other VimL code is being
94/// processed and that “other VimL code” must not be affected.
95typedef struct {
96 except_T *current_exception;
97 struct msglist *private_msg_list;
98 const struct msglist *const *msg_list;
99 int trylevel;
100 int got_int;
101 int need_rethrow;
102 int did_emsg;
103} TryState;
104
105#ifdef INCLUDE_GENERATED_DECLARATIONS
106# include "api/private/helpers.h.generated.h"
107#endif
108#endif // NVIM_API_PRIVATE_HELPERS_H
109