From af23f3bbf31856fbd79359db62697d82e6457f66 Mon Sep 17 00:00:00 2001
From: "Sven M. Hallberg" <pesco@khjk.org>
Date: Sun, 17 Feb 2013 16:45:29 +0100
Subject: [PATCH] add more glue functions in base64_sem1

---
 examples/base64_sem1.c | 37 ++++++++++---------------------------
 1 file changed, 10 insertions(+), 27 deletions(-)

diff --git a/examples/base64_sem1.c b/examples/base64_sem1.c
index 9d1012fb..1c318e3c 100644
--- a/examples/base64_sem1.c
+++ b/examples/base64_sem1.c
@@ -25,12 +25,10 @@
 
 const HParsedToken *act_bsfdig(const HParseResult *p)
 {
-    HParsedToken *res = h_arena_malloc(p->arena, sizeof(HParsedToken));
+    HParsedToken *res = H_MAKE_UINT(0);
 
-    assert(p->ast->token_type == TT_UINT);
-    uint8_t c = p->ast->uint;
+    uint8_t c = H_CAST_UINT(p->ast);
 
-    res->token_type = TT_UINT;
     if(c >= 0x40 && c <= 0x5A) // A-Z
         res->uint = c - 0x41;
     else if(c >= 0x60 && c <= 0x7A) // a-z
@@ -58,13 +56,11 @@ H_ACT_APPLY(act_index0, h_act_index, 0);
 // General-form action to turn a block of base64 digits into bytes.
 const HParsedToken *act_base64_n(int n, const HParseResult *p)
 {
-    assert(p->ast->token_type == TT_SEQUENCE);
-
     HParsedToken *res = h_arena_malloc(p->arena, sizeof(HParsedToken));
     res->token_type = TT_SEQUENCE;
     res->seq = h_carray_new_sized(p->arena, n);
 
-    HParsedToken **digits = p->ast->seq->elements;
+    HParsedToken **digits = h_seq_elements(p->ast);
 
     uint32_t x = 0;
     int bits = 0;
@@ -75,9 +71,7 @@ const HParsedToken *act_base64_n(int n, const HParseResult *p)
     x >>= bits%8;   // align, i.e. cut off extra bits
 
     for(int i=0; i<n; i++) {
-        HParsedToken *item = h_arena_malloc(p->arena, sizeof(HParsedToken));
-        item->token_type = TT_UINT;
-        item->uint = x & 0xFF;
+        HParsedToken *item = H_MAKE_UINT(x & 0xFF);
 
         res->seq->elements[n-1-i] = item;   // output the last byte and
         x >>= 8;                            // discard it
@@ -91,34 +85,23 @@ H_ACT_APPLY(act_base64_3, act_base64_n, 3);
 H_ACT_APPLY(act_base64_2, act_base64_n, 2);
 H_ACT_APPLY(act_base64_1, act_base64_n, 1);
 
-// Helper to concatenate two arrays.
-void carray_concat(HCountedArray *a, const HCountedArray *b)
-{
-    for(size_t i=0; i<b->used; i++)
-        h_carray_append(a, b->elements[i]);
-}
-
 const HParsedToken *act_base64(const HParseResult *p)
 {
     assert(p->ast->token_type == TT_SEQUENCE);
     assert(p->ast->seq->used == 2);
     assert(p->ast->seq->elements[0]->token_type == TT_SEQUENCE);
 
-    HParsedToken *res = h_arena_malloc(p->arena, sizeof(HParsedToken));
-    res->token_type = TT_SEQUENCE;
-    res->seq = h_carray_new(p->arena);
+    HParsedToken *res = H_MAKE_SEQ();
 
     // concatenate base64_3 blocks
-    HCountedArray *seq = p->ast->seq->elements[0]->seq;
-    for(size_t i=0; i<seq->used; i++) {
-        assert(seq->elements[i]->token_type == TT_SEQUENCE);
-        carray_concat(res->seq, seq->elements[i]->seq);
-    }
+    HCountedArray *seq = H_FIELD_SEQ(0);
+    for(size_t i=0; i<seq->used; i++)
+        h_seq_append(res, seq->elements[i]);
 
     // append one trailing base64_2 or _1 block
-    const HParsedToken *tok = p->ast->seq->elements[1];
+    const HParsedToken *tok = h_seq_index(p->ast, 1);
     if(tok->token_type == TT_SEQUENCE)
-        carray_concat(res->seq, tok->seq);
+        h_seq_append(res, tok);
 
     return res;
 }
-- 
GitLab