home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / INFO / TURBOPAS / LS.ZIP / LS.PAS
Encoding:
Pascal/Delphi Source File  |  1985-12-28  |  6.4 KB  |  280 lines

  1. (*
  2.  * ls - file list program
  3.  *
  4.  * this is a general file-list processing program
  5.  * it can process a comma seperated list of wildcards
  6.  * into a sorted pathname list
  7.  *
  8.  * shs 8/3/85
  9.  *
  10.  *)
  11.  
  12. program ls(output);
  13.  
  14.  
  15. {$p512,d-}
  16.  
  17. const
  18.    maxnumfiles =  250;
  19.    null =         #0;
  20.  
  21. type
  22.    longstring =   string [80];
  23.    filestring =   string [15];
  24.    filearray =    array [1.. maxnumfiles] of filestring;
  25.    regpack =      record
  26.                      ax,
  27.                      bx,
  28.                      cx,
  29.                      dx,
  30.                      bp,
  31.                      si,
  32.                      di,
  33.                      ds,
  34.                      es,
  35.                      flags:         Integer;
  36.                   end;
  37.  
  38.  
  39. var
  40.    reg:           regpack;
  41.    dta:           longstring;
  42.    filetable:     filearray;
  43.    filesize:      array [1.. maxnumfiles] of integer;
  44.    filecount:     integer;
  45.    i,j,k:         integer;
  46.    lines:         integer;
  47.    pattern:       longstring;
  48.    totalk:        integer;
  49.  
  50.  
  51. procedure display_free_space(drive: longstring);
  52. var
  53.    cluster_size: real;
  54.  
  55. begin
  56.    with reg do
  57.    begin
  58.  
  59.       if drive[2] = ':' then
  60.       begin
  61.          write(drive[1],':  ');
  62.          dx := ord(upcase(drive[1]))-ord('@');
  63.       end
  64.  
  65.       else
  66.          dx := 0;
  67.  
  68.       ax := $3600;
  69.       msdos(reg);
  70.  
  71.       cluster_size := int(cx) * int(ax);
  72.       write(int(bx) * cluster_size / 1024.0:0:0,'k or ');
  73.       write(int(bx) / int(dx) * 100.0:0:2,'% free, out of ');
  74.       writeln(int(dx) * cluster_size / 1024.0:0:0,'k total disk space');
  75.  
  76.    end;
  77.  
  78. end;
  79.  
  80.  
  81. procedure sorttable(var fdir:     filearray;
  82.                         first:     integer;
  83.                         last:      integer);
  84. var
  85.    i:       integer;
  86.    swapped: boolean;
  87.    temp:    filestring;
  88.    itemp:   integer;
  89.  
  90. begin
  91.  
  92.    repeat
  93.       swapped := false;
  94.       for i := first to last-1 do
  95.       begin
  96.          if fdir[i] > fdir[i+1] then
  97.          begin
  98.             temp := fdir[i];
  99.             fdir[i] := fdir[i+1];
  100.             fdir[i+1] := temp;
  101.             itemp := filesize[i];
  102.             filesize[i] := filesize[i+1];
  103.             filesize[i+1] := itemp;
  104.             swapped := true;
  105.          end;
  106.       end;
  107.  
  108.       last := last - 1;
  109.    until (swapped = false) or (last < 2);
  110.  
  111. end;
  112.  
  113.  
  114. procedure getfiles (patternlist:   longstring;
  115.                          {comma seperated list of patterns to match}
  116.  
  117.                     fattr:         integer;
  118.                          {attribute to match}
  119.  
  120.                     var fdir:      filearray;
  121.                          {output filename list}
  122.  
  123.                     var num:       integer);
  124.                          {output number of files}
  125.  
  126. {-find files matching specified characteristics}
  127.  
  128. var
  129.    i,
  130.    cf:            byte;
  131.    onedir:        filestring;
  132.    listpos:       integer;
  133.    pattern:       longstring;
  134.    c:             char;
  135.    prevnum:       integer;
  136.    h,d,y,m:       byte;
  137.  
  138. begin
  139.    num := 0;
  140.    totalk := 0;
  141.    prevnum := 1;
  142.    listpos := 1;
  143.  
  144.    while listpos <= length (patternlist) do
  145.    begin
  146.       pattern := '';
  147.       c := patternlist [listpos];
  148.  
  149.       while (c <> ',') and (listpos <= length (patternlist)) do
  150.       begin
  151.          pattern := pattern + c;
  152.          listpos := listpos + 1;
  153.          c := patternlist [listpos];
  154.       end;
  155.       listpos := listpos + 1;
  156.  
  157.       if pattern[length(pattern)] = ':' then
  158.          pattern := pattern + '*.*';
  159.  
  160.       display_free_space(pattern);
  161.  
  162.       pattern := pattern + null;
  163.       reg.ax := $1a00;
  164.       reg.ds := seg (dta [1]);
  165.       reg.dx := ofs (dta [1]);
  166.       msdos(reg);              {set dta address}
  167.  
  168.       reg.cx := fattr;
  169.       reg.ax := $4e00;
  170.       reg.ds := seg (pattern [1]);
  171.       reg.dx := ofs (pattern [1]);
  172.       msdos(reg);              {find first matching file}
  173.  
  174.       cf := reg.flags and 1;
  175.  
  176.       while ((cf <> 1) and (num < maxnumfiles)) do
  177.       begin
  178.          i := ord (dta [22]);
  179.  
  180.          if (i = fattr) or ((fattr <> 16) and
  181.                (i < fattr)) then
  182.          begin                       {get subdir or file name}
  183.  
  184.             onedir := '';
  185.             i := 0;
  186.  
  187.             repeat
  188.                c := dta [31 + i];
  189.                if (c >= 'A') and (c <= 'Z') then
  190.                   c := chr(ord(c) + 32);
  191.  
  192.                if c <> null then
  193.                   onedir := onedir + c;
  194.  
  195.                i := i + 1;
  196.             until c = null;          {throw out the . and .. entries}
  197.  
  198.  
  199.             if onedir [1]<> '.' then
  200.             begin
  201.                num := num + 1;
  202.                fdir[num]:= onedir;
  203.  
  204.                m:=Ord(dta[27]);
  205.                h:=Ord(dta[28]);
  206.                d:=Ord(dta[29]);
  207.                y:=Ord(dta[30]);
  208.                filesize[num] := trunc((m+256.0*(h+256.0*(d+256.0*y)))/1024.0+0.999);
  209.                if (filesize[num] = 0) then
  210.                   fdir[num] := ' ' + fdir[num]
  211.                else
  212.                   totalk := totalk + filesize[num];
  213.             end;
  214.          end;
  215.  
  216.          reg.ax := $4f00;
  217.          reg.ds := seg (dta [1]);
  218.          reg.dx := ofs (dta [1]);
  219.          msdos(reg);              {keep searching for next file}
  220.  
  221.          cf := reg.flags and 1;
  222.       end;
  223.  
  224.       sorttable(fdir,prevnum,num); {sort each part of list separately}
  225.       prevnum := num + 1;
  226.    end;
  227.  
  228.    if num >= maxnumfiles then
  229.    begin
  230.       writeln('warning: files in excess of ',
  231.             maxnumfiles, ' ignored');
  232.    end;
  233. end;                     {getfiles}
  234.  
  235.  
  236.  
  237.  
  238. begin
  239.  
  240.    if paramcount > 1 then
  241.    begin
  242.       writeln('usage: ls PATTERN{,PATTERN}');
  243.       halt;
  244.    end;
  245.  
  246.    if paramcount = 1 then
  247.       pattern := paramstr(1)
  248.    else
  249.       pattern := '*.*';
  250.  
  251.  
  252.    writeln;
  253.    getfiles(pattern, $37, filetable, filecount);
  254.    write('Total of ',totalk,'k used by ',filecount,' files in ');
  255.    writeln(pattern);
  256.  
  257.    lines := ((filecount+3) div 4);
  258.    for i := 1 to lines do
  259.    begin
  260.       k := i;
  261.       for j := 1 to 4 do
  262.       begin
  263.          if k <= filecount then
  264.          begin
  265.             if filesize[k] > 0 then
  266.                write(filesize[k]:3,'k ',filetable[k])
  267.             else
  268.                write(filetable[k],'\    ');
  269.  
  270.             if j <> 4 then
  271.                write(' ':14-length(filetable[k]));
  272.          end;
  273.          k := k + lines;
  274.       end;
  275.       writeln;
  276.    end;
  277.  
  278.    halt(0);
  279. end.
  280.