/* * Copyright (C) 2016, 2017, 2018 "IoT.bzh" * Author José Bollo * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* * This simple program expands the object { "$ref": "#/path/to/a/target" } * * For example: * * { * "type":{ * "a": "int", * "b": { "$ref": "#/type/a" } * } * } * * will be exapanded to * * { * "type":{ * "a": "int", * "b": "int" * } * } * * Invocation: program [file|-]... * * without arguments, it reads the input. */ #define _GNU_SOURCE #include #include #include #include #include "exprefs.h" /** * process a file and prints its expansion on stdout */ void process(char *filename) { struct json_object *root; /* translate - */ if (!strcmp(filename, "-")) filename = "/dev/stdin"; /* check access */ if (access(filename, R_OK)) { fprintf(stderr, "can't access file %s\n", filename); exit(1); } /* read the file */ root = json_object_from_file(filename); if (!root) { fprintf(stderr, "reading file %s produced null\n", filename); exit(1); } /* expand */ root = exp$refs(root); /* check if tree */ if (!exp$refs_is_tree(root)) { fprintf(stderr, "expansion of %s doesn't produce a tree\n", filename); exit(1); } /* print the result */ json_object_to_file_ext ("/dev/stdout", root, JSON_C_TO_STRING_PRETTY); /* clean up */ json_object_put(root); } /** process the list of files or stdin if none */ int main(int ac, char **av) { if (!*++av) process("-"); else { do { process(*av); } while(*++av); } return 0; }