summaryrefslogtreecommitdiffstats
path: root/jv_parse.c
diff options
context:
space:
mode:
authorNicolas Williams <nico@cryptonector.com>2014-06-04 18:01:47 -0500
committerNicolas Williams <nico@cryptonector.com>2014-06-04 18:15:58 -0500
commitae625d0de74c2966e627e3d5e498ab72529c4251 (patch)
treebf32f195548a0780df732d241fef81aabca97f58 /jv_parse.c
parent5fb82d1018681f41230a3ff6dc412ddad511e821 (diff)
Revert "Add -I / --online-input for huge top-level arrays"
This reverts commit 77936a594d797c480f26bfcef3636a74588a6918. There are too many odd bugs in this mode, and it turns out to be a bad idea anyways. Instead, in the future a better option will be to pursue alternative parsers, such as: - streaming parser that outputs only when a new leaf value is added or an array/object is opened/closed; options here include whether to include a path in each output; - parsers for binary JSON encodings (there's a variety of them). Then one might run jq with a streaming parser and use `reduce` to coalesce inputs from some depth down (instead of from one level down as the reverted commit had intended). Besides, a fully streaming parser is desirable in some cases, therefore we should have such a thing as an option. I've explored modifying the current parser to support a streaming option, but it only makes the code very difficult to follow, which is one reason that alternate parsers makes sense. At any rate, this is all for the future. For now there's no streaming of individual texts, just text sequences.
Diffstat (limited to 'jv_parse.c')
-rw-r--r--jv_parse.c32
1 files changed, 9 insertions, 23 deletions
diff --git a/jv_parse.c b/jv_parse.c
index 4667f1f9..cc1e7b96 100644
--- a/jv_parse.c
+++ b/jv_parse.c
@@ -28,8 +28,6 @@ struct jv_parser {
int stackpos;
int stacklen;
jv next;
-
- jv_parser_flags flags;
char* tokenbuf;
int tokenpos;
@@ -47,8 +45,7 @@ struct jv_parser {
};
-static void parser_init(struct jv_parser* p, jv_parser_flags flags) {
- p->flags = flags;
+static void parser_init(struct jv_parser* p) {
p->stack = 0;
p->stacklen = p->stackpos = 0;
p->next = jv_invalid();
@@ -113,9 +110,6 @@ static pfunc token(struct jv_parser* p, char ch) {
break;
case ',':
- if (p->stackpos == 1 && (p->flags & JV_PARSE_EXPLODE_TOPLEVEL_ARRAY) &&
- jv_get_kind(p->stack[0]) == JV_KIND_ARRAY)
- return 0;
if (!jv_is_valid(p->next))
return "Expected value before ','";
if (p->stackpos == 0)
@@ -139,22 +133,16 @@ static pfunc token(struct jv_parser* p, char ch) {
if (p->stackpos == 0 || jv_get_kind(p->stack[p->stackpos-1]) != JV_KIND_ARRAY)
return "Unmatched ']'";
if (jv_is_valid(p->next)) {
- if (p->stackpos != 1 || !(p->flags & JV_PARSE_EXPLODE_TOPLEVEL_ARRAY)) {
- p->stack[p->stackpos-1] = jv_array_append(p->stack[p->stackpos-1], p->next);
- p->next = jv_invalid();
- }
+ p->stack[p->stackpos-1] = jv_array_append(p->stack[p->stackpos-1], p->next);
+ p->next = jv_invalid();
} else {
if (jv_array_length(jv_copy(p->stack[p->stackpos-1])) != 0) {
// this case hits on input like [1,2,3,]
return "Expected another array element";
}
}
- if (p->stackpos == 1 && (p->flags & JV_PARSE_EXPLODE_TOPLEVEL_ARRAY)) {
- jv_free(p->stack[--p->stackpos]);
- } else {
- jv_free(p->next);
- p->next = p->stack[--p->stackpos];
- }
+ jv_free(p->next);
+ p->next = p->stack[--p->stackpos];
break;
case '}':
@@ -327,9 +315,7 @@ static chclass classify(char c) {
static const presult OK = "output produced";
static int check_done(struct jv_parser* p, jv* out) {
- if ((p->stackpos == 0 && jv_is_valid(p->next)) ||
- (p->stackpos == 1 && (p->flags & JV_PARSE_EXPLODE_TOPLEVEL_ARRAY) &&
- jv_get_kind(p->stack[0]) == JV_KIND_ARRAY && jv_is_valid(p->next))) {
+ if (p->stackpos == 0 && jv_is_valid(p->next)) {
*out = p->next;
p->next = jv_invalid();
return 1;
@@ -384,9 +370,9 @@ static pfunc scan(struct jv_parser* p, char ch, jv* out) {
return answer;
}
-struct jv_parser* jv_parser_new(jv_parser_flags flags) {
+struct jv_parser* jv_parser_new() {
struct jv_parser* p = jv_mem_alloc(sizeof(struct jv_parser));
- parser_init(p, flags);
+ parser_init(p);
return p;
}
@@ -458,7 +444,7 @@ jv jv_parser_next(struct jv_parser* p) {
jv jv_parse_sized(const char* string, int length) {
struct jv_parser parser;
- parser_init(&parser, 0);
+ parser_init(&parser);
jv_parser_set_buf(&parser, string, length, 0);
jv value = jv_parser_next(&parser);
if (jv_is_valid(value)) {