diff --git a/src/bitwriter.c b/src/bitwriter.c index a6d06ca..c24ef0e 100644 --- a/src/bitwriter.c +++ b/src/bitwriter.c @@ -104,6 +104,7 @@ void h_bit_writer_free(HBitWriter* w) { g_free(w); } +#ifdef INCLUDE_TESTS // TESTS BELOW HERE typedef struct { unsigned long long data; @@ -134,3 +135,43 @@ void run_bitwriter_test(bitwriter_test_elem data[], char flags) { g_check_cmpulonglong ((unsigned long long)h_read_bits(&input, data[i].nbits, FALSE), ==, data[i].data); } } + +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/hammer.c b/src/hammer.c index 904fdd0..82ca235 100644 --- a/src/hammer.c +++ b/src/hammer.c @@ -265,6 +265,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" @@ -427,6 +431,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/hammer.h b/src/hammer.h index 26367f3..fc3ea5b 100644 --- a/src/hammer.h +++ b/src/hammer.h @@ -443,6 +443,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. 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; } 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();