commit cedc8995374227141a55c363a442f93a8486f8c8
parent ef4c04671995054ba459d9c894eb94d51fac1cb2
Author: ssnf <ssnf@ssnf.xyz>
Date: Wed, 27 Aug 2025 13:36:21 +0000
libjson
Diffstat:
2 files changed, 16 insertions(+), 3 deletions(-)
diff --git a/include/json.h b/include/json.h
@@ -22,11 +22,13 @@ typedef struct {
typedef struct {
ulong st[8]; /*obj stack*/
- String s; /*data buffer*/
JsonObj* o; /*obj vector*/
JsonObj* cur; /*cur obj*/
ulong n; /*stack number*/
- ulong pos; /*buffer pos*/
+
+ /* don't use these */
+ String s; /*data buffer*/
+ ulong pos; /*buffer pos*/
} Json;
void json_close(Json *j);
diff --git a/src/libjson/json.c b/src/libjson/json.c
@@ -63,6 +63,7 @@ json_init(Json *j, char *file)
JsonType
json_next(Json *j, JsonType t)
{
+ JsonObj *o;
ulong i;
char c, *p, *q;
@@ -88,9 +89,19 @@ loop:
j->cur->t = JObj;
break;
case ']':
+ c = '[';
+ if (0)
case '}':
+ c = '{';
if (!j->n)
return err(j, "bad stack");
+ o = j->o + j->st[j->n - 1];
+ if (o->v.c != c)
+ return err(j, "mismatch");
+ if (j->cur->t != JNone) {
+ --j->pos;
+ break;
+ }
--j->n;
case ',':
if (j->cur->k.s && j->cur->t == JNone)
@@ -122,7 +133,7 @@ loop:
goto loop;
case ':':
if (j->cur->k.s)
- return err(j, "double key");
+ return err(j, "double colon");
j->cur->k = j->cur->v.s;
memset(&j->cur->v, 0, sizeof(j->cur->v));
j->cur->t = JNone;