

	Dokumentation
	=============

Diese Dokumentation protokolliert unsere Bearbeitung der Semesteraufgabe. Sie
ist überdies ein Demonstrationsausdruck, der mit unserem eigenen
Textformatiererer erstellt wurde.  


Textformatieren gehört zu den ältesten Anwendungen des Betriebssystems Unix.
Das Prinzip, daß Leerzeilen Absätze trennen, ist auch sehr typisch, wie wir
beim Formatieren unseres Handbuches mit nroff (welches leider nicht
8-bit-clean zu sein scheint) durch xman feststellen konnten.


Zu entwickeln war ein Programm, das einen ASCII-Text auf eine vorgegebene
Breite rechts- oder linksbündig oder auch im Blocksatz formatieren kann. 
Auch mehrspaltige Formate und unterschiedliche Seitengrößen sollten
unterstützt werden. Der Formatierungsalgorithmus sollte die bei der
Formatierung zwangsläufig auftretenden Lücken möglichst klein halten und
gleichmäßig verteilen. Parameter wie Spaltenbreite und -anzahl sowie die
Seitengröße sollten über Kommandozeilenparameter einstellbar sein und bei
fehlenden Angaben auf plausible Defaultwerte gesetzt werden.
	Statt ASCII haben wir uns für die Obermenge Latin-1 entschieden, da es
bereits genügend ärgerliche Programme gibt, die nicht 8-bit-clean für Umlaute
sind.
	Für die Kommandozeilenoptionen haben wir uns für ein deutsches
pseudonatursprachliches Interface entschieden, weil wir dies für leicht zu
verstehen und leicht zu verinnerlichen halten.  
	Als Namen für unseren Textformatierer wählten wir 'tippe', da
Festschritttypen wie bei einer Schreibmaschine vorausgesetzt werden. Wir haben
'tform' als Namen verworfen, da dies zu hochtrabend für ein derart kleines
Programm mit nur wenigen Funktionen klingt.


Das Programm war entsprechend der Unixphilosophie als Eingabe-Ausgabefilter zu
gestalten. Genau genommen, hätte man es in vier Teile teilen können: einen
Absatztrenner, einen Zeilensetzer, einen Spaltenumbrecher und ein das ganze
korrekt pipendes Shellskript.
	Jedoch sind längst auch unter Unix größere Programme üblich, die viele
Funktionen vereinen. Wir haben uns entschieden, erst den gesamten Text in den
Speicher einlesen zu lassen, damit zu erkennen ist, wie lang er wird, und um
die Spalten der letzten Seite auszugleichen.  
	Anfangs erwogen wir, den halbformatierten Text in einer Temporärdatei
zwischenzuspeichern, jedoch ist es angesichts der Speichergröße und des brk()
unserer Rechner höchst unwahrscheinlich, daß die Speichergrenzen je erreicht
werden sollten, so daß wir den ganzen Text dynamisch ablegen.
	Man kann im Programmtext erkennen, daß die einzelnen Zeilenanfänge in
einer Liste statt in einem Array gespeichert werden, da wir Berührungsängste
mit einem realloc (große Zeilenzahl) hatten, dies würden wir jedoch heute zur
erhöhten Geschwindigkeit einbauen, wenn wir noch die Zeit hätten, das Programm
vor dem Abgabetermin zu überarbeiten.


Bei der Entwicklung kam es uns entgegen, daß sich die Aufgabe in mehrere
Teilaufgaben gliederte, so wurde zum Beispiel die Kommandointerpretation
seperat geschrieben und erst später eingegliedert. Obwohl wir zu
modularisieren gelernt haben, haben wir nun der Übersichtlichkeit halber nur
ein Listing abgegeben, eine Wiederverwendung einzelner Funktionen ist nämlich
eher unwahrscheinlich und unsere 15 Kilobyte Programmtext ließen sich locker
in 3 Sekunden übersetzen.  
	Gegen Ende der Semesterferien war das Programm noch vollkommen
unvollständig.  Es war schwer zu entscheiden, wie der Algorithmus im Detail
funktioniert, mit was für Hilfsvariablen er sich in C ausdrücken ließ und so
weiter.
	Man kann schlecht etwas zu Stande bringen, wenn man versucht, ohne
Konzept ein Programm in den Editor zu tippen. Es ist aber ebenso schwierig,
mit Papier und Bleistift ein Programm dieser Komplexität auszudenken, ohne daß
man z. B. von der Behandlung von Bindestrichen irritiert wird, wenn man sich
gerade mit Absatzerkennung beschaeftigt hat. Hier haben uns schließlich
Abstriche der Gestalt geholfen, daß wir auf unsere Ambitionen der Sorte
"Tabulatoren im Absatz sollen tabulieren", "Leerzeilen sollen intelligent
gestrichen werden", "Seiten sollen numeriert werden", "Sonderzeichen \f \v und
\r sollen ihrer üblichen Bedeutung angemessen interpretiert werden" verzichtet
haben.
	Wir haben trotzdem eine benutzerfreundliches Programm geschrieben, das
Absatzeinrückungen und Leerzeilen relativ treu zum Original überträgt und die
geforderte Funktionalität korrekt erfüllt.


Uns hat speziell an dieser Aufgabe gefallen, daß sie so überschaubar war, daß
man relativ sauber programmieren konnte und trotzdem mathematisch komplexe
Aufgaben beinhaltet waren. Es wird kaum auf Systemdienste von Unix
zurückgegriffen, dafür werden viele interessante C-Sprachelemente verwendet,
und die Sprache C haben wir schließlich erst in dieser Lehrveranstaltung
kennengelernt. Nicht gefallen hat uns die geraubte Zeit.