Program VERBOSITY_INDEX; { JUSTIN MARQUEZ Reads a FidoNet *.MSG File areas and logs info about authorship and "verbosity" found in the messages. Requires Turbo Pascal 7.xx or Borland Pascal 7.xx (for the StringS Unit) OutPut is redirectable. Can be quickly sorted With Dos's SORT.COM Here is a batch File you may find useful: rem YAK.BAT verbose %1 > zap.txt sort < zap.txt > yak.txt /+37 /R del zap.txt This Program is written by Justin Marquez, FidoNet 106/100 It is being donated to all as a PUBLIC DOMAIN Program, which may be freely used, copied and modified as you please. "if you improve on it, I'd like a copy of the modifications For my own edification!" } Uses Strings, Dos; Type FidoMessageHeader = Record FromUser : Array[0..35] of Char ; ToUser : Array[0..35] of Char ; Subject : Array[0..71] of Char ; DateTime : Array[0..19] of Char ; TimesRead : Word ; DestNode : Word ; OrigNode : Word ; Cost : Word ; OrigNet : Word ; DestNet : Word ; Filler : Array[0..7] of Byte ; Replyto : Word ; Attribute : Word ; NextReply : Word ; end; Entry = Record Author : String[36]; Count : Integer; Bytes : LongInt; end; Var MsgDir, fn : String; SR : SearchRec; tmp : FidoMessageHeader; Who_From : String[36]; n, i : Integer; HiNum : Integer; rec : Array [1..512] of Entry; TotBytes : LongInt; Procedure GetMsgInfo (fname : String; Var Hdr : FidoMessageHeader); Var HFile : File of FidoMessageHeader; MFile : Text; begin FillChar(Hdr, SizeOf(Hdr), #0); { clear it out initially } { get msg hdr only } Assign(HFile,fname); Reset(HFile); Seek(HFile, 0); Read(HFile, Hdr); Close(HFile); end; Procedure Pad_Path(Var s : String); begin if s[length(s)] <> '\' then s := s + '\'; end; Procedure Process_Name; Var k : Integer; Found : Boolean; begin Found := False; if n > 0 then For k := 1 to n do if Who_From = rec[k].author then begin inc(rec[k].count); rec[k].Bytes := rec[k].Bytes + SR.Size; Found := True; end else begin rec[1].author := Who_From; rec[1].count := 1; rec[1].Bytes := rec[1].Bytes + SR.Size end; if not Found then begin inc(n); Rec[n].Author := Who_From; Rec[n].Count := 1; rec[n].Bytes := rec[n].Bytes + SR.Size; end; end; Procedure Intro_And_Init; begin FillChar(rec,SizeOf(rec),#0); { clear it out initially } HiNum := 0; TotBytes := 0; n := 0; if ParamCount > 0 then MsgDir := ParamStr(1) else begin WriteLn(' VERBOSE >'); WriteLn('EXAMPLE:'); WriteLn; WriteLn('VERBOSE C:\OPUS\HOUSYSOP\ '); WriteLn(' reads all msg Files in the area and reports findings.'); WriteLn; WriteLn(' Note: can be redirected to a File or device.'); WriteLn; WriteLn('Public Domain from 106/100. Request as VERBOSE.ZIP.'); Halt(2); end; end; Procedure Process_Files; begin Pad_Path(MsgDir); fn := MsgDir + '*.MSG'; FindFirst(fn, AnyFile, SR); While DosError = 0 do begin fn := MsgDir + SR.Name; GetMsgInfo (fn, tmp); Who_From := ''; Who_From := StrPas(StrUpper(tmp.FromUser)); Inc(HiNum); TotBytes := TotBytes + SR.Size; Process_Name; FindNext(SR); end; end; Procedure Report_Results; begin For i := 1 to n do WriteLn(rec[i].Author : 36, Rec[i].Count : 4, (100 * Rec[i].Count / HiNum) : 6 : 1, '% ', Rec[i].Bytes : 6, ' Bytes or', (100 * Rec[i].Bytes / TotBytes) : 5 : 1, '% by size' ); WriteLn(' Total messages found: ' : 36, HiNum : 4); WriteLn(' Total Bytes found : ' : 36, TotBytes : 18); WriteLn(n, ' different Writers found in ', MsgDir, '.'); end; begin Intro_And_Init; Process_Files; Report_Results; end.