home *** CD-ROM | disk | FTP | other *** search
- (*--------------------------------------------------------------------------*)
- (* TREEDIRS.INC *)
- (* Turbo Pascal routines for tree-structured directories. *)
- (* Copyright 1984 Michael A. Covington *)
- (* Functions: currentdrive Procedures: chdrive *)
- (* currentdir rmdir *)
- (* diskspace mkdir *)
- (* rename *)
- (*--------------------------------------------------------------------------*)
- TYPE
- pathtype = STRING[62];
- drivetype = STRING[2];
- rtype = RECORD
- ax,bx,cx,dx,bp,si,di,ds,es,flags:INTEGER
- END;
-
- PROCEDURE xxdiskerr(x:drivetype);
- BEGIN
- WRITELN('Error -- Invalid disk drive, ''',x,'''');
- HALT
- END;
-
- PROCEDURE xxpatherr(x:pathtype);
- BEGIN
- WRITELN('Error -- Invalid path,''',x,'''');
- HALT
- END;
-
- FUNCTION currentdrive: drivetype;
- (*--------------------------------------------------------------------------*)
- (* Returns designator for the default drive, e.g. 'A:'. *)
- (*--------------------------------------------------------------------------*)
- VAR
- w : drivetype;
- reg : rtype;
-
- BEGIN
- reg.ax:=$1900;
- Intr($21,reg);
- w:='A:';
- w[1]:=CHR(ORD(w[1])+Lo(reg.ax));
- currentdrive:=w
- END;
-
- PROCEDURE chdrive(x:drivetype);
- (*--------------------------------------------------------------------------*)
- (* Chooses a new default drive. Parameters can have the form A: A a: or a. *)
- (* Requires XXDISKERR, above *)
- (*--------------------------------------------------------------------------*)
- VAR
- reg: rtype;
-
- BEGIN
- reg.ax := $0E00;
- reg.dx := ORD(UpCase(x[1])) - ORD('A');
- Intr($21,reg);
- IF (reg.dx < 0) OR (Lo(reg.ax) < Lo(reg.dx)) THEN xxdiskerr(x);
- END;
-
- FUNCTION diskspace(x:drivetype):REAL;
- (*--------------------------------------------------------------------------*)
- (* Returns number of bytes available on specified disk. Parameter as for *)
- (* CHDRIVE. Requires XXDISKERR, above. *)
- (*--------------------------------------------------------------------------*)
- VAR
- reg: rtype;
-
- BEGIN
- reg.ax := $3600;
- reg.dx := 1 + ORD(UpCase(x[1])) - ORD('A');
- Intr($21,reg);
- IF reg.ax = $FFFF THEN
- xxdiskerr(x)
- ELSE
- diskspace := (256.0 * Hi(reg.dx) + Lo(reg.dx)) * reg.ax * reg.cx
- END;
-
- FUNCTION currentdir(x:drivetype):pathtype;
- (*--------------------------------------------------------------------------*)
- (* Returns full path to active directory on specified drive, including *)
- (* backslash at beginning, not including drive designator. Parameters as *)
- (* for CHDRIVE. Requires XXDISKERR, above. *)
- (*--------------------------------------------------------------------------*)
- VAR
- w : pathtype;
- reg: rtype;
- i : INTEGER;
-
- BEGIN (*get current path*)
- reg.ax:=$4700;
- reg.dx:=1 + ORD(UpCase(x[1])) - ORD('A');
- reg.ds:=Seg(w[1]);
- reg.si:=Ofs(w[1]);
- Intr($21,reg);
- IF (reg.flags AND 1) > 0 THEN xxdiskerr(x);
-
- (*turn it into a Turbo string*)
- i:=1;
- WHILE w[i]<>CHR(0) DO i:=i+1;
- w[0]:=CHR(i-1);
- FOR i:=1 TO LENGTH(w) DO w[i]:=UpCase(w[i]);
- currentdir := '\'+w
- END;
-
- PROCEDURE xxdir(x:pathtype; k:INTEGER);
- (*--------------------------------------------------------------------------*)
- (* Executes CHDIR, MKDIR, RMDIR requests. Requires XXPATHERR,CURRENTDRIVE. *)
- (*--------------------------------------------------------------------------*)
- VAR
- w : pathtype;
- reg: rtype;
-
- BEGIN
- w:=x+CHR(0);
- IF w[2] <> ':' THEN (*add drive designator*)
- w:=currentdrive+w;
- reg.ax := k;
- reg.ds := Seg(w[1]);
- reg.dx := Ofs(w[1]);
- Intr($21,reg);
- IF (reg.flags AND 1) > 0 THEN xxpatherr(x)
- END;
-
- PROCEDURE chdir(x:pathtype);
- (*--------------------------------------------------------------------------*)
- (* Equivalent to CHDIR in DOS; requires XXDIR, XXPATHERR, CURRENTDRIVE *)
- (* WARNING: do not leave a directory if you have files open in it. *)
- (*--------------------------------------------------------------------------*)
- BEGIN
- xxdir(x,$3B00)
- END;
-
- PROCEDURE rmdir(x:pathtype);
- (*--------------------------------------------------------------------------*)
- (* Equivalent to RMDIR in DOS; requires XXDIR, XXPATHERR, CURRENTDRIVE *)
- (*--------------------------------------------------------------------------*)
- BEGIN
- xxdir(x,$3A00)
- END;
-
- PROCEDURE mkdir(x:pathtype);
- (*--------------------------------------------------------------------------*)
- (* Equivalent to MKDIR in DOS; requires XXDIR, XXPATHERR, CURRENTDRIVE *)
- (*--------------------------------------------------------------------------*)
- BEGIN
- xxdir(x,$3900)
- END;
-
- PROCEDURE Rename(x,y:pathtype);
- (*--------------------------------------------------------------------------*)
- (* renames a file; unlike the DOS RENAME command, both parameters of this *)
- (* are full paths. The paths need not be the same, allowing a file to be *)
- (* moved from one directory to another. First parameter can specify a *)
- (* drive, any drive letter on the second parameter is ignored. *)
- (*--------------------------------------------------------------------------*)
- VAR
- wx,wy : pathtype;
- reg : rtype;
-
- BEGIN
- wx := x + CHR(0);
- wy := y + CHR(0);
- IF wx[2]<>':' THEN wx :=currentdrive+wx;
- reg.ax := $5600;
- reg.ds := Seg(wx[1]);
- reg.dx := Ofs(wx[1]);
- reg.es := Seg(wy[1]);
- reg.di := Ofs(wy[1]);
- Intr($21,reg);
- IF (reg.flags AND 1) <> 0 THEN
- BEGIN
- WRITELN;
- WRITELN('Error -- invalid rename request.');
- WRITELN(' -- from: ''',x,'''');
- WRITELN(' -- to: ''',y,'''');
- HALT
- END
- END;
-