home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DP Tool Club 8
/
CDASC08.ISO
/
VRAC
/
QUIETDDA.ZIP
/
QUIET.PAS
< prev
next >
Wrap
Pascal/Delphi Source File
|
1993-08-27
|
8KB
|
198 lines
program silence_noisy_programs ;
uses dos ;
const
bufsize = 16384;
progdata = 'QUIET- Free DOS utility: quiets noisy programs.';
progdat2 = 'V1.00: August 27, 1993. (c) 1993 by David Daniel Anderson - Reign Ware.';
usage = 'Usage: QUIET noisy_prog {will OVERWRITE the file - use a backup!!!}';
outname = 'o$_$_$$!.DDA';
tmpname = 't$_$_$$!.DDA';
type
buffer = array [1..bufsize] of char;
var
buf : buffer ;
infile,
outfile : file ;
bytesread,
byteswritten : word ;
nextchar : char ;
checknext,
extra_char,
lastbyte : boolean ;
fdt : longint ;
dirinfo : searchrec ; { contains filespec info. }
spath : pathstr ; { source file path, }
sdir : dirstr ; { directory, }
sname : namestr ; { name, }
sext : extstr ; { extension. }
sfn, dfn, tfn : string [64]; { Source/ Dest/ Temp FileName, including dir }
filesdone : array [1..512] of string [64]; { table of each dir+name }
done : boolean ; { done is used so a file is not processed twice }
{ used with the array "filesdone" because a bug }
{ (in DOS I think) causes files to be selected }
{ based on FAT placement, rather than name when }
{ wildcards are implemented. The BUG allows }
{ files to be done repeatedly, every time they }
{ are encountered. }
i, nmdone : word ; { i is a counter, }
{ nmdone is number of files wrapped }
procedure showhelp ( errornum : byte );
var
message : string [80];
begin
writeln ( progdata );
writeln ( progdat2 );
writeln ;
writeln ( usage );
writeln ;
case errornum of
1 : message := 'you must specify -exactly- one filespec (wildcards are OK).';
2 : message := 'could not open the "noisy" file: ' + sfn + ' (may be read-only).';
3 : message := 'could not open the temp file (does ' + outname + ' already exist?).';
4 : message := 'the blockread procedure failed ( error reading "noisy" file: ' + sfn + '.';
5 : message := 'rename procedure failed, "quiet" file is ' + outname + '.';
6 : message := 'original file was read only, is renamed to ' + tmpname + '.';
7 : message := 'you cannot just specify a path, add "*.*" or "\*.*" for all files.';
8 : message := 'could not find any matching files.';
end;
writeln ( 'ERROR: (#',errornum,') - ', message );
halt ( errornum );
end;
procedure openfiles(var ofl, nfl : file; name1, name2 : string);
begin
{$i-}
assign ( ofl, name1 );
reset ( ofl,1 );
if ioresult <> 0 then
showhelp (2); { unable to open ??? }
assign ( nfl, name2 );
reset ( nfl );
if ( ioresult <> 0 ) then begin { if file does -NOT- exist }
rewrite ( nfl,1 ); { yet, it is save to proceed }
if ioresult <> 0 then { unable to open ??? }
showhelp (3) ;
end
else
showhelp (3) ;
{$i+}
end;
procedure quietbuf ( var bufr : buffer; var chknext : boolean ; var noises : word );
const
noisea = 'µ';
noiseb = 'a';
NOPChar = 'É';
var
bf_indx : word ;
begin
for bf_indx := 1 to ( sizeof ( bufr ) - 1 ) do
if ( ( bufr [ bf_indx ] = noisea ) and
( bufr [ bf_indx +1 ] = noiseb ) ) then begin
noises := noises + 1 ;
bufr [ bf_indx ] := NOPChar;
bufr [ bf_indx +1 ] := NOPChar;
end;
chknext := ( bufr [ sizeof ( bufr ) ] = noisea );
end;
procedure quietfile ( var infile, outfile : file );
var
noises : word ;
begin
noises := 0;
repeat
{$i-} blockread ( infile, buf, bufsize, bytesread ); {$i+}
if ioresult <> 0 then
showhelp (4) ;
quietbuf ( buf, checknext, noises );
if ( checknext and ( not eof ( infile ))) then begin
blockread ( infile, nextchar, 1 );
extra_char := true ;
if nextchar = 'a' then begin
noises := noises + 1 ;
buf [ sizeof ( buf ) ] := 'É';
nextchar := 'É';
end;
end
else extra_char := false ;
blockwrite ( outfile, buf, bytesread, byteswritten );
if extra_char then
blockwrite ( outfile, nextchar, 1 );
lastbyte := (( bytesread = 0 ) or ( bytesread <> byteswritten ));
until lastbyte ;
writeln ( noises, ' noises found.' );
end;
begin { MAIN }
if paramcount <> 1 then showhelp (1);
nmdone := 1; { initialize number done to one since }
{ count is incremented after process ends }
for i := 1 to 512 do { initialize array }
filesdone[i] := ''; { (I'm not sure if this is needed) }
spath := paramstr (1); { source path is first parameter }
fsplit ( fexpand (spath),sdir,sname,sext); { break up path into components }
if (sname = '') then { - but quit if only a path and no }
showhelp(7); { name is given }
findfirst (spath, archive, dirinfo); { find the first match of filespec }
if doserror <> 0 then
showhelp(8);
while doserror = 0 do { process all specified files }
begin
sfn := sdir+dirinfo.name; { should have dir info so we are not }
{ confused with current directory (?) }
{ IS needed for dest and temp filenames }
done := false; { initialize for each "new" file found }
for i := 1 to 512 do
if sfn = filesdone[i] then { check entire array to see if we }
done := true; { have done this file already }
if not done then begin { if not, then }
filesdone[nmdone] := sfn; { say we have now }
dfn := sdir+outname; { give both dest and }
tfn := sdir+tmpname; { and temp files unique names }
openfiles ( infile, outfile, sfn, dfn );
write ( 'Quieting ', sfn, ', ' );
quietfile ( infile, outfile );
getftime ( infile, fdt );
setftime ( outfile, fdt );
close (infile); { close in }
close (outfile); { and out files }
{i-}
rename ( infile, tfn ); { rename in to temp and then }
if ioresult <> 0 then
showhelp (5);
rename ( outfile, sfn ); { out to in, thereby SWITCHING }
erase ( infile ); { in with out so we can erase in (!) }
if ioresult <> 0 then
showhelp (6);
{$i+}
nmdone := nmdone + 1; { increment number processed }
end; { if not done }
findnext(dirinfo); { go to next (until no more) }
end; { while }
end.