aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarvin Borner2023-05-26 22:20:00 +0200
committerMarvin Borner2023-05-26 22:20:00 +0200
commite5c2e8978f3572b00585b53c1f3bf8ee75586439 (patch)
treed56d131f8a06bf97f4b39e32eb756587673e67ec
parentd239d5da765ddc389195d7121d517e16c674f50e (diff)
Switched to xxHash from murmur3
-rw-r--r--inc/hash.h2
-rw-r--r--readme.md7
-rw-r--r--src/hash.c157
-rw-r--r--test/aoc.blc.dump186
-rw-r--r--test/fac.blc.dump70
-rwxr-xr-xtest/run2
6 files changed, 252 insertions, 172 deletions
diff --git a/inc/hash.h b/inc/hash.h
index 35da312..7898180 100644
--- a/inc/hash.h
+++ b/inc/hash.h
@@ -9,6 +9,6 @@
typedef uint64_t hash_t;
-hash_t hash(const void *key, int len, uint64_t seed);
+hash_t hash(const void *data, size_t len, uint64_t seed);
#endif
diff --git a/readme.md b/readme.md
index c38d889..87db161 100644
--- a/readme.md
+++ b/readme.md
@@ -102,3 +102,10 @@ As of right now, expressions **don’t** get beta-reduced or manipulated
in any other way. As an idea for the future, long expressions could get
reduced using different techniques/depths and then get replaced with the
shortest one (as fully reduced expressions aren’t necessarily shorter).
+
+## Libraries
+
+- [pqueue](https://github.com/vy/libpqueue/) \[BSD 2-Clause\]: Simple
+ priority queue implementation
+- [xxHash](https://github.com/Cyan4973/xxHash/) \[BSD 2-Clause\]:
+ Extremely fast hash algorithm
diff --git a/src/hash.c b/src/hash.c
index 8940d70..2feeee8 100644
--- a/src/hash.c
+++ b/src/hash.c
@@ -1,62 +1,135 @@
-// murmur3 originally by Austin Appleby
-// Copyright (c) 2013, ksss
-// Copyright (c) 2023, Marvin Borner <dev@marvinborner.de>
-// SPDX-License-Identifier: MIT
+//-----------------------------------------------------------------------------
+// xxHash Library
+// Copyright (c) 2012-2021 Yann Collet
+// All rights reserved.
+//
+// BSD 2-Clause License (https://www.opensource.org/licenses/bsd-license.php)
+//
+// xxHash3
+//-----------------------------------------------------------------------------
#include <stdint.h>
+#include <string.h>
#include <hash.h>
-hash_t hash(const void *key, int len, uint64_t seed)
+#define XXH_PRIME_1 11400714785074694791ULL
+#define XXH_PRIME_2 14029467366897019727ULL
+#define XXH_PRIME_3 1609587929392839161ULL
+#define XXH_PRIME_4 9650029242287828579ULL
+#define XXH_PRIME_5 2870177450012600261ULL
+
+static uint64_t XXH_read64(const void *memptr)
{
- const uint64_t m = 0xc6a4a7935bd1e995ULL;
- const int r = 47;
+ uint64_t val;
+ memcpy(&val, memptr, sizeof(val));
+ return val;
+}
- uint64_t h = seed ^ (len * m);
+static uint32_t XXH_read32(const void *memptr)
+{
+ uint32_t val;
+ memcpy(&val, memptr, sizeof(val));
+ return val;
+}
- const uint64_t *data = (const uint64_t *)key;
- const uint64_t *end = data + (len / 8);
+static uint64_t XXH_rotl64(uint64_t x, int r)
+{
+ return (x << r) | (x >> (64 - r));
+}
- while (data != end) {
- uint64_t k = *data++;
+hash_t hash(const void *data, size_t len, uint64_t seed)
+{
+ const uint8_t *p = (const uint8_t *)data;
+ const uint8_t *const end = p + len;
+ uint64_t h64;
- k *= m;
- k ^= k >> r;
- k *= m;
+ if (len >= 32) {
+ const uint8_t *const limit = end - 32;
+ uint64_t v1 = seed + XXH_PRIME_1 + XXH_PRIME_2;
+ uint64_t v2 = seed + XXH_PRIME_2;
+ uint64_t v3 = seed + 0;
+ uint64_t v4 = seed - XXH_PRIME_1;
- h ^= k;
- h *= m;
- }
+ do {
+ v1 += XXH_read64(p) * XXH_PRIME_2;
+ v1 = XXH_rotl64(v1, 31);
+ v1 *= XXH_PRIME_1;
- const unsigned char *data2 = (const unsigned char *)data;
+ v2 += XXH_read64(p + 8) * XXH_PRIME_2;
+ v2 = XXH_rotl64(v2, 31);
+ v2 *= XXH_PRIME_1;
- int b = len & 7;
- if (b >= 7) {
- h ^= ((uint64_t)data2[6]) << 48;
- }
- if (b >= 6) {
- h ^= ((uint64_t)data2[5]) << 40;
- }
- if (b >= 5) {
- h ^= ((uint64_t)data2[4]) << 32;
- }
- if (b >= 4) {
- h ^= ((uint64_t)data2[3]) << 24;
+ v3 += XXH_read64(p + 16) * XXH_PRIME_2;
+ v3 = XXH_rotl64(v3, 31);
+ v3 *= XXH_PRIME_1;
+
+ v4 += XXH_read64(p + 24) * XXH_PRIME_2;
+ v4 = XXH_rotl64(v4, 31);
+ v4 *= XXH_PRIME_1;
+
+ p += 32;
+ } while (p <= limit);
+
+ h64 = XXH_rotl64(v1, 1) + XXH_rotl64(v2, 7) +
+ XXH_rotl64(v3, 12) + XXH_rotl64(v4, 18);
+
+ v1 *= XXH_PRIME_2;
+ v1 = XXH_rotl64(v1, 31);
+ v1 *= XXH_PRIME_1;
+ h64 ^= v1;
+ h64 = h64 * XXH_PRIME_1 + XXH_PRIME_4;
+
+ v2 *= XXH_PRIME_2;
+ v2 = XXH_rotl64(v2, 31);
+ v2 *= XXH_PRIME_1;
+ h64 ^= v2;
+ h64 = h64 * XXH_PRIME_1 + XXH_PRIME_4;
+
+ v3 *= XXH_PRIME_2;
+ v3 = XXH_rotl64(v3, 31);
+ v3 *= XXH_PRIME_1;
+ h64 ^= v3;
+ h64 = h64 * XXH_PRIME_1 + XXH_PRIME_4;
+
+ v4 *= XXH_PRIME_2;
+ v4 = XXH_rotl64(v4, 31);
+ v4 *= XXH_PRIME_1;
+ h64 ^= v4;
+ h64 = h64 * XXH_PRIME_1 + XXH_PRIME_4;
+ } else {
+ h64 = seed + XXH_PRIME_5;
}
- if (b >= 3) {
- h ^= ((uint64_t)data2[2]) << 16;
+
+ h64 += (uint64_t)len;
+
+ while (p + 8 <= end) {
+ uint64_t k1 = XXH_read64(p);
+ k1 *= XXH_PRIME_2;
+ k1 = XXH_rotl64(k1, 31);
+ k1 *= XXH_PRIME_1;
+ h64 ^= k1;
+ h64 = XXH_rotl64(h64, 27) * XXH_PRIME_1 + XXH_PRIME_4;
+ p += 8;
}
- if (b >= 2) {
- h ^= ((uint64_t)data2[1]) << 8;
+
+ if (p + 4 <= end) {
+ h64 ^= (uint64_t)(XXH_read32(p)) * XXH_PRIME_1;
+ h64 = XXH_rotl64(h64, 23) * XXH_PRIME_2 + XXH_PRIME_3;
+ p += 4;
}
- if (b >= 1) {
- h ^= ((uint64_t)data2[0]);
- h *= m;
+
+ while (p < end) {
+ h64 ^= (*p) * XXH_PRIME_5;
+ h64 = XXH_rotl64(h64, 11) * XXH_PRIME_1;
+ p++;
}
- h ^= h >> r;
- h *= m;
- h ^= h >> r;
+ h64 ^= h64 >> 33;
+ h64 *= XXH_PRIME_2;
+ h64 ^= h64 >> 29;
+ h64 *= XXH_PRIME_3;
+ h64 ^= h64 >> 32;
- return h;
+ return h64;
}
diff --git a/test/aoc.blc.dump b/test/aoc.blc.dump
index f5ecf68..455f743 100644
--- a/test/aoc.blc.dump
+++ b/test/aoc.blc.dump
@@ -1,100 +1,100 @@
=== START BLOC ===
| entries: 95
-| entry 93: (<1> [[[(<3> (((<78> 1) [[0]]) (<8> ((2 (<33> 1)) <2>))))]]])
-| entry 92: (<9> 0)
-| entry 91: [[(((<45> [(<85> [[0]])]) <62>) ((<34> 1) 0))]]
-| entry 90: (((3 2) 1) 0)
-| entry 89: [[[[[(((4 1) 0) <90>)]]]]]
-| entry 88: [([(0 [[0]])] (((0 (<17> [[[(1 2)]]])) [(0 [[(<28> (<11> 0))]])]) [(0 [[(<30> <23>)]])]))]
-| entry 87: (((<1> [[[(<3> ((<13> <6>) 0))]]]) <86>) 0)
-| entry 86: ((<45> <56>) 1)
-| entry 85: ((0 [[0]]) [[1]])
-| entry 84: ((0 [[1]]) [[[0]]])
-| entry 83: ([[[[[(((<49> 1) 2) 0)]]]]] 0)
-| entry 82: (<9> <44>)
-| entry 81: (<0> <39>)
-| entry 80: (<1> [[[[(<32> (((3 2) ((2 1) <10>)) <2>))]]]])
-| entry 79: [[((([[[((<1> [[((<40> 3) ((4 <10>) (1 <2>)))]]) 0)]]] <89>) [[[2]]]) ((([[[((<7> 0) (((<22> (([[[[((3 0) (2 1))]]]] <93>) (<1> [[(<59> (1 0))]]))) ([(((((<45> [(((0 [[1]]) [[0]]) [[0]])]) <62>) 0) <83>) 0)] ((<34> 2) (<42> 0)))) 1))]]] (<42> (<51> ([(<24> (((0 (<17> [[1]])) [(0 [[(<28> [[0]])]])]) [(0 [[((<0> (<43> <36>)) 0)]])]))] 1)))) [[0]]) (<51> 0)))]]
-| entry 78: [((<84> [[[0]]]) [0])]
-| entry 77: ([((3 3) 0)] 0)
-| entry 76: ([(0 0)] [[((<43> [(<18> <77>)]) [(<11> <77>)])]])
-| entry 75: (<76> 1)
-| entry 74: ((3 0) [[[1]]])
-| entry 73: [[(([(((0 [(<29> (<76> 0))]) [[(((0 [[0]]) [(2 0)]) [[[0]]])]]) [[(((0 (1 0)) [[[0]]]) [(2 0)])]])] 1) <31>)]]
-| entry 72: ((3 0) [[1]])
-| entry 71: [([(0 [[0]])] ((((0 (<64> <53>)) [(0 [[(<46> <35>)]])]) [(0 [[(<81> (<12> 0))]])]) [(0 [[(<47> <39>)]])]))]
-| entry 70: ((3 0) [[[2]]])
-| entry 69: ([(<59> [[0]])] <10>)
-| entry 68: (<12> <74>)
-| entry 67: (<12> <44>)
-| entry 66: (<5> <44>)
-| entry 65: (<0> (((<1> [[[(<3> ((<13> (<8> <6>)) [[0]]))]]]) <86>) 0))
-| entry 64: (<0> <4>)
-| entry 63: (<89> 1)
-| entry 62: [(([[((0 1) [0])]] [[[0]]]) ((((0 [[1]]) [(<58> [[[2]]])]) [(<58> [[[1]]])]) [0]))]
-| entry 61: (2 (<71> 1))
-| entry 60: (<5> <70>)
+| entry 93: (<21> 1)
+| entry 92: ((3 0) [[[2]]])
+| entry 91: (<0> (((<2> [[[(<1> ((<22> (<10> <7>)) [[0]]))]]]) <87>) 0))
+| entry 90: ((<2> [[[(<53> (<28> <6>))]]]) <5>)
+| entry 89: (0 <5>)
+| entry 88: (<0> <45>)
+| entry 87: ((<8> <57>) 1)
+| entry 86: [[[[(1 3)]]]]
+| entry 85: (<21> <16>)
+| entry 84: (<0> <37>)
+| entry 83: [((<44> [[[0]]]) [0])]
+| entry 82: [(<44> [0])]
+| entry 81: ([[((([<44>] 1) ([[[(0 2)]]] 0)) 1)]] 0)
+| entry 80: (<77> 1)
+| entry 79: ((3 0) [[[1]]])
+| entry 78: [(<49> <69>)]
+| entry 77: ([(0 0)] [[((<35> [(<18> <52>)]) [(<36> <52>)])]])
+| entry 76: [([(0 [[0]])] (((0 (<23> [[[(1 2)]]])) [(0 [[(<19> (<36> 0))]])]) [(0 [[(<88> <63>)]])]))]
+| entry 75: (<17> <92>)
+| entry 74: [(((0 [[0]]) [((<0> [[1]]) 0)]) [((<0> [[0]]) 0)])]
+| entry 73: [(([[((0 1) [0])]] [[[0]]]) ((((0 [[1]]) [(<81> [[[2]]])]) [(<81> [[[1]]])]) [0]))]
+| entry 72: (<2> [[[(<1> (((<83> 1) [[0]]) (<10> ((2 (<39> 1)) <6>))))]]])
+| entry 71: (<0> <93>)
+| entry 70: [(0 [[1]])]
+| entry 69: ((3 0) [[0]])
+| entry 68: ((3 0) [[1]])
+| entry 67: (4 3)
+| entry 66: [[((([[[((<2> [[((<41> 3) ((4 <4>) (1 <6>)))]]) 0)]]] <38>) [[[2]]]) ((([[[((<42> 0) (((<3> (([[[[((3 0) (2 1))]]]] <72>) (<2> [[(<59> (1 0))]]))) ([(((((<8> [(((0 [[1]]) [[0]]) [[0]])]) <73>) 0) <50>) 0)] ((<26> 2) (<90> 0)))) 1))]]] (<90> (<74> ([(<70> (((0 (<23> [[1]])) [(0 [[(<19> [[0]])]])]) [(0 [[((<0> (<35> <45>)) 0)]])]))] 1)))) [[0]]) (<74> 0)))]]
+| entry 65: (<9> <16>)
+| entry 64: [([(0 [[0]])] ((((0 (<60> <86>)) [(0 [[(<71> <37>)]])]) [(0 [[(<27> (<21> 0))]])]) [(0 [[(<84> <62>)]])]))]
+| entry 63: (<18> 1)
+| entry 62: (<17> 1)
+| entry 61: ((<3> (<2> [[[(<1> (((<22> <10>) [0]) <7>))]]])) <6>)
+| entry 60: (<0> <5>)
| entry 59: (<0> 0)
-| entry 58: ([[((([<84>] 1) ([[[(0 2)]]] 0)) 1)]] 0)
-| entry 57: (0 <4>)
-| entry 56: [<85>]
-| entry 55: ((<80> <21>) <4>)
-| entry 54: ((3 0) [[0]])
-| entry 53: [[[[(1 3)]]]]
-| entry 52: (0 (1 3))
-| entry 51: [(((0 [[0]]) [((<0> [[1]]) 0)]) [((<0> [[0]]) 0)])]
-| entry 50: ((<22> (<1> [[[(<3> (((<13> <8>) [0]) <6>))]]])) <2>)
-| entry 49: (4 3)
-| entry 48: (<12> 1)
-| entry 47: (<0> <35>)
-| entry 46: (<0> <48>)
-| entry 45: [[[(2 (1 0))]]]
-| entry 44: ((3 0) [[[0]]])
-| entry 43: (0 [[[2]]])
-| entry 42: ((<1> [[[(<32> (<61> <2>))]]]) <4>)
-| entry 41: (([([(1 (0 0))] [(1 (0 0))])] [[(((<57> [(<12> (2 0))]) [(<5> (2 0))]) [(<9> (2 0))])]]) 1)
-| entry 40: (<16> 0)
-| entry 39: (<5> 1)
-| entry 38: (((<49> 2) 1) 0)
-| entry 37: [(<63> <54>)]
-| entry 36: (<11> 1)
-| entry 35: (<9> 1)
-| entry 34: [[((<21> 1) <83>)]]
-| entry 33: [([(0 [[0]])] ((((0 (<64> [[[[(2 3)]]]])) [(0 [[(<46> (<5> 0))]])]) [(0 [[(<81> <35>)]])]) [(0 [[(<47> <48>)]])]))]
-| entry 32: (<40> 1)
-| entry 31: ([((<43> <53>) [[[[(0 3)]]]])] 0)
-| entry 30: (<0> <36>)
-| entry 29: [(<84> [0])]
-| entry 28: (<0> <23>)
-| entry 27: [(((1 <60>) <82>) <67>)]
-| entry 26: [((1 (<11> <72>)) (<18> <54>))]
-| entry 25: [(1 [((1 1) 0)])]
-| entry 24: [(0 [[1]])]
-| entry 23: (<18> 1)
-| entry 22: [[[((2 0) 1)]]]
-| entry 21: [[(([([[((1 0) [[[0]]])]] ((((0 [[(((0 (<33> <41>)) (<71> <41>)) <41>)]]) [[[((((1 (<27> 1)) [(((1 (<9> <70>)) <67>) <60>)]) <19>) <27>)]]]) [[[((((1 (<15> 1)) <19>) [(((1 <66>) (<9> <74>)) <68>)]) <15>)]]]) [[[((((1 (<19> 1)) <27>) <15>) <19>)]]]))] 1) ([(((<57> [[[[[(2 4)]]]]]) [[[[[(1 4)]]]]]) [[[[[(0 4)]]]]])] 0))]]
-| entry 20: (<1> [[[(<3> ((<0> <13>) <6>))]]])
-| entry 19: [(([[[[[[((((5 2) 1) 0) <38>)]]]]]] 1) <44>)]
-| entry 18: [[[[(1 <90>)]]]]
-| entry 17: (<0> [[[2]]])
-| entry 16: [((0 [[[[[0]]]]]) [[1]])]
-| entry 15: [(((1 <82>) <68>) <66>)]
-| entry 14: ((<45> <88>) [[[[(((3 2) 0) 1)]]]])
-| entry 13: (1 <10>)
-| entry 12: [[[[[(2 <38>)]]]]]
-| entry 11: [[[[(0 <90>)]]]]
-| entry 10: (<24> 0)
-| entry 9: [[[[[(0 <38>)]]]]]
-| entry 8: (<0> <10>)
-| entry 7: (<1> [[[(((<16> 1) 0) ((<0> (<24> 1)) ((2 ([(0 [[0]])] 1)) 0)))]]])
-| entry 6: ((2 1) <2>)
-| entry 5: [[[[[(1 <38>)]]]]]
-| entry 4: [[[[3]]]]
-| entry 3: (<40> [[0]])
-| entry 2: ([(0 [[0]])] 0)
-| entry 1: [(<25> <25>)]
+| entry 58: ([(<59> [[0]])] <4>)
+| entry 57: [<32>]
+| entry 56: (((<2> [[[(<1> ((<22> <7>) 0))]]]) <87>) 0)
+| entry 55: (<17> <16>)
+| entry 54: [[(([(((0 [(<82> (<77> 0))]) [[(((0 [[0]]) [(2 0)]) [[[0]]])]]) [[(((0 (1 0)) [[[0]]]) [(2 0)])]])] 1) <31>)]]
+| entry 53: (<41> 1)
+| entry 52: ([((3 3) 0)] 0)
+| entry 51: [(1 [((1 1) 0)])]
+| entry 50: ([[[[[(((<67> 1) 2) 0)]]]]] 0)
+| entry 49: (<38> 1)
+| entry 48: ((<8> <76>) [[[[(((3 2) 0) 1)]]]])
+| entry 47: ((<46> <11>) <5>)
+| entry 46: (<2> [[[[(<53> (((3 2) ((2 1) <4>)) <6>))]]]])
+| entry 45: (<36> 1)
+| entry 44: ((0 [[1]]) [[[0]]])
+| entry 43: [(((1 <75>) <65>) <85>)]
+| entry 42: (<2> [[[(((<40> 1) 0) ((<0> (<70> 1)) ((2 ([(0 [[0]])] 1)) 0)))]]])
+| entry 41: (<40> 0)
+| entry 40: [((0 [[[[[0]]]]]) [[1]])]
+| entry 39: [([(0 [[0]])] ((((0 (<60> [[[[(2 3)]]]])) [(0 [[(<71> (<17> 0))]])]) [(0 [[(<27> <37>)]])]) [(0 [[(<84> <93>)]])]))]
+| entry 38: [[[[[(((4 1) 0) <29>)]]]]]
+| entry 37: (<9> 1)
+| entry 36: [[[[(0 <29>)]]]]
+| entry 35: (0 [[[2]]])
+| entry 34: [(([[[[[[((((5 2) 1) 0) <14>)]]]]]] 1) <16>)]
+| entry 33: (<21> <79>)
+| entry 32: ((0 [[0]]) [[1]])
+| entry 31: ([((<35> <86>) [[[[(0 3)]]]])] 0)
+| entry 30: [[(((<8> [(<32> [[0]])]) <73>) ((<26> 1) 0))]]
+| entry 29: (((3 2) 1) 0)
+| entry 28: (2 (<64> 1))
+| entry 27: (<0> <62>)
+| entry 26: [[((<11> 1) <50>)]]
+| entry 25: (0 (1 3))
+| entry 24: [(((1 <65>) <33>) <55>)]
+| entry 23: (<0> [[[2]]])
+| entry 22: (1 <4>)
+| entry 21: [[[[[(2 <14>)]]]]]
+| entry 20: [((1 (<36> <68>)) (<18> <69>))]
+| entry 19: (<0> <63>)
+| entry 18: [[[[(1 <29>)]]]]
+| entry 17: [[[[[(1 <14>)]]]]]
+| entry 16: ((3 0) [[[0]]])
+| entry 15: (([([(1 (0 0))] [(1 (0 0))])] [[(((<89> [(<21> (2 0))]) [(<17> (2 0))]) [(<9> (2 0))])]]) 1)
+| entry 14: (((<67> 2) 1) 0)
+| entry 13: (<2> [[[(<1> ((<0> <22>) <7>))]]])
+| entry 12: (<9> 0)
+| entry 11: [[(([([[((1 0) [[[0]]])]] ((((0 [[(((0 (<39> <15>)) (<64> <15>)) <15>)]]) [[[((((1 (<43> 1)) [(((1 (<9> <92>)) <85>) <75>)]) <34>) <43>)]]]) [[[((((1 (<24> 1)) <34>) [(((1 <55>) (<9> <79>)) <33>)]) <24>)]]]) [[[((((1 (<34> 1)) <43>) <24>) <34>)]]]))] 1) ([(((<89> [[[[[(2 4)]]]]]) [[[[[(1 4)]]]]]) [[[[[(0 4)]]]]])] 0))]]
+| entry 10: (<0> <4>)
+| entry 9: [[[[[(0 <14>)]]]]]
+| entry 8: [[[(2 (1 0))]]]
+| entry 7: ((2 1) <6>)
+| entry 6: ([(0 [[0]])] 0)
+| entry 5: [[[[3]]]]
+| entry 4: (<70> 0)
+| entry 3: [[[((2 0) 1)]]]
+| entry 2: [(<51> <51>)]
+| entry 1: (<41> [[0]])
| entry 0: [[[((0 2) 1)]]]
-| final: [([(<8> (<55> ((<93> [[[[<52>]]]]) 0)))] ((<1> [[(<3> ((<7> ((<7> (1 (<50> ((<22> (<22> [[(<56> ((<91> 1) 0))]])) <10>)))) <69>)) (1 (<50> ((<22> (<22> <91>)) <10>)))))]]) ((<20> <55>) (((<1> [[[(<3> ([(<8> ((3 2) <2>))] (([[(<65> ([(<3> <2>)] <87>))]] 1) 0)))]]]) <78>) ((<20> ((<45> ((<80> [[((<21> (([[((((1 <4>) [((<34> <92>) 1)]) [((<21> <92>) 1)]) [<92>])]] [[[[(1 <52>)]]]]) 1)) 0)]]) <4>)) (<20> [(((<1> [[[(((<29> 0) 1) (<61> ([([(0 [[0]])] (((0 (<17> [[[2]]])) [(0 [[(<28> <36>)]])]) [(0 [[(<30> (<18> 0))]])]))] 0)))]]]) <4>) (([[((((<73> 0) 1) [[[2]]]) (<14> (([[(([([[((1 0) [[0]])]] (((0 [[((0 (<88> <75>)) <75>)]]) [[[(((1 (<26> 1)) [(<63> <72>)]) <26>)]]]) [[[(((1 (<37> 1)) <26>) <37>)]]]))] 1) <31>)]] ((<79> 1) 0)) (<14> ((<79> 0) 1)))))]] 0) [[[(0 (0 (0 (0 (1 (1 (0 (0 2))))))))]]]))]))) ((<1> [[([(((<16> <2>) <69>) (<8> (2 ([(0 [[0]])] <2>))))] (([[(<65> <87>)]] (<73> [[[(0 (1 (0 (1 (0 (0 (0 (0 2))))))))]]])) 0))]]) 0))))))]
+| final: [([(<10> (<47> ((<72> [[[[<25>]]]]) 0)))] ((<2> [[(<1> ((<42> ((<42> (1 (<61> ((<3> (<3> [[(<57> ((<30> 1) 0))]])) <4>)))) <58>)) (1 (<61> ((<3> (<3> <30>)) <4>)))))]]) ((<13> <47>) (((<2> [[[(<1> ([(<10> ((3 2) <6>))] (([[(<91> ([(<1> <6>)] <56>))]] 1) 0)))]]]) <83>) ((<13> ((<8> ((<46> [[((<11> (([[((((1 <5>) [((<26> <12>) 1)]) [((<11> <12>) 1)]) [<12>])]] [[[[(1 <25>)]]]]) 1)) 0)]]) <5>)) (<13> [(((<2> [[[(((<82> 0) 1) (<28> ([([(0 [[0]])] (((0 (<23> [[[2]]])) [(0 [[(<19> <45>)]])]) [(0 [[(<88> (<18> 0))]])]))] 0)))]]]) <5>) (([[((((<54> 0) 1) [[[2]]]) (<48> (([[(([([[((1 0) [[0]])]] (((0 [[((0 (<76> <80>)) <80>)]]) [[[(((1 (<20> 1)) [(<49> <68>)]) <20>)]]]) [[[(((1 (<78> 1)) <20>) <78>)]]]))] 1) <31>)]] ((<66> 1) 0)) (<48> ((<66> 0) 1)))))]] 0) [[[(0 (0 (0 (0 (1 (1 (0 (0 2))))))))]]]))]))) ((<2> [[([(((<40> <6>) <58>) (<10> (2 ([(0 [[0]])] <6>))))] (([[(<91> <56>)]] (<54> [[[(0 (1 (0 (1 (0 (0 (0 (0 2))))))))]]])) 0))]]) 0))))))]
=== END BLOC ===
diff --git a/test/fac.blc.dump b/test/fac.blc.dump
index e46df2a..7a1e387 100644
--- a/test/fac.blc.dump
+++ b/test/fac.blc.dump
@@ -1,40 +1,40 @@
=== START BLOC ===
| entries: 35
-| entry 33: (<1> 1)
-| entry 32: [(((1 <18>) <24>) <22>)]
-| entry 31: (0 <5>)
-| entry 30: (<2> <33>)
-| entry 29: (<3> 1)
-| entry 28: (<2> <5>)
-| entry 27: ([([(1 (0 0))] [(1 (0 0))])] [[(((<31> [(<3> (2 0))]) [(<1> (2 0))]) [(<0> (2 0))])]])
-| entry 26: ((3 0) [[[2]]])
-| entry 25: [[(([([[((1 0) [[[0]]])]] ((((0 [[(((0 ([([(0 [[0]])] ((((0 (<28> [[[[(2 3)]]]])) [(0 [[(<19> (<1> 0))]])]) [(0 [[(<30> <12>)]])]) [(0 [[(<17> <29>)]])]))] <6>)) (<11> <6>)) <6>)]]) [[[((((1 (<32> 1)) [(((1 (<0> <26>)) <22>) <18>)]) <7>) <32>)]]]) [[[((((1 (<9> 1)) <7>) [(((1 <21>) (<0> <13>)) <23>)]) <9>)]]]) [[[((((1 (<7> 1)) <32>) <9>) <7>)]]]))] 1) <20>)]]
-| entry 24: (<0> <15>)
-| entry 23: (<3> <13>)
-| entry 22: (<3> <15>)
-| entry 21: (<1> <15>)
-| entry 20: ([(((<31> [[[[[(2 4)]]]]]) [[[[[(1 4)]]]]]) [[[[[(0 4)]]]]])] 0)
-| entry 19: (<2> <29>)
-| entry 18: (<1> <26>)
-| entry 17: (<2> <12>)
-| entry 16: (<0> 0)
-| entry 15: ((3 0) [[[0]]])
-| entry 14: (4 3)
-| entry 13: ((3 0) [[[1]]])
-| entry 12: (<0> 1)
-| entry 11: [([(0 [[0]])] ((((0 (<28> <8>)) [(0 [[(<19> <12>)]])]) [(0 [[(<30> (<3> 0))]])]) [(0 [[(<17> <33>)]])]))]
-| entry 10: [(1 [((1 1) 0)])]
-| entry 9: [(((1 <24>) <23>) <21>)]
-| entry 8: [[[[(1 3)]]]]
-| entry 7: [(([[[[[[((((5 2) 1) 0) <4>)]]]]]] 1) <15>)]
-| entry 6: (<27> 1)
-| entry 5: [[[[3]]]]
-| entry 4: (((<14> 2) 1) 0)
-| entry 3: [[[[[(2 <4>)]]]]]
-| entry 2: [[[((0 2) 1)]]]
-| entry 1: [[[[[(1 <4>)]]]]]
-| entry 0: [[[[[(0 <4>)]]]]]
-| final: ([((((([(<10> <10>)] [[[[[(((([[(([((((0 [([((((0 [[1]]) [[[0]]]) [[[0]]]) [0])] (<27> 0))]) [[((((0 [[0]]) [(2 0)]) [[[0]]]) [[[0]]])]]) [[((((0 [[0]]) [[[0]]]) [(2 0)]) [[[0]]])]]) [[((((0 (1 0)) [[[0]]]) [[[0]]]) [(2 0)])]])] 1) <20>)]] 2) (<11> 1)) 3) ((((4 (([[((((1 <5>) [(([[((<25> 1) ([[[[[(((<14> 1) 2) 0)]]]]] 0))]] <16>) 1)]) [((<25> <16>) 1)]) [<16>])]] 3) (0 2))) (<11> 2)) 1) 0))]]]]]) <8>) <8>) 0) [0])] [[[[(0 (1 (0 (1 3))))]]]])
+| entry 33: (<2> 1)
+| entry 32: (0 <8>)
+| entry 31: (<2> <13>)
+| entry 30: (<1> <4>)
+| entry 29: ((3 0) [[[1]]])
+| entry 28: [(([[[[[[((((5 2) 1) 0) <6>)]]]]]] 1) <13>)]
+| entry 27: (<1> <21>)
+| entry 26: (<1> <33>)
+| entry 25: (<0> <13>)
+| entry 24: (<1> <8>)
+| entry 23: (<2> <29>)
+| entry 22: ([([(1 (0 0))] [(1 (0 0))])] [[(((<32> [(<2> (2 0))]) [(<5> (2 0))]) [(<0> (2 0))])]])
+| entry 21: (<5> 1)
+| entry 20: (<5> <13>)
+| entry 19: ((3 0) [[[2]]])
+| entry 18: [[(([([[((1 0) [[[0]]])]] ((((0 [[(((0 ([([(0 [[0]])] ((((0 (<24> [[[[(2 3)]]]])) [(0 [[(<26> (<5> 0))]])]) [(0 [[(<27> <4>)]])]) [(0 [[(<30> <33>)]])]))] <14>)) (<11> <14>)) <14>)]]) [[[((((1 (<15> 1)) [(((1 (<0> <19>)) <31>) <17>)]) <28>) <15>)]]]) [[[((((1 (<9> 1)) <28>) [(((1 <20>) (<0> <29>)) <23>)]) <9>)]]]) [[[((((1 (<28> 1)) <15>) <9>) <28>)]]]))] 1) <16>)]]
+| entry 17: (<5> <19>)
+| entry 16: ([(((<32> [[[[[(2 4)]]]]]) [[[[[(1 4)]]]]]) [[[[[(0 4)]]]]])] 0)
+| entry 15: [(((1 <17>) <25>) <31>)]
+| entry 14: (<22> 1)
+| entry 13: ((3 0) [[[0]]])
+| entry 12: [(1 [((1 1) 0)])]
+| entry 11: [([(0 [[0]])] ((((0 (<24> <7>)) [(0 [[(<26> <4>)]])]) [(0 [[(<27> (<2> 0))]])]) [(0 [[(<30> <21>)]])]))]
+| entry 10: (4 3)
+| entry 9: [(((1 <25>) <23>) <20>)]
+| entry 8: [[[[3]]]]
+| entry 7: [[[[(1 3)]]]]
+| entry 6: (((<10> 2) 1) 0)
+| entry 5: [[[[[(1 <6>)]]]]]
+| entry 4: (<0> 1)
+| entry 3: (<0> 0)
+| entry 2: [[[[[(2 <6>)]]]]]
+| entry 1: [[[((0 2) 1)]]]
+| entry 0: [[[[[(0 <6>)]]]]]
+| final: ([((((([(<12> <12>)] [[[[[(((([[(([((((0 [([((((0 [[1]]) [[[0]]]) [[[0]]]) [0])] (<22> 0))]) [[((((0 [[0]]) [(2 0)]) [[[0]]]) [[[0]]])]]) [[((((0 [[0]]) [[[0]]]) [(2 0)]) [[[0]]])]]) [[((((0 (1 0)) [[[0]]]) [[[0]]]) [(2 0)])]])] 1) <16>)]] 2) (<11> 1)) 3) ((((4 (([[((((1 <8>) [(([[((<18> 1) ([[[[[(((<10> 1) 2) 0)]]]]] 0))]] <3>) 1)]) [((<18> <3>) 1)]) [<3>])]] 3) (0 2))) (<11> 2)) 1) 0))]]]]]) <7>) <7>) 0) [0])] [[[[(0 (1 (0 (1 3))))]]]])
=== END BLOC ===
diff --git a/test/run b/test/run
index e587660..b92629b 100755
--- a/test/run
+++ b/test/run
@@ -7,7 +7,7 @@ SUCC="\033[0;32m[SUCC]\033[0m "
for file in *.blc; do
../build/bloc --from-blc -i "$file" -o ../build/"$file".bloc
- ../build/bloc --from-bloc -d -i ../build/"$file".bloc -o ../build/"$file" >../build/"$file".dump
+ ../build/bloc --from-bloc -d -i ../build/"$file".bloc -o ../build/"$file" &>../build/"$file".dump
cmp "$file" ../build/"$file" && printf "$SUCC" || printf "$FAIL"
echo "blc cmp on $file"
cmp "$file".dump ../build/"$file".dump && printf "$SUCC" || printf "$FAIL"