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 
  
  
 
  | 
  |  |