#include #include #include #include "compile.h" #include "builtin.h" #include "jv.h" #include "jv_parse.h" #include "locfile.h" #include "parser.h" #include "execute.h" #include "version.gen.h" static const char* progname; static void usage() { fprintf(stderr, "\njq - commandline JSON processor [version %s]\n", JQ_VERSION); fprintf(stderr, "Usage: %s [options] \n\n", progname); fprintf(stderr, "For a description of the command line options and\n"); fprintf(stderr, "how to write jq filters (and why you might want to)\n"); fprintf(stderr, "see the jq documentation at http://stedolan.github.com/jq\n\n"); exit(1); } static void die() { fprintf(stderr, "Use %s --help for help with command-line options,\n", progname); fprintf(stderr, "or see the jq documentation at http://stedolan.github.com/jq\n"); exit(1); } static int isoptish(const char* text) { return text[0] == '-' && (text[1] == '-' || isalpha(text[1])); } static int isoption(const char* text, char shortopt, const char* longopt) { if (text[0] != '-') return 0; if (strlen(text) == 2 && text[1] == shortopt) return 1; if (text[1] == '-' && !strcmp(text+2, longopt)) return 1; return 0; } enum { SLURP = 1, RAW_INPUT = 2, PROVIDE_NULL = 4, RAW_OUTPUT = 8, COMPACT_OUTPUT = 16, ASCII_OUTPUT = 32, }; static int options = 0; static struct bytecode* bc; static void process(jv value) { jq_init(bc, value); jv result; while (jv_is_valid(result = jq_next())) { if ((options & RAW_OUTPUT) && jv_get_kind(result) == JV_KIND_STRING) { fwrite(jv_string_value(result), 1, jv_string_length(jv_copy(result)), stdout); } else { int dumpopts = 0; if (!(options & COMPACT_OUTPUT)) dumpopts |= JV_PRINT_PRETTY; if (options & ASCII_OUTPUT) dumpopts |= JV_PRINT_ASCII; jv_dump(result, dumpopts); } printf("\n"); } jv_free(result); jq_teardown(); } int main(int argc, char* argv[]) { if (argc) progname = argv[0]; const char* program = 0; for (int i=1; i 0) { if (options & SLURP) { if (first) slurped = jv_string(buf); else slurped = jv_string_concat(slurped, jv_string(buf)); } else { if (buf[len-1] == '\n') buf[len-1] = 0; process(jv_string(buf)); } } } else { jv_parser_set_buf(&parser, buf, strlen(buf), !feof(stdin)); jv value; while (jv_is_valid((value = jv_parser_next(&parser)))) { if (options & SLURP) { if (first) slurped = jv_array(); slurped = jv_array_append(slurped, value); } else { process(value); } } if (jv_invalid_has_msg(jv_copy(value))) { jv msg = jv_invalid_get_msg(value); fprintf(stderr, "parse error: %s\n", jv_string_value(msg)); jv_free(msg); break; } else { jv_free(value); } } first = 0; } jv_parser_free(&parser); if (options & SLURP) { if (jv_is_valid(slurped)) { process(slurped); } else { jv_free(slurped); } } } bytecode_free(bc); return 0; }