Category : Pascal Source Code
Archive   : CMPLTPAS.ZIP
Filename : WORDSTAT.PAS
{--------------------------------------------------------------}
{ WordStat }
{ }
{ Word Counter & Word Length Tabulator for TextFiles }
{ }
{ by Jeff Duntemann }
{ and Hugh Kenner }
{ Turbo Pascal V5.0 }
{ Last update 7/14/88 }
{ }
{ From: COMPLETE TURBO PASCAL 5.0 by Jeff Duntemann }
{ Scott, Foresman & Co., Inc. 1988 ISBN 0-673-38355-5 }
{--------------------------------------------------------------}
PROGRAM WordStat;
USES Printer;
CONST
PrintWidth = 68;
Tab = #9;
TYPE
Array40 = ARRAY[0..40] OF Integer;
String80 = String[80];
VAR
I,J : Integer;
Scale : Real;
Ch : Char;
Opened : Boolean;
TestFile : Text;
FName : String80;
Counters : Array40;
Line : String80;
AWord : String80;
WordLength : Integer;
LineCount : Integer;
WhiteSpace : SET OF Char;
GoodChars : SET OF Char;
PROCEDURE KillJunk(VAR AString : String80);
BEGIN
WhiteSpace := [#8,#9,#10,#12,#13,#32];
GoodChars := ['A'..'Z','a'..'z','0'..'9'];
REPEAT { Clean up leading end of word }
IF Length(AString) > 0 THEN
IF (AString[1] IN WhiteSpace) OR (NOT(AString[1] IN GoodChars))
THEN Delete(AString,1,1)
UNTIL ((NOT (AString[1] IN WhiteSpace)) AND (AString[1] IN GoodChars))
OR (Length(AString) <= 0);
REPEAT { Clean up trailing end of word }
IF Length(AString) > 0 THEN
IF (AString[Length(AString)] IN WhiteSpace)
OR (NOT(AString[Length(AString)] IN GoodChars))
THEN Delete(AString,Length(AString),1)
UNTIL ((NOT(AString[Length(AString)] IN WhiteSpace)
AND (AString[Length(AString)] IN GoodChars))
OR (Length(AString) <= 0))
END; { KillJunk }
PROCEDURE Opener( FileName : String80;
VAR TFile : Text;
VAR OpenFlag : Boolean);
VAR
I : Integer;
BEGIN
Assign(TFile,FileName); { Associate logical to physical }
{$I-} Reset(TFile); {$I+} { Open file for read }
I := IOResult; { I <> 0 = File Not Found }
IF I = 0 THEN OpenFlag := True ELSE OpenFlag := False;
END; { Opener }
FUNCTION Scaler(Counters : Array40) : Real;
VAR
I,MaxCount : Integer;
BEGIN
MaxCount := 0; { Set initial count to 0 }
FOR I := 1 TO 40 DO
IF Counters[I] > MaxCount THEN MaxCount := Counters[I];
IF MaxCount > PrintWidth THEN Scaler := PrintWidth / MaxCount
ELSE Scaler := 1.0; { Scale=1 if max < printer width}
END; { Scaler }
PROCEDURE Grapher(Counters : Array40; Scale : Real);
VAR
I,J : Integer;
BEGIN
FOR I := 1 TO 40 DO
BEGIN
Write(Lst,'[',I:3,']: '); { Show count }
FOR J:=1 TO Round(Counters[I] * Scale) DO Write(Lst,'*');
Writeln(Lst,'') { Add (CR) at end of *'s}
END
END;
BEGIN { WordStat Main }
FName := ParamStr(1); { We must pick up command tail first, }
KillJunk(FName); { before opening any files! }
FOR I:=0 TO 40 DO Counters[I]:=0; { Init Counters }
LineCount := 0;
Opener(FName,TestFile,Opened); { Attempt to open input file }
IF NOT Opened THEN { If we can't open it... }
BEGIN
Writeln('>>>Input file ',FName,' is missing or damaged.');
Writeln(' Please Check this file''s status and try again.');
END
ELSE { If you've got a file, run with it! }
BEGIN
WHILE NOT EOF(TestFile) DO { While there's stuff in the file }
BEGIN
Readln(TestFile,Line); { Read a Line }
LineCount := LineCount + 1; { Count the Line }
Write('.'); { Display a progress indicator }
FOR I := 1 TO Length(Line) DO
IF Line[I] = Tab THEN Line[I] := ' ';
WHILE Length(Line) > 0 DO { While there are words in the Line }
BEGIN
KillJunk(Line); { Remove any non-text characters }
IF POS(' ',Line) > 0 THEN
AWord := Copy(Line,1,POS(' ',Line)) ELSE AWord := Line;
KillJunk(AWord); { Clean up the individual word }
Counters[0] := Succ(Counters[0]); { Count the word }
WordLength := Length(AWord);
IF WordLength > 40 THEN WordLength := 40;
J := Counters[WordLength]; { Get counter for that Length }
J := Succ(J); { Increment it... }
Counters[WordLength] := J; { ...and put it back. }
Delete(Line,1,Length(AWord)); { Remove the word from the Line }
END
END;
Writeln;
Close(TestFile); { Close the input file }
{ The count itself is done. Now to display it: }
Scale := Scaler(Counters); { Scale the Counters }
Writeln(Lst,
'>>Text file ',FName,
' has ',Counters[0],
' words in ',LineCount,' Lines.');
Writeln(Lst,
' Word size histogram follows:');
Grapher(Counters,Scale); { Display Scaled histograms }
Writeln(Lst,Chr(12)); { Send a formfeed to printer }
END
END.
Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!
This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.
But one thing that puzzles me is the “mtswslnkmcjklsdlsbdmMICROSOFT” string. There is an article about it here. It is definitely worth a read: http://www.os2museum.com/wp/mtswslnk/