home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* LIBRARY.PAS *)
- (* Rekursive Arbeitsprozeduren *)
- (* ------------------------------------------------------ *)
- UNIT library;
-
- INTERFACE
-
- USES dos, crt, header;
-
- VAR i : BYTE ;
- subdir : textline ; (* Aktueller Pfad *)
- (* folgende Variablen sind für die Statistiken: *)
- mem_found ,
- mem_count : longint ;
- fil_found ,
- fil_count ,
- dir_count : INTEGER ;
-
- PROCEDURE set_cursor ( cursor : word);
- PROCEDURE get_cursor (VAR cursor : word);
- PROCEDURE recurse (deep : word);
-
- IMPLEMENTATION
-
- (* ------------------------------------------------------ *)
- PROCEDURE set_cursor (cursor : word);
-
- BEGIN
- WITH regs DO BEGIN
- ax := $0100 ;
- cx := cursor;
- intr ($10,regs);
- END;
- END;
-
- (* ------------------------------------------------------ *)
- PROCEDURE get_cursor (VAR cursor : word);
-
- BEGIN
- WITH regs DO BEGIN
- ax := $0300;
- intr ($10,regs);
- cursor := cx;
- END;
- END;
-
- (* ------------------------------------------------------ *)
- PROCEDURE abort_program;
-
- BEGIN
- WriteLn; WriteLn; highvideo;
- Write ('':MAIN_MARGIN,PROG_NAME);
- WriteLn (' --> Programm vom Benutzer abgebrochen.');
- LowVideo;
- chdir(Copy(start_path,3,80));
- set_cursor (DOScursor); (* DOS-Cursor zurücksetzen *)
- Halt; (* Program abbrechen *)
- END;
-
- (* ------------------------------------------------------ *)
- PROCEDURE pause;
-
- BEGIN
- IF IS_ECHO THEN Delay(OUTPUT_DELAY);
- END;
-
- (* ------------------------------------------------------ *)
- PROCEDURE wait;
- VAR ch : CHAR;
- BEGIN
- ch := readkey;
- CASE ch OF
- {^S} #19 : REPEAT { CTRL-S --> warten, bis ... }
- ch := readkey;
- IF ch = #3 THEN abort_program;
- {^Q} UNTIL ch = #17; { ... CTRL-Q eingegeben wird }
- {^C} #3 : abort_program; { CTRL-C / CTRL-BREAK }
- END;
- END;
-
- (* ------------------------------------------------------ *)
- PROCEDURE show_dirname (deep: BYTE);
- VAR path : textline;
- BEGIN
- IF IS_ECHO THEN BEGIN
- getdir(0,path);
- Write('':MAIN_MARGIN);
- IF recursive THEN Write('':(deep SHL 1));
- highvideo; WriteLn(path); LowVideo;
- IF KeyPressed THEN wait ELSE pause;
- END;
- END;
-
- {$IFDEF dir_recurse}
- (* ------------------------------------------------------ *)
- PROCEDURE show_filename(dta : searchrec; deep : BYTE);
- VAR p : BYTE; dati : datetime;
- BEGIN
- IF IS_ECHO THEN BEGIN
- Write('':(deep SHL 1));
- WITH dta DO BEGIN
- p := 0;
- IF (attr AND directory <> directory) OR
- NOT recursive THEN LowVideo
- ELSE highvideo;
- IF (name <> '.') AND (name <> '..') THEN
- p := Pos('.',name);
- IF p = 0 THEN
- Write('':WORK_MARGIN,name,'':12-Length(name))
- ELSE Write('':WORK_MARGIN, Copy(name,1,Pred(p)),
- '':9-Length(Copy(name,1,Pred(p))),
- Copy(name,Succ(p),3),'':3-
- Length(Copy(name,Succ(p),3)) );
- END;
- WITH dta, dati DO BEGIN
- unpacktime(time,dati);
- IF size_on THEN
- IF (name = '.') THEN Write('<DIR> ':8) ELSE
- IF (name = '..') THEN Write('<DIR> ':8) ELSE
- IF (attr AND directory = directory ) THEN
- Write('<DIR> ':8)
- ELSE
- IF (attr AND volumeid = volumeid ) THEN
- Write('VOLUME':8)
- ELSE Write(size:8);
- IF date_on THEN BEGIN
- IF day < 10 THEN Write('0':3,day)
- ELSE Write(day:4);
- IF month < 10 THEN Write('.0',month)
- ELSE Write('.',month:2);
- Write('.',year MOD 100:2);
- END;
- IF time_on THEN BEGIN
- IF hour < 10 THEN Write('0':3,hour)
- ELSE Write( hour:4);
- IF min < 10 THEN Write(':0' ,min )
- ELSE Write(':', min:2);
- END;
- IF attr_on THEN BEGIN
- Write(' ');
- IF (attr AND archive = archive ) THEN
- Write('A');
- IF (attr AND sysfile = sysfile ) THEN
- Write('S');
- IF (attr AND readonly = readonly ) THEN
- Write('R');
- IF (attr AND hidden = hidden ) THEN
- Write('H');
- IF (attr AND volumeid = volumeid ) THEN
- Write('V');
- IF (attr AND directory = directory) THEN
- Write('D');
- END;
- WriteLn;
- END;
- IF KeyPressed THEN wait ELSE pause; LowVideo;
- END;
- Delay(DEFAULT_DELAY);
- END;
- {$ENDIF}
-
- (* ------------------------------------------------------ *)
- PROCEDURE recurse (deep : word);
- VAR dta : searchrec;
- BEGIN
- IF deep > 0 THEN chdir(subdir);
- findfirst ('*.*',directory,dta);
- WHILE DOSerror = 0 DO BEGIN
- WITH dta DO
- IF (attr AND directory = directory) THEN BEGIN
- IF (name <> '.') AND (name <> '..') THEN BEGIN
- IF recursive THEN BEGIN
- inc(dir_count);
- subdir := name;
- recurse (Succ(deep));
- {$IFDEF dir_recurse}
- END
- ELSE show_filename(dta,deep);
- {$ELSE}
- END;
- {$ENDIF}
- END;
- END;
- findnext (dta);
- END;
- show_dirname (deep);
- mem_found := 0;
- fil_found := 0;
- FOR i := 1 TO MAXPATTERN DO
- IF (pattern[i][0] <> #0) THEN BEGIN
- {$IFDEF clean_recurse}
- fil_found := 0;
- mem_found := 0;
- Write('':MAIN_MARGIN+(deep SHL 1),
- pattern[i]:12,fil_found:12,' Datei(en) gefunden');
- {$ENDIF}
- findfirst(pattern[i],$22,dta);
- WHILE DOSerror = 0 DO BEGIN
- inc(fil_found);
- inc(mem_found,dta.size);
- {$IFDEF clean_recurse}
- IF IS_ECHO THEN BEGIN
- GotoXY(1,wherey);
- Write('':MAIN_MARGIN+(deep SHL 1),
- pattern[i]:12,fil_found:12,
- ' Datei(en) gefunden');
- END;
- Assign(deletefile,dta.name);
- {$I-} Erase(deletefile); {SI+}
- {$ELSE}
- show_filename(dta,deep);
- {$ENDIF}
- IF KeyPressed THEN wait ELSE pause;
- findnext(dta);
- END;
- {$IFDEF clean_recurse}
- IF IS_ECHO THEN WriteLn;
- {$ENDIF}
- inc(fil_count,fil_found);
- inc(mem_count,mem_found);
- END;
- {$IFDEF dir_recurse}
- IF IS_ECHO THEN BEGIN
- Write('':WORK_MARGIN+10);
- IF recursive THEN Write('':(deep SHL 1));
- IF fil_found = 0 THEN WriteLn(' Keine Datei gefunden')
- ELSE WriteLn(mem_found:10,' Byte in ',
- fil_found ,' Datei(en) ');
- END;
- {$ENDIF}
- IF deep > 0 THEN chdir ('..');
- END;
-
- (* ------------------------------------------------------ *)
- BEGIN
- mem_count := 0;
- fil_count := 0;
- dir_count := 1;
- END.
- (* ------------------------------------------------------ *)
- (* Ende von LIBRARY.PAS *)
-