devtools: Refactoring, bug fix, new IDL
[src/app-framework-binder.git] / src / devtools / main-exprefs.c
1 /*
2  * Copyright (C) 2016, 2017, 2018 "IoT.bzh"
3  * Author José Bollo <jose.bollo@iot.bzh>
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  *   http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17 /*
18  * This simple program expands the object { "$ref": "#/path/to/a/target" }
19  *
20  * For example:
21  *
22  *  {
23  *    "type":{
24  *      "a": "int",
25  *      "b": { "$ref": "#/type/a" }
26  *    }
27  *  }
28  *
29  * will be exapanded to
30  *
31  *  {
32  *    "type":{
33  *      "a": "int",
34  *      "b": "int"
35  *    }
36  *  }
37  *
38  * Invocation:   program  [file|-]...
39  *
40  * without arguments, it reads the input.
41  */
42
43 #define _GNU_SOURCE
44 #include <string.h>
45 #include <stdio.h>
46 #include <unistd.h>
47
48 #include <json-c/json.h>
49
50 #include "exprefs.h"
51
52 /**
53  * process a file and prints its expansion on stdout
54  */
55 void process(char *filename)
56 {
57         struct json_object *root;
58
59         /* translate - */
60         if (!strcmp(filename, "-"))
61                 filename = "/dev/stdin";
62
63         /* check access */
64         if (access(filename, R_OK)) {
65                 fprintf(stderr, "can't access file %s\n", filename);
66                 exit(1);
67         }
68
69         /* read the file */
70         root = json_object_from_file(filename);
71         if (!root) {
72                 fprintf(stderr, "reading file %s produced null\n", filename);
73                 exit(1);
74         }
75
76         /* expand */
77         root = exp$refs(root);
78
79         /* check if tree */
80         if (!exp$refs_is_tree(root)) {
81                 fprintf(stderr, "expansion of %s doesn't produce a tree\n", filename);
82                 exit(1);
83         }
84
85         /* print the result */
86         json_object_to_file_ext ("/dev/stdout", root, JSON_C_TO_STRING_PRETTY);
87
88         /* clean up */
89         json_object_put(root);
90 }
91
92 /** process the list of files or stdin if none */
93 int main(int ac, char **av)
94 {
95         if (!*++av)
96                 process("-");
97         else {
98                 do { process(*av); } while(*++av);
99         }
100         return 0;
101 }
102