summaryrefslogtreecommitdiffstats
path: root/package/jshn/files
diff options
context:
space:
mode:
authornbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73>2011-02-16 00:24:52 +0000
committernbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73>2011-02-16 00:24:52 +0000
commit3b96f8e26b0fa34da206538181593dfdf16e4a54 (patch)
tree8833da94020531981dc723a4e28ea29f64f0df9d /package/jshn/files
parent200663f5d96c38484074fcb2849aae126dc6fb7f (diff)
add jshn (JSON SHell Notation), a small utility and shell library for parsing and generating json data
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@25547 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'package/jshn/files')
-rw-r--r--package/jshn/files/jshn.sh109
1 files changed, 109 insertions, 0 deletions
diff --git a/package/jshn/files/jshn.sh b/package/jshn/files/jshn.sh
new file mode 100644
index 000000000..2dddfe8bf
--- /dev/null
+++ b/package/jshn/files/jshn.sh
@@ -0,0 +1,109 @@
+[ -z "$N" ] && . /etc/functions.sh
+
+# functions for parsing and generating json
+
+json_init() {
+ [ -n "$JSON_UNSET" ] && eval "unset $JSON_UNSET"
+ export -- JSON_SEQ=0 JSON_STACK= JSON_CUR="JSON_VAR" JSON_UNSET=
+}
+
+json_add_generic() {
+ local type="$1"
+ local var="$2"
+ local val="$3"
+ local cur="${4:-$JSON_CUR}"
+
+ export ${NO_EXPORT:+-n} -- "${cur}_$var=$val"
+ export ${NO_EXPORT:+-n} -- "TYPE_${cur}_$var=$type"
+ append JSON_UNSET "${cur}_$var TYPE_${cur}_$var"
+ append "KEYS_${cur}" "$var"
+}
+
+json_add_table() {
+ JSON_SEQ=$(($JSON_SEQ + 1))
+ append JSON_STACK "$JSON_CUR"
+ local table="JSON_TABLE$JSON_SEQ"
+ export ${NO_EXPORT:+-n} -- "UP_$table=$JSON_CUR"
+ JSON_CUR="$table"
+}
+
+json_add_object() {
+ local cur="$JSON_CUR"
+ json_add_table
+ json_add_generic object "$1" "$JSON_CUR" "$cur"
+}
+
+json_close_object() {
+ local oldstack="$JSON_STACK"
+ export "KEYS_${JSON_CUR}"
+ JSON_CUR="${JSON_STACK##* }"
+ JSON_STACK="${JSON_STACK% *}"
+ [[ "$oldstack" == "$JSON_STACK" ]] && JSON_STACK=
+}
+
+json_add_array() {
+ local cur="$JSON_CUR"
+ json_add_table
+ json_add_generic array "$1" "$JSON_CUR" "$cur"
+}
+
+json_close_array() {
+ json_close_object
+}
+
+json_add_string() {
+ json_add_generic string "$1" "$2"
+}
+
+json_add_int() {
+ json_add_generic int "$1" "$2"
+}
+
+json_add_boolean() {
+ json_add_generic boolean "$1" "$2"
+}
+
+# functions read access to json variables
+
+json_load() {
+ eval `jshn -r "$1"`
+}
+
+json_dump() {
+ jshn -w
+}
+
+json_get_type() {
+ local dest="$1"
+ local var="$2"
+ eval "export ${NO_EXPORT:+-n} -- \"$dest=\${TYPE_${JSON_CUR}_$var}\""
+}
+
+json_get_var() {
+ local dest="$1"
+ local var="$2"
+ eval "export ${NO_EXPORT:+-n} -- \"$dest=\${${JSON_CUR}_$var}\""
+}
+
+json_select() {
+ local target="$1"
+ local type
+
+ [ -z "$1" ] && {
+ JSON_CUR="JSON_VAR"
+ return
+ }
+ [[ "$1" == ".." ]] && {
+ eval "JSON_CUR=\"\${UP_$JSON_CUR}\""
+ return;
+ }
+ json_get_type type "$target"
+ case "$type" in
+ object|array)
+ json_get_var JSON_CUR "$target"
+ ;;
+ *)
+ echo "WARNING: Variable '$target' does not exist or is not an array/object"
+ ;;
+ esac
+}