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