home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* SUCH.PAS *)
- (* sucht Files in allen Verzeichnissen *)
- (* des aktuellen Laufwerks *)
- (* Turbo Pascal 3.0 *)
- (* (c) 1988 by Gerd Brinkmann & PASCAL International *)
- (* ------------------------------------------------------ *)
-
- PROGRAM Such;
-
- TYPE
- str = STRING[64];
- register = RECORD
- ax,bx,cx,dx,bp,si,di,ds,es : INTEGER;
- END;
- VAR
- akt_Verzeichnis,
- such_datei : str;
- verz_stack : ARRAY[0..255] OF Str;
- stackanfang,
- stackende : BYTE;
- dateien : INTEGER;
-
- (* ------------------------------------------------------ *)
- PROCEDURE Push_Dir ( name : str );
- (* schiebt einen String auf den Verzeichnisstack *)
-
- BEGIN
- verz_stack[stackanfang] := akt_Verzeichnis + '\' + name;
- stackanfang := SUCC(stackanfang);
- END;
-
- (* ----------------------------------------------------- *)
- PROCEDURE Pop_Dir ( VAR name : Str );
-
- (* holt einen String vom Verzeichnisstack und *)
- (* setzt das aktuelle Directory auf diesen String *)
-
- BEGIN
- name := verz_stack[stackende];
- stackende := SUCC(stackende);
- ChDir(name);
- END;
-
- (* ----------------------------------------------------- *)
- PROCEDURE Hole_DTA ( VAR es, bx : INTEGER );
-
- (* Disk Tranfer Adresse lesen *)
- VAR
- reg : register;
- BEGIN
- reg.ax := $2F00;
- MsDos(reg);
- es := reg.es;
- bx := reg.bx;
- END;
-
- (* ----------------------------------------------------- *)
- PROCEDURE such_ersten_Eintrag ( such_string : str;
- attribut : INTEGER;
- VAR status : INTEGER );
-
- (* ersten Verzeichnis-Eintrag, der den Suchkriterien *)
- (* in 'such_string' und 'attribut' genügt, suchen *)
-
- VAR
- reg : register;
- BEGIN
- such_string := such_string + #0;
- reg.ax := $4E00;
- reg.ds := Seg(such_string[1]);
- reg.dx := Ofs(such_string[1]);
- reg.cx := attribut;
- MsDos(reg);
- status := Lo(reg.ax);
- END;
-
- (* ----------------------------------------------------- *)
- PROCEDURE such_weiteren_Eintrag ( VAR status : INTEGER );
-
- (* nächsten Verzeichnis-Eintrag suchen *)
-
- VAR
- reg : register;
- BEGIN
- reg.ax := $4F00;
- MsDos(reg);
- status := Lo(reg.ax);
- END;
-
- (* ----------------------------------------------------- *)
- PROCEDURE Hole_Name ( VAR file_name : str );
-
- (* Name des gefundenen Eintrags aus der DTA extrahieren *)
-
- VAR
- es, bx : INTEGER;
- BEGIN
- Hole_DTA(es,bx);
- bx := bx + 30;
- file_name := '';
- WHILE mem[es:bx] <> 0 DO BEGIN
- file_name := file_name + CHR(mem[es:bx]);
- bx := SUCC(bx);
- END;
- END;
-
- (* ----------------------------------------------------- *)
- PROCEDURE such_Eintraege ( such_string : str );
-
- (* sucht im aktuellen Directory erst nach Verzeichnis- *)
- (* einträgen, die auf den Verzeichnis-Stack kommen und *)
- (* dann nach Einträgen, die dem Suchstring genügen *)
-
- VAR
- file_name : str;
- es, bx, status : INTEGER;
- BEGIN
- Hole_DTA(es,bx);
- such_ersten_Eintrag('*. ', 18, status);
- WHILE status = 0 DO BEGIN
- IF (mem[es:bx+21] AND 16) = 16 THEN BEGIN
- Hole_Name(file_name);
- IF file_name[1] <> '.' THEN Push_Dir(file_name)
- END;
- such_weiteren_Eintrag(status);
- END;
- such_ersten_Eintrag(such_string, 39, status);
- WHILE status = 0 DO BEGIN
- dateien := SUCC(dateien);
- Hole_Name(file_name);
- WriteLn(akt_Verzeichnis,'\',file_name);
- such_weiteren_Eintrag(status);
- END;
- END;
-
- (* ----------------------------------------------------- *)
- PROCEDURE Suche ( such_string : str );
-
- (* steuert die Suche durch den Verzeichnisbaum *)
- VAR
- Start_Verzeichnis : str;
- dirs : INTEGER;
- BEGIN
- GetDir(0,Start_Verzeichnis);
- akt_Verzeichnis := '';
- ChDir('\'); (* Root-Verzeichnis setzen *)
- stackanfang := 0; (* Stack *)
- stackende := 0; (* initialisieren *)
- dateien := 0;
- dirs := 1;
- such_Eintraege(such_string);
- WHILE stackanfang <> stackende DO BEGIN
- (* Stack leer ? *)
- dirs := SUCC(dirs);
- Pop_Dir(akt_Verzeichnis);
- such_Eintraege(such_string);
- END;
- WriteLn;
- Write('Es wurden ',dirs,' Verzeichnis(se) durchsucht');
- WriteLn(' und ',dateien,' Datei(en) gefunden');
- ChDir(Start_Verzeichnis);
- END;
-
- (*------------------- HAUPTPROGRAMM -------------------*)
- BEGIN
- WriteLn;
- IF ParamCount > 0 THEN such_datei := Paramstr(1)
- ELSE BEGIN
- Write('Bitte Suchbegriff eingeben : ');
- ReadLn(such_datei)
- END;
- IF (POS('\',such_datei) > 0) OR
- (POS(':',such_datei) > 0) THEN
- WriteLn('Pfad- oder Laufwerksangaben ',
- 'sind nicht erlaubt !')
- ELSE
- IF such_datei <> '' THEN Suche(such_datei);
- END.
- (* ------------------------------------------------------ *)
- (* Ende von SUCH.PAS *)