#! /bin/sh set -euf # TODO check json first # XXX json_key is something like PWD^^ normalize_json() { sed -rn ' 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 -rn ' 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 -rn "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.