home
readme
diff
tree
note
docs
0commit f6b52b3556db5c1a69e7fe0cd6d118e03d93bed3
1Author: lakefox <mason@lakefox.net>
2Date: Mon Feb 23 12:03:30 2026 -0700
3
4 get_unit stack tracking changes
5
6diff --git a/accounts b/accounts
7new file mode 100644
8index 0000000..a639064
9--- /dev/null
10+++ b/accounts
11@@ -0,0 +1,2 @@
12+# Replace with your actual SIP details
13+<sip:lakefox@localhost>;medianat=ice
14diff --git a/config b/config
15new file mode 100644
16index 0000000..66b035d
17--- /dev/null
18+++ b/config
19@@ -0,0 +1,11 @@
20+module_path /usr/lib/baresip/modules
21+module stun.so
22+module ice.so
23+# Also ensure your audio modules are on (alsa, pulse, or coreaudio)
24+module pulse.so
25+
26+# Google's public STUN server is fast and reliable
27+stun_server stun.l.google.com:19302
28+
29+# Optional: Set the port range for RTP (audio data)
30+rtp_ports 10000-20000
31diff --git a/include/grim.h b/include/grim.h
32index b746876..76dadf6 100755
33--- a/include/grim.h
34+++ b/include/grim.h
35@@ -188,6 +188,6 @@ char* INNER_HTML(Node* node, char** buffer, size_t* size, int depth);
36
37 void ADD_CLASS(Node* n, char* value);
38
39-void get_unit(struct Unit** units, int* cap, int* units_len, char** vars, int* vars_len, int* vars_cap, char* value);
40+void get_unit(struct Unit** units, int* cap, int* units_len, char** vars, int* vars_len, int* vars_cap, int* stack_len, char* value);
41
42 #endif // NODE_H
43diff --git a/playground/css_unit.c b/playground/css_unit.c
44index dae4828..5262d00 100644
45--- a/playground/css_unit.c
46+++ b/playground/css_unit.c
47@@ -24,9 +24,11 @@ void benchmark_get_unit(char* value) {
48 char *vars = malloc(MAX_STR_LEN * cap);
49 int vars_len = 0;
50
51+ int stack_len = 0;
52+
53 for (int i = 0; i < iterations; i++) {
54 units_len = 0;
55- get_unit(&units, &cap, &units_len, &vars, &vars_len, &vars_cap, value);
56+ get_unit(&units, &cap, &units_len, &vars, &vars_len, &vars_cap, &stack_len, value);
57 }
58
59 free(units);
60@@ -51,15 +53,17 @@ void test_get_unit(char* ustr, struct Unit* known_units, int known_units_len, in
61 char **vars = NULL;
62 int vars_len = 0;
63
64- get_unit(&units, &cap, &units_len, &vars, &vars_len, &vars_cap, ustr);
65+ int stack_len = 0;
66+
67+ get_unit(&units, &cap, &units_len, &vars, &vars_len, &vars_cap, &stack_len, ustr);
68
69
70 assert(units_len == known_units_len);
71
72 bool error = false;
73
74- if (vars_len != stack_size) {
75- fprintf(stderr, "STACK assertion failed on test case \"%s\": %d != %d\n", ustr, vars_len, stack_size);
76+ if (stack_len != stack_size) {
77+ fprintf(stderr, "STACK assertion failed on test case \"%s\": %d != %d\n", ustr, stack_len, stack_size);
78 error = true;
79 }
80
81@@ -75,7 +79,7 @@ void test_get_unit(char* ustr, struct Unit* known_units, int known_units_len, in
82 }
83
84 if (!error) {
85- printf("\"%s\" parsed correctly with a stack of %d\n", ustr, vars_len);
86+ printf("\"%s\" parsed correctly with a stack of %d\n", ustr, stack_len);
87 }
88
89 free(units);
90@@ -91,11 +95,13 @@ int main() {
91 char **vars = NULL;
92 int vars_len = 0;
93
94- char* ustr = "((let(x 10px) let(b 30px) set(x b * 2%) print(x)) (let(y 10px) set(y y * 2) print(y)))";
95+ int stack_len = 0;
96+
97+ char* ustr = "((let(x 10px) set(x x * 2%) print(x)) (let(y 10px) set(y y * 2) print(y)))";
98
99- get_unit(&units, &cap, &units_len, &vars, &vars_len, &vars_cap, ustr);
100+ get_unit(&units, &cap, &units_len, &vars, &vars_len, &vars_cap, &stack_len, ustr);
101
102- printf("Stack Size: %d\n", vars_len);
103+ printf("Stack Size: %d\n", stack_len);
104
105 free(units);
106 free(vars);
107@@ -103,18 +109,20 @@ int main() {
108 if (true) {
109 benchmark_get_unit(ustr);
110
111- test_get_unit("1 + 1", (struct Unit[]){{NUMBER, 1.0f}, {ADD, 0.0f}, {NUMBER, 1.0f}}, 3, 0);
112- test_get_unit("23px * 5678.7%", (struct Unit[]){{PX, 23.0f}, {MULT, 0.0f}, {PERCENT, 5678.7f}}, 3, 0);
113- test_get_unit("calc(23px * size)", (struct Unit[]){{CALC, 3}, {PX, 23.0f}, {MULT, 0.0f}, {VAR, -1.0f}}, 4, 0);
114- test_get_unit("((let(x 10px) set(x x * 2%) print(x)) (let(y 10px) set(y y * 2) print(y)))", (struct Unit[]){{GROUP, 22.0f},
115- {GROUP, 10.0f},
116- {LET, 2.0f}, {VAR, 0.0f}, {PX, 10.0f},
117- {SET, 4.0f}, {VAR, 0.0f}, {VAR, 0.0f}, {MULT, 0.0f}, {PERCENT, 2.0f},
118- {PRINT, 1.0f}, {VAR, 0.0f},
119- {GROUP, 10.0f},
120- {LET, 2.0f}, { VAR, 0.0f}, {PX, 10.0f},
121- {SET, 4.0f}, {VAR, 0.0f}, {VAR, 0.0f}, {MULT, 0.0f}, {NUMBER, 2.0f},
122- {PRINT, 1.0f}, {VAR, 0.0f}}
123+ test_get_unit("1 + 1", (struct Unit[]){{NUMBER, 1}, {ADD, 0}, {NUMBER, 1}}, 3, 0);
124+ test_get_unit("23px * 5678.7%", (struct Unit[]){{PX, 23}, {MULT, 0}, {PERCENT, 5678.7f}}, 3, 0);
125+ test_get_unit("calc(23px * size)", (struct Unit[]){{CALC, 3}, {PX, 23}, {MULT, 0}, {VAR, -1}}, 4, 0);
126+ test_get_unit("(let(x 10px) set(x 30px) (let(x 50px) print(x)) print(x))", (struct Unit[]){{GROUP, 14}, {LET, 2}, {VAR, 0}, {PX, 10}, {SET, 2}, {VAR, 0}, {PX, 30}, {GROUP, 5}, {LET, 2}, {VAR, 1}, {PX, 50}, {PRINT, 1}, {VAR, 1}, {PRINT, 1}, {VAR, 0}}, 15, 2);
127+ test_get_unit("((let(x 10px) set(x x * 2%) print(x)) (let(y 10px) set(y y * 2) print(y)))", (struct Unit[]){{GROUP, 22},
128+ {GROUP, 10},
129+ {LET, 2}, {VAR, 0}, {PX, 10},
130+ {SET, 4}, {VAR, 0}, {VAR, 0}, {MULT, 0}, {PERCENT, 2},
131+ {PRINT, 1}, {VAR, 0},
132+ {GROUP, 10},
133+ {LET, 2}, { VAR, 0}, {PX, 10},
134+ {SET, 4}, {VAR, 0}, {VAR, 0}, {MULT, 0}, {NUMBER, 2},
135+ {PRINT, 1}, {VAR, 0}}
136 , 23, 1);
137+ test_get_unit("(let(x :name \"john doe\" :age 27))", (struct Unit[]){{GROUP, 14.0f}, {LET, 13}, {VAR, 0}, {TAG, 1035}, {STRING, 8}, {CHAR, 106}, {CHAR, 111}, {CHAR, 104}, {CHAR, 110}, {CHAR, 32}, {CHAR, 100}, {CHAR, 111}, {CHAR, 101}, {TAG, 606}, {NUMBER, 27}}, 15, 1);
138 }
139 }
140diff --git a/src/grim.c b/src/grim.c
141index 979e6ce..7529c5d 100755
142--- a/src/grim.c
143+++ b/src/grim.c
144@@ -448,14 +448,16 @@ Range getNextUnit(const std::vector<Unit>& units, size_t& offset, size_t end) {
145 // HEAP: [width, height, em, dpi]
146 // HEAP LAYOUT: VAR
147
148-float unit_value(struct Unit_Vector** heap, struct Unit_Vector** units, int start, int end) {
149- struct Unit result = {NUMBER, 0.0f};
150+float unit_value(struct Units[]** stack, struct Unit_Vector** units, int start, int end) {
151+ UnitType result_type = NUMBER;
152+ float result_value = 0;
153+
154 UnitType op = ADD;
155
156- struct Unit iv;
157+ UnitType iv_type = NUMBER;
158+ float iv_value = 0
159
160- // Will normally be 0 unless data is added to the heap before hand
161- int heap_ptr = heap.length;
162+Init the heap, the stack will be passed for preset values
163
164 for (int i = start; i < end; i++) {
165 struct Unit unit = units.units[i];
166diff --git a/src/parser.c b/src/parser.c
167index 1f17515..2608ea0 100755
168--- a/src/parser.c
169+++ b/src/parser.c
170@@ -106,7 +106,7 @@ int write_var(char** vars_ptr, int* len, int* cap, char var[MAX_STR_LEN]) {
171 return *len-1;
172 }
173
174-void get_unit(struct Unit** units, int* cap, int* units_len, char** vars, int* vars_len, int* vars_cap, char* value) {
175+void get_unit(struct Unit** units, int* cap, int* units_len, char** vars, int* vars_len, int* vars_cap, int* stack_len, char* value) {
176 char buffer[MAX_STR_LEN];
177 int buffer_len = 0;
178
179@@ -179,8 +179,6 @@ void get_unit(struct Unit** units, int* cap, int* units_len, char** vars, int* v
180 if (!inQuotes) {
181 if (v == '(') parenDepth++;
182 else if (v == ')') parenDepth--;
183-
184- if (v == ':' || v == ';') continue;
185 }
186
187 if (parenDepth > 0) {
188@@ -234,11 +232,11 @@ void get_unit(struct Unit** units, int* cap, int* units_len, char** vars, int* v
189 int before_count = *units_len;
190 int before_vars_len = *vars_len;
191
192- get_unit(units, cap, units_len, vars, vars_len, vars_cap, args);
193+ get_unit(units, cap, units_len, vars, vars_len, vars_cap, stack_len, args);
194 free(args);
195
196 if (placeholder.type != LET) {
197- vars_len = &before_vars_len;
198+ *vars_len = before_vars_len;
199 }
200
201 int child_count = *units_len - before_count;
202@@ -355,20 +353,23 @@ void get_unit(struct Unit** units, int* cap, int* units_len, char** vars, int* v
203 } else {
204 unit.type = VAR;
205
206- bool var_found = false;
207+ if (((*units_len)-1 >= 1) && (*units)[(*units_len)-1].type == LET) {
208+ unit.value = write_var(vars, vars_len, vars_cap, buffer);
209
210- for (int j = *vars_len-1; j >= 0; j--) {
211- if (strcmp(&(*vars)[j * MAX_STR_LEN], buffer) == 0) {
212- var_found = true;
213- unit.value = j;
214- break;
215+ if (unit.value + 1 > *stack_len) {
216+ *stack_len = unit.value + 1;
217+ }
218+ } else {
219+ bool var_found = false;
220+ for (int j = *vars_len-1; j >= 0; j--) {
221+ if (strcmp(&(*vars)[j * MAX_STR_LEN], buffer) == 0) {
222+ var_found = true;
223+ unit.value = j;
224+ break;
225+ }
226 }
227- }
228
229- if (!var_found) {
230- if (((*units_len)-1 >= 1) && (*units)[(*units_len)-1].type == LET) {
231- unit.value = write_var(vars, vars_len, vars_cap, buffer);
232- } else {
233+ if (!var_found) {
234 unit.value = -1;
235 }
236 }