Universität Ulm - Sektion Angewandte Informationsverarbeitung

10. und letztes (!) Übungsblatt (22.01.98 - 29.01.98)

zur Vorlesung Unix Datenbanken I (WS 97/98)

 

 

Aufgabe 1 (24 Punkte)

 

Bei der Erstellung von größeren Texten (Skripte, Bücher mit mehreren hundert Seiten) ist es wie bei der Erstellung von größeren Programmen zweckmäßig (man denke an mehrere Autoren, an Wiederverwendbarkeit, an Versionsverwaltung u.dgl.), den Text in kleinere Einheiten (z.B. nach inhaltlichen Gesichtspunkten) zu zerlegen und das Ergebnis (den Ausdruck oder die Darstellung am Bildschirm) via make zu produzieren.

Wir gehen hier aus guten Gründen von einem ASCII-basierten Textverarbeitungsprogramm aus, d.h. der Eingabetext wird durch ein Programm in eine entsprechende Ausgabesprache (z.B. Postscript) übersetzt (also kein WYSIWYG). Die Modularisierung erfolgt über Makros, die von einem oder mehreren Preprozessoren (siehe C-Preprozessor, include-Anweisung) verarbeitet werden.

Das im folgenden verwendete System (groff) spielt für die vorliegende Aufgabe keine Rolle. Der Text besteht aus einer Reihe von Dateien, die sequentiell bearbeitet werden. In diesen Dateien werden über Makro-Anweisungen weitere Dateien include-artig herangezogen, allerdings auf unterschiedliche Art. Generell stehen Makroanweisungen am Zeilenanfang und beginnen mit einem Punkt. An Makroanweisungen sollen unterschieden werden:

 

.so <filename>

entspricht dem #include <filename>; die Datei <filename> wird textuell eingefügt an die Stelle des Aufrufs und erneut bearbeitet

.PSPIC <filename> <scalefactor>

der Inhalt der Datei <filename> ist bereits in Postscript-Format und wird im Ergebnis an diese Stelle antsprechend skaliert eingefügt

 .IP .SOURCE <filename>

der Inhalt der Datei <filename> ist z.B. ein C-Programm; der Inhalt wird in einem bestimmten Font eins-zu-eins ggf. mit notwendiger Skalierung der Schriftgröße gesetzt, eine Interpretation des Inhalts findet nicht statt.

.IP .PROTOCOL <filename>

der Inhalt der Datei <filename> ist die Aufzeichnung eines Benutzerdialogs: Ausgaben des Rechners werden in einem bestimmten Font normal gesetzt, Eingaben des Benutzers werden in einem bestimmten Font fett gesetzt; alles andere wie bei .so

 

Achtung:

Dateien, die mit dem .so-Makro referiert werden, können selbst wieder o.g. Makroanweisungen enthalten.

Im Folgenden seien für die Dateinamen Konventionen vereinbart:

 

Das "Makefile" sehe der Einfachheit halber wie folgt aus (ausführbare Datei namens makeps):

 groff -s -t <Optionen> -P -l file[0-9] file13 file2* <Hauptfiles> >out.ps 2>err

 

Die Dateien zwischen den Optionen und der Ausgabe-Umlenkung (out.ps) stellen in der aufgeführten Reihenfolge (beachte: Bearbeitung durch die Shell) die Dateien der obersten Ebene dar. Von dort wird über die Makroaufrufe verzweigt: die Angabe der Dateinamen in den Makroaufrufen (<filename>) erfolgt absolut (Name beginnt mit einem /), vom aktuellen Katalog (Name beginnt mit ./) aus oder der Name ist ein reiner Dateiname (keine Pfadbezeichnung). Verweise "nach oben" (Pfadname beginnt / enthält ein ..) sollen nicht vorkommen.

  

Ihre Aufgabe :-) lautet:

Schreiben Sie ein tcl-Skript (unter Nutzung von Unix-Kommandos wie egrep oder sort), das ausgehend von den Hauptfiles (in makeps) alle zu diesem "Werk" gehörenden Dateien ausgibt. Weiterhin sollen alle Dateinamen, die statt einer .ps- oder .pic-Endung eine andere Endung (z.B. .fig oder .gif) haben, mitausgegeben werden.

Alle so bestimmten Dateien sollen dann via tar archiviert werden. Ein Testdatenbestand steht Ihnen als ge-tar-tes und ge-zip-tes File zur Verfügung!

Zergliedern Sie Ihr Programm in Prozeduren - beachten Sie, daß Sie bei der Verwendung der Rekursion eine Schranke für die Rekursionstiefe (z.B. auf 5) setzen!

 

Anmerkung:

Da das Programm zur Erzeugung der Ausgabe (hier: groff) bereits erfolgreich gearbeitet hat, ist die Existenz oder die Lesbarkeit von Dateien nicht mehr zu prüfen!