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