home *** CD-ROM | disk | FTP | other *** search
/ DP Tool Club 8 / CDASC08.ISO / VRAC / 4HIST.ZIP / 4HIST.PAS < prev    next >
Pascal/Delphi Source File  |  1993-09-08  |  5KB  |  186 lines

  1. program delete_duplicate_4dos_command_history_entries;
  2. uses dos , crt ;
  3. type
  4.     link = ^node;
  5.     node = record
  6.              cmd  : string ;
  7.              next : link ;
  8.            end;
  9. var
  10.    inbufr,
  11.    inlist,
  12.    ccmd      : string ;
  13.  
  14.    anchor,
  15.    chain,
  16.    temp,
  17.    cnode     : link ;
  18.  
  19.    before,
  20.    after     : text ;
  21.  
  22.    infile,
  23.    outfile,
  24.    tmpfile   : string ;
  25.  
  26.    i_case,
  27.    twirl     : boolean ;
  28.    histnumb  : word ;
  29.    histsize,
  30.    fdt       : longint ;
  31.  
  32. procedure showhelp ( errornum : byte );
  33. const
  34.     progdata = '4HIST- Free 4DOS utility: command history duplicate entry deleter.';
  35.     progdat2 = 'V1.00: September 8, 1993. (c) 1993 by David Daniel Anderson - Reign Ware.';
  36.     usage = 'Usage: 4HIST file [/i (ignore case)]';
  37. var
  38.     message : string [80];
  39. begin
  40.     writeln ( progdata );
  41.     writeln ( progdat2 );
  42.     writeln ;
  43.     writeln ( usage );
  44.     writeln ;
  45.  
  46.     case errornum of
  47.       1 : message := 'you must specify -exactly- one filespec.';
  48.       2 : message := 'unable to open ' + paramstr (1) + '!';
  49.       3 : message := 'file is empty, cannot continue.';
  50.     end;
  51.     writeln ( 'ERROR: (#',errornum,') - ', message );
  52.     halt ( errornum );
  53. end;
  54.  
  55. function converttoupper(w : string) : string;
  56. var
  57.    cp  : integer;        {the position of the character to change.}
  58. begin
  59.      for cp := 1 to length(w) do
  60.          w[cp] := upcase(w[cp]);
  61.      converttoupper := w;
  62. end;
  63.  
  64. procedure openfiles(var sfile, dfile : text; name1, name2 : string);
  65. var
  66.      dirinfo : searchrec ;
  67.      inname  : string [12] ;
  68.      insize  : longint ;
  69.  
  70. begin       { open the file to process, and another for output }
  71.      findfirst ( name1, archive, dirinfo );
  72.      if doserror <> 0 then
  73.         showhelp (2);
  74.  
  75.      inname := dirinfo.name ;
  76.      insize := dirinfo.size ;
  77.  
  78.      assign ( sfile, inname );     { we know names of both, }
  79. {$i-} reset ( sfile ); {$i+}     { but if source does not exist, }
  80.      if ( ioresult <> 0 ) then  { show help                     }
  81.          showhelp(2);
  82.  
  83.      if insize = 0 then
  84.          showhelp(3);
  85.  
  86.      assign ( dfile,name2 );     { create output file regardless }
  87.      rewrite ( dfile );
  88. end;
  89.  
  90. begin
  91.      outfile := 'dda_4h-!.out';
  92.      tmpfile := 'dda_4h-!.tmp';
  93.      if paramcount >= 1 then
  94.         infile := paramstr (1)
  95.      else showhelp (1) ;
  96.  
  97.      i_case := false ;
  98.      if ( paramcount = 2 ) then
  99.         if (( converttoupper ( paramstr (2) )) = '/I' )  then
  100.            i_case := true ;
  101.  
  102.      openfiles ( before, after, infile, outfile );
  103.  
  104.      new ( anchor );
  105.      anchor^.cmd  := '';
  106.      anchor^.next := nil ;
  107.      chain := anchor ;
  108.  
  109.      twirl := true ;
  110.      histsize := 0 ;
  111.      histnumb := 0 ;
  112.  
  113.      while not eof ( before ) do begin
  114.            readln ( before, ccmd );
  115.  
  116.            twirl := not twirl ;
  117.            if twirl then write ('\')
  118.                    else write ('/');
  119.            gotoxy ( wherex - 1, wherey );
  120.  
  121.            histsize := histsize + length ( ccmd ) ;
  122.            histnumb := histnumb + 1 ;
  123.  
  124.            new ( cnode );
  125.            cnode^.cmd  := ccmd ;
  126.            cnode^.next := nil  ;
  127.            chain := anchor ;
  128.  
  129.            inbufr := cnode^.cmd ;
  130.            if i_case then inbufr := converttoupper ( inbufr );
  131.  
  132.            while ( chain^.next <> nil )  do begin
  133.  
  134.                  inlist := chain^.next^.cmd ;
  135.                  if i_case then inlist := converttoupper ( inlist );
  136.  
  137.                  if ( inbufr = inlist ) then
  138.                  begin
  139.                       temp := chain^.next ;
  140.                       chain^.next := chain^.next^.next ;
  141.                       dispose ( temp );
  142.                  end
  143.                  else
  144.                     chain := chain^.next ;
  145.            end;
  146.  
  147.            inlist := chain^.cmd ;
  148.            if i_case then inlist := converttoupper ( inlist );
  149.  
  150.            if ( inbufr <> inlist ) then
  151.            begin
  152.               chain^.next := cnode ;
  153.               chain := cnode ;
  154.            end;
  155.      end;
  156.  
  157.      histsize := histsize + histnumb ;
  158.      write ( 'History was: ', histsize, ' bytes (',
  159.               histnumb, ' commands), and is now: ' );
  160.      histsize := 0 ;
  161.      histnumb := 0 ;
  162.      repeat
  163.            temp := anchor ;
  164.            anchor := anchor^.next;
  165.            dispose ( temp );
  166.            writeln ( after, anchor^.cmd ) ;
  167.            histsize := histsize + length ( anchor^.cmd ) ;
  168.            histnumb := histnumb + 1 ;
  169.      until anchor^.next = nil ;
  170.      dispose ( anchor );
  171.  
  172.      histsize := histsize + histnumb ;
  173.      writeln ( histsize, ' bytes (', histnumb, ' commands).' );
  174.  
  175.      close ( after );
  176.      reset ( after );
  177.      getftime ( before, fdt );
  178.      setftime ( after, fdt );
  179.      close ( before );
  180.      close ( after );
  181.      rename ( before, tmpfile );
  182.      rename ( after, infile );
  183.      erase  ( before );
  184.  
  185. end.
  186.