aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/api/private/helpers.c
diff options
context:
space:
mode:
authorThiago de Arruda <tpadilha84@gmail.com>2014-10-22 10:45:54 -0300
committerThiago de Arruda <tpadilha84@gmail.com>2014-10-22 11:26:43 -0300
commitb31a74ad11c8943b795d132c7d3e3c961d048118 (patch)
tree059e5ccf4d4173cc8bc335cd553941ed23e43147 /src/nvim/api/private/helpers.c
parent42334463447e884b9a1198be599d734fbe2d1eb7 (diff)
downloadrneovim-b31a74ad11c8943b795d132c7d3e3c961d048118.tar.gz
rneovim-b31a74ad11c8943b795d132c7d3e3c961d048118.tar.bz2
rneovim-b31a74ad11c8943b795d132c7d3e3c961d048118.zip
debug: Improve debugging of msgpack-rpc requests
- Add the api_stringify function to display API objects - Use api_stringify to display request arguments and return values in DLOG statements.
Diffstat (limited to 'src/nvim/api/private/helpers.c')
-rw-r--r--src/nvim/api/private/helpers.c98
1 files changed, 98 insertions, 0 deletions
diff --git a/src/nvim/api/private/helpers.c b/src/nvim/api/private/helpers.c
index 093cb0e55f..784915cd16 100644
--- a/src/nvim/api/private/helpers.c
+++ b/src/nvim/api/private/helpers.c
@@ -1,4 +1,5 @@
#include <assert.h>
+#include <inttypes.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
@@ -553,6 +554,103 @@ Dictionary api_metadata(void)
return copy_object(DICTIONARY_OBJ(metadata)).data.dictionary;
}
+char *api_stringify(Object obj)
+{
+ Array array = ARRAY_DICT_INIT;
+ print_to_array(obj, &array);
+ size_t size = 0;
+ for (size_t i = 0; i < array.size; i++) {
+ size += array.items[i].data.string.size;
+ }
+
+ char *rv = xmalloc(size + 1);
+ size_t pos = 0;
+ for (size_t i = 0; i < array.size; i++) {
+ String str = array.items[i].data.string;
+ memcpy(rv + pos, str.data, str.size);
+ pos += str.size;
+ free(str.data);
+ }
+ rv[pos] = NUL;
+ free(array.items);
+ return rv;
+}
+
+static void print_to_array(Object obj, Array *array)
+{
+ char buf[32];
+
+ switch (obj.type) {
+ case kObjectTypeNil:
+ ADD(*array, STRING_OBJ(cstr_to_string("nil")));
+ break;
+
+ case kObjectTypeBoolean:
+ ADD(*array,
+ STRING_OBJ(cstr_to_string(obj.data.boolean ? "true" : "false")));
+ break;
+
+ case kObjectTypeInteger:
+ snprintf(buf, sizeof(buf), "%" PRId64, obj.data.integer);
+ ADD(*array, STRING_OBJ(cstr_to_string(buf)));
+ break;
+
+ case kObjectTypeFloat:
+ snprintf(buf, sizeof(buf), "%f", obj.data.floating);
+ ADD(*array, STRING_OBJ(cstr_to_string(buf)));
+ break;
+
+ case kObjectTypeBuffer:
+ snprintf(buf, sizeof(buf), "Buffer(%" PRIu64 ")", obj.data.buffer);
+ ADD(*array, STRING_OBJ(cstr_to_string(buf)));
+ break;
+
+ case kObjectTypeWindow:
+ snprintf(buf, sizeof(buf), "Window(%" PRIu64 ")", obj.data.window);
+ ADD(*array, STRING_OBJ(cstr_to_string(buf)));
+ break;
+
+ case kObjectTypeTabpage:
+ snprintf(buf, sizeof(buf), "Tabpage(%" PRIu64 ")", obj.data.tabpage);
+ ADD(*array, STRING_OBJ(cstr_to_string(buf)));
+ break;
+
+ case kObjectTypeString:
+ ADD(*array, STRING_OBJ(cstr_to_string("\"")));
+ ADD(*array, STRING_OBJ(cstr_to_string(obj.data.string.data)));
+ ADD(*array, STRING_OBJ(cstr_to_string("\"")));
+ break;
+
+ case kObjectTypeArray:
+ ADD(*array, STRING_OBJ(cstr_to_string("[")));
+ for (size_t i = 0; i < obj.data.array.size; i++) {
+ print_to_array(obj.data.array.items[i], array);
+ if (i < obj.data.array.size - 1) {
+ ADD(*array, STRING_OBJ(cstr_to_string(", ")));
+ }
+ }
+ ADD(*array, STRING_OBJ(cstr_to_string("]")));
+ break;
+
+ case kObjectTypeDictionary:
+ ADD(*array, STRING_OBJ(cstr_to_string("{")));
+ for (size_t i = 0; i < obj.data.dictionary.size; i++) {
+ ADD(*array,
+ STRING_OBJ(cstr_to_string(obj.data.dictionary.items[i].key.data)));
+ ADD(*array, STRING_OBJ(cstr_to_string(": ")));
+ print_to_array(obj.data.dictionary.items[i].value, array);
+ if (i < obj.data.array.size - 1) {
+ ADD(*array, STRING_OBJ(cstr_to_string(", ")));
+ }
+ }
+ ADD(*array, STRING_OBJ(cstr_to_string("}")));
+ break;
+
+ default:
+ ADD(*array, STRING_OBJ(cstr_to_string("INVALID")));
+ }
+}
+
static void init_error_type_metadata(Dictionary *metadata)
{
Dictionary types = ARRAY_DICT_INIT;