double n;
char *buf;
Rune peeked;
- jmp_buf jmp;
- int canjmp;
};
static Rune
l->peeked = 0;
return r;
}
+ if(l->s[0] == '\0')
+ return 0;
l->s += chartorune(&r, l->s);
return r;
}
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)
{
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;
case '[':
obj = l->t == '{';
ln = &j->first;
- e = nil;
if(obj){
j->t = JSONObject;
if(lex(l) < 0)
goto firstobj;
}else{
j->t = JSONArray;
- l->canjmp = 1;
- if(setjmp(l->jmp) > 0){
- free(e);
+ if(peeknonspace(l) == ']'){
+ getch(l);
return j;
}
}
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);
{
JSONEl *e, *f;
+ if(j == nil)
+ return;
switch(j->t){
case JSONString:
if(j->s)