Progetto che fu assegnato nell'ambito del vecchio corso di LSO col prof. Foggia. Lo posto perchè comunque penso che possa tornare utile.
Lo script esamina tutti i file .h della directory corrente, individuando quali sono le costanti simboliche definite in ciascun file attraverso #define.
Questo script, quindi, deve esaminare tutti i file .c della directory corrente per individuare quali usano una costante simbolica. L'output dello script indica per ciascuna costante il file e il numero di linea in cui è definita, e i file e i numeri di linea in cui è usata.
[codice-bash:30z8p2um]#!/bin/bash
#funzione che esegue il filtraggio di righe fornite da un'istruzione grep -n; elimina il percorso del file dalla riga e il
#contenuto della riga stessa, lasciando solo il nome del file e il numero di riga
function filter() {
file="${1%%:*}"
file="${file##*/}"
cont="${1#*:}"
cont="${cont%%:*}"
echo $file:$cont
return
}
(
IFS=$'\n' #cambio della IFS
#ricerca di tutti i file .h e .c nella directory corrente
hfiles=`find . -iname '*.h'`
cfiles=`find . -iname '*.c'`
#se non esistono file .h nella directory corrente stampa un messaggio di errore e viene terminata l'esecuzione
if [[ -z $hfiles ]]; then
echo "Errore: nessun file .h trovato!"
exit
fi
#nei file .h vengono ricercate tutte le righe che contengono la definizione di una costante simbolica;
#queste righe vengono filtrate usando il comando sed: viene eliminata la stringa "#define" con tutti gli spazi che si
#trovano prima e dopo,e viene eliminato tutto ciò che si trova a destra del primo spazio tra il nome della costante e
#il valore
fileconsts=`grep -n -H "#define " $hfiles | sed 's/ *#define *//;s/ .*$//'`
#-H: assieme alla riga trovata viene fornito sempre in uscita il pathname completo del file in cui si trova la riga
#-n: assieme alla riga trovata viene fornito il numero di riga
for fcc in $fileconsts; do
con="${fcc##*:}" #eliminazione del pathname e n.riga in modo da far rimanere solo il nome della costante
echo $con #stampa a video del nome della costante
echo -e "\tdefinita in: "$(filter $fcc)
#-e: il comando interpreta il carattere backslash \ come parte di un carattere speciale (ad esempio "\t")
if [[ -n $cfiles ]]; then #il ciclo di ricerca è eseguito solo se esistono dei file .c nella directory
cmatches=$(grep -n -H $con $cfiles) #cerca le righe in cui sono usate le costanti nei file .c
for match in $cmatches; do
echo -e "\tusata in: "$(filter $match)
done
fi
done
)[/codice-bash]
Corsi di Laurea
ROX @ Unisa - Forum degli studenti di Ingegneria utilizza i cookie. Se prosegui la navigazione accetti il loro uso.
Accetto l'uso dei cookie