#!/bin/bash  
# petteriIII 21.2.2013 
# Xref-ohjelma tulostaa muuttujien arvot mikäli niiden nimessä on ainakin yksi pieni kirjain tai kun niiden nimi on pelkästään yksi suuri kirjain jonka oerässä voi olla yksi numero.

# muutujien määrittelyssä ei lueta ohjelmalistausta muissa tarkoituksissa kuin:
# - luetaan declare-lauseet ja tulostetaan ne sellaisinaan mutta vaikka ne olisivat ristiriitaisia tulostuksen kanssa niin niitä ei käytetä. 
#   declare-lauseitahan ei tarvitse olla ja mikäli se on ristiriidassa tulosteen kanssa on se todennäköisemmin väärä.
# - luetaan ja tulostetaan funktiokutsut.

# echo -e "funktiot paikasta:"${0%/OMATSKRIPTIT*}"/OMATSKRIPTIT/FUNKTIOKIRJASTO/Xref_funktiot liitetään koodiin" 

function Xref () {
function TulostaMuuttuja () {
[[ $(eval echo \$$1) ]] && echo -n $1' on numero- tai tekstimuuttuja arvoltaan: ' && eval echo \$$1 || echo $1" on määrittelemätön"
}

function TulostaMatriisi () {
echo $1' on matriisi.' 
[[ $(eval echo \${$1[*]}) ]] && { 
echo -n 'arvot    : '; eval echo \${$1[*]}   # arvojen väliin tulostuu välilyönti
echo -n 'osoitteet: '; eval echo \${!$1[*]}  # osoitteiden väliin tulostuu välilyönti. 
}; echo ;}

function TestaaMuuttuja () { 
[[ $(eval echo \${!$1[*]} | cut -sd ' ' -f 2) ]] && TulostaMatriisi $1 && return # Matriisi ei voi olla määrittelemätön vaan silloin se on tavallinen muuttuja.
[[ $1 ]] && TulostaMuuttuja $1 
# [[ $(eval echo \$$1) ]] && TulostaMuuttuja $1
echo
}

# function Xref () { # echo -e "Xrefiä on kutsuttu skriptistä:"${0}".   Kutsu tehtiin riviltä:"${BASH_LINENO[0]}"\n\n"
( set -o posix ; set ) > /tmp/delme 
for skriptin_listaus in $(cat /tmp/delme)   
do
  [[ $skriptin_listaus = TestaaMuuttuja ]] && break              
  [[ ! $skriptin_listaus = *[\=]* ]] && continue                     # jos rivillä ei ole yhtäkuin-merkkiä niin rivin voi ohittaa 
  [[ ${skriptin_listaus:0:1} = \$ ]] && continue                     # tavallisesti muuttuja ei voi alkaa merkillä $. 
  MUUTTUJAN_NIMI=$(echo ${skriptin_listaus%%=*})                     # muuttujan nimeksi tulee merkit ennen yhtäkuinmerkkiä 
  [[ $MUUTTUJAN_NIMI = *[[:lower:]]* ]] && TestaaMuuttuja e #$MUUTTUJAN_NIMI # jos muuttujanimestä löytyy yksikin pieni aakkonen niin Xref hyväksyy sen 
  # [[ ${MUUTTUJAN_NIMI:0:1} = [A-Z] && ${MUUTTUJAN_NIMI:1} != [A-Z] ]] && TestaaMuuttuja $MUUTTUJAN_NIMI         # isolla kirjoitetut yksimerkkiset muuttujanimet hyväksytään 
done

apu=$(cat "${0}" | grep function ); [[ $apu > 0 ]] && echo "listaus skriptin funktioista:" &&  echo -e ' '"${apu[@]/%/\n}"  
}  
