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 											}