+ printf("%s\n", json_object_to_json_string(jsobj));
+ }
+}
+
+static void
+export_type(struct json_object *jsobj, const char *prefix)
+{
+ const char *types[] = {
+ "null",
+ "boolean",
+ "double",
+ "int",
+ "object",
+ "array",
+ "string"
+ };
+
+ if (prefix)
+ printf("export %s=%s; ", prefix, types[json_object_get_type(jsobj)]);
+ else
+ printf("%s\n", types[json_object_get_type(jsobj)]);
+}
+
+static bool
+filter_json(int opt, struct json_object *jsobj, char *expr)
+{
+ struct jp_state *state;
+ struct json_object *res = NULL;
+ const char *prefix = NULL;
+
+ state = jp_parse(expr);
+
+ if (!state || state->error)
+ {
+ fprintf(stderr, "In expression '%s': %s\n",
+ expr, state ? state->error : "Out of memory");
+
+ goto out;
+ }
+
+ res = jp_match(state->path, jsobj);
+
+ if (res)
+ {
+ prefix = (state->path->type == T_LABEL) ? state->path->str : NULL;
+
+ switch (opt)
+ {
+ case 't':
+ export_type(res, prefix);
+ break;
+
+ default:
+ export_value(res, prefix);
+ break;
+ }