Contributor: MARTIN WOODS
program MSGNUM;
uses dos,crt;
const version='v1.5';
var sto,
sfrom,
daystosave,
top,
bottom,
mtop,
mbottom,
keep :word;
drv :byte;
st,
path :string;
msg,
save :array[1..10240] of boolean;
date :array[1..10240] of word;
Function CurrentDrive:char;
var pthstr:pathstr;
begin
pthstr:=fexpand('');
CurrentDrive:=pthstr[1];
end;
function mchr(n:byte;ch:char):string;
var a:byte;s:string;
begin
s:='';
for a:=1 to n do s:=s+ch;
mchr:=s;
end;
function FDayOfYear(l:longint):word;
var t:datetime;
begin
unpacktime(l,t);
t.month:=t.month-1;
FDayOfYear:=((t.year-1990)*365)
+ (t.year-1988 div 4)
+ (t.month*30) + t.day
+ ( ord(t.month>=1))
- (2*ord(t.month>=2))
+ ( ord(t.month>=3))
+ ( ord(t.month>=5))
+ ( ord(t.month>=7))
+ ( ord(t.month>=8))
+ ( ord(t.month>=10));
end;
Function TodaysDate:word;
var y,m,d,temp:word;dt:datetime;l:longint;
begin
getdate(y,m,d,temp);
dt.year:=y;
dt.month:=m;
dt.day:=d;
packtime(dt,l);
todaysdate:=fdayofyear(l);
end;
procedure initvars;
var a:word;
begin
sto:=1;
sfrom:=1;
daystosave:=2;
keep:=100;
bottom:=1;
mbottom:=1;
mtop:=1;
top:=1;
path:='';
for a:=1 to 10240 do
begin
msg[a]:=FALSE;
save[a]:=FALSE;
date[a]:=0;
end;
end;
procedure getparams;
var a,b,code:word;parama,temp:string;past:boolean;
begin
If (paramcount<1) or (paramstr(1)='?') then
begin
writeln;
writeln(' MSGNUM ',version,' - A Message base renumbering system for
FIDOnet and compatible'); writeln(' message systems. This is a brute
force handler that is s-l-o-w. But it'); writeln(' uses file handlers
instead of FCBs like RENUM, so is safer. Syntax:'); writeln;
writeln(' MSGNUM [switches] [path]');
writeln;
writeln(' Switches:');
writeln;
writeln(' /Sxx-yy Save messages xx to yy - keeps those messages
exactly as'); writeln(' they were before, and does NOT
renumber THEM'); writeln(' /Dxx Messages less than xx days old
will be saved even if they'); writeln(' exceed the /L
paramater'); writeln(' /Kxx Keeps xx messages in the base, even
if they are older than the'); writeln(' number of days
specified in the /D paramater.'); writeln;
writeln(' Path MUST be specified. The path refers to the subdir of the
base to be'); writeln(' renumbered.');
writeln;
writeln(' Default is: MSGNUM /S1-1 /D2 /K100 [path]');
halt;
end
else
begin
for a:=1 to paramcount do
begin
parama:=paramstr(a);
If parama[1]='/' then
begin
Case upcase(parama[2]) of
'S':begin
past:=FALSE;
temp:='';
for b:=3 to length(parama) do
begin
If parama[b]='-' then
begin
past:=TRUE;
val(temp,sfrom,code);
temp:='';
end
else
begin
temp:=temp+parama[b];
end;
end;
val(temp,sto,code);
end;
'D':begin
temp:='';
for b:=3 to length(parama) do
begin
temp:=temp+parama[b];
end;
val(temp,daystosave,code);
end;
'K':begin
temp:='';
for b:=3 to length(parama) do
begin
temp:=temp+parama[b];
end;
val(temp,keep,code);
end;
end;
end
else
begin
If path='' then
for b:=1 to length(parama) do path:=path+parama[b];
If path[length(path)]<>'\' then path:=path+'\';
path:=fexpand(path);
end;
end;
end;
end;
procedure readfilesin;
var s:searchrec;
tempword:word;
tempint:integer;
begin
Findfirst(path+'*.msg',AnyFile,s);
While DosError=0 do
begin
val(copy(s.name,1,length(s.name)-4),tempword,tempint);
msg[tempword]:=TRUE;
save[tempword]:=(tempword>=sfrom) and (tempword<=sto);
date[tempword]:=FDayOfYear(s.time);
If tempwordtop then top:=tempword;
Findnext(s);
end;
end;
procedure findkeep;
var count:word;td:word;
begin
count:=1;
mtop:=top;
mbottom:=top+1;
td:=todaysdate;
repeat
dec(mbottom);
If (msg[mbottom]) and (not save[mbottom]) and (mbottom>bottom) then
inc(count);
until ((count>=keep) and (date[mbottom]+daystosave<=td)) or
(mbottom<=bottom);end;
procedure deleteunwanted;
var a,
todayyear,
y,
m,
d,
temp :word;
tempstr :string[12];
f :file;
begin
Write('Erasing No Files! ');
for a:=1 to (mbottom-1) do
begin
If (msg[a]) and (not save[a]) then
begin
str(a,tempstr);
tempstr:=tempstr+'.MSG';
assign(f,tempstr);
Write(mchr(12,#8),mchr(12-length(tempstr),#32)+tempstr);
erase(f);
msg[a]:=FALSE;
end;
end;
Writeln(mchr(70-wherex,#32),' ...Done.');
end;
procedure renameexisting;
var a,count:word;
tempstr,countstr:string[12];
f:file;
begin
a:=mbottom;
count:=0;
Write('Renaming '+mchr(28,#32));
repeat
If (msg[a]) and (not save[a]) then
begin
tempstr:='';
str(a,tempstr);
tempstr:=tempstr+'.MSG';
assign(f,tempstr);
inc(count);
while save[count] do inc(count);
str(count,countstr);
countstr:=countstr+'.MSG';
Write(mchr(28,#8),tempstr,' to
',countstr,mchr(24-length(tempstr)-length(countstr),#32)); If
(countstr<>tempstr) then rename(f,countstr); end;
inc(a);
until a>top;
writeln(mchr(70-wherex,#32),' ...Done.');
end;
begin
initvars;
getparams;
getdir(0,st);
chdir(copy(path,1,length(path)-1));
writeln(' Renumbering directory '+copy(path,1,length(path)-1));
readfilesin;
findkeep;
write(' Deleting Unwanted files.... ');
deleteunwanted;
write(' Renaming Remaining files... ');
renameexisting;
chdir(st);
end.