X-Git-Url: http://git.archive.openwrt.org/?p=project%2Flibubox.git;a=blobdiff_plain;f=jshn.c;h=69cb06f91f75058fecfc9da92c05646398baad0d;hp=e2f0b83892349aeaa92bfb420baf09818899fcb3;hb=ad9b5a387df86c3fa1bdf733b913f5bf4b751f21;hpb=bdf636377785788f7463d915e0adfb1a77bfe8c5 diff --git a/jshn.c b/jshn.c index e2f0b83..69cb06f 100644 --- a/jshn.c +++ b/jshn.c @@ -1,14 +1,42 @@ -#include -#include +/* + * Copyright (C) 2011-2013 Felix Fietkau + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ +#ifdef JSONC + #include +#else + #include +#endif + #include #include #include #include #include #include +#include "list.h" + +#include "blob.h" +#include "blobmsg_json.h" #define MAX_VARLEN 256 +static struct blob_buf b = { 0 }; + +static const char *var_prefix = ""; +static int var_prefix_len = 0; + static int add_json_element(const char *key, json_object *obj); static int add_json_object(json_object *obj) @@ -89,6 +117,9 @@ static int add_json_element(const char *key, json_object *obj) case json_type_int: type = "int"; break; + case json_type_double: + type = "double"; + break; default: return -1; } @@ -118,6 +149,9 @@ static int add_json_element(const char *key, json_object *obj) case json_type_int: fprintf(stdout, "' %d;\n", json_object_get_int(obj)); break; + case json_type_double: + fprintf(stdout, "' %lf;\n", json_object_get_double(obj)); + break; default: return -1; } @@ -130,7 +164,7 @@ static int jshn_parse(const char *str) json_object *obj; obj = json_tokener_parse(str); - if (is_error(obj) || json_object_get_type(obj) != json_type_object) { + if (!obj || json_object_get_type(obj) != json_type_object) { fprintf(stderr, "Failed to parse message data\n"); return 1; } @@ -145,19 +179,27 @@ static char *get_keys(const char *prefix) { char *keys; - keys = alloca(strlen(prefix) + sizeof("KEYS_") + 1); - sprintf(keys, "KEYS_%s", prefix); + keys = alloca(var_prefix_len + strlen(prefix) + sizeof("K_") + 1); + sprintf(keys, "%sK_%s", var_prefix, prefix); return getenv(keys); } -static void get_var(const char *prefix, const char *name, char **var, char **type) +static void get_var(const char *prefix, const char **name, char **var, char **type) { - char *tmpname; + char *tmpname, *varname; + + tmpname = alloca(var_prefix_len + strlen(prefix) + 1 + strlen(*name) + 1 + sizeof("T_")); + + sprintf(tmpname, "%s%s_%s", var_prefix, prefix, *name); + *var = getenv(tmpname); - tmpname = alloca(strlen(prefix) + 1 + strlen(name) + 1 + sizeof("TYPE_")); - sprintf(tmpname, "TYPE_%s_%s", prefix, name); - *var = getenv(tmpname + 5); + sprintf(tmpname, "%sT_%s_%s", var_prefix, prefix, *name); *type = getenv(tmpname); + + sprintf(tmpname, "%sN_%s_%s", var_prefix, prefix, *name); + varname = getenv(tmpname); + if (varname) + *name = varname; } static json_object *jshn_add_objects(json_object *obj, const char *prefix, bool array); @@ -167,7 +209,7 @@ static void jshn_add_object_var(json_object *obj, bool array, const char *prefix json_object *new; char *var, *type; - get_var(prefix, name, &var, &type); + get_var(prefix, &name, &var, &type); if (!var || !type) return; @@ -181,6 +223,8 @@ static void jshn_add_object_var(json_object *obj, bool array, const char *prefix new = json_object_new_string(var); } else if (!strcmp(type, "int")) { new = json_object_new_int(atoi(var)); + } else if (!strcmp(type, "double")) { + new = json_object_new_double(strtod(var, NULL)); } else if (!strcmp(type, "boolean")) { new = json_object_new_boolean(!!atoi(var)); } else { @@ -210,38 +254,65 @@ out: return obj; } -static int jshn_format(bool no_newline) +static int jshn_format(bool no_newline, bool indent) { json_object *obj; + const char *output; + char *blobmsg_output = NULL; + int ret = -1; + + if (!(obj = json_object_new_object())) + return -1; + + jshn_add_objects(obj, "J_V", false); + if (!(output = json_object_to_json_string(obj))) + goto out; + + if (indent) { + blob_buf_init(&b, 0); + if (!blobmsg_add_json_from_string(&b, output)) + goto out; + if (!(blobmsg_output = blobmsg_format_json_indent(b.head, 1, 0))) + goto out; + output = blobmsg_output; + } + fprintf(stdout, "%s%s", output, no_newline ? "" : "\n"); + free(blobmsg_output); + ret = 0; - obj = json_object_new_object(); - jshn_add_objects(obj, "JSON_VAR", false); - fprintf(stdout, "%s%s", json_object_to_json_string(obj), - no_newline ? "" : "\n"); +out: json_object_put(obj); - return 0; + return ret; } static int usage(const char *progname) { - fprintf(stderr, "Usage: %s [-n] -r |-w\n", progname); + fprintf(stderr, "Usage: %s [-n] [-i] -r |-w\n", progname); return 2; } int main(int argc, char **argv) { bool no_newline = false; + bool indent = false; int ch; - while ((ch = getopt(argc, argv, "nr:w")) != -1) { + while ((ch = getopt(argc, argv, "p:nir:w")) != -1) { switch(ch) { + case 'p': + var_prefix = optarg; + var_prefix_len = strlen(var_prefix); + break; case 'r': return jshn_parse(optarg); case 'w': - return jshn_format(no_newline); + return jshn_format(no_newline, indent); case 'n': no_newline = true; break; + case 'i': + indent = true; + break; default: return usage(argv[0]); }