neovim

Neovim text editor
git clone https://git.dasho.dev/neovim.git
Log | Files | Refs | README

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);