]> git.lizzy.rs Git - plan9front.git/blobdiff - sys/src/libjson/json.c
etheriwl: don't break controller on command flush timeout
[plan9front.git] / sys / src / libjson / json.c
index 8186976a350bac6098313cd45cf737a185bea056..74fd5eeb0cd9e9f264b22d58064fbe84d4c8ce9f 100644 (file)
@@ -22,8 +22,6 @@ struct Lex
        double n;
        char *buf;
        Rune peeked;
-       jmp_buf jmp;
-       int canjmp;
 };
 
 static Rune
@@ -36,6 +34,8 @@ getch(Lex *l)
                l->peeked = 0;
                return r;
        }
+       if(l->s[0] == '\0')
+               return 0;
        l->s += chartorune(&r, l->s);
        return r;
 }
@@ -48,6 +48,20 @@ peekch(Lex *l)
        return l->peeked;
 }
 
+static Rune
+peeknonspace(Lex *l)
+{
+       Rune r;
+
+       for(;;){
+               r = peekch(l);
+               if(r != 0x20 && r != 0x09 && r != 0x0A && r != 0x0D)
+                       break;
+               getch(l);
+       }
+       return r;
+}
+
 static int
 fixsurrogate(Rune *rp, Rune r2)
 {
@@ -79,16 +93,8 @@ lex(Lex *l)
        int i;
        char c;
 
-       for(;;){
-               r = peekch(l);
-               if(r != 0x20 && r != 0x09 && r != 0x0A && r != 0x0D)
-                       break;
-               getch(l);
-       }
+       peeknonspace(l);
        r = getch(l);
-       if(r == ']' && l->canjmp)
-               longjmp(l->jmp, 1);
-       l->canjmp = 0;
        if(r == 0 || r == '{' || r == '[' || r == ']' || r == '}' || r == ':' || r == ','){
                l->t = r;
                return 0;
@@ -239,7 +245,6 @@ error:
        case '[':
                obj = l->t == '{';
                ln = &j->first;
-               e = nil;
                if(obj){
                        j->t = JSONObject;
                        if(lex(l) < 0)
@@ -249,9 +254,8 @@ error:
                        goto firstobj;
                }else{
                        j->t = JSONArray;
-                       l->canjmp = 1;
-                       if(setjmp(l->jmp) > 0){
-                               free(e);
+                       if(peeknonspace(l) == ']'){
+                               getch(l);
                                return j;
                        }
                }
@@ -318,8 +322,8 @@ jsonparse(char *s)
 
        memset(&l, 0, sizeof(l));
        l.s = s;
-       l.slen = strlen(s)+1;
-       if((l.buf = mallocz(l.slen, 1)) == nil)
+       l.slen = strlen(s);
+       if((l.buf = mallocz(l.slen+UTFmax+1, 1)) == nil)
                return nil;
 
        j = jsonobj(&l);
@@ -332,6 +336,8 @@ jsonfree(JSON *j)
 {
        JSONEl *e, *f;
 
+       if(j == nil)
+               return;
        switch(j->t){
        case JSONString:
                if(j->s)