From 56a5845674ad256498b2c54676620da5f02958f8 Mon Sep 17 00:00:00 2001 From: Dan Hirsch <thequux@thequux.com> Date: Wed, 23 May 2012 15:55:40 +0200 Subject: [PATCH] Implemented and --- src/hammer.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/hammer.c b/src/hammer.c index 47429853..046cd260 100644 --- a/src/hammer.c +++ b/src/hammer.c @@ -228,7 +228,7 @@ static parse_result_t* parse_unimplemented(void* env, parse_state_t *state) { return &result; } -static parser_t unimplemented = { +static parser_t unimplemented __attribute__((unused)) = { .fn = parse_unimplemented, .env = NULL }; @@ -883,7 +883,22 @@ const parser_t* length_value(const parser_t* length, const parser_t* value) { return res; } -const parser_t* and(const parser_t* p) { return &unimplemented; } +static parse_result_t *parse_and(void* env, parse_state_t* state) { + input_stream_t bak = state->input_stream; + parse_result_t *res = do_parse((parser_t*)env, state); + state->input_stream = bak; + if (res) + return make_result(state, NULL); + return NULL; +} + +const parser_t* and(const parser_t* p) { + // zero-width postive lookahead + parser_t *res = g_new(parser_t, 1); + res->env = (void*)p; + res->fn = parse_and; + return res; +} static parse_result_t* parse_not(void* env, parse_state_t* state) { input_stream_t bak = state->input_stream; -- GitLab