commit ff5b08e

shrub  ·  2026-11-02 17:49:05 +0000 UTC
parent 44b8c21
use template for freeing helpers
1 files changed,  +34, -39
+34, -39
 1@@ -6,62 +6,57 @@ staload "parse.sats"
 2 
 3 exception ParseErr of ()
 4 
 5+fun{a:vt0p} list_destroy(items: List0_vt(a), destroy: (a) -<fun1> void): void =
 6+    case+ items of
 7+    | ~nil_vt() => ()
 8+    | ~cons_vt(item, rest) => (
 9+        destroy(item);
10+        list_destroy<a>(rest, destroy))
11+
12+fun part_destroy(part: stringpart): void =
13+    case+ part of
14+    | ~Literal(text) => strptr_free(text)
15+    | ~Variable(text) => strptr_free(text)
16+
17 fun parts_free(p: List0_vt(stringpart)): void =
18-    case+ p of
19-    | ~nil_vt ()           => ()
20-    | ~cons_vt(part, rest) => (
21-        (case+ part of
22-        | ~Literal (text) => strptr_free(text)
23-        | ~Variable(text) => strptr_free(text) );
24-        parts_free(rest) )
25+    list_destroy<stringpart>(p, part_destroy)
26 
27-implement bindings_free(b) =
28-    case+ b of 
29-    (* tilde means destroy the list wrapper*)
30-    | ~nil_vt()             => ()
31-    | ~cons_vt(entry, rest) =>
32+fun binding_destroy(b: binding): void = 
33     let
34-        (* construct new local variables(k,v) from 
35-         * the entry record *)
36         val @{key = k, value = v} = entry
37     in
38-        strptr_free  (k);
39-        parts_free   (v);
40-        bindings_free(rest)
41+        strptr_free(k);
42+        parts_free (v)
43     end
44 
45-fun rule_free(r: List0_vt(rule)): void =
46-    case+ r of
47-    | ~nil_vt() => ()
48-    | ~cons_vt(rule, rest) =>
49-    let 
50-        val @{name = n, bindings = b} = rule
51+implement bindings_free(b) =
52+    list_destroy<binding>(b, binding_destroy)
53+
54+fun rule_destroy(r: rule): void =
55+    let
56+        val @{name = n, bindings = b} = r
57     in
58-        strptr_free  (n);
59-        bindings_free(b);
60-        rule_free    (rest)
61+        strptr_free(n);
62+        bindings_free(b)
63     end
64 
65+fun rule_free(r: List0_vt(rule)): void =
66+    list_destroy<rule>(r, rule_destroy)
67+
68 fun paths_free(p: List0_vt(Strptr1)): void = 
69-    case+ p of 
70-    | ~nil_vt() => ()
71-    | ~cons_vt(path, rest) => (
72-    strptr_free(path);
73-    paths_free(rest)) 
74+    list_destroy<Strptr1>(p, strptr_free)
75 
76-fun edge_free(e: List0_vt(edge)): void = 
77-    case+ e of 
78-    | ~nil_vt() => ()
79-    | ~cons_vt(edge, rest) =>
80+fun edge_destroy (e: edge): void =
81     let 
82-        val @{output = o, rule = r, input = i, bindings = b} = edge
83+        val @{output = o, rule = r, input = i, bindings = b} = e
84     in
85         paths_free(o);
86         strptr_free(r);
87         paths_free(i);
88-        bindings_free(b);
89-        edge_free(rest)
90-end
91+        bindings_free(b)
92+
93+fun edge_free(e: List0_vt(edge)): void = 
94+     list_destroy<edge>(e, edge_destroy)
95 
96 implement manifest_free(m) =
97 let