struct json *
json_from_file(const char *file_name)
{
- struct json_parser *p;
struct json *json;
FILE *stream;
- /* Open file. */
stream = fopen(file_name, "r");
if (!stream) {
return json_string_create_nocopy(
xasprintf("error opening \"%s\": %s", file_name, strerror(errno)));
}
+ json = json_from_stream(stream);
+ fclose(stream);
+
+ return json;
+}
+
+/* Parses the contents of 'stream' as a JSON object or array, and returns a
+ * newly allocated 'struct json'. The caller must free the returned structure
+ * with json_destroy() when it is no longer needed.
+ *
+ * The file must be encoded in UTF-8.
+ *
+ * See json_from_string() for return value semantics.
+ */
+struct json *
+json_from_stream(FILE *stream)
+{
+ struct json_parser *p;
+ struct json *json;
- /* Read and parse file. */
p = json_parser_create(JSPF_TRAILER);
for (;;) {
char buffer[BUFSIZ];
}
json = json_parser_finish(p);
- /* Close file and check for I/O errors. */
if (ferror(stream)) {
json_destroy(json);
json = json_string_create_nocopy(
- xasprintf("error reading \"%s\": %s", file_name, strerror(errno)));
+ xasprintf("error reading JSON stream: %s", strerror(errno)));
}
- fclose(stream);
return json;
}
}
static bool
-parse_multiple(const char *input_file)
+parse_multiple(FILE *stream)
{
struct json_parser *parser;
char buffer[BUFSIZ];
size_t n, used;
- FILE *file;
bool ok;
- file = fopen(input_file, "r");
- if (!file) {
- ovs_fatal(errno, "Cannot open \"%s\"", input_file);
- }
-
parser = NULL;
n = used = 0;
ok = true;
- while (used < n || refill(file, buffer, sizeof buffer, &n, &used)) {
+ while (used < n || refill(stream, buffer, sizeof buffer, &n, &used)) {
if (!parser && isspace((unsigned char) buffer[used])) {
/* Skip white space. */
used++;
main(int argc, char *argv[])
{
const char *input_file;
+ FILE *stream;
bool ok;
set_program_name(argv[0]);
}
input_file = argv[optind];
- if (!strcmp(input_file, "-")) {
- input_file = "/dev/stdin";
+ stream = !strcmp(input_file, "-") ? stdin : fopen(input_file, "r");
+ if (!stream) {
+ ovs_fatal(errno, "Cannot open \"%s\"", input_file);
}
if (multiple) {
- ok = parse_multiple(input_file);
+ ok = parse_multiple(stream);
} else {
- ok = print_and_free_json(json_from_file(input_file));
+ ok = print_and_free_json(json_from_stream(stream));
}
return !ok;