#!/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 perä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"
# compgen -v | grep [[:lower:]] | grep -v ^_
for skriptin_listaus in $(declare) #$(cat "${0}")   
do
  [[ $skriptin_listaus = TestaaMuuttuja ]] && break              
  [[ ! $skriptin_listaus = *[\=]* ]] && continue                     # jos rivillä ei ole yhtäkuinmerkkiä 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 > ${skriptin_listaus%%[*} ]] && muuttujan_nimi=${skriptin_listaus%%[*} # muuttuja on matriisi ja assosiatiivisen osoite sotkisi joten se stripataan pois
  [[ $muuttujan_nimi = *[[:lower:]]* ]] && TestaaMuuttuja ${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}"  
}
