Vai al contenuto

Primario: Sky Slate Blackcurrant Watermelon Strawberry Orange Banana Apple Emerald Chocolate Marble
Secondario: Sky Slate Blackcurrant Watermelon Strawberry Orange Banana Apple Emerald Chocolate Marble
Sfondo: Blank Waves Squares Notes Sharp Wood Rockface Leather Honey Vertical Triangles
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
-->
Foto

[PROGETTO-BASH] trovare costanti in file .h


  • Effettua l'accesso per rispondere
Nessuna risposta in questa discussione

#1
Blackjack

Blackjack

    Moderatore globale

  • Moderatore
  • 2542 Messaggi:
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]


Immagine inviata
Immagine inviata
Immagine inviata

"L'amore è la capacità di avvertire il simile nel dissimile"




Leggono questa discussione 0 utenti

0 utenti, 0 ospiti, 0 utenti anonimi