From bbf4e05fde301bc48907ca6d485c59ae10a6467c Mon Sep 17 00:00:00 2001 From: Nicolas Williams Date: Sat, 15 Jun 2013 00:08:59 -0500 Subject: [PATCH] Move slurp_file() into library as jv_load_file() Needed as part of creating a libjq. --- Makefile.am | 12 ++++++------ builtin.c | 4 ++-- jv_file.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ jv_file.h | 8 ++++++++ main.c | 42 +++--------------------------------------- main.h | 9 --------- 6 files changed, 64 insertions(+), 56 deletions(-) create mode 100644 jv_file.c create mode 100644 jv_file.h delete mode 100644 main.h diff --git a/Makefile.am b/Makefile.am index c08ed97..7da9ccf 100644 --- a/Makefile.am +++ b/Makefile.am @@ -2,12 +2,12 @@ JQ_INCS = jq_parser.h builtin.h bytecode.h compile.h execute.h \ forkable_stack.h frame_layout.h jv.h jv_alloc.h jv_aux.h jv_dtoa.h \ - jv_parse.h jv_unicode.h locfile.h opcode.h opcode_list.h parser.y \ - jv_utf8_tables.h main.h lexer.l + jv_file.h jv_parse.h jv_unicode.h locfile.h opcode.h opcode_list.h \ + parser.y jv_utf8_tables.h main.h lexer.l -JQ_SRC = locfile.c opcode.c bytecode.c compile.c execute.c builtin.c jv.c \ - jv_parse.c jv_print.c jv_dtoa.c jv_unicode.c jv_aux.c jv_alloc.c \ - jq_test.c ${JQ_INCS} +JQ_SRC = locfile.c opcode.c bytecode.c compile.c execute.c builtin.c \ + jv.c jv_parse.c jv_print.c jv_dtoa.c jv_unicode.c jv_aux.c jv_file.c \ + jv_alloc.c jq_test.c ${JQ_INCS} ### C build options @@ -131,4 +131,4 @@ if ENABLE_DOCS endif clean-local: clean-local-docs - rm -f version.h .remake-version-h \ No newline at end of file + rm -f version.h .remake-version-h diff --git a/builtin.c b/builtin.c index e6cfa4d..60be1bc 100644 --- a/builtin.c +++ b/builtin.c @@ -5,8 +5,8 @@ #include "jq_parser.h" #include "locfile.h" #include "jv_aux.h" +#include "jv_file.h" #include "jv_unicode.h" -#include "main.h" @@ -585,7 +585,7 @@ int slurp_lib(block* bb) { char* home = getenv("HOME"); if (home) { // silently ignore no $HOME jv filename = jv_string_append_str(jv_string(home), "/.jq"); - jv data = slurp_file(jv_string_value(filename), 1); + jv data = jv_load_file(jv_string_value(filename), 1); if (jv_is_valid(data)) { nerrors = builtins_bind_one(bb, jv_string_value(data) ); } diff --git a/jv_file.c b/jv_file.c new file mode 100644 index 0000000..980a245 --- /dev/null +++ b/jv_file.c @@ -0,0 +1,45 @@ + +#include +#include +#include +#include +#include "jv.h" +#include "jv_aux.h" +#include "jv_parse.h" + +jv jv_load_file(const char* filename, int raw) { + FILE* file = fopen(filename, "r"); + struct jv_parser parser; + jv data; + if (!file) { + return jv_invalid_with_msg(jv_string_fmt("Could not open %s: %s", + filename, + strerror(errno))); + } + if (raw) { + data = jv_string(""); + } else { + data = jv_array(); + jv_parser_init(&parser); + } + while (!feof(file) && !ferror(file)) { + char buf[4096]; + size_t n = fread(buf, 1, sizeof(buf), file); + if (raw) { + data = jv_string_concat(data, jv_string_sized(buf, (int)n)); + } else { + jv_parser_set_buf(&parser, buf, strlen(buf), !feof(file)); + jv value; + while (jv_is_valid((value = jv_parser_next(&parser)))) + data = jv_array_append(data, value); + } + } + int badread = ferror(file); + fclose(file); + if (badread) { + jv_free(data); + return jv_invalid_with_msg(jv_string_fmt("Error reading from %s", + filename)); + } + return data; +} diff --git a/jv_file.h b/jv_file.h new file mode 100644 index 0000000..a4ae76c --- /dev/null +++ b/jv_file.h @@ -0,0 +1,8 @@ +#ifndef JV_FILE_H +#define JV_FILE_H + +#include "jv.h" + +jv jv_load_file(const char *, int); + +#endif diff --git a/main.c b/main.c index ef3ee25..221ddba 100644 --- a/main.c +++ b/main.c @@ -6,6 +6,7 @@ #include #include "compile.h" #include "jv.h" +#include "jv_file.h" #include "jv_parse.h" #include "execute.h" #include "config.h" /* Autoconf generated header file */ @@ -96,43 +97,6 @@ static void process(jv value, int flags) { jq_teardown(&jq); } -jv slurp_file(const char* filename, int raw) { - FILE* file = fopen(filename, "r"); - struct jv_parser parser; - jv data; - if (!file) { - return jv_invalid_with_msg(jv_string_fmt("Could not open %s: %s", - filename, - strerror(errno))); - } - if (raw) { - data = jv_string(""); - } else { - data = jv_array(); - jv_parser_init(&parser); - } - while (!feof(file) && !ferror(file)) { - char buf[4096]; - size_t n = fread(buf, 1, sizeof(buf), file); - if (raw) { - data = jv_string_concat(data, jv_string_sized(buf, (int)n)); - } else { - jv_parser_set_buf(&parser, buf, strlen(buf), !feof(file)); - jv value; - while (jv_is_valid((value = jv_parser_next(&parser)))) - data = jv_array_append(data, value); - } - } - int badread = ferror(file); - fclose(file); - if (badread) { - jv_free(data); - return jv_invalid_with_msg(jv_string_fmt("Error reading from %s", - filename)); - } - return data; -} - FILE* current_input; const char** input_filenames; int ninput_files; @@ -224,7 +188,7 @@ int main(int argc, char* argv[]) { } jv arg = jv_object(); arg = jv_object_set(arg, jv_string("name"), jv_string(argv[i+1])); - jv data = slurp_file(argv[i+2], 0); + jv data = jv_load_file(argv[i+2], 0); if (!jv_is_valid(data)) { data = jv_invalid_get_msg(data); fprintf(stderr, "%s: Bad JSON in --argfile %s %s: %s\n", progname, @@ -260,7 +224,7 @@ int main(int argc, char* argv[]) { } if (options & FROM_FILE) { - jv data = slurp_file(program, 1); + jv data = jv_load_file(program, 1); if (!jv_is_valid(data)) { data = jv_invalid_get_msg(data); fprintf(stderr, "%s: %s\n", progname, jv_string_value(data)); diff --git a/main.h b/main.h deleted file mode 100644 index ec60039..0000000 --- a/main.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef MAIN_H -#define MAIN_H - -#include "compile.h" - -jv slurp_file(const char*, int); - - -#endif -- 2.40.0