(*---------------------------------------------------------------------------
  :Program.    ScanDir.mod
  :Contents.   Funktion zum Durchsuchen eines Verzeichnisses nach Dateien,
  :Contents.   die ein bestimmtes Muster erfüllen.
  :Author.     Andreas Vögele
  :Address.    Gartenstraße 13
  :Address.    71106 Magstadt
  :Address.    FIDO: 2:246/1115.6
  :Copyright.  PD
  :Language.   Oberon
  :Translator. Amiga Oberon Compiler 3.0
  :History.    V1.0 [Andreas Vögele] 23-Jul-93
---------------------------------------------------------------------------*)

MODULE ScanDir;

IMPORT d: Dos;

VAR
  Anchor - : d.AnchorPath;
  Error  - : LONGINT;      (* siehe Dos.mod *)
  FirstCall: BOOLEAN;
  
(*
 * ScanDir -- Durchsucht ein Verzeichnis nach Dateien, die das angegebene
 *            Muster erfüllen.
 *
 * Beispiel:
 *
 *   WHILE s.ScanDir("#?.mod", buffer) DO
 *     io.WriteString(buffer); io.WriteLn;
 *   END;
 *)

PROCEDURE ScanDir * (pattern: ARRAY OF CHAR; VAR pathname: ARRAY OF CHAR): BOOLEAN;
  (* $CopyArrays- *)
BEGIN
  REPEAT
    IF FirstCall THEN
      FirstCall := FALSE;
      Error := d.MatchFirst(pattern, Anchor);
    ELSE
      Error := d.MatchNext(Anchor);
    END;
  UNTIL (Error # 0) OR (Anchor.info.dirEntryType < 0);
  IF Error # 0 THEN
    d.MatchEnd(Anchor);
    FirstCall := TRUE;
    RETURN FALSE;
  END;
  COPY(Anchor.buf, pathname);
  RETURN TRUE;
END ScanDir;

BEGIN
  FirstCall := TRUE;
  Anchor.breakBits := LONGSET{d.ctrlC};
  Anchor.strLen    := LEN(Anchor.buf);
CLOSE
  d.MatchEnd(Anchor);
END ScanDir.
