Hier werde ich versuche, die Funktionsweise von UDO in Grundzuegen
darzustellen. Ob mir das gelungen ist, muesst Ihr entscheiden, aber
sicherlich ist diese kurze Auflistung besser als nichts.
Dreh- und Angelpunkt sind eigentlich genau sieben Routinen:
- init_vars()
Hier werden interne Variablen auf ihre Defaultwerte
zurueckgesetzt und die Sprachstrings auf Deutsch voreingestellt.
- init_modules()
Alle Module werden initialisiert.
- udo()
Das Herzstueck, was alles weitere veranlasst, also das
Ueberpruefen, ob die Quelldatei vorhanden ist, das Anlegen von
Logfiles, der Aufruf von pass1() und pass2() sowie das
Schliessen aller geoeffneten Dateien am Ende der Uebersetzung.
- pass1()
Im ersten Durchlauf werden alle Kapitel, Labels, Aliase, Makros
und Definitionen ermittelt, die fuer den zweiten Durchgang von
eminenter Wichtigkeit sind, sei es fuer die Ausgabe der
Inhaltsverzeichnisse oder die automatische Referenzierung.
- pass2()
Im zweiten Durchlauf erfolgt die eigentliche Umsetzung des
Textes. Die vielen Anfragen sind bedingt durch die hier
beruecksichtigten verbatim-, raw- und table-Umgebungen sowie die
speziellen Umgebungen mittels !ifdest.
- tokenize()
Eine Zeile wird in Tokens zerlegt. Falls das erste Token ein
Kommando enthaelt, wird die entsprechende Funktion aufgerufen. Welche,
das wird vorher in einer Tabelle festgelegt. Die aufgerufenen Routinen
haben alle den Namen `c_' (sie lauteten mal alle
`convert_', aber aus Faulheit habe ich da eine kleine Kuerzung
vorgenommen). Ist kein Kommando am Anfang des Absatzes, werden die
Woerter der Zeile in einen internen Puffer aufgenommen, der momentan
statisch verwaltet wird und auf 800 Worte ausgelegt ist.
- token_output()
Hier wird ein kompletter Absatz ausgegeben. Dies ist eine
verdammt kniffelige Angelegenheit. Versucht bitte nicht zu verstehen,
was in dieser Routine alles abgefragt wird.
- exit_vars
Hier werden alle benoetigten Variablen wieder zuruecksetzt
sprich der waehrend der Ueberstzung alloziierte Speicher freigegeben.
Dies sieht im ersten Moment ziemlich einfach aus. Die ganze Sache
waere auch recht einfach, wenn man nicht zwischendurch noch genau
beruecksichtigen muesste, wann und vor allen Dingen in welcher
Reihenfolge
- Sonderzeichen,
- Schriftarten,
- Trennungsregeln,
- Referenzen,
- Makros und Definitionen sowie
- spezielle Platzhalter
angepasst werden muessen. Eine Aenderung der Aufrufreihenfolge der
Funktionen c_macros, auto_quote_chars,
auto_references, c_divis, c_tilde,
c_vars etc. hat mir schon manche schlaflose Nacht bereitet.