mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06:00
API: Refactor: Add macro infrastructure for typed arrays
- Add macros supporting typed arrays in the remote API - Refactor StringArray-related functions on top of the new macros
This commit is contained in:
parent
92307201b5
commit
1e67b13fdc
@ -34,10 +34,7 @@ REMOTE_TYPE(Tabpage);
|
||||
|
||||
typedef struct object Object;
|
||||
|
||||
typedef struct {
|
||||
String *items;
|
||||
size_t size;
|
||||
} StringArray;
|
||||
TYPED_ARRAY_OF(String);
|
||||
|
||||
typedef struct {
|
||||
Integer row, col;
|
||||
|
@ -14,6 +14,43 @@
|
||||
{ \
|
||||
msgpack_rpc_from_integer(result, res); \
|
||||
}
|
||||
|
||||
#define TYPED_ARRAY_IMPL(t, lt) \
|
||||
bool msgpack_rpc_to_##lt##array(msgpack_object *obj, t##Array *arg) \
|
||||
{ \
|
||||
if (obj->type != MSGPACK_OBJECT_ARRAY) { \
|
||||
return false; \
|
||||
} \
|
||||
\
|
||||
arg->size = obj->via.array.size; \
|
||||
arg->items = xcalloc(obj->via.array.size, sizeof(t)); \
|
||||
\
|
||||
for (size_t i = 0; i < obj->via.array.size; i++) { \
|
||||
if (!msgpack_rpc_to_##lt(obj->via.array.ptr + i, &arg->items[i])) { \
|
||||
return false; \
|
||||
} \
|
||||
} \
|
||||
\
|
||||
return true; \
|
||||
} \
|
||||
\
|
||||
void msgpack_rpc_from_##lt##array(t##Array result, msgpack_packer *res) \
|
||||
{ \
|
||||
msgpack_pack_array(res, result.size); \
|
||||
\
|
||||
for (size_t i = 0; i < result.size; i++) { \
|
||||
msgpack_rpc_from_##lt(result.items[i], res); \
|
||||
} \
|
||||
} \
|
||||
\
|
||||
void msgpack_rpc_free_##lt##array(t##Array value) { \
|
||||
for (size_t i = 0; i < value.size; i++) { \
|
||||
msgpack_rpc_free_##lt(value.items[i]); \
|
||||
} \
|
||||
\
|
||||
free(value.items); \
|
||||
}
|
||||
|
||||
void msgpack_rpc_call(msgpack_object *req, msgpack_packer *res)
|
||||
{
|
||||
// The initial response structure is the same no matter what happens,
|
||||
@ -151,24 +188,6 @@ bool msgpack_rpc_to_object(msgpack_object *obj, Object *arg)
|
||||
}
|
||||
}
|
||||
|
||||
bool msgpack_rpc_to_stringarray(msgpack_object *obj, StringArray *arg)
|
||||
{
|
||||
if (obj->type != MSGPACK_OBJECT_ARRAY) {
|
||||
return false;
|
||||
}
|
||||
|
||||
arg->size = obj->via.array.size;
|
||||
arg->items = xcalloc(obj->via.array.size, sizeof(String));
|
||||
|
||||
for (uint32_t i = 0; i < obj->via.array.size; i++) {
|
||||
if (!msgpack_rpc_to_string(obj->via.array.ptr + i, &arg->items[i])) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool msgpack_rpc_to_position(msgpack_object *obj, Position *arg)
|
||||
{
|
||||
return obj->type == MSGPACK_OBJECT_ARRAY
|
||||
@ -282,15 +301,6 @@ void msgpack_rpc_from_object(Object result, msgpack_packer *res)
|
||||
}
|
||||
}
|
||||
|
||||
void msgpack_rpc_from_stringarray(StringArray result, msgpack_packer *res)
|
||||
{
|
||||
msgpack_pack_array(res, result.size);
|
||||
|
||||
for (size_t i = 0; i < result.size; i++) {
|
||||
msgpack_rpc_from_string(result.items[i], res);
|
||||
}
|
||||
}
|
||||
|
||||
void msgpack_rpc_from_position(Position result, msgpack_packer *res)
|
||||
{
|
||||
msgpack_pack_array(res, 2);;
|
||||
@ -343,14 +353,6 @@ void msgpack_rpc_free_object(Object value)
|
||||
}
|
||||
}
|
||||
|
||||
void msgpack_rpc_free_stringarray(StringArray value) {
|
||||
for (uint32_t i = 0; i < value.size; i++) {
|
||||
msgpack_rpc_free_string(value.items[i]);
|
||||
}
|
||||
|
||||
free(value.items);
|
||||
}
|
||||
|
||||
void msgpack_rpc_free_array(Array value)
|
||||
{
|
||||
for (uint32_t i = 0; i < value.size; i++) {
|
||||
@ -374,3 +376,5 @@ REMOTE_FUNCS_IMPL(Buffer, buffer)
|
||||
REMOTE_FUNCS_IMPL(Window, window)
|
||||
REMOTE_FUNCS_IMPL(Tabpage, tabpage)
|
||||
|
||||
TYPED_ARRAY_IMPL(String, string)
|
||||
|
||||
|
@ -8,6 +8,8 @@
|
||||
|
||||
#include "nvim/api/private/defs.h"
|
||||
|
||||
#define ARRAY_DICT_INIT {.size = 0, .items = NULL}
|
||||
|
||||
/// Validates the basic structure of the msgpack-rpc call and fills `res`
|
||||
/// with the basic response structure.
|
||||
///
|
||||
@ -80,9 +82,9 @@ void msgpack_rpc_from_dictionary(Dictionary result, msgpack_packer *res);
|
||||
#define msgpack_rpc_init_window
|
||||
#define msgpack_rpc_init_tabpage
|
||||
#define msgpack_rpc_init_object = {.type = kObjectTypeNil}
|
||||
#define msgpack_rpc_init_stringarray = {.items = NULL, .size = 0}
|
||||
#define msgpack_rpc_init_array = {.items = NULL, .size = 0}
|
||||
#define msgpack_rpc_init_dictionary = {.items = NULL, .size = 0}
|
||||
#define msgpack_rpc_init_stringarray = ARRAY_DICT_INIT
|
||||
#define msgpack_rpc_init_array = ARRAY_DICT_INIT
|
||||
#define msgpack_rpc_init_dictionary = ARRAY_DICT_INIT
|
||||
|
||||
/// Helpers for freeing arguments/return value
|
||||
///
|
||||
@ -102,6 +104,5 @@ void msgpack_rpc_free_stringarray(StringArray value);
|
||||
void msgpack_rpc_free_array(Array value);
|
||||
void msgpack_rpc_free_dictionary(Dictionary value);
|
||||
|
||||
|
||||
#endif // NVIM_OS_MSGPACK_RPC_H
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user