Introduction
Introduction Statistics Contact Development Disclaimer Help
optimize and simplify a bit: allow more efficient buffering - json2tsv - JSON t…
git clone git://git.codemadness.org/json2tsv
Log
Files
Refs
README
LICENSE
---
commit 60cdcd6ec005e72e168f0318228371471121ad9b
parent f831a4b76c10d7efcb72effd18332f3deac7a4fa
Author: Hiltjo Posthuma <[email protected]>
Date: Sun, 6 Oct 2019 16:20:13 +0200
optimize and simplify a bit: allow more efficient buffering
on a sample input using getchar_unlocked and putchar_unlocked parsed
113MB of JSON data in 1.7 seconds vs 2.7.
Tested with gcc and clang.
Diffstat:
M json2tsv.c | 26 +++++++++++++++-----------
1 file changed, 15 insertions(+), 11 deletions(-)
---
diff --git a/json2tsv.c b/json2tsv.c
@@ -24,9 +24,9 @@ enum JSONType {
#define JSON_MAX_NODE_DEPTH 32
struct json_node {
+ enum JSONType type;
char *name;
size_t namesiz;
- enum JSONType type;
size_t index; /* count/index for TYPE_ARRAY and TYPE_OBJECT */
};
@@ -251,9 +251,9 @@ printvalue(const char *s)
for (; *s; s++) {
/* escape some chars */
switch (*s) {
- case '\n': fputs("\\n", stdout); break;
- case '\\': fputs("\\\\", stdout); break;
- case '\t': fputs("\\t", stdout); break;
+ case '\n': putchar('\\'); putchar('n'); break;
+ case '\\': putchar('\\'); putchar('\\'); break;
+ case '\t': putchar('\\'); putchar('t'); break;
default:
/* ignore other control chars */
if (iscntrl((unsigned char)*s))
@@ -278,20 +278,24 @@ processnode(struct json_node *nodes, size_t depth, const …
if (nodes[i].type == TYPE_OBJECT) {
putchar('.');
} else if (nodes[i].type == TYPE_ARRAY) {
- if (showindices)
+ if (showindices) {
printf("[%zu]", nodes[i].index);
- else
- fputs("[]", stdout);
+ } else {
+ putchar('[');
+ putchar(']');
+ }
}
}
+ putchar('\t');
switch (nodes[depth - 1].type) {
case TYPE_UNKNOWN: return;
- case TYPE_ARRAY: fputs("\ta\t\n", stdout); return;
- case TYPE_OBJECT: fputs("\to\t\n", stdout); return;
- case TYPE_PRIMITIVE: fputs("\tp\t", stdout); break;
- case TYPE_STRING: fputs("\ts\t", stdout); break;
+ case TYPE_ARRAY: putchar('a'); break;
+ case TYPE_OBJECT: putchar('o'); break;
+ case TYPE_PRIMITIVE: putchar('p'); break;
+ case TYPE_STRING: putchar('s'); break;
}
+ putchar('\t');
printvalue(value);
putchar('\n');
}
You are viewing proxied material from codemadness.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.