diff options
Diffstat (limited to 'gron')
-rwxr-xr-x | gron | 63 |
1 files changed, 63 insertions, 0 deletions
@@ -0,0 +1,63 @@ +#!/bin/bash +set -e + +. "$(dirname -- "${BASH_SOURCE[0]}")/json.sh" + +stack=() + +print_lhs() { + printf 'json' + local x + for x in "${stack[@]}"; do + printf '[%s]' "$x" + done + printf '=' +} + +handle_token() { + local val='' + case "$1" in + object_beg) + val='{}' + stack+=('bogus') + ;; + object_end) + stack=("${stack[@]::${#stack[@]}-1}") + ;; + object_key) + stack[${#stack[@]}-1]="${2@Q}" + ;; + array_beg) + val='[]' + stack+=('0') + ;; + array_end) + stack=("${stack[@]::${#stack[@]}-1}") + ;; + number) + val="$2" + ;; + string) + val="${2@Q}" + ;; + null|true|false) + val="$1" + ;; + error) + printf >&2 "json error: $1\n" "${@:2}" + ;; + esac + if [[ -n "$val" ]]; then + printf 'json' + local x + for x in "${stack[@]}"; do + printf '[%s]' "$x" + done + printf '=%s;\n' "$val" + fi + if [[ ${#stack[@]} -gt 0 && ${stack[${#stack[@]}-1]} =~ ^[0-9]$ ]]; then + stack[${#stack[@]}-1]=$((${stack[${#stack[@]}-1]}+1)) + fi +} + +json_tokenize handle_token |