Dateisuche mit TURBO PascalFür die Verarbeitung von Dateien stellt TURBO Pascal (CP/M-80) die ProzedurenRESET(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:
Finds(name,nummer) ist wie folgt:
Zusammengestellt von
Werner Cirsovius
|