diff --git a/bindings/cpp/src/kdlpp.cpp b/bindings/cpp/src/kdlpp.cpp index 0ed240f..264dc39 100644 --- a/bindings/cpp/src/kdlpp.cpp +++ b/bindings/cpp/src/kdlpp.cpp @@ -1,5 +1,6 @@ #include #include +#include namespace kdl { @@ -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; + 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; } @@ -234,10 +235,10 @@ Document parse(std::u8string_view kdl_text, KdlVersion version) } kdl_str text = {reinterpret_cast(kdl_text.data()), kdl_text.size()}; - kdl_parser* parser = kdl_create_string_parser(text, opts); + using Parser = std::unique_ptr; + 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; } diff --git a/src/parser.c b/src/parser.c index ca70853..1c8d847 100644 --- a/src/parser.c +++ b/src/parser.c @@ -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); diff --git a/src/str.c b/src/str.c index 48430a5..baf229a 100644 --- a/src/str.c +++ b/src/str.c @@ -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: diff --git a/src/utils/ckdl-cat.c b/src/utils/ckdl-cat.c index 9c9284e..b5b7693 100644 --- a/src/utils/ckdl-cat.c +++ b/src/utils/ckdl-cat.c @@ -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) { @@ -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; } } diff --git a/tests/emitter_test.c b/tests/emitter_test.c index e6b8282..900861a 100644 --- a/tests/emitter_test.c +++ b/tests/emitter_test.c @@ -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) @@ -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)