diff options
Diffstat (limited to 'lib/sg_pr2serr.c')
-rw-r--r-- | lib/sg_pr2serr.c | 55 |
1 files changed, 39 insertions, 16 deletions
diff --git a/lib/sg_pr2serr.c b/lib/sg_pr2serr.c index 8acfa278..5c869aee 100644 --- a/lib/sg_pr2serr.c +++ b/lib/sg_pr2serr.c @@ -18,6 +18,9 @@ #include "sg_pr2serr.h" #include "sg_json_builder.h" + +#define sgj_opts_ev "SG3_UTILS_JSON_OPTS" + /* * #define json_serialize_mode_multiline 0 * #define json_serialize_mode_single_line 1 @@ -74,25 +77,24 @@ sgj_parse_opts(sgj_state * jsp, const char * j_optarg) bool negate; int k, c; - for (k = 0; j_optarg[k]; ++k) { + for (k = 0; j_optarg[k]; ++k) { /* step over leading whitespace */ + if (! isspace(j_optarg[k])) + break; + } + for ( ; j_optarg[k]; ++k) { c = j_optarg[k]; negate = false; switch (c) { case '=': - case ' ': if (0 == k) - break; /* allow and ignore leading '=' or ' ' */ + break; /* allow and ignore leading '=' */ bad_arg = true; if (0 == jsp->first_bad_char) jsp->first_bad_char = c; break; case '!': - negate = true; - break; case '~': - negate = true; - break; - case 'N': + case '-': /* '-' is probably most practical negation symbol */ negate = true; break; case '0': @@ -108,6 +110,9 @@ sgj_parse_opts(sgj_state * jsp, const char * j_optarg) case '8': jsp->pr_indent_size = 8; break; + case 'e': + jsp->pr_exit_status = ! prev_negate; + break; case 'g': jsp->pr_format = 'g'; break; @@ -123,8 +128,8 @@ sgj_parse_opts(sgj_state * jsp, const char * j_optarg) case 'p': jsp->pr_pretty = ! prev_negate; break; - case 't': - jsp->pr_trailer = ! prev_negate; + case 's': + jsp->pr_string = ! prev_negate; break; case 'v': ++jsp->verbose; @@ -143,23 +148,40 @@ sgj_parse_opts(sgj_state * jsp, const char * j_optarg) return ! bad_arg; } -bool -sgj_init_state(sgj_state * jsp, const char * j_optarg) +static void +sgj_def_opts(sgj_state * jsp) { jsp->pr_as_json = true; + jsp->pr_exit_status = true; jsp->pr_hex = false; jsp->pr_leadin = true; jsp->pr_output = false; jsp->pr_pretty = true; - jsp->pr_trailer = true; + jsp->pr_string = true; jsp->pr_format = 0; jsp->first_bad_char = 0; jsp->verbose = 0; jsp->pr_indent_size = 4; +} + +bool +sgj_init_state(sgj_state * jsp, const char * j_optarg) +{ + const char * cp; + + sgj_def_opts(jsp); jsp->basep = NULL; jsp->outputp = NULL; jsp->userp = NULL; + cp = getenv(sgj_opts_ev); + if (cp) { + if (! sgj_parse_opts(jsp, cp)) { + pr2ws("error parsing %s environment variable, ignore\n", + sgj_opts_ev); + sgj_def_opts(jsp); + } + } return j_optarg ? sgj_parse_opts(jsp, j_optarg) : true; } @@ -229,7 +251,7 @@ sgj_pr2file(sgj_state * jsp, sgj_opaque_p jop, int exit_status, FILE * fp) fprintf(fp, "%s: all NULL pointers ??\n", __func__); return; } - if ((NULL == jop) && jsp->pr_leadin) + if ((NULL == jop) && jsp->pr_exit_status) json_object_push(jvp, "exit_status", json_integer_new(exit_status)); memcpy(&out_settings, &def_out_settings, sizeof(out_settings)); @@ -437,7 +459,7 @@ sgj_add_name_pair_istr(sgj_state * jsp, sgj_opaque_p jop, { if ((NULL == jsp) || (! jsp->pr_as_json)) return; - else { + else if (jsp->pr_string) { sgj_opaque_p jo2p = sgj_new_named_object(jsp, (jop ? jop : jsp->basep), name); if (NULL == jo2p) @@ -445,7 +467,8 @@ sgj_add_name_pair_istr(sgj_state * jsp, sgj_opaque_p jop, sgj_add_val_i(jsp, jo2p, "i", (int64_t)value); if (str) sgj_add_val_s(jsp, jo2p, str_name ? str_name : "string", str); - } + } else + sgj_add_val_i(jsp, jop, name, value); } /* Returns number of characters placed in 'out' excluding trailing NULL */ |