PROGRAM Findit; { PROGRAM TO FIND STRINGS IN FILES } {Written by: Gordon Atkinson, Data Plus Inc., (416) 425-3323. To find and display character strings in a file, of files thru an indirect file (@). (i.e. FOOBAR - find strings in FOOBAR note default extension = .PAS @FOOBAR - find strings in files listed in FOOBAR in format as above defaulting to Extension = .PAS note default extension = .DOC ) TYPE Progline = PACKED ARRAY [1..132] OF Char; VAR P: Integer; Ch: Char; Done, Indirect: Boolean; Filein: Text; Pline: Progline; Plineu: Progline; Filefile: Text; Filenm: PACKED ARRAY [1..22] OF Char; Prognm: PACKED ARRAY [1..22] OF Char; Find: Boolean; I, J, K: Integer; Findsize: Integer; Findstring: PACKED ARRAY [1..81] OF Char; Lineno: Integer; Level: Integer; Foundinline: Boolean; PROCEDURE Displayline; VAR K: Integer; BEGIN Foundinline := True; Writeln(Lineno: 5, Pline: J); Writeln('.....', Plineu: J); FOR K := 1 TO 132 DO Plineu[K] := ' '; END; {-------} PROCEDURE Tests(VAR Xi, Xk: Integer); VAR I, K: Integer; Find: Boolean; Isave: Integer; BEGIN Level := Level + 1; K := Xk + 1; I := Xi; WHILE (I <= J) AND (K > 0) DO BEGIN IF K = 1 THEN Isave := I; IF Findstring[K] = '*' THEN BEGIN Tests(I, K); K := 0; Find := False; IF Pline[I] = Chr(9) THEN Plineu[I] := Chr(9) ELSE Plineu[I] := ' '; END ELSE BEGIN IF (Ord(Pline[I]) >= Ord('a')) AND (Ord(Pline[I]) <= Ord('z')) THEN Ch := Chr(Ord(Pline[I]) - 32) ELSE Ch := Pline[I]; IF (Ch = Findstring[K]) OR (Findstring[K] = '%') THEN BEGIN Plineu[I] := '^'; I := I + 1; K := K + 1; Find := True END ELSE BEGIN Find := False; IF (K = 1) THEN BEGIN IF Pline[I] = Chr(9) THEN Plineu[I] := Chr(9) ELSE Plineu[I] := ' '; I := I + 1 END ELSE IF Findstring[K - 1] = '*' THEN BEGIN Find := True; Plineu[I] := '-'; I := I + 1 END ELSE BEGIN IF Pline[I] = Chr(9) THEN Plineu[I] := Chr(9) ELSE Plineu[I] := ' '; K := 0; END; END; IF (K > Findsize) AND Find THEN BEGIN Displayline; Find := False; K := 0; END; END; IF NOT Find AND (Level = 0) THEN BEGIN IF Pline[Isave] = Chr(9) THEN Plineu[Isave] := Chr(9) ELSE Plineu[Isave] := ' '; I := Isave + 1; K := 1; END; END; FOR I := Isave TO 132 DO IF Pline[I] = Chr(9) THEN Plineu[I] := Chr(9) ELSE Plineu[I] := ' '; Level := Level - 1; END; {--------------} PROCEDURE Scanline; BEGIN J := 133; REPEAT J := J - 1 UNTIL (Pline[J] <> ' ') OR (J = 1); END; BEGIN Write('Enter string to find (*,% are wild cards)! '); Readln(Findstring); Write('Enter number of characters ..............! '); Readln(Findsize); FOR I := 1 TO Findsize DO IF (Ord(Findstring[I]) >= Ord('a')) AND (Ord(Findstring[I]) <= Ord('z')) THEN Findstring[I] := Chr(Ord(Findstring[I]) - 32); Write('Program name file{ @ for indirect file } ? '); Readln(Filenm); IF Filenm[1] = '@' THEN BEGIN FOR I := 1 TO 21 DO Filenm[I] := Filenm[I + 1]; Filenm[22] := ' '; Reset(Filefile, Filenm, '.DOC'); Indirect := True; END ELSE BEGIN Indirect := False; END; REPEAT IF Indirect THEN BEGIN Readln(Filefile, Prognm); END ELSE BEGIN Done := False; Prognm := Filenm; END; IF NOT Done THEN BEGIN Reset(Filein, Prognm, '.PAS'); Writeln('-------------------------------------------', Prognm); Lineno := 0; WHILE NOT Eof(Filein) DO BEGIN Readln(Filein, Pline); FOR K := 1 TO 132 DO Plineu[K] := ' '; Lineno := Lineno + 1; Scanline; I := 1; K := 0; Level := - 1; Foundinline := False; Tests(I, K); END; Close(Filein); END; IF INDIRECT THEN BEGIN IF EOF(FILEFILE) THEN DONE := TRUE; END ELSE Done := True UNTIL Done; FOR K := 1 TO 26 DO Write('-=-'); Writeln; END.