diff options
author | bfredl <bjorn.linse@gmail.com> | 2024-06-15 19:50:44 +0200 |
---|---|---|
committer | bfredl <bjorn.linse@gmail.com> | 2024-06-24 10:38:36 +0200 |
commit | 2bb1a18631c4035e4a582b7d995968acbac874bf (patch) | |
tree | 91cbe1813e2b1c6f3b940c21aced43d36cab8366 /src/nvim/msgpack_rpc/packer.c | |
parent | da4e8dc5b04a82c6dd483f6c5345a81d8b375bec (diff) | |
download | rneovim-2bb1a18631c4035e4a582b7d995968acbac874bf.tar.gz rneovim-2bb1a18631c4035e4a582b7d995968acbac874bf.tar.bz2 rneovim-2bb1a18631c4035e4a582b7d995968acbac874bf.zip |
refactor(typval): don't use msgpack_packer for msgpackdump()
Step towords completely eliminating msgpack_packer.
Diffstat (limited to 'src/nvim/msgpack_rpc/packer.c')
-rw-r--r-- | src/nvim/msgpack_rpc/packer.c | 76 |
1 files changed, 72 insertions, 4 deletions
diff --git a/src/nvim/msgpack_rpc/packer.c b/src/nvim/msgpack_rpc/packer.c index 58318b88b0..279cbb3925 100644 --- a/src/nvim/msgpack_rpc/packer.c +++ b/src/nvim/msgpack_rpc/packer.c @@ -8,7 +8,7 @@ # include "msgpack_rpc/packer.c.generated.h" #endif -static void check_buffer(PackerBuffer *packer) +void mpack_check_buffer(PackerBuffer *packer) { if (mpack_remaining(packer) < MPACK_ITEM_SIZE) { packer->packer_flush(packer); @@ -87,7 +87,25 @@ void mpack_str(String str, PackerBuffer *packer) mpack_raw(str.data, len, packer); } -void mpack_raw(char *data, size_t len, PackerBuffer *packer) +void mpack_bin(const char *data, size_t len, PackerBuffer *packer) +{ + if (len < 0xff) { + mpack_w(&packer->ptr, 0xc4); + mpack_w(&packer->ptr, len); + } else if (len < 0xffff) { + mpack_w(&packer->ptr, 0xc5); + mpack_w2(&packer->ptr, (uint32_t)len); + } else if (len < 0xffffffff) { + mpack_w(&packer->ptr, 0xc6); + mpack_w4(&packer->ptr, (uint32_t)len); + } else { + abort(); + } + + mpack_raw(data, len, packer); +} + +void mpack_raw(const char *data, size_t len, PackerBuffer *packer) { size_t pos = 0; while (pos < len) { @@ -103,6 +121,27 @@ void mpack_raw(char *data, size_t len, PackerBuffer *packer) } } +void mpack_ext(char *buf, size_t len, int8_t type, PackerBuffer *packer) +{ + if (len == 1) { + mpack_w(&packer->ptr, 0xd4); + } else if (len == 2) { + mpack_w(&packer->ptr, 0xd5); + } else if (len <= 0xff) { + mpack_w(&packer->ptr, 0xc7); + } else if (len < 0xffff) { + mpack_w(&packer->ptr, 0xc8); + mpack_w2(&packer->ptr, (uint32_t)len); + } else if (len < 0xffffffff) { + mpack_w(&packer->ptr, 0xc9); + mpack_w4(&packer->ptr, (uint32_t)len); + } else { + abort(); + } + mpack_w(&packer->ptr, type); + mpack_raw(buf, len, packer); +} + void mpack_handle(ObjectType type, handle_T handle, PackerBuffer *packer) { char exttype = (char)(type - EXT_OBJECT_TYPE_SHIFT); @@ -156,7 +195,7 @@ void mpack_object_inner(Object *current, Object *container, size_t container_idx kvi_init(stack); while (true) { - check_buffer(packer); + mpack_check_buffer(packer); switch (current->type) { case kObjectTypeLuaRef: // TODO(bfredl): could also be an error. Though kObjectTypeLuaRef @@ -231,7 +270,7 @@ void mpack_object_inner(Object *current, Object *container, size_t container_idx } else { Dictionary dict = container->data.dictionary; KeyValuePair *it = &dict.items[container_idx++]; - check_buffer(packer); + mpack_check_buffer(packer); mpack_str(it->key, packer); current = &it->value; if (container_idx >= dict.size) { @@ -241,3 +280,32 @@ void mpack_object_inner(Object *current, Object *container, size_t container_idx } kvi_destroy(stack); } + +PackerBuffer packer_string_buffer(void) +{ + const size_t initial_size = 64; // must be larger than SHADA_MPACK_FREE_SPACE + char *alloc = xmalloc(initial_size); + return (PackerBuffer) { + .startptr = alloc, + .ptr = alloc, + .endptr = alloc + initial_size, + .packer_flush = flush_string_buffer, + }; +} + +static void flush_string_buffer(PackerBuffer *buffer) +{ + size_t current_capacity = (size_t)(buffer->endptr - buffer->startptr); + size_t new_capacity = 2 * current_capacity; + size_t len = (size_t)(buffer->ptr - buffer->startptr); + + buffer->startptr = xrealloc(buffer->startptr, new_capacity); + buffer->ptr = buffer->startptr + len; + buffer->endptr = buffer->startptr + new_capacity; +} + +/// can only be used with a PackerBuffer from `packer_string_buffer` +String packer_take_string(PackerBuffer *buffer) +{ + return (String){ .data = buffer->startptr, .size = (size_t)(buffer->ptr - buffer->startptr) }; +} |