home *** CD-ROM | disk | FTP | other *** search
- (*-------------------------------------------------------*)
- (* DOKU.PAS *)
- (* Dokumentation von Prozeduren und Funktionen in *)
- (* Turbo-Pascal-Units *)
- (* (c) 1990 B. Biever & TOOLBOX *)
- (*-------------------------------------------------------*)
-
- PROGRAM Unitdokumentation;
-
- USES Crt, Dos, Printer;
-
- TYPE
- DefZeiger = ^DefZeile;
- DefZeile = RECORD
- Zeile : STRING[79];
- Naechstes : DefZeiger;
- END;
- CONST
- Ign : BOOLEAN = FALSE;
- chk : 0..3 = 0;
-
- VAR
- Textdatei : Text;
- FPath : DirStr;
- FName : NameStr;
- FExt : ExtStr;
- FileName : PathStr;
- UnitName : STRING[20];
- ProcedureName : STRING[40];
- AnzahlProzeduren : INTEGER;
- Wurzel, Pl, Ptemp : DefZeiger;
-
- {---------------------------------------}
-
- FUNCTION UpString(s: STRING) : STRING;
- VAR
- i : BYTE;
- BEGIN
- FOR i := 1 TO Length(s) DO s[i] := UpCase(s[i]);
- UpString := s;
- END;
-
- {---------------------------------------}
-
- PROCEDURE Init;
- { Initialisieren aller Variablen, }
- { Dateinamen einlesen, Dateien eröffnen }
- VAR
- FileNameDir : DirStr;
- FileNameName: NameStr;
- FileNameExt : ExtStr;
- BEGIN
- New(Wurzel);
- Pl := Wurzel;
- UnitName := '';
- AnzahlProzeduren := 0;
- ClrScr;
- Write('Bitte geben Sie den Dateinamen ein: ');
- ReadLn(FileName);
- FileName := UpString(FileName);
- FSplit(FileName, FileNameDir, FileNameName, FileNameExt);
- IF FileNameExt = '' THEN
- FileName := Concat(FileName, '.PAS');
- WriteLn;
- Assign(Textdatei, FileName);
- {$I-}
- Reset(Textdatei);
- {$I+}
- IF IOResult <> 0 THEN BEGIN
- TextColor(LightRed);
- WriteLn('Fehler: Datei ', FileName);
- WriteLn('nicht gefunden. Programm beendet.');
- Halt;
- END;
- END;
-
- {---------------------------------------}
-
- FUNCTION Find(SubStr, s: STRING) : BYTE;
- { Suchen des Schlüsselwortes unter Be- }
- { rücksichtigung von verschachtelten }
- { Kommentaren, Hochkommas und Teil- }
- { strings. }
- VAR
- SubStrLaenge,
- i, j : BYTE;
- a : STRING;
- test : BOOLEAN;
-
- PROCEDURE FindRem(Position: BYTE);
- VAR
- a1, a2 : CHAR;
- BEGIN
- a1 := s[Position];
- IF (a1 = '{') AND (chk = 0) THEN BEGIN
- Ign := TRUE; chk := 1; { Kommentar }
- END
- ELSE IF (a1 = '}') AND (chk = 1) THEN BEGIN
- Ign := FALSE; chk := 0 { Ende Kommentar }
- END
- ELSE IF (a1 = '''') AND (chk = 0) THEN BEGIN
- Ign := TRUE; chk := 3; { '-Anfang }
- END
- ELSE IF (a1 = '''') AND (chk = 3) THEN BEGIN
- Ign := FALSE; chk := 0; { -Ende }
- END
- ELSE IF Position + 1 <= Length(s) THEN BEGIN
- IF (a1 = '(') AND (chk = 0) THEN BEGIN
- a2 := s[Position + 1];
- IF a2 = '*' THEN BEGIN
- Ign := TRUE; chk := 2; { Kommentar }
- END;
- END
- ELSE IF a1 = '*' THEN BEGIN
- a2 := s[Position + 1];
- IF (a2 = ')') AND (chk = 2) THEN BEGIN
- Ign := FALSE; chk := 0; { Ende Kommentar }
- END;
- END;
- END;
- END;
-
- BEGIN
- Find := 0;
- test := FALSE;
- s := UpString(s);
- SubStr := UpString(SubStr);
- SubStrLaenge := Length(SubStr);
- IF Length(SubStr) > Length(s) THEN Exit;
- IF (Length(s) - SubStrLaenge) >= 0 THEN
- BEGIN
- FOR i:= 1 TO Length(s) DO BEGIN
- FindRem(i);
- a := Copy(s, i, SubStrLaenge);
- IF a = SubStr THEN BEGIN
- IF i > 1 THEN
- IF s[i - 1] <> ' ' THEN BEGIN
- find := 0; Exit;
- END;
- IF i + SubStrLaenge < Length(s) THEN
- IF i > 1 THEN
- IF NOT (s[i + SubStrLaenge + 1] IN [' ', '('])
- THEN BEGIN
- find := 0; Exit;
- END;
- IF ign THEN find := 0 ELSE find := i;
- END;
- END;
- END;
- END;
-
- {---------------------------------------}
-
- PROCEDURE UnitNameSuchen;
- { Sucht das reservierte Wort Unit und schreibt }
- { den Namen der Unit in die Variable UnitName. }
- VAR
- s : STRING[150];
- Position,
- i : BYTE;
- BEGIN
- s := ''; i := 0;
- REPEAT
- ReadLn(Textdatei, s);
- Position := Find('UNIT', s);
- UNTIL EoF(Textdatei) OR ((Position > 0) AND (chk = 0));
- IF EoF(Textdatei) THEN BEGIN
- TextColor(LightRed);
- WriteLn('Fehler: Keine UNIT-Anweisung');
- WriteLn('gefunden. Programm beendet.');
- Halt;
- END;
- REPEAT
- Inc(i);
- IF s[i + Position + 4] <> ' ' THEN
- UnitName := Concat(UnitName, s[i + 4]);
- UNTIL (s[i + Position + 4] = ';')
- OR (s[i + Position + 4] = ' ');
- END;
-
- {---------------------------------------}
-
- PROCEDURE ProzedurenSuchen;
- { Sucht alle Inferface-Prozeduren }
- VAR
- i1, Pos,
- p1, p2, p3,
- WortLaenge : BYTE;
- TempIgn1,
- TempIgn2 : BOOLEAN;
- s,
- TempLinie : STRING;
- a : CHAR;
- BEGIN
- REPEAT
- ReadLn(Textdatei, s);
- Pos := Find('INTERFACE', s);
- UNTIL EoF(Textdatei) OR (Pos <> 0);
- IF EoF(Textdatei) THEN BEGIN
- TextColor(LightRed);
- WriteLn('Fehler: Keine INTERFACE-Anweisung');
- WriteLn('gefunden. Programm beendet.');
- Halt;
- END;
- REPEAT
- ProcedureName := '';
- ReadLn(Textdatei, s);
- TempIgn1 := Ign;
- TempIgn2 := Ign;
- p2 := Find('IMPLEMENTATION', s);
- IF p2 = 0 THEN BEGIN
- p1 := Find('PROCEDURE', s);
- TempIgn1 := Ign;
- p3 := Find('FUNCTION', s);
- TempIgn2 := Ign;
- IF (p1 > 0) OR (p3 > 0) THEN BEGIN
- IF p1 > 0 THEN BEGIN
- Pos := p1; WortLaenge := 9;
- END
- ELSE
- BEGIN
- Pos := p3; WortLaenge := 8;
- END;
- IF (s[Pos + WortLaenge] <> ';') AND
- (s[Pos + WortLaenge] <> '(') THEN BEGIN
- Pl^.Zeile := 'NEUEPROZEDUR';
- New(Ptemp);
- Pl^.Naechstes := Ptemp;
- Pl := Ptemp;
- i1 := 0;
- Inc(i1);
- a := s[i1 + Pos + WortLaenge];
- WHILE (a <> ';') AND (a <> '(') AND
- (a <> ' ') AND (a <> ':') DO
- BEGIN
- Inc(i1);
- ProcedureName := Concat(ProcedureName, a);
- a := s[i1 + Pos + WortLaenge];
- END;
- Inc(AnzahlProzeduren);
- TempLinie := Concat(ProcedureName,
- ' '); {24 Leerzeichen}
- Insert(UnitName, TempLinie, 24);
- Pl^.Zeile := TempLinie;
- New(Ptemp);
- Pl^.Naechstes := Ptemp;
- Pl := Ptemp;
- FSplit(FileName, FPath, FName, FExt);
- FName := UpString(FName);
- FExt := UpString(FExt);
- TempLinie := Concat('Unit-Dateiname: ',
- FName, FExt);
- Pl^.Zeile := TempLinie;
- New(Ptemp);
- Pl^.Naechstes := Ptemp;
- Pl := Ptemp;
- END;
- END;
- IF AnzahlProzeduren <> 0 THEN BEGIN
- Pl^.Zeile := s;
- New(Ptemp);
- Pl^.Naechstes := Ptemp;
- Pl := Ptemp;
- END;
- GotoXY(1, 6);
- Write('Anzahl Prozeduren: ', AnzahlProzeduren);
- END;
- UNTIL EoF(Textdatei) OR (p2 <> 0);
- Pl^.Zeile := '';
- Pl^.Naechstes := NIL;
- Ptemp := Wurzel;
- END;
-
- {---------------------------------------}
-
- PROCEDURE Ausdrucken;
- { Ausgabe für einen Epson LQ-1050 }
- VAR
- Seite : LONGINT;
- zz : WORD;
- s : STRING[3];
- Pointer : DefZeiger;
- TYPE
- Zustand = (ein, aus);
-
- PROCEDURE Breitschrift(einaus: Zustand);
- BEGIN
- IF einaus = ein THEN
- Write(Lst, Chr(27), Chr(87), Chr(1))
- ELSE
- Write(Lst, Chr(27), Chr(87), Chr(0));
- END;
-
- PROCEDURE Doppeldruck(einaus: Zustand);
- BEGIN
- IF einaus = ein THEN
- Write(Lst, Chr(27), Chr(71))
- ELSE
- Write(Lst, Chr(27), Chr(72));
- END;
-
- PROCEDURE Doppeltehoehe(einaus: Zustand);
- BEGIN
- IF einaus = ein THEN
- Write(Lst, Chr(27), Chr(119), Chr(1))
- ELSE
- Write(Lst, Chr(27), Chr(119), Chr(0));
- END;
-
- PROCEDURE Formfeed;
- BEGIN
- Write(Lst, Chr(12));
- END;
-
- PROCEDURE Titelblatt;
- VAR
- i : INTEGER;
- Titelzeile: STRING[40];
- BEGIN
- FOR i:= 1 TO 72 DO Write(Lst, Chr(196));
- WriteLn(Lst); WriteLn(Lst);
- Doppeltehoehe(ein); Breitschrift(ein);
- Titelzeile := ' Toolbox-Tool';
- WriteLn(Lst, Titelzeile);
- Breitschrift(aus); Doppeltehoehe(aus);
- FOR i:= 1 TO 72 DO Write(Lst, Chr(196));
- WriteLn(Lst);
- zz := 6;
- END;
-
- PROCEDURE Blattende;
- VAR
- i : BYTE;
- Titelzeile : STRING[80];
- s : STRING[3];
- BEGIN
- FOR i:= 4 TO (71 - zz) DO WriteLn(Lst);
- Inc(Seite);
- FOR i:= 1 TO 72 DO Write(Lst, Chr(196));
- WriteLn(Lst);
- Doppeltehoehe(ein);
- Str(Seite, s);
- Titelzeile := ' '
- {29 Leerz.} + ' --- Seite ' + s + ' ---';
- WriteLn(Lst, Titelzeile);
- Doppeltehoehe(aus);
- FOR i:= 1 TO 72 DO Write(Lst, Chr(196));
- WriteLn(Lst);
- zz := 0;
- Formfeed;
- END;
-
- PROCEDURE Titel;
- VAR
- i : BYTE;
- Titelzeile : STRING[40];
- BEGIN
- FOR i:= 1 TO 72 DO Write(Lst, Chr(196));
- WriteLn(Lst); WriteLn(Lst);
- Pointer := Pointer^.Naechstes;
- Doppeltehoehe(ein); Breitschrift(ein);
- Titelzeile := Pointer^.Zeile;
- Write(Lst, Titelzeile);
- Doppeltehoehe(aus); Breitschrift(aus);
- Pointer := Pointer^.Naechstes;
- WriteLn(Lst);
- FOR i:= 1 TO 72 DO Write(Lst, Chr(196));
- WriteLn(Lst); WriteLn(Lst);
- zz := zz + 6;
- END;
-
- BEGIN
- Doppeldruck(ein);
- Seite := 0; zz := 0;
- Pointer := Wurzel;
- REPEAT
- Titelblatt;
- REPEAT
- IF Pointer^.Zeile = 'NEUEPROZEDUR' THEN Titel;
- WriteLn(Lst, Pointer^.Zeile);
- Pointer := Pointer^.Naechstes;
- Inc(zz);
- UNTIL (zz >= 65) OR (Pointer = NIL);
- Blattende;
- UNTIL Pointer = NIL;
- END;
-
- {---------------------------------------}
-
- BEGIN
- Init;
- UnitNameSuchen;
- ProzedurenSuchen;
- Close(Textdatei);
- Ausdrucken;
- END.