defs.h (3639B)
1 #pragma once 2 3 #include <stdbool.h> 4 #include <stdint.h> 5 #include <string.h> 6 7 #include "klib/kvec.h" 8 #include "nvim/types_defs.h" 9 10 #define ARRAY_DICT_INIT KV_INITIAL_VALUE 11 #define STRING_INIT { .data = NULL, .size = 0 } 12 #define OBJECT_INIT { .type = kObjectTypeNil } 13 #define ERROR_INIT ((Error) { .type = kErrorTypeNone, .msg = NULL }) 14 #define REMOTE_TYPE(type) typedef handle_T type 15 16 #define ERROR_SET(e) ((e)->type != kErrorTypeNone) 17 18 #define ArrayOf(...) Array 19 #define DictOf(...) Dict 20 #define DictAs(name) Dict 21 #define Dict(name) KeyDict_##name 22 #define Enum(...) String 23 #define DictHash(name) KeyDict_##name##_get_field 24 #define DictKey(name) 25 #define LuaRefOf(...) LuaRef 26 #define Union(...) Object 27 #define Tuple(...) Array 28 #include "api/private/defs.h.inline.generated.h" 29 30 // Basic types 31 typedef enum { 32 kErrorTypeNone = -1, 33 kErrorTypeException, 34 kErrorTypeValidation, 35 } ErrorType; 36 37 typedef enum { 38 kMessageTypeUnknown = -1, 39 // Per msgpack-rpc spec. 40 kMessageTypeRequest = 0, 41 kMessageTypeResponse = 1, 42 kMessageTypeNotification = 2, 43 kMessageTypeRedrawEvent = 3, 44 } MessageType; 45 46 /// Mask for all internal calls 47 #define INTERNAL_CALL_MASK (((uint64_t)1) << (sizeof(uint64_t) * 8 - 1)) 48 49 /// Internal call from Vimscript code 50 #define VIML_INTERNAL_CALL INTERNAL_CALL_MASK 51 52 /// Internal call from Lua code 53 #define LUA_INTERNAL_CALL (VIML_INTERNAL_CALL + 1) 54 55 /// Check whether call is internal 56 /// 57 /// @param[in] channel_id Channel id. 58 /// 59 /// @return true if channel_id refers to internal channel. 60 static inline bool is_internal_call(const uint64_t channel_id) 61 FUNC_ATTR_ALWAYS_INLINE FUNC_ATTR_CONST 62 { 63 return !!(channel_id & INTERNAL_CALL_MASK); 64 } 65 66 typedef struct { 67 ErrorType type; 68 char *msg; 69 } Error; 70 71 typedef bool Boolean; 72 typedef int64_t Integer; 73 typedef double Float; 74 75 /// Maximum value of an Integer 76 #define API_INTEGER_MAX INT64_MAX 77 78 /// Minimum value of an Integer 79 #define API_INTEGER_MIN INT64_MIN 80 81 typedef struct { 82 char *data; 83 size_t size; 84 } String; 85 86 REMOTE_TYPE(Buffer); 87 REMOTE_TYPE(Window); 88 REMOTE_TYPE(Tabpage); 89 90 typedef struct object Object; 91 typedef kvec_t(Object) Array; 92 93 typedef struct key_value_pair KeyValuePair; 94 typedef kvec_t(KeyValuePair) Dict; 95 96 typedef kvec_t(String) StringArray; 97 98 typedef enum { 99 kObjectTypeNil = 0, 100 kObjectTypeBoolean, 101 kObjectTypeInteger, 102 kObjectTypeFloat, 103 kObjectTypeString, 104 kObjectTypeArray, 105 kObjectTypeDict, 106 kObjectTypeLuaRef, 107 // EXT types, cannot be split or reordered, see #EXT_OBJECT_TYPE_SHIFT 108 kObjectTypeBuffer, 109 kObjectTypeWindow, 110 kObjectTypeTabpage, 111 } ObjectType; 112 113 typedef enum { 114 kUnpackTypeStringArray = -1, 115 } UnpackType; 116 117 /// Value by which objects represented as EXT type are shifted 118 /// 119 /// Subtracted when packing, added when unpacking. Used to allow moving 120 /// buffer/window/tabpage block inside ObjectType enum. This block yet cannot be 121 /// split or reordered. 122 #define EXT_OBJECT_TYPE_SHIFT kObjectTypeBuffer 123 #define EXT_OBJECT_TYPE_MAX (kObjectTypeTabpage - EXT_OBJECT_TYPE_SHIFT) 124 125 struct object { 126 ObjectType type; 127 union { 128 Boolean boolean; 129 Integer integer; 130 Float floating; 131 String string; 132 Array array; 133 Dict dict; 134 LuaRef luaref; 135 } data; 136 }; 137 138 struct key_value_pair { 139 String key; 140 Object value; 141 }; 142 143 typedef uint64_t OptionalKeys; 144 typedef Integer HLGroupID; 145 146 // this is the prefix of all keysets with optional keys 147 typedef struct { 148 OptionalKeys is_set_; 149 } OptKeySet; 150 151 typedef struct { 152 char *str; 153 size_t ptr_off; 154 int type; // ObjectType or UnpackType. kObjectTypeNil == untyped 155 int opt_index; 156 bool is_hlgroup; 157 } KeySetLink; 158 159 typedef KeySetLink *(*FieldHashfn)(const char *str, size_t len);