static void recover(Streader* sr, int64_t pos) { rassert(sr != NULL); rassert(pos <= sr->pos); Streader_clear_error(sr); sr->pos = pos; return; }
bool Streader_try_match_char(Streader* sr, char ch) { rassert(sr != NULL); rassert(!Streader_is_error_set(sr)); const int64_t start_pos = sr->pos; const bool success = Streader_match_char(sr, ch); if (!success) { Streader_clear_error(sr); sr->pos = start_pos; } return success; }
static bool Streader_try_match_char_seq(Streader* sr, const char* seq) { assert(sr != NULL); assert(!Streader_is_error_set(sr)); assert(seq != NULL); const size_t start_pos = sr->pos; const bool success = Streader_match_char_seq(sr, seq); if (!success) { Streader_clear_error(sr); sr->pos = start_pos; } return success; }
END_TEST START_TEST(Matching_wrong_characters_fails) { Streader* sr = init_with_cstr("1"); fail_if(Streader_match_char(sr, '2'), "Matched '2' successfully in \"1\""); fail_if(!Streader_is_error_set(sr), "No error set after a failed match"); fail_if(Streader_match_char(sr, '1'), "Match succeeded after an error"); Streader_clear_error(sr); fail_if(Streader_is_error_set(sr), "Streader_clear_error did not remove Streader error"); fail_if(!Streader_match_char(sr, '1'), "Correct match did not succeed after a cleared failure"); }