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:
Thiago de Arruda 2014-05-23 15:49:40 -03:00
parent 92307201b5
commit 1e67b13fdc
3 changed files with 45 additions and 43 deletions

View File

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

View File

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

View File

@ -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