diff options
Diffstat (limited to '.graveyard/json/sh')
-rwxr-xr-x | .graveyard/json/sh/json.sh | 116 | ||||
-rw-r--r-- | .graveyard/json/sh/test.json | 7 |
2 files changed, 123 insertions, 0 deletions
diff --git a/.graveyard/json/sh/json.sh b/.graveyard/json/sh/json.sh new file mode 100755 index 00000000..79f8529a --- /dev/null +++ b/.graveyard/json/sh/json.sh @@ -0,0 +1,116 @@ +#! /bin/sh +set -euf + +# TODO check json first + +# XXX json_key is something like PWD^^ + +normalize_json() { + sed -n ' + 1s/^/cat<<EOF\n/ + # TODO handle escaped double quotes + s/"[^"]\+"/"$(echo -n & | base64)"/g + $s/$/\nEOF/ + p + ' | sh | tr -d '[:space:]' +} + +json_to_sh() { + sed -n ' + s/,/;/g + s/\[/begin_json_array;/g; s/\]/end_json_array;/g + s/\{/begin_json_object;/g; s/\}/end_json_object;/g + s/\("[^"]\+"\):/json_set_key \1;/g + s/;\("[^"]\+"\)/;json_set string \1;/g + s/;\([0-9.]\+\)/;json_set number `echo -n \1 | base64`;/g + s/;;/;/g + s/;/\n/g + p + ' +} + +begin_json_object() { + push_key %%%MAKEJSONOBJ%%% +} +end_json_object() { + #echo end_json_object: $json_key >&2 + pop_key # TODO check if is %%%MAKEJSONOBJ%%% + #echo obj: $1 `set | sed -rn "s/^(${json_key}_[a-zA-Z]+)_VALUE=(.*)/\1/p"` >&2 + #json_set object "`set | sed -rn "s/^(${json_key}_[a-zA-Z]+)_VALUE=(.*)/\1/p"`" + json_set object "`set | sed -n "s/^\(${json_key}_[a-zA-Z]\+\)=\(.*\)/\1/p"`" +} +begin_json_array() { :; } +end_json_array() { :; } +json_push_key() { + push_key "`echo -n "$1" | base64 -d`" +} +json_set_key() { + pop_key + json_push_key "$1" +} +json_set() { + ##echo "typeof_$json_key=$1" >&2 + ##echo "${json_key}_VALUE=\"$2\"" >&2 # (`echo -n $2 | base64 -d`)" >&2 + #eval "${json_key}_TYPE=$1" + #eval "${json_key}_VALUE=\"$2\"" + eval "typeof_${json_key}=$1" + eval "${json_key}=\"$2\"" +} + +push_key() { + json_key="${json_key+${json_key}_}$1" +} +pop_key() { + json_key="`echo $json_key | sed 's/_[^_]\+$//'`" +} + +json() { + #eval echo "\"\$`echo -n "$json_key" "$@" | tr "$IFS" _`\" | base64 -d" + NAME="`echo -n "$json_key" "$@" | tr "$IFS" _`" + #eval "TYPE=\"\$${NAME}_TYPE\"" + eval "TYPE=\"\$typeof_$NAME\"" + + echo -n "$TYPE $NAME: " + case "$TYPE" in + (object) + #eval echo -n \$${NAME}_VALUE + eval echo -n \$$NAME + ;; + #set | sed -rn "s/^(${NAME})_([a-zA-Z]+)[a-zA-Z_]*_VALUE=(.*)/\1_\2/p" | + # sort | uniq | tr \\n \ ;; + (*) #echo -n "$VALUE";; + #eval "VALUE=\"\$(echo -n \"\$${NAME}_VALUE\" | base64 -d)\"" + #eval echo -n \"\$${NAME}_VALUE\" | base64 -d + eval echo -n \$${NAME} | base64 -d + esac + echo +} + +read_json() { + json_key="${1-JSON}" + #meh="`cat`" + #echo "$meh" + ##echo "$meh" | normalize_json | json_to_sh; exit + #eval "`echo "$meh" | normalize_json | json_to_sh`" + eval "`normalize_json | json_to_sh`" +} + +# TODO print_json x, print_json x ca ... to print as json + +read_json "$1" +echo ==== +set | egrep "^(typeof_)?$json_key[A-Za-z_]*=" +echo ==== +json +json a +json b +json c +json c ca +json c cb +json d +#echo ==== +#echo $JSON_VALUE +#echo $JSON_c_cb_VALUE | base64 -d; echo + +echo READY. +#### End of file. diff --git a/.graveyard/json/sh/test.json b/.graveyard/json/sh/test.json new file mode 100644 index 00000000..9b4c6312 --- /dev/null +++ b/.graveyard/json/sh/test.json @@ -0,0 +1,7 @@ +{ + "a": "1", + "b": 2, + "c": { "ca": 11, "cb": [1, 2, 3, "42"] }, + "d": {}, + "float": 4.23 +} |