home *** CD-ROM | disk | FTP | other *** search
/ Frostbyte's 1980s DOS Shareware Collection / floppyshareware.zip / floppyshareware / USCX / TURBO-10.ZIP / GETDIR.PAS < prev    next >
Pascal/Delphi Source File  |  1985-05-17  |  5KB  |  112 lines

  1. { ************************************************************************}
  2. { ----------------------------  GetDir  --------------------------------- }
  3. { ************************************************************************}
  4. { Turbo Pascal procedure to scan a disk's directory under PC/MSDos 2.0    }
  5. { Written orginally by:    Jim McCarthy                                   }
  6. {                          Technical Support                              }
  7. {                          Borland Intl.                                  }
  8. { Re-worked into an easy to use $Include file by                          }
  9. {                          Clark W. Walker                                }
  10. {                          CompuServe 76010,346                           }
  11. { ************************************************************************}
  12.    TYPE
  13.       registers = record
  14.                     ax, bx, cx, dx, bp, si, di, ds, es, flags : integer;
  15.                   end;
  16.       string80 = string[80];
  17.    VAR
  18.       OurDTA : array [ 1..43 ] of byte;    { Data Transfer Area buffer }
  19.       CurDTAseg,                           { DTA segment before exicution }
  20.       CurDTAofs,                           { DTA offset    "        "     }
  21.       OurDTAseg,                           { DTA segment and offset set after }
  22.       OurDTAofs          : integer;        { start of program }
  23.       regs               : registers;      { register pack for the DOS call }
  24. { --------------------------------------------------------------------------}
  25. {     This procedure will setup for or reset the DTA in preparation         }
  26. { --------------------------------------------------------------------------}
  27. { --------------------------------------------------------------------------}
  28. PROCEDURE DirSetup(InitReset: String80 ;
  29.                    var error: Integer  );
  30. VAR
  31.    I : Integer;
  32. BEGIN
  33.    Error := 0;
  34.    IF InitReset = 'INIT' then
  35.       BEGIN           {---------- Initialization processes ------------}
  36.          For I := 1 to 43 do                    {Initialize our DTA Buffer}
  37.              OurDTA[I]:=0;
  38.  
  39.          regs.ax := $2F00;                      { Save Current DTA pointer}
  40.          Intr($21,regs);                        { to be restored later    }
  41.          CurDTASeg := regs.es;
  42.          CurDTAOfs := regs.bx;
  43.          error := regs.ax and $FF;
  44.  
  45.          if error = 0 then
  46.             BEGIN
  47.             OurDTAseg := seg(OurDTA);           {Point DOS to our        }
  48.             OurDTAofs := ofs(OurDTA);           {DTA Buffer              }
  49.             regs.ax := $1A00;
  50.             regs.ds := OurDTASeg;
  51.             regs.dx := OurDTAOfs;
  52.             Intr($21,regs);
  53.             error := regs.ax and $FF;
  54.             END;
  55.       END
  56.    Else
  57.       BEGIN            {-------------- Reset Processes ------------------}
  58.          regs.ax := $1A00;
  59.          regs.ds := CurDTASeg;
  60.          regs.dx := CurDTAOfs;
  61.          Intr($21,regs);
  62.          error := regs.ax and $FF;
  63.          END;
  64. END;
  65.  
  66. { --------------------------------------------------------------------------}
  67. {   DirGet gets the first/next drectory entry of a particular file mask.    }
  68. {   Also reads directories and volumne info                                 }
  69. { --------------------------------------------------------------------------}
  70. { Func:    'FIRST' or 'NEXT'                                                }
  71. { Asciiz:  Drive:\Path\Filename.Ext                                         }
  72. { FileName:Filename.Ext                                                     }
  73. { Option:  1=volumne read                                                   }
  74. {          2=directores read                                                }
  75. {          3=standard files read                                            }
  76. {  Note: options could be added to read system and hidden files             }
  77. { --------------------------------------------------------------------------}
  78. PROCEDURE DirGet  (Func     : String80 ;
  79.                    Asciiz   : String80 ;
  80.                var FileName : String80 ;
  81.                    Option   : Integer  ;
  82.                var Error    : Integer  );
  83. VAR
  84.      I : integer;
  85.  
  86. BEGIN
  87.     error := 0;
  88.  
  89.     If Func = 'FIRST' then
  90.        BEGIN
  91.        asciiz[length(asciiz)+1]:=chr(0); { Terminate name with hex00 }
  92.        regs.ax := $4E00;          { Get first directory entry }
  93.        regs.ds := seg(Asciiz);    { Point to the file mask }
  94.        regs.dx := ofs(Asciiz);
  95.        regs.dx := regs.dx + 1;    { Point past string's length byte }
  96.        regs.cx := Option;
  97.        END
  98.     else
  99.        regs.ax := $4F00;          {Get next directory entry}
  100.  
  101.     Intr($21,regs);               { Execute MSDos call }
  102.     error := regs.ax and $FF;     { Get error return }
  103.     I := 1;
  104.     If error = 0 then
  105.     Repeat                        { Get name from the DTA area }
  106.         FileName[I]:=chr(mem[OurDTASeg:OurDTAOfs + 29 + I]);
  107.         I := I + 1;
  108.     Until (not (FileName[I - 1] in [' '..'~']));
  109.     FileName[0]:=chr(I-1)         { set string length because assigning }
  110.                                   { by element does not set length }
  111. END;
  112.