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);
}
--
⑨