int main(int argc, char *argv[]) { FILE *fp; char *buf = NULL, *p; char *file = NULL; size_t size = 0; int i; int r = 0; ARGBEGIN { case 'p': file = EARGF(usage()); break; default: usage(); } ARGEND; if (!file && argc < 1) usage(); if (!file) { for (i = 0; i < argc; i++) if (parsepair(argv[i]) < 0) r = 1; } else { fp = fopen(file, "r"); if (!fp) eprintf("fopen %s:", file); while (agetline(&buf, &size, fp) != -1) { p = buf; for (p = buf; *p == ' ' || *p == '\t'; p++) ; if (*p == '#' || *p == '\n') continue; for (p = buf; *p; p++) { if (*p == '\n') { *p = '\0'; break; } } p = buf; if (parsepair(p) < 0) r = 1; } if (ferror(fp)) eprintf("%s: read error:", file); free(buf); fclose(fp); } return r; }
static int parseobject(Parser *p, JSON *parent, JSON **prev) { JSON *kprev = nil, *vprev = nil; JSON *v = inititem(p, parent, prev, '{'); must(consume(p, "{")); skipws(p); if (*p->s != '}') { must(parsepair(p, v, &kprev, &vprev)); for (skipws(p); *p->s == ','; skipws(p)) { p->s++; // consume , skipws(p); must(parsepair(p, v, &kprev, &vprev)); } } must(consume(p, "}")); if (v) { v->end = p->s; } return 1; }