Contributor: DAVID DANIEL ANDERSON    

(*
From: DAVID DANIEL ANDERSON        Refer#: NONE
Subj: QUIET USING BLOCKREAD
*)

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 ;
                       {!}  { all of the case messages got reformatted }
    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.


                                     QUIET
                    Free DOS utility: quiets noisy programs
                         Version 1.00 - August 27, 1993
                                    (c) 1993
                                       by
                             David Daniel Anderson
                                   Reign Ware





QUIET quiets noisy programs, by replacing certain noisemaking program
codes.

WARNING!!! QUIET OVERWRITES THE INPUT FILE, SO MAKE SURE THAT YOU
EITHER WORK ON A -COPY- OF YOUR FILE(S) OR YOU KNOW WHAT YOU ARE
DOING BEFORE YOU START.

Usage:  QUIET noisy_prog

Examples:

   QUIET hangman.com
   QUIET *.exe
   QUIET pac*.*
   QUIET d:\games\fire.com

QUIET needs one and only one parameter on the command line: the file
to be silenced.  By using wildcards (* and ?), multiple files can be
processed in one pass.  (See the DOS manual for wildcard info.)

QUIET will maintain the original date and time of the file(s).


                             How it works:

QUIET simply replaces the two-byte sequence: a  with: 
In hex, that is:   E6 61   and:   90  90.
In decimal it is: 230 97   and:  144 144.

The E6 61 code is simply an instruction to activate the speaker, and
the 90 90 code is simply an instruction to do nothing.


              Possible complications/ reasons for failure:

1) Some programs check themselves, and will not work at all if they
have been changed.

2) Many programs make noise by other methods, and will not be silenced.

3) If the file was read-only, it cannot be processed.

4) Some virus detectors will complain if you try this on a file which
you have told the watch dog program to monitor.

Note: other errors are mentioned by the program when it encounters them.

---
  SLMR 2.1a 
  RNET 2.00m: ILink: Channel 1(R)  Cambridge, MA  617-354-7077