X-Git-Url: http://git.archive.openwrt.org/?p=project%2Flibubox.git;a=blobdiff_plain;f=sh%2Fjshn.sh;h=3aff5ea92adebd0249bc99056671e550ce0ac7d7;hp=70c3aa36b3f026d3f62634316927409c98b87d26;hb=1a32939cb5ad3fabed9d78c030e2746cdbbdc038;hpb=4d0a00c82c77a9395c992841237e2c06c4606a5e diff --git a/sh/jshn.sh b/sh/jshn.sh index 70c3aa3..3aff5ea 100644 --- a/sh/jshn.sh +++ b/sh/jshn.sh @@ -12,6 +12,15 @@ _json_set_var() { eval "${JSON_PREFIX}$___var=\"\$___val\"" } +__jshn_raw_append() { + local var="$1" + local value="$2" + local sep="${3:- }" + + eval "export -- \"$var=\${$var:+\${$var}\${value:+\$sep}}\$value\"" +} + + _jshn_append() { local __var="$1" local __value="$2" @@ -28,7 +37,6 @@ _json_export() { local __val="$2" export -- "$__var=$__val" - _jshn_append "JSON_UNSET" "$__var" } _json_add_key() { @@ -60,15 +68,6 @@ _json_inc() { [ -n "$_dest" ] && _set_var "$_dest" "$_seq" } -_json_stack_push() { - local new_cur="$1" - local cur - - _json_get_var cur JSON_CUR - _jshn_append JSON_STACK "$cur" - _json_set_var JSON_CUR "$new_cur" -} - _json_add_generic() { local type="$1" local var="$2" @@ -87,6 +86,7 @@ _json_add_generic() { _json_export "${cur}_$var" "$val" _json_export "TYPE_${cur}_$var" "$type" + _jshn_append "JSON_UNSET" "${cur}_$var" _json_add_key "$cur" "$var" } @@ -101,23 +101,22 @@ _json_add_table() { _json_inc JSON_SEQ seq local table="JSON_$itype$seq" - _json_export "UP_$table" "$cur" + _json_set_var "UP_$table" "$cur" _json_export "KEYS_$table" "" [ "$itype" = "ARRAY" ] && _json_export "SEQ_$table" "" - _json_stack_push "$table" + _json_set_var JSON_CUR "$table" + _jshn_append "JSON_UNSET" "$table" _json_get_var new_cur JSON_CUR _json_add_generic "$type" "$1" "$new_cur" "$cur" } _json_close_table() { - local stack new_stack + local _s_cur _s_new - _json_get_var stack JSON_STACK - _json_set_var JSON_CUR "${stack##* }" - new_stack="${stack% *}" - [[ "$stack" == "$new_stack" ]] && new_stack= - _json_set_var JSON_STACK "$new_stack" + _json_get_var _s_cur JSON_CUR + _json_get_var _s_new "UP_$_s_cur" + _json_set_var JSON_CUR "$_s_new" } json_set_namespace() { @@ -132,22 +131,26 @@ json_cleanup() { local unset _json_get_var unset JSON_UNSET - [ -n "$unset" ] && eval "unset $unset" + for tmp in $unset JSON_VAR; do + unset \ + ${JSON_PREFIX}UP_$tmp \ + ${JSON_PREFIX}KEYS_$tmp \ + ${JSON_PREFIX}SEQ_$tmp \ + ${JSON_PREFIX}TYPE_$tmp \ + ${JSON_PREFIX}NAME_$tmp \ + ${JSON_PREFIX}$tmp + done unset \ ${JSON_PREFIX}JSON_SEQ \ - ${JSON_PREFIX}JSON_STACK \ ${JSON_PREFIX}JSON_CUR \ - ${JSON_PREFIX}JSON_UNSET \ - ${JSON_PREFIX}KEYS_JSON_VAR \ - ${JSON_PREFIX}TYPE_JSON_VAR + ${JSON_PREFIX}JSON_UNSET } json_init() { json_cleanup export -- \ ${JSON_PREFIX}JSON_SEQ=0 \ - ${JSON_PREFIX}JSON_STACK= \ ${JSON_PREFIX}JSON_CUR="JSON_VAR" \ ${JSON_PREFIX}JSON_UNSET="" \ ${JSON_PREFIX}KEYS_JSON_VAR= \ @@ -182,6 +185,10 @@ json_add_boolean() { _json_add_generic boolean "$1" "$2" } +json_add_double() { + _json_add_generic double "$1" "$2" +} + # functions read access to json variables json_load() { @@ -193,12 +200,47 @@ json_dump() { } json_get_type() { - local dest="$1" - local cur + local __dest="$1" + local __cur - _json_get_var cur JSON_CUR - local var="${JSON_PREFIX}TYPE_${cur}_$2" - eval "export -- \"$dest=\${$var}\"; [ -n \"\${$var+x}\" ]" + _json_get_var __cur JSON_CUR + local __var="${JSON_PREFIX}TYPE_${__cur}_${2//[^a-zA-Z0-9_]/_}" + eval "export -- \"$__dest=\${$__var}\"; [ -n \"\${$__var+x}\" ]" +} + +json_get_keys() { + local __dest="$1" + local _tbl_cur + + if [ -n "$2" ]; then + json_get_var _tbl_cur "$2" + else + _json_get_var _tbl_cur JSON_CUR + fi + local __var="${JSON_PREFIX}KEYS_${_tbl_cur}" + eval "export -- \"$__dest=\${$__var}\"; [ -n \"\${$__var+x}\" ]" +} + +json_get_values() { + local _v_dest="$1" + local _v_keys _v_val _select= + + unset "$_v_dest" + [ -n "$2" ] && { + json_select "$2" + _select=1 + } + + json_get_keys _v_keys + set -- $_v_keys + while [ "$#" -gt 0 ]; do + json_get_var _v_val "$1" + __jshn_raw_append "$_v_dest" "$_v_val" + shift + done + [ -n "$_select" ] && json_select .. + + return 0 } json_get_var() {