home *** CD-ROM | disk | FTP | other *** search
- (*-------------------------------------------------------*)
- (* QCD.PAS - Quick Change Dir *)
- (* Programm zum schnellen Wechseln im Verzeichnisbaum *)
- (* (C) Copyright 1989 by Mario Westphal & TOOLBOX *)
- (*-------------------------------------------------------*)
-
- PROGRAM qcd;
- USES CRT, DOS;
- {$M 19000,30000,30000} {* leider viel Stack für Rekursion! }
-
- PROCEDURE quickCD;
-
- TYPE
- soundstr = String[4];
- keyword = String[68];
- PathStr = String[68];
-
- CONST
- max_Stack = 255; {* maximale Anzahl der Dirs }
-
- VAR
- pfad, {* für Read_Path }
- aktverz, {* momentanes Dir }
- retverz : PathStr; {von hier Aufruf von QCD }
-
- fehler : Byte; {* für IORESULT }
-
- treefile : TEXT; {* für QCDTREE.DIR }
- puffer : array[1..2048] of Char; {* Puffer für TEXT }
-
- dirinfo : searchrec; {* für FINDFIRST/NEXT }
-
- verz_stack : array[1..max_Stack] of ^PathStr;
- {* die Pointerorgie für den Verzeichnisstack }
-
- merk_heap : Pointer; {* für MARK }
- s_anf,
- s_end : Byte; {* Zeiger für den Stack }
-
-
- PROCEDURE hilfeseite;
- BEGIN
- WRITELN('SYNTAX : QCD { /N } { <Laufwerk>:} { < Pfad',+
- 'name > }');
- WRITELN;
- WRITELN('PARAMETER : /N erstellt eine neue Verzeichnis',+
- '-Datei im');
- WRITELN(' Hauptverzeichnis des momentan',+
- ' gesetzten Laufwerks.');
- WRITELN;
- WRITELN('<Laufwerk> : geben Sie hier den Kennbuchstaben',+
- ' des Laufwerks an,');
- WRITELN(' das Sie als Standardlaufwerk setzen',+
- ' wollen.');
- WRITELN;
- WRITELN('<Pfadname> : hier können Sie einen vollständigen',+
- ' oder unvollständigen');
- WRITELN(' Pfadnamen angeben. Geben Sie kein',+
- ' Laufwerk an, bezieht');
- WRITELN(' sich Ihre Angabe auf das momentan',+
- ' gesetzte Laufwerk.');
- WRITELN;
- WRITELN('BESCHREIBUNG');
- WRITELN(' Kann QCD den von Ihnen angegebenen',+
- ' Pfad nicht finden, weil');
- WRITELN(' er unvollständig oder fehlerhaft',+
- ' ist, dann versucht QCD,');
- WRITELN(' einen ähnlich klingenden Pfadnamen',+
- ' zu finden.');
- WRITELN(' QCD gibt Ihnen den Pfad aus und',+
- ' fragt, ob Sie weitersuchen');
- WRITELN(' möchten, oder ob Sie im momentan',+
- ' gesetzten Verzeichnis');
- WRITELN(' bleiben wollen. Drücken Sie ',+
- '<RETURN>, dann sucht QCD weiter.');
- WRITELN(' Kann kein Pfad mehr gefunden werden',+
- ', wird in das');
- WRITELN(' Startverzeichnis zurückgewechselt.');
- END;
-
- FUNCTION FindLastPos(String1,String2:String):Byte;
- VAR i,v : Byte;
- tstr : string;
- BEGIN
- v := 0; {* initialisieren }
- FOR i := 1 TO LENGTH(string2) DO
- BEGIN
- tstr := COPY(string2,i,LENGTH(string1));
- IF tStr = string1 THEN v := i; {* Position zuweisen }
- END;
- FindLastPos := v; {* letzte Position von Str1 in Str2 }
- END;
-
- PROCEDURE beenden; {* zuvor mit MARK }
- BEGIN {* "gemerkte" Heap-Spitze }
- RELEASE(merk_heap); {* wieder freigeben }
- END;
-
- PROCEDURE LiesBaum(path:PathStr);
- VAR dirinfo : searchrec;
- BEGIN
- FINDFIRST(Path+'\*.*',$10,dirinfo); {* Nur DIR suchen }
- WHILE DOSERROR = 0 DO
- BEGIN
- IF (dirinfo.attr AND $10 <> 0) AND (dirinfo.name[1] <> '.')
- THEN
- BEGIN
- WRITELN(treefile,path+'\'+dirinfo.name);
- LiesBaum(Path+'\'+dirinfo.name);
- END;
- FINDNEXT(dirinfo);
- END;
- END;
-
- PROCEDURE New_Tree;
- BEGIN
- ASSIGN(treefile,'\QCDTREE.DIR');
- SETTEXTBUF(treefile,puffer); {* größerer Puffer }
- {* bringt Speed }
- {$I-}
- REWRITE(treefile); {* Datei zum Schreiben öffnen }
- {$I+}
-
- IF IORESULT <> 0 THEN {* wenn Fehler ! }
- BEGIN
- WRITELN(#7,'Verzeichnis-Datei kann nicht erzeugt werden!');
- EXIT;
- END;
-
- GETDIR(0,aktverz);
- aktverz := aktverz[1]+':'; {* Root Dir }
- WRITELN(treefile,aktverz+'\'); {* Erster Eintrag }
- liesbaum(aktverz); {* Verzeichnis scannen }
-
- CLOSE(treefile); {* Datei schließen }
-
- END;
-
- FUNCTION Read_Tree:Boolean;
- VAR pfadname : PathStr;
-
- PROCEDURE push_stack;
- BEGIN
- IF s_anf < Max_Stack THEN
- BEGIN
- NEW(verz_stack[s_anf]); {* neu erzeugen }
- verz_stack[s_anf]^ := pfadname;
- {* Dateieintrag auf den Stack }
- INC(s_anf); {* Zeiger aktualisieren }
- INC(s_end);
- END; {* von s_anf...}
- END;
-
- BEGIN
- s_anf := 2; {* initialisieren }
- s_end := 1;
-
- ASSIGN(treefile,'\QCDTREE.DIR');
- SETTEXTBUF(treefile,puffer);
-
- {$I-}
- RESET(treefile); {* zum Lesen öffnen }
- {$I+}
- fehler := IORESULT;
- CASE fehler OF
- 2 : BEGIN {* FILE NOT FOUND }
- WRITELN(#7,'Verzeichnis-Datei QCDTREE.DIR ',+
- 'nicht gefunden!');
- WRITELN('Bitte QCD mit der Option /N ',+
- 'aufrufen');
- WRITELN;
- END; {* von fehler = 2 }
-
- 0 : fehler := 0; {* alles klar...}
-
- ELSE fehler := 2; {* Fehler simulieren }
-
- END; {* von case... }
-
- IF fehler <> 0 THEN
- BEGIN
- read_tree := FALSE; {* Funktionsergebnis zuweisen }
- beenden; {* Heap freigeben }
- EXIT; {* verlassen }
- END;
-
- WHILE NOT EOF(treefile)
- DO BEGIN
- READLN(treefile,pfadname); {* Eintrag lesen }
- push_stack; {* auf den Stack }
- END; {* von not EOF... }
-
- CLOSE(treefile); {* Datei schließen }
- END;
-
- FUNCTION Meldung : BYTE;
- VAR choice : Char;
- BEGIN
- WRITELN('Neues Verzeichnis ist : ',aktverz);
- WRITELN('Weitersuchen ? [ <──┘ / ESC ]');
-
- REPEAT
- choice := READKEY;
- UNTIL (choice = #13) OR (choice = #27); {* RETURN/ESC }
-
- IF choice = #13 THEN meldung := 1
- ELSE Meldung := 0; {* Ergebnis zuweisen }
- WRITELN;
-
- END;
-
- FUNCTION soundex(W:keyword):soundstr;
- CONST
- soundkey: ARRAY['A'..'Z'] of Char =('0','1','2','3','2','1',
- '2','0','0','2','2','4','5','5','0','1','2','6',
- '2','3','0','1','0','2','0','2');
- VAR
- SWert : soundstr;
- I,K : Integer;
- Ch,LastCh : Char;
-
- BEGIN
- IF LENGTH(W) = 0 THEN SOUNDEX := '0000'
- ELSE
- BEGIN
- SWert := W[1];
- LastCh := ' ';
- FOR i := 2 TO LENGTH(W) DO
- BEGIN
- Ch := W[i];
- IF Ch IN ['A'..'Z'] THEN
- IF (soundkey[Ch] <> '0') AND
- (soundkey[Ch] <> LastCh) THEN
- BEGIN
- Swert := Swert + soundkey[Ch];
- LastCh := soundkey[Ch];
- END;
- END; {* for i...}
-
- IF LENGTH(Swert) > 4 THEN Swert := COPY(Swert,1,4)
- ELSE
- WHILE LENGTH(Swert) < 4 DO Swert := Swert+'0';
- SOUNDEX := Swert;
- END;
-
- END;
-
- FUNCTION Read_Path: BOOLEAN;
- VAR i : Byte;
-
- BEGIN
- IF PARAMCOUNT = 0 THEN {* nichts übergeben }
- BEGIN
- Read_Path := FALSE; {* Ergebnis zuweisen }
- hilfeseite; {* Seite mit Hilfestellung }
- EXIT; {* ausgeben }
- END
- ELSE {* ansonsten...}
- BEGIN
- pfad := PARAMSTR(1);
- Read_Path := TRUE;
-
- IF (COPY(pfad,1,2) = '/N') OR (COPY(pfad,1,2) = '/n') THEN
- BEGIN
- WRITELN('Verzeichnis-Datei QCDTREE.DIR wird erstellt.');
- WRITELN;
- new_tree; {* neue Datei anlegen}
- read_path := FALSE;
- CHDIR(retverz); {* in Startverzeichnis }
- EXIT;
- END; {* und dann abbrechen }
-
- WHILE (COPY(pfad,LENGTH(pfad),1) = '\') AND
- (LENGTH(pfad) > 1) DO DELETE(pfad,LENGTH(pfad),1);
-
- {* \\\ ausschalten }
-
- FOR i := 1 TO LENGTH(pfad) DO pfad[i] := UPCASE(pfad[i]);
- {* in Großbuchstaben umwandeln }
-
- END; {* von ELSE... }
-
- END;
-
- PROCEDURE such_pfad;
- VAR i : Word;
- vwert,
- swert : SoundStr;
- name : PathStr;
- found,
- size : Byte;
-
- BEGIN
- size := LENGTH(COPY(pfad,FINDLASTPOS('\',pfad)+1,12));
- found := 0; {* Länge des Suchnamens }
-
-
- FOR i := 1 TO s_end DO {* Stack scannen }
-
- IF pfad = COPY(verz_stack[i]^,FINDLASTPOS
- ('\',verz_stack[i]^)+1,12)
- THEN
- BEGIN
- found := 1; {* z.B. \XXXXXX }
- {$I-}
- CHDIR(verz_stack[i]^);
- {$I+}
-
- IF IORESULT <> 0 THEN
- BEGIN
- WRITELN(#7,'Falscher Eintrag in Verzeichnis-Datei');
- WRITELN('Bitte QCD mit der Option /N aufrufen');
- CHDIR(retverz);
- GETDIR(0,aktverz);
- found := 0;
- EXIT;
- END; {* von IORESULT <> 0 }
-
- GETDIR(0,aktverz);
- WRITELN;
- WRITELN('Neues Verzeichnis ist : ',aktverz);
- EXIT;
-
- END;
-
-
- swert := soundex(COPY(pfad,FINDLASTPOS('\',pfad)+1,size));
-
- FOR i := 1 TO s_end DO {* Stack scannen }
- BEGIN
- name := COPY(verz_stack[i]^,FINDLASTPOS
- ('\',verz_stack[i]^)+1,size);
-
- vwert:=Soundex(name); {* Soundex-Wert errechnen }
-
- IF swert = vwert THEN {* Soundex-Werte gleich }
- BEGIN
- found := 3;
- {$I-}
- CHDIR(verz_stack[i]^);
- {$I+}
- IF IORESULT <> 0 THEN
- BEGIN
- WRITELN(#7,'Falscher Eintrag in Verzeichnis-Datei');
- WRITELN('Bitte QCD mit der Option /N aufrufen');
- found := 0;
- CHDIR(retverz);
- EXIT;
- END; {* von IORESULT <> 0 }
-
- GETDIR(0,aktverz);
-
- IF meldung = 0 THEN
- BEGIN
- WRITELN;
- WRITELN('Neues Verzeichnis ist : ',aktverz);
- EXIT;
- END
- ELSE found := 4; {* weitersuchen }
-
- END; {* von swert = vwert...}
-
- END; {* von FOR i... }
-
-
- IF found = 0 THEN {* nichts gefunden ==> Anfangsbuchstabe }
-
- FOR i := 1 TO s_end DO
- IF pfad[1] = COPY(verz_stack[i]^,FINDLASTPOS
- ('\',verz_stack[i]^)+1,1)
- THEN
- BEGIN
- found := 3;
- {$I-}
- CHDIR(verz_stack[i]^);
- {$I+}
- IF IORESULT <> 0 THEN
- BEGIN
- WRITELN(#7,'Falscher Eintrag in Verzeichnis-Datei');
- WRITELN('Bitte QCD mit der Option /N aufrufen');
- found := 0;
- CHDIR(retverz);
- EXIT;
- END; {* von IORESULT <> 0...}
-
- GETDIR(0,aktverz);
- IF meldung = 0 THEN
- BEGIN
- WRITELN;
- WRITELN('Neues Verzeichnis ist : ',aktverz);
- EXIT
- END
- ELSE found := 4; {* gefunden, aber J gedrückt}
- {* also weitersuchen }
- END; {* von FOR i... }
-
-
- IF found = 3 THEN {* Weiter gedrückt }
- IF meldung = 1 THEN BEGIN END; {* Name ausgeben }
-
- IF found = 0 THEN {* Nichts gefunden }
- BEGIN
- CHDIR(retverz); {* zurück in Startverz. }
- WRITELN(#7,'Pfad nicht gefunden');
- EXIT;
- END;
-
- IF found = 4 THEN {* J gedrückt, aber nichts }
- BEGIN {* mehr gefunden }
- CHDIR(retverz);
- WRITELN;
- WRITELN('Kein weiteres Verzeichnis gefunden!');
- WRITELN;
- WRITELN('Startverzeichnis ',retverz,' wieder gesetzt.');
- EXIT;
- END; {* von found = 4 }
-
- END; {* von such_pfad }
-
- BEGIN
-
- WRITELN;
- WRITELN('QCD - Quick Change Dir, Version 1.1,',+
- ' (C) Copyright 1989 by Mario M. Westphal');
- WRITELN;
- {* sonst funktioniert das Programm nicht !!! }
-
- GETDIR(0,retverz); {* Startverzeichnis merken }
-
- IF NOT read_path THEN EXIT; {* nichts übergeben }
- {* also abbrechen }
- MARK(merk_heap); {* Heap-Spitze merken }
-
-
-
- IF (pfad[2] = ':') AND (LENGTH(pfad)=2)
- THEN pfad := pfad+'\'; {* C: ==> C:\ }
-
- {$I-}
- CHDIR(pfad); {* normal versuchen }
- {$I+}
-
- fehler := IORESULT;
-
- IF fehler = 3 THEN
- BEGIN {* Backslash voranstellen }
- IF pfad[1] <> '\' THEN pfad := '\'+pfad;
- {$I-}
- CHDIR(pfad); {* noch einmal versuchen }
- {$I+}
- fehler := IORESULT;
- IF pfad[1] = '\' THEN DELETE(pfad,1,1);
- END; {* von Fehler = 3 }
-
- CASE fehler OF {* FEHLER ABFANGEN }
- 0 : BEGIN
- GETDIR(0,aktverz);
- WRITELN('Neues Verzeichnis ist : ',aktverz);
- EXIT;
- END;
- {* Ungültige Laufwerksbezeichnung }
- 15 : BEGIN
- WRITELN(#7,'Falsche Laufwerksbezeichnung!');
- WRITELN('Startverzeichnis ',retverz,' wieder gesetzt.');
- CHDIR(retverz); {* zurück ins Startverz }
- beenden; {* Heap freigeben }
- EXIT; {* aussteigen }
- END;
- {* Laufwerk nicht bereit }
- 152 : BEGIN
- WRITELN(#7,'Laufwerk ',pfad[1]+': nicht bereit!');
- WRITELN('Startverzeichnis ',retverz,' wieder gesetzt.');
- CHDIR(retverz);
- beenden;
- EXIT;
- END;
- {* Hardware Fehler }
- 162 : BEGIN
- WRITELN(#7,'Fehler am Laufwerk ',UPCASE(pfad[1])+': !');
- WRITELN('Startverzeichnis ',retverz,' wieder gesetzt.');
- CHDIR(retverz);
- beenden;
- EXIT;
- END;
- {* Pfad nicht gefunden }
- 3 : BEGIN
- IF NOT read_tree THEN {* Fehler bei Readtree }
- BEGIN
- CHDIR(retverz);
- WRITELN('Startverzeichnis ',retverz,' wieder gesetzt.');
- beenden;
- EXIT;
- END {* ...not Read-Tree }
- ELSE
- such_pfad; {* Verzeichnis suchen }
- END; {* von fehler = 3 }
- ELSE {* Jeder andere Fehler }
- BEGIN
- WRITELN(#7,'Nicht näher bestimmbarer Fehler!');
- HALT(fehler);
- END;
-
- END; {* von CASE...}
-
- beenden; {* Heap freigeben }
-
- END; {* von QuickCD }
-
- BEGIN
- quickcd;
- END.