Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 8 additions & 7 deletions bindings/cpp/src/kdlpp.cpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#include <kdl/kdl.h>
#include <kdlpp.h>
#include <memory>

namespace kdl {

Expand Down Expand Up @@ -210,11 +211,11 @@ std::u8string Document::to_string(KdlVersion version) const
if (version == KdlVersion::Kdl_1) opts.version = KDL_VERSION_1;
if (version == KdlVersion::Kdl_2) opts.version = KDL_VERSION_2;

kdl_emitter* emitter = kdl_create_buffering_emitter(&opts);
using Emitter = std::unique_ptr<kdl_emitter, decltype(&kdl_destroy_emitter)>;
Emitter emitter{kdl_create_buffering_emitter(&opts), &kdl_destroy_emitter};
if (emitter == nullptr) throw EmitterError{"Error initializing the KDL emitter"};
emit_nodes(emitter, m_nodes);
auto result = std::u8string{to_u8string_view(kdl_get_emitter_buffer(emitter))};
kdl_destroy_emitter(emitter);
emit_nodes(emitter.get(), m_nodes);
auto result = std::u8string{to_u8string_view(kdl_get_emitter_buffer(emitter.get()))};
return result;
}

Expand All @@ -234,10 +235,10 @@ Document parse(std::u8string_view kdl_text, KdlVersion version)
}

kdl_str text = {reinterpret_cast<char const*>(kdl_text.data()), kdl_text.size()};
kdl_parser* parser = kdl_create_string_parser(text, opts);
using Parser = std::unique_ptr<kdl_parser, decltype(&kdl_destroy_parser)>;
Parser parser{kdl_create_string_parser(text, opts), &kdl_destroy_parser};
if (parser == nullptr) throw std::runtime_error("Error initializing the KDL parser");
auto doc = Document::read_from(parser);
kdl_destroy_parser(parser);
auto doc = Document::read_from(parser.get());
return doc;
}

Expand Down
1 change: 1 addition & 0 deletions src/parser.c
Original file line number Diff line number Diff line change
Expand Up @@ -675,6 +675,7 @@ static kdl_event_data* _next_event_in_node(kdl_parser* self, kdl_token* token)
self->waiting_type_annotation = (kdl_str){NULL, 0};
}
if (self->state & PARSER_FLAG_IN_PROPERTY) {
kdl_free_string(&self->tmp_string_key);
self->tmp_string_key = self->waiting_prop_name;
self->waiting_prop_name = (kdl_owned_string){NULL, 0};
self->event.name = kdl_borrow_str(&self->tmp_string_key);
Expand Down
1 change: 1 addition & 0 deletions src/str.c
Original file line number Diff line number Diff line change
Expand Up @@ -505,6 +505,7 @@ kdl_owned_string _kdl_dedent_multiline_string(kdl_str const* s)
if (len > 0 && buf_dedented[len - 1] == '\n') --len;
buf_dedented = realloc(buf_dedented, len + 1);
buf_dedented[len] = '\0';
_kdl_free_write_buffer(&buf_norm_lf);
return (kdl_owned_string){.data = buf_dedented, .len = len};

dedent_err:
Expand Down
3 changes: 3 additions & 0 deletions src/utils/ckdl-cat.c
Original file line number Diff line number Diff line change
Expand Up @@ -101,9 +101,11 @@ static bool kdl_cat_impl(kdl_parser* parser, kdl_emitter* emitter)
kdl_event_data* ev = kdl_parser_next_event(parser);
switch (ev->event) {
case KDL_EVENT_EOF:
proplist_clear(&props);
if (!kdl_emit_end(emitter)) return false;
return true;
case KDL_EVENT_PARSE_ERROR:
proplist_clear(&props);
return false;
case KDL_EVENT_START_NODE:
if (!in_node_list) {
Expand Down Expand Up @@ -136,6 +138,7 @@ static bool kdl_cat_impl(kdl_parser* parser, kdl_emitter* emitter)
proplist_append(&props, ev->name, &ev->value);
break;
default:
proplist_clear(&props);
return false;
}
}
Expand Down
4 changes: 4 additions & 0 deletions tests/emitter_test.c
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,8 @@ static void test_data_types(void)
kdl_str expected_str = kdl_str_from_cstr(expected);
ASSERT(expected_str.len == result.len);
ASSERT(memcmp(result.data, expected_str.data, result.len) == 0);

kdl_destroy_emitter(emitter);
}

static void test_ascii_mode(void)
Expand All @@ -138,6 +140,8 @@ static void test_ascii_mode(void)

ASSERT(expected_str.len == result.len);
ASSERT(memcmp(result.data, expected_str.data, result.len) == 0);

kdl_destroy_emitter(emitter);
}

void TEST_MAIN(void)
Expand Down