TURBO Pascal 3.0 Projekte



Dateisuche mit TURBO Pascal

Für die Verarbeitung von Dateien stellt TURBO Pascal (CP/M-80) die Prozeduren RESET(file) und REWRITE(file) zur Verfügung. Nach dem Abarbeiten dieser Prozeduren erfolgt ein interner Aufruf zur Fehlerroutine von TURBO Pascal. Im Fehlerfall gibt das Programm eine Meldung aus und bricht ab. Mit der Direktive {$I-}RESET(file){$I+} lässt sich der Abbruch beim Öffnen einer nicht vorhandenen Datei vermeiden. (Der Programmierer sollte aber anschließend das Ergebnis verarbeiten, z.B. mit if IOresult<>0 then ...). Mit dieser Methode lässt sich gezielt nach einer Datei suchen, die allerdings einen eindeutigen Namen haben muss. Es kommt aber vor, dass nach mehreren Dateien gesucht werden soll, die dann auch noch einen nicht eindeutigen Namen haben, z.B. nach allen Dateien mit der Endung .TXT, was in CP/M als *.TXT angegeben wird.
In Mallard BASIC existiert dafür der Befehl FIND$(name,nummer). Hierbei ist name die Maske für die zu suchende Datei und nummer gibt an, die wievielte Datei gesucht werden soll. Ist die Suche erfolgreich, dann gibt FIND$ einen eindeutigen Dateinamen zurück. Im anderen Fall ist der zurückgegebene Dateiname leer.

Es soll nun eine Funktion für TURBO Pascal vorgestellt werden, die genau wie der BASIC-Befehl funktioniert. Die Basis für das Suchen einer Datei sind zwei BDOS-Funktionen, nämlich Search for First (Funktion 17) und Search for Next (Funktion 18). Für das erste Suchen wird die Adresse eines CP/M File Control Blocks verwendet, der bei den folgenden Suchaufrufen nicht mehr benötigt wird. Ist der Suchvorgang erfolgreich, dann gibt die BDOS-Suchfunktion eine Zahl im Bereich 0..3 zurück, andernfalls 255. Die Zahl zeigt auf einen von vier möglichen Einträgen im aktuellen DMA-Puffer. Da dieser Puffer 128 Bytes groß ist, ergibt sich als Ergebnis eine 32 Byte große Dateiinformation, die einem Verzeichniseintrag entspricht. Dabei ist das erste Byte die Benutzernummer, an die sich acht Zeichen für den Dateinamen und drei für den Dateitypen anschließen.

Für die Such-Funktion werden also folgende CP/M Strukturen benötigt:
  1. Ein FCB. Hierfür kann der Standard-FCB − ab Adresse 0x005C − verwendet werden.
  2. Ein Disk-Puffer. Hier kann der Standard-Puffer − ab Adresse 0x0080 − nicht verwendet werden, da TURBO Pascal ab Adresse 0x00A0 den Speicher für Systemwerte nutzt.
Da die Such-Funktion einen String übernimmt und auch übergibt, muss eine Konvertierung der unterschiedlichen Strukturen erfolgen. Der Ablauf der Funktion Finds(name,nummer) ist wie folgt:
  1. Die Prozedur StringToFCB konvertiert den Aufrufnamen in die FCB-Struktur.
  2. Dann wird solange gesucht, bis die Suche entweder erfolglos ist oder die gewählte Datei gefunden wurde.
  3. Die Prozedur FCBtoString konvertiert die FCB-Struktur in einen Dateinamen.
Listing des Beispielprogramms
[Hier das Modul FINDS.INC und hier der erwähnte Artikel "Turbo Directory"]

Zusammengestellt von Werner Cirsovius
Juli 2009