Im Magazin „CHIP SPECIAL", Ausgabe 1, wurde der folgende Artikel abgedruckt.
Dieses Programm beschreibt eine Methode zur Dokumentation von TURBO-Pascal-Programmen.

PLIST kreiert Spitzen-Listings

*liefert die schönsten und informativsten Pascal-Listings
*lückenlose Zeilennummern
*Markierung der reservierten Wörter
*an jeden Drucker anzupassen
*druckt INCLUDE-Files auf Wunsch
*hält automatisch Abschnitte zusammen
*zeigt Verschachtelungstiefe
*voll TLIST kompatibel
*erzeugt CROSSREFERENZ-Liste
*durch binäre Suchbäume sehr schnell

Man kann halt nicht alles haben. TURBO-Pascal bietet ein so ausgezeichnetes Preis/Leistungsverhältnis, daß man die Mängel des mitgelieferten Ausdruckprogramms TLIST gern in Kauf nimmt. Denn, ganz abgesehen von den wenigen Möglichkeiten, dieses Programm arbeit zudem noch fehlerhaft. So werden zwar nicht alle reservierten Worte gefunden, dafür aber auch in Kommentaren und Strings unterstrichen. Druckeranpassungen sind nicht vorgesehen. Bei der Zeilenummerierung treten bei Punkt-Kommandos immer Lücken auf. Und je nachdem, ob man INCLUDE-Files ausgedruckt haben will oder nicht, muß man die Aufrufe hierfür im Quelltext hin- und herschieben.

Doch jetzt können Sie dieses Programm getrost löschen. Mit PLIST erhalten Sie einen Pascal-Lister, der auch höchsten Ansprüchen gerecht wird.

Bedienung

Die Anwendung des Programms ist stark an die von TLIST angelehnt. Nach dem Aufruf erscheint auf dem Bildschirm:
  PLIST vers, 3.6
  Programmname oder ? oder RETURN
  fuer Ende
Die Eingabe eines Fragezeichens bewirkt die Anzeige einer kurzen Programmerläuterung mit einer Beschreibung der Formatieranveisungen (siehe Bild).
Wenn Sie einen Programmanmen eingeben und das entsprechende File gefunden wird, können Sie unter folgenden Optionen beliebig viele auswählen:

LZeilennummern werden ausgedruckt
Mreservierte Wörter werden markiert
IInclude-Files werden ausgedruckt
ATextabschnitte werden zusammengehalten
VVerschachtelungstiefe wird angezeigt
CCrossreferensliste wird erzeugt

Optionen

Die Optionen L und M entsprechen denen von TLIST. Die Markierung der reservierten Wörter kann im Programm an ihren Drucker angepasst werden. Falls sie mehrere Drucker besitzen, können Sie ja auch mehrere Versionen des Programms erstellen. Die Programme hier im Heft wurden mit einem Typenraddrucker erstellt. Zur Hervorhebung der reservierten Wörter wurde ein dreifacher Schattendruck eingestellt. Bei Matrixdruckern bietet sich auch fett-kursiv oder unterstrichen-kursiv an.

Include-Files werden auf demselben Laufwerk erwartet, auf dem sich auch das Hauptprogramm befindet. Wenn ein Include-file ausgedruckt wird, erscheint auf dem Bildschirm 'Including '. Falls ein File gesucht aber nicht gefunden wird, erfolgt die Meldung 'Include-File not found'.

Die Option A bewirkt, daß Textabschnitte auf einer Seite zusammengehalten werden, wann immer das möglich ist. Erfolgt nämlich ein Seitenumbruch mitten in einer verschachtelten Aaweisungsfolge, so geht der ganze Überblick verloren. Wenn also ein Textabschnitt nicht mehr ganz auf die laufende Seite paßt, so wird gleich eine neue Seite begonnen. Anfang und Ende von Textabschnitten werden durch Leerzeilen, Punktkommandos und Include-Anweisungen definiert. Da Sie innerhalb von kleineren Blöcken kaum Leerzeilen einfügen, entsprechen die Textabschnitte meist unmittelbar auch logischen Abschnitten.

Die Ausgabe der Verschachtelungstiefe ergibt eine zusätzliche Information, der besonders große Bedeutung bei der Fehlersuche in Programmen zukommt. Gerade im Hochschulbereich wird auf die Angabe der Verschachtelungstiefe großer Wert gelegt. Ein vergessenes 'END' oder falsch gasetzte Kommentarzeichen zum Beispiel werden schnell und sicher erkannt.

Eine Crossreferenz-Liste (=Querverweisliste) wird man sich immer dann mit ausdrucken lassen, wenn ein Programm überarbeitet, ergänzt oder woanders eingebaut werden soll. Alle anwenderdefinierten Bezeichner werden alphabetisch sortiert mit Angabe ihrer Vorkommen (=Zeilennummer) ausgedruckt. Dabei wird, wie auch vom Compiler, nicht zwischen Groß- und Kleinschrift unterschieden. Falls ein Bezeichner in einer Zeile mehrfach auftritt, so wird die Zeilennummer nur einmal aufgeführt. Wenn sie sine Crossreferenz-Liste wollen, so fragt das Programm anschließend nach der Zeilenabreite ihres Druckers. Mit dieser Angabe kann der Ausdruck optimal formatiert werden.

Nachdem Sie Ihre Optionen ausgewählt haben, könen Sie noch bestimmen, ob nach jeder Druckseite gewartet werden soll. Dadurch ist aucg Einzelblattverarbeitung möglich.

Alle Programne hier im Heft wurden alt der Optionskombination LMIAV ausgedruckt. Bei PLIST selbst wurde zusätslich noch die Crossreferenz-Liste ausgedruckt. Bei den Demo-Programmen wurde der Ausdruck der Include-Files weggelassen.

Programmtechnische Details

PLIST ist dae komplexeste Programm des Hefts. Wieder einmal sind es dynamische Strukturen, die die Leistungafälligkelt und Flexibilität bewirken. Das Einlesen des Programmtextes erfolgt immer abschnittweiee in einen Einlesepuffer. Ist dieser noch eine einfach, verkettete Liste, so hat die Crossreference-Liste die Struktur eines binären Suchbaums, an dessen Knoten jeweils wieder einfach verkettete Listen (=die Zeilennummern) 'hängen'. Über den Aufbau des binären Suchbaums wird beim Programm BAUMDRMO mehr gesagt. Prinzipiell eignet sich der Aufbau dieser Struktur auch zum Erstellen des Index in Büchern.

Das Zusammenspiel der dynamischen Strukturen demonstriert eindrucksvoll die hervorragende Heap-Verwaltung (= freier Speicher für dynamische Variablen)-Verwaltung in Turbo-Pascal. Der Puffer wird immer wieder gelöscht, der Suchbaum stetig aufgebaut. Die Standardprozedur 'dispose' kann also ohne Einschränkung eingesetzt werden.

Eine besonders angenehme Erweiterung, die Turbo-Pascal gegenüber anderen Versionen bietet, ist die Möglichkeit der 'initialisierten Variablen'. Im Programm kann man sie an verschiedenen Stellen finden, zum Beispiel:
const PL : integer = 72;
Auch die Felder 'Standardbezeichner' und 'Reswords' sind so aufgebaut. Dabei wird gleich doppelt gespart: Sie sparen Zeit beim Rintippen, da Sie ohne diese Möglichkeit umständliche Initilisierungsroutinen schreiben müßten. Der Compiler spart Speicherplatz ein, indem er diese Variablen gleich im Programa-Code anlegt. Allerdings muß beim Einsaätz von solchen Variablen eine Besonderheit beachtet werden. Die Variablen werden durch den Compiler und nicht durch das Programm initialisiert. Wenn also die Werte verändert wurden, so haben die Variablen beim wiederholten Start des Programms die veränderten Inhalte! Dies gilt natürlich nicht, wenn das Programm neu geladen wurde. Wenn Sie aber kleinere Programme im Speicher compilieren und mehrmals hintereinander mit 'R' starten, kann dieses Phänomen eigenartige Reaktionen hervorrufen.

Die "beiden Felder für die reservierten Wörter and die Standardbezeichner sind alphabetisch geordnet. Das ermöglicht eine schnelle binäre Suche innerhalb dieser Felder. Da diese Methode auf alle geordneten. Strukturen angewandt werden kann, sollten sich Anfänger schnell damit vertraut machen.

Da Pascal eine formatfreie Sprache ist, die einzelnen Prozeduren den Programmtext aber zeilenweise abarbeiten, mußten alle Flags global definiert werden. Zudem wird ganz gezielt mit sog. Seiteneffekten gearbeitet. So berechnet zum Beispiel die Funktion 'reserviert' nebenbei die Verschatelungstiefe. Oder die Funktion 'Sonderzeile' setzt das INCLUDE-Flag. Normalerweise sind solche Beeinflussungen von globalen Variablen durch Punktionen unbedingt zu vermeiden. Eine Ausnahme, wie in diesem Fall, kann höchstens durch erhöhte Effizienz gerechtfertigt werden.

Anregungen

Es gibt kein Programm, das sich nicht verbessern läßt. So kann auch PLIST bei Bedarf noch erweitert und ergänzt werden. Allerdings ist die vorliegende Version bereits sehr ausgetüftelt und dürfte in den allermeisten Fällen gute Ergebnisse liefern. Die hohe Yersionsnmmer ist keine Spielerei: Das Programm wurde immer wieder den eigenen Bedürfnissen entsprechend überarbeitet.

Aus PLIST kann auch BLIST oder CLIST gemacht werden, also ein BASIC- oder C-Ausdruckprogramm. Alle wichtigen Prozeduren sind bereits vorhanden. Sogar ein A(ssembler)-Lister wäre eine sinnvolle Aufgabe.

So hilft Ihnen PLIST

Geben Sie den Programm-Namen ein oder ? oder RETURN für Ende: ?

Um den Ausdruck des Programms zu formatieren, koennen Sie folgende Punktkomnandos benuetzen: (Syntax : {.Kommando})

KommandoWirkungVoreinstellung
 
PL nnSeitenlaenge72
MT nnRand oben3
MB nnRand unten3
PO nnRand links0
CP nnNeue Seite bei weniger als n Zeilen0
PANeue Seite
HEKopfzeileListing of ... PAGE #
FOFusszeile(keine)
L+/L-Listing ein/aus
A+/A-Autoblock ein/aus

Alle Kommandos ausser HE und FO koennen auch in eine Zeile geschrieben werden. Beispiel {.PL 64, MT 8, PO 5}
In HE und FO kann # fuer die Seitennumner angegeben werden.

Listing von PLIST.PAS
Listing von PLIST-1.INC
Listing von PLIST-2.INC
Listing von PLIST-3.INC
Listing von PLIST-4.INC
Listing von PLIST-5.INC
Das Listing
Die Crossreferenz-Liste
Die Statische Struktur

Eingescanned von Werner Cirsovius
November 2012
© CHIP Verlag