home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / INFO / TURBOPAS / PC_DISK.ZIP / PC-DISK2.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1985-10-10  |  9.9 KB  |  291 lines

  1. program pcdisk2;
  2.  
  3. const
  4.      sectors_per_diskette     = 708;
  5.      cluster_size             = 2;
  6.      sector_size_bits         = 9;
  7.  
  8. type
  9.      filename                 = string[11];
  10.      catalog_record           = record
  11.           volume_no           : integer;
  12.           file_name           : filename;
  13.           size1,size2         : integer;
  14.           time,date           : integer;
  15.           description         : string[33];
  16.           end;
  17.  
  18. var
  19.     datafile                  : file of catalog_record;
  20.     cr                        : catalog_record;
  21.     size                      : real;
  22.     t1,t2,t3                  : integer;
  23.     d1,d2,d3                  : integer;
  24.     file_table                : array[1..1000] of catalog_record;
  25.     file_count                : integer;
  26.     file_sector_total         : integer;
  27.     volume_table              : array[1..20] of filename;
  28.     volume_count              : integer;
  29.     volume_space_total        : real;
  30.     volume_sector_total       : integer;
  31.     i, j                      : integer;
  32.     keyid                     : integer;
  33.     catfile                   : string[80];
  34.     line_count                : integer;
  35.     parm                      : string[80];
  36.     pagesize                  : integer;
  37.     view                      : boolean;
  38.     outfile                   : text;
  39.  
  40. function realsize(s1,s2    : integer) : real;
  41.  
  42. var
  43.      x                     : real;
  44.  
  45. begin;
  46.      if s1<0 then x := 65536.0+s1
  47.      else         x := s1;
  48.      x := x+65536.0*s2;
  49.      realsize := x;
  50.      end; { conversion from two integers to a real }
  51.  
  52. procedure sortfile;
  53.  
  54. var
  55.      i, j, k                   : integer;
  56.      lowkey                    : filename;
  57.  
  58. begin
  59.      for i := 1 to file_count-1 do begin
  60.           k := i;
  61.           lowkey := file_table[i].file_name;
  62.           for j := i+1 to file_count do begin
  63.                if lowkey>file_table[j].file_name then begin
  64.                     k := j;
  65.                     lowkey := file_table[j].file_name;
  66.                     end; { saving new low key and index }
  67.                end; { search for current lowest key and index }
  68.           if k<>i then begin
  69.                cr := file_table[i];
  70.                file_table[i] := file_table[k];
  71.                file_table[k] := cr;
  72.                end; { swap if current is not lowest }
  73.           end; { sorting the file table, slowly }
  74. end; { file sort procedure }
  75.  
  76. procedure sortvolume;
  77.  
  78. var
  79.      i, j, k                   : integer;
  80.      lowkey1                   : integer;
  81.      lowkey2                   : filename;
  82.  
  83. begin
  84.      for i := 1 to file_count-1 do begin
  85.           k := i;
  86.           lowkey1 := file_table[i].volume_no;
  87.           lowkey2 := file_table[i].file_name;
  88.           for j := i+1 to file_count do with file_table[j] do begin
  89.                if ((lowkey1>volume_no) or
  90.                   ((lowkey1=volume_no) and (lowkey2>file_name))) then begin
  91.                     k := j;
  92.                     lowkey1 := volume_no;
  93.                     lowkey2 := file_name;
  94.                     end; { saving new low key and index }
  95.                end; { search for current lowest key and index }
  96.           if k<>i then begin
  97.                cr := file_table[i];
  98.                file_table[i] := file_table[k];
  99.                file_table[k] := cr;
  100.                end; { swap if current is not lowest }
  101.           end; { sorting the file table, slowly }
  102. end; { volume sort procedure }
  103.  
  104. procedure sortsize;
  105.  
  106. var
  107.      i, j, k                   : integer;
  108.      lowkey, x                 : real;
  109.  
  110. begin
  111.      for i := 1 to file_count-1 do begin
  112.           k := i;
  113.           lowkey := realsize(file_table[i].size1,file_table[i].size2);
  114.           for j := i+1 to file_count do begin
  115.                x := realsize(file_table[j].size1,file_table[j].size2);
  116.                if lowkey>x then begin
  117.                     k := j;
  118.                     lowkey := x;
  119.                     end; { saving new low key and index }
  120.                end; { search for current lowest key and index }
  121.           if k<>i then begin
  122.                cr := file_table[i];
  123.                file_table[i] := file_table[k];
  124.                file_table[k] := cr;
  125.                end; { swap if current is not lowest }
  126.           end; { sorting the file table, slowly }
  127. end; { size sort procedure }
  128.  
  129. procedure sortdate;
  130.  
  131. var
  132.      i, j, k                   : integer;
  133.      lowkey1                   : integer;
  134.      lowkey2                   : integer;
  135.      lowkey3                   : filename;
  136.  
  137. begin
  138.      for i := 1 to file_count-1 do begin
  139.           k := i;
  140.           lowkey1 := file_table[i].date;
  141.           lowkey2 := file_table[i].time;
  142.           lowkey3 := file_table[i].file_name;
  143.           for j := i+1 to file_count do with file_table[j] do begin
  144.                if ((lowkey1>date) or
  145.                   ((lowkey1=date) and (lowkey2>time)) or
  146.                   ((lowkey1=date) and (lowkey2=time) and (lowkey3<file_name)))
  147.                   then begin
  148.                     k := j;
  149.                     lowkey1 := date;
  150.                     lowkey2 := time;
  151.                     lowkey3 := file_name;
  152.                     end; { saving new low key and index }
  153.                end; { search for current lowest key and index }
  154.           if k<>i then begin
  155.                cr := file_table[i];
  156.                file_table[i] := file_table[k];
  157.                file_table[k] := cr;
  158.                end; { swap if current is not lowest }
  159.           end; { sorting the file table, slowly }
  160. end; { volume sort procedure }
  161.  
  162. procedure pagebegin;
  163.  
  164. begin
  165.      if view then clrscr else write(outfile,chr(12));
  166.      writeln(outfile,'File name        Size   Date     Time   V# Description');
  167.      if view then begin
  168.           line_count := 2;
  169.           end
  170.      else begin
  171.           writeln(outfile,' ');
  172.           line_count := 3;
  173.           end;
  174.      end;
  175.  
  176. procedure pageend;
  177.  
  178. var
  179.      junk           : string[10];
  180.  
  181. begin
  182.      if view then begin
  183.           gotoxy(1,24);
  184.           writeln('Press enter to continue');
  185.           readln(junk);
  186.           end;
  187.      pagebegin;
  188.      end;
  189.  
  190. begin
  191.      keyid := 5;
  192.      view := true;
  193.      catfile := 'C:\PUBLIC\COLLECT.DAT';
  194.      for i := 1 to ParamCount do begin;
  195.           parm := ParamStr(i);
  196.           if parm[1]='/' then begin
  197.                j := pos(upcase(parm[2]),'FVSDOMP');
  198.                if j<6 then keyid := j
  199.                else        view  := (j=6);
  200.                end
  201.           else                catfile := parm;
  202.           end;
  203.      line_count := 0;
  204.      if view then begin
  205.           pagesize := 24;
  206.           assign(outfile,'CON:');
  207.           clrscr;
  208.           end
  209.      else begin
  210.           pagesize := 58;
  211.           assign(outfile,'LST:');
  212.           end;
  213.      rewrite(outfile);
  214.      volume_count := 0;
  215.      volume_space_total := 0;
  216.      volume_sector_total := 0;
  217.      file_count := 0;
  218.      assign(datafile,catfile);
  219.  {$i-}
  220.      reset(datafile);
  221.  {$i+}
  222.      if IOresult<>0 then begin
  223.           writeln('Unable to open ',catfile,'. Program halted');
  224.           halt;
  225.           end;
  226.      writeln(outfile,'Volume number/name cross reference');
  227.      while(not eof(datafile)) do begin
  228.           read(datafile,cr);
  229.           if cr.volume_no=-1 then begin
  230.                if volume_count>0 then begin
  231.                     writeln(outfile,volume_space_total:9:0,
  232.                           volume_sector_total:5,
  233.                           sectors_per_diskette-volume_sector_total :5);
  234.                     end;
  235.                volume_count := volume_count+1;
  236.                volume_table[volume_count] := cr.file_name;
  237.                write(outfile,volume_count:2,'  ',cr.file_name,' ');
  238.                volume_space_total := 0;
  239.                volume_sector_total := 0;
  240.                end
  241.           else begin
  242.                file_count := file_count+1;
  243.                file_table[file_count] := cr;
  244.                volume_space_total := volume_space_total +
  245.                                      realsize(cr.size1,cr.size2);
  246.                file_sector_total := (cr.size2 shl (16-sector_size_bits))+
  247.                                     (cr.size1 shr sector_size_bits);
  248.                if (cr.size1 shl (16-sector_size_bits))<>0 then
  249.                     file_sector_total := file_sector_total+1;
  250.                if (file_sector_total mod cluster_size)<>0 then
  251.                     file_sector_total := (file_sector_total div cluster_size)*
  252.                                          cluster_size+cluster_size;
  253.                volume_sector_total := volume_sector_total+file_sector_total;
  254.                end;
  255.           end;
  256.      writeln(outfile,volume_space_total:9:0,volume_sector_total:5,
  257.                      sectors_per_diskette-volume_sector_total :5);
  258.      writeln(outfile,file_count,' file records read.');
  259.      writeln(outfile,volume_count,' volume records read.');
  260.      case keyid of
  261.           1 : sortfile;
  262.           2 : sortvolume;
  263.           3 : sortsize;
  264.           4 : sortdate;
  265.           5 : {sortno};
  266.           else ;
  267.           end;
  268.      pageend;
  269.      for i := 1 to file_count do begin;
  270.           with file_table[i] do begin
  271.                size := realsize(size1,size2);
  272.                t3 := (time and 31)*2;
  273.                t2 := (time shr 5) and 63;
  274.                t1 := (time shr 11);
  275.                d3 := date and 31;
  276.                d2 := (date shr 5) and 15;
  277.                d1 := (date shr 9) + 80;
  278.                writeln(outfile,
  279.                        copy(file_name,1,8),'.',copy(file_name,9,3),' ',
  280.                        size:8:0,' ',
  281.                        t1:2,':',t2:2,':',t3:2,' ',
  282.                        d2:2,'/',d3:2,'/',d1:2,' ',
  283.                        volume_no:2,' ',description);
  284.                end;
  285.           line_count := line_count+1;
  286.           if line_count>=pagesize then pageend;
  287.           end;
  288.      close(datafile);
  289. end.
  290.     line_count := line_count+1;
  291.           if line_count>=pagesize then pag