X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fdevtools%2Fgetref.c;fp=src%2Fdevtools%2Fgetref.c;h=9e829dd58ebddaff8f35962a7373aefa86ea16d2;hb=40b7650e4c95481889c1e37dea57be7de018e37d;hp=0000000000000000000000000000000000000000;hpb=9a623c3aa32ec0fbf9682f37a990abd00f38da60;p=src%2Fapp-framework-binder.git diff --git a/src/devtools/getref.c b/src/devtools/getref.c new file mode 100644 index 00000000..9e829dd5 --- /dev/null +++ b/src/devtools/getref.c @@ -0,0 +1,84 @@ +/* + * 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 "getref.h" + +/** + * Search for a reference of type "#/a/b/c" int the + * parsed JSON root object + */ +int search$ref(struct json_object *root, const char *ref, struct json_object **result) +{ + char *d; + struct json_object *i; + + /* does it match #/ at the beginning? */ + if (ref[0] != '#' || (ref[0] && ref[1] != '/')) { + fprintf(stderr, "$ref invalid. Was: %s", ref); + return 0; + } + + /* search from root to target */ + i = root; + d = strdupa(ref+2); + d = strtok(d, "/"); + while(i && d) { + if (!json_object_object_get_ex(i, d, &i)) + return 0; + d = strtok(NULL, "/"); + } + if (result) + *result = i; + return 1; +} + +struct json_object *get$ref(struct json_object *root, const char *ref) +{ + struct json_object *result; + return search$ref(root, ref, &result) ? result : NULL; +}