devtools: Refactoring, bug fix, new IDL
[src/app-framework-binder.git] / src / devtools / main-json2c.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 "json2c.h"
51
52 /**
53  * process a file and prints its expansion on stdout
54  */
55 void process(char *filename)
56 {
57         char *desc;
58         struct json_object *root;
59
60         /* translate - */
61         if (!strcmp(filename, "-"))
62                 filename = "/dev/stdin";
63
64         /* check access */
65         if (access(filename, R_OK)) {
66                 fprintf(stderr, "can't access file %s\n", filename);
67                 exit(1);
68         }
69
70         /* read the file */
71         root = json_object_from_file(filename);
72         if (!root) {
73                 fprintf(stderr, "reading file %s produced null\n", filename);
74                 exit(1);
75         }
76
77         /* create the description */
78         desc = json2c_std(root);
79         if (!desc) {
80                 fprintf(stderr, "out of memory\n");
81                 exit(1);
82         }
83
84         /* print the description */
85         printf("%s", desc);
86
87         /* clean up */
88         json_object_put(root);
89         free(desc);
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
103