Home Inhaltsverzeichnis udo.c Speicherverwaltung mit um_*

6 UDOs grobe Funktionsweise

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:

  1. init_vars()
    Hier werden interne Variablen auf ihre Defaultwerte zurueckgesetzt und die Sprachstrings auf Deutsch voreingestellt.
     
  2. init_modules()
    Alle Module werden initialisiert.
     
  3. 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.
     
  4. 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.
     
  5. 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.
     
  6. 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.
     
  7. 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.
     
  8. 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

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.


Home Inhaltsverzeichnis udo.c Speicherverwaltung mit um_*