--- libelwix/example/test_json.c 2017/11/28 11:14:00 1.1.2.4 +++ libelwix/example/test_json.c 2017/11/28 13:42:22 1.1.2.6 @@ -2,6 +2,7 @@ #include #include #include +#include #include #include @@ -95,13 +96,111 @@ run_simple(json_t *json) return 0; } +static int +dump(const char *jstr, jtok_t *toks, int toksnum, int indent) +{ + register int i, j, k; + + if (!toksnum) + return 0; + + if (toks->tok_type == J_VALUE) { + printf("%.*s", (int) json_toklen(toks), json_tokstr(jstr, toks)); + return 1; + } else if (toks->tok_type == J_STRING) { + printf("%.*s", (int) json_toklen(toks), json_tokstr(jstr, toks)); + return 1; + } else if (toks->tok_type == J_OBJECT) { + printf("\n"); + for (j = i = 0; i < json_toksize(toks); i++) { + for (k = 0; k < indent; k++) + printf(" "); + j += dump(jstr, toks + j + 1, toksnum - j, indent + 1); + printf(": "); + j += dump(jstr, toks + j + 1, toksnum - j, indent + 1); + printf("\n"); + } + return j + 1; + } else if (toks->tok_type == J_ARRAY) { + printf("\n"); + for (j = i = 0; i < json_toksize(toks); i++) { + for (k = 0; k < indent - 1; k++) + printf(" "); + printf(" - "); + j += dump(jstr, toks + j + 1, toksnum - j, indent + 1); + printf("\n"); + } + return j + 1; + } + + return 0; +} + int +run_dump(json_t *json) +{ + int rlen, toksnum, wait4eof = 0; + char buf[BUFSIZ]; + ait_val_t v; + jtok_t *toks, *t; + + toks = e_malloc(sizeof(jtok_t)); + if (!toks) + return 1; + else + toksnum = 1; + AIT_SET_STRSIZ(&v, 1); + while (42) { + memset(buf, 0, sizeof buf); + rlen = fread(buf, 1, sizeof buf, stdin); + switch (rlen) { + case -1: + printf("Error:: fread() #%d - %s\n", errno, strerror(errno)); + AIT_FREE_VAL(&v); + e_free(toks); + return 2; + case 0: + if (wait4eof) + return 0; + printf("Error:: Unexpected termination!\n"); + AIT_FREE_VAL(&v); + e_free(toks); + return 3; + default: + AIT_SET_STRCAT(&v, buf); + break; + } +again: + rlen = json_parse(json, AIT_GET_STR(&v), AIT_LEN(&v), toks, toksnum); + if (rlen == (u_int) -1) { + if (elwix_GetErrno() == J_ERR_NOMEM) { + toksnum *= 2; + t = e_realloc(toks, sizeof(jtok_t) * toksnum); + if (t) { + toks = t; + goto again; + } + } + } else { + dump(AIT_GET_STR(&v), toks, json->h_next, 0); + wait4eof = 1; + } + } + AIT_FREE_VAL(&v); + e_free(toks); + + return 0; +} + +int main(int argc, char **argv) { json_t json; if (argc < 2) return run_simple(&json); + else + return run_dump(&json); return 0; }