Filter und pipes |
|
|
kurze Entwicklungszeit
schrittweise Verfeinerung
|
|
lange Laufzeit
|
| |
Aufgabe |
crossreference list für die Identifikatoren
in einem C-Programm
|
| |
.1 |
alle Identifkatoren finden
|
.2 |
alle Zeilennummern zu einem Identifikator finden
|
.3 |
formatieren
|
| |
.1.1 |
alle Wörter finden, Sonderzeichen löschen
|
.1.2 |
Zahlen löschen
|
.1.3 |
Schlüsselwörter löschen
|
| |
.2.1 |
Identifikatoren suchen: egrep
|
.2.2 |
aus egrep-Ausgabe Zeilennummern extrahieren
|
| |
.1.3.1 |
ckeywords erzeugt Liste aller C-Schlüsselwörter
|
.1.3.2 |
Mengenoperationen mit sort und uniq simulieren
|
| |
Lösung |
|
| |
woerter |
cat "$@" \
| tr -sc A-Za-z '\012'
|
| |
identifier0 |
cat "$@" \
| tr -sc A-Za-z_0-9 '\012' \
| sort -u
|
| |
identifier1 |
cat "$@" \
| tr -sc A-Za-z_0-9 '\012' \
| sed 's|^[0-9].*$||' \
| sort -u
|
| |
identifier |
{ cat "$@" \
| tr -sc A-Za-z_0-9 '\012' \
| sed 's|^[0-9].*$||' \
| sort -u
ckeywords
ckeywords
} | sort \
| uniq -u
|
| |
|
Dieses Skript funktioniert nur wenn ckeywords ein gültiges Kommando ist,
also wenn ckeywords über PATH erreichbar ist
|
|
Momentanes Arbeitsverzeichnis im Pfad?
|
identifier2 |
which ckeywords 2>/dev/null || \
{ echo "$0: program ckeywords not found" 1>&2
exit 1
}
{ cat "$@" \
| tr -sc A-Za-z_0-9 '\012' \
| sed 's|^[0-9].*$||' \
| sort -u
ckeywords
ckeywords
} \
| sort \
| uniq -u
|
| |
|
Defensive Programmierung
Test, ob ckeywords zur Verfügung steht.
|
ckeywords |
function ckeywords () {
cat << 'ende keywords'
auto
break
case
char
const
continue
default
do
double
else
enum
extern
float
for
goto
if
int
long
register
return
short
signed
sizeof
static
struct
switch
typedef
union
unsigned
void
volatile
while
ende keywords
}
ckeywords
|
| |
zeilennummern |
ident=$1
shift
cat "$@" \
| grep -n -E "\<$ident\>" \
| sed 's|:.*$||'
|
| |
crossref |
file="$1"
for id in $(identifier "$file")
do
echo "$id"
zeilennummern "$id" "$file" \
| pr -8 -b -t
echo ""
done
|
| |
|
Skript ist verteilt auf mehrere kleine Dateien
|
| |
|
Funktionen ausnutzen
|
| |
cross |
function ckeywords () {
cat << 'ende keywords'
auto
break
case
char
const
continue
default
do
double
else
enum
extern
float
for
goto
if
int
long
register
return
short
signed
sizeof
static
struct
switch
typedef
union
unsigned
void
volatile
while
ende keywords
}
function identifier () {
(
cat "$1" \
| tr -sc A-Za-z_0-9 '\012' \
| sed 's|^[0-9].*$||' \
| sort -u
ckeywords
ckeywords
) \
| sort \
| uniq -u
}
function zeilennummern () {
local ident
ident=$1
shift
cat "$@" \
| grep -n "\<$ident\>" \
| sed 's|:.*$||'
}
file="$1"
for id in $(identifier "$file")
do
echo $id
zeilennummern $id "$file" \
| pr -8 -b -t
echo ""
done
|
| |