#!/bin/bash # Hash maps written in/for GNU/BASH. # Copyright (C) 2006 Matous Jan Fialka. # Released under the terms of GNU/GPL. function hashmap() # usage: hashmap name [ key [ value ] ] -> none { [[ "$1" ]] && eval '[[ "'\$2':'\$3'" != ":" ]] && { HASHMAP_'$1'_KEYS=( "${HASHMAP_'$1'_KEYS[@]}" "'\$2'" ) HASHMAP_'$1'_VALS=( "${HASHMAP_'$1'_VALS[@]}" "'\$3'" ) } || '$1'(){ hashmap '$1' "$1" "$2"; }' return 0 } function hashmap_valof() # usage: hashmap_valof name [ key ] -> value { [[ "$1" ]] && { eval 'local i=0 for (( i=0; i<${#HASHMAP_'$1'_KEYS[@]}; ++i )); do [[ "${HASHMAP_'$1'_KEYS[i]}" == "'\$2'" ]] && \ printf -- "%s\\n" "${HASHMAP_'$1'_VALS[i]}" done' } return 0 } function hashmap_vals() # usage: hashmap_vals name -> value1 .. valueN { [[ "$1" ]] && eval 'printf -- "%s\\n" "${HASHMAP_'$1'_VALS[@]}"' return 0 } function hashmap_keyof() # usage: hashmap_keyof name [ value ] -> key { [[ "$1" ]] && { eval 'local i=0 for (( i=0; i<${#HASHMAP_'$1'_VALS[@]}; ++i )); do [[ "${HASHMAP_'$1'_VALS[i]}" == "'\$2'" ]] && \ printf -- "%s\\n" "${HASHMAP_'$1'_KEYS[i]}" done' } return 0 } function hashmap_keys() # usage: hashmap_keys name -> key1 .. keyN { [[ "$1" ]] && eval 'printf -- "%s\\n" "${HASHMAP_'$1'_KEYS[@]}"' return 0 } function hashmap_dump() { [[ "$1" ]] && { eval 'local i=0 for (( i=0; i<${#HASHMAP_'$1'_KEYS[@]}; ++i )); do printf -- "hashmap %s %s %s \\n" '$1' \ "'"'"'${HASHMAP_'$1'_KEYS[i]}'"'"'" \ "'"'"'${HASHMAP_'$1'_VALS[i]}'"'"'" done' } return 0 } # vim:syn=sh: