shithub: rjson

Download patch

ref: c3ed63d730acc6814fd408ebdba9f5fe00cbb62b
parent: 62df9a6d3022bf58144fdd44ff950b35e6fcf8f3
author: sirjofri <sirjofri@sirjofri.de>
date: Sun Mar 15 14:34:14 EDT 2026

adds experimental free function

--- a/rjson.c
+++ b/rjson.c
@@ -257,3 +257,56 @@
 	
 	return json;
 }
+
+void
+rfreestruct(void *src, Rjson *rjson)
+{
+	Rjson *rj;
+	char **s;
+	int *i;
+	int c;
+	void *entry;
+	char **arr;
+	
+	for (rj = rjson; rj->name; rj++) {
+		switch (rj->type) {
+		case JSONNull:
+			break;
+		case JSONBool:
+		case JSONNumber:
+			break;
+		case JSONString:
+			s = (char**)((char*)src + rj->addr);
+			if (*s)
+				free(*s);
+			*s = nil;
+			break;
+		case JSONArray:
+			i = (int*)((char*)src + rj->countaddr);
+			arr = (char**)((char*)src + rj->addr);
+			if (!*arr)
+				break;
+			if (rj->sub) {
+				for (c = 0; c < *i; c++) {
+					entry = *arr + c*rj->arrsize;
+					rfreestruct(entry, rj->sub);
+				}
+			} else {
+				if (rj->arrsize == JSONString) {
+					for (c = 0; c < *i; c++) {
+						entry = *arr + c*typesize(rj->arrsize);
+						if (entry)
+							free(entry);
+					}
+				}
+			}
+			free(*arr);
+			*arr = nil;
+			*i = 0;
+			break;
+		case JSONObject:
+			rfreestruct((char*)src + rj->addr, rj->sub);
+			break;
+		}
+	}
+}
--- a/rjson.h
+++ b/rjson.h
@@ -19,3 +19,4 @@
 
 int rjsontostruct(JSON *json, Rjson*, void*);
 JSON *rstructtojson(void *src, Rjson*);
+void rfreestruct(void*, Rjson*);
--- a/test/t.c
+++ b/test/t.c
@@ -110,6 +110,15 @@
 	
 	if (strcmp(s, testjson) != 0)
 		exits("test failed");
+	jsonfree(j);
+	free(s);
+	
+	rfreestruct(&t, Test_rjson);
+	if (t.one) exits("one is not freed");
+	if (t.two) exits("two is not freed");
+	if (t.obj.xyz) exits("obj.xyz is not freed");
+	if (t.obarr) exits("obarr is not freed");
+	if (t.nums) exits("nums is not freed");
 	
 	exits(nil);
 }
--