From 10154622b871c3082872aafbfec2f50248fb8e15 Mon Sep 17 00:00:00 2001 From: "Sven M. Hallberg" Date: Sat, 9 Jun 2012 14:41:32 +0200 Subject: [PATCH 1/3] call actions only on successful parse --- src/hammer.c | 1 + src/parsers/action.c | 7 +++++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/hammer.c b/src/hammer.c index 0934a05..85a7fc2 100644 --- a/src/hammer.c +++ b/src/hammer.c @@ -426,6 +426,7 @@ static void test_action(void) { g_check_parse_ok(action_, "ab", 2, "(u0x41 u0x42)"); g_check_parse_ok(action_, "AB", 2, "(u0x41 u0x42)"); + g_check_parse_failed(action_, "XX", 2); } static void test_not_in(void) { diff --git a/src/parsers/action.c b/src/parsers/action.c index c5b89f9..479a840 100644 --- a/src/parsers/action.c +++ b/src/parsers/action.c @@ -10,8 +10,11 @@ static HParseResult* parse_action(void *env, HParseState *state) { if (a->p && a->action) { HParseResult *tmp = h_do_parse(a->p, state); //HParsedToken *tok = a->action(h_do_parse(a->p, state)); - const HParsedToken *tok = a->action(tmp); - return make_result(state, (HParsedToken*)tok); + if(tmp) { + const HParsedToken *tok = a->action(tmp); + return make_result(state, (HParsedToken*)tok); + } else + return NULL; } else // either the parser's missing or the action's missing return NULL; } From fa093d3b064d96bf0b4c7f7462da8bfcc8cf0016 Mon Sep 17 00:00:00 2001 From: "Meredith L. Patterson" Date: Fri, 27 Jul 2012 15:06:40 -0700 Subject: [PATCH 2/3] Added h_parse_result_free(). --- src/hammer.c | 4 ++++ src/hammer.h | 5 +++++ 2 files changed, 9 insertions(+) diff --git a/src/hammer.c b/src/hammer.c index 85a7fc2..adcc210 100644 --- a/src/hammer.c +++ b/src/hammer.c @@ -264,6 +264,10 @@ HParseResult* h_parse(const HParser* parser, const uint8_t* input, size_t length return res; } +void h_parse_result_free(HParseResult *result) { + h_delete_arena(result->arena); +} + #ifdef INCLUDE_TESTS #include "test_suite.h" diff --git a/src/hammer.h b/src/hammer.h index 62b5676..e8db7fd 100644 --- a/src/hammer.h +++ b/src/hammer.h @@ -437,6 +437,11 @@ HParser *h_indirect(); */ void h_bind_indirect(HParser* indirect, HParser* inner); +/** + * Free the memory allocated to an HParseResult when it is no longer needed. + */ +void h_parse_result_free(HParseResult *result); + // Some debugging aids /** * Format token into a compact unambiguous form. Useful for parser test cases. From f62aa1089604bbd8299b969fcaddaabe3bb609e8 Mon Sep 17 00:00:00 2001 From: "Meredith L. Patterson" Date: Fri, 27 Jul 2012 15:37:48 -0700 Subject: [PATCH 3/3] Stubbed out bitwriter tests. --- src/bitwriter.c | 43 ++++++++++++++++++++++++++++++++++++++++++- src/test_suite.c | 2 ++ 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/src/bitwriter.c b/src/bitwriter.c index b51df3e..0b35b67 100644 --- a/src/bitwriter.c +++ b/src/bitwriter.c @@ -103,4 +103,45 @@ void h_bit_writer_free(HBitWriter* w) { g_free(w); } -// TESTS BELOW HERE +#ifdef INCLUDE_TESTS + +static void test_bitwriter_ints(void) { + +} + +static void test_bitwriter_be(void) { + +} + +static void test_bitwriter_le(void) { + +} + +static void test_largebits_be(void) { + +} + +static void test_largebits_le(void) { + +} + +static void test_offset_largebits_be(void) { + +} + +static void test_offset_largebits_le(void) { + +} + +void register_bitwriter_tests(void) { + g_test_add_func("/core/bitwriter/be", test_bitwriter_be); + g_test_add_func("/core/bitwriter/le", test_bitwriter_le); + g_test_add_func("/core/bitwriter/largebits-be", test_largebits_be); + g_test_add_func("/core/bitwriter/largebits-le", test_largebits_le); + g_test_add_func("/core/bitwriter/offset-largebits-be", test_offset_largebits_be); + g_test_add_func("/core/bitwriter/offset-largebits-le", test_offset_largebits_le); + g_test_add_func("/core/bitwriter/ints", test_bitwriter_ints); +} + +#endif // #ifdef INCLUDE_TESTS + diff --git a/src/test_suite.c b/src/test_suite.c index 016274c..af22c7e 100644 --- a/src/test_suite.c +++ b/src/test_suite.c @@ -19,6 +19,7 @@ #include "test_suite.h" extern void register_bitreader_tests(); +extern void register_bitwriter_tests(); extern void register_parser_tests(); int main(int argc, char** argv) { @@ -26,6 +27,7 @@ int main(int argc, char** argv) { // register various test suites... register_bitreader_tests(); + register_bitwriter_tests(); register_parser_tests(); g_test_run();