home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS 1992 June / SIMTEL_0692.cdr / msdos / dirutl / ddel124.arc / ALTFIO.MOD < prev    next >
Encoding:
Modula Implementation  |  1989-07-15  |  5.5 KB  |  171 lines

  1. IMPLEMENTATION MODULE AltFIO;
  2.  
  3.   IMPORT SYSTEM, FIO, IO, Lib, Str;
  4.   FROM SYSTEM IMPORT CarryFlag;
  5.  
  6.   PROCEDURE WrErr(name, msg: ARRAY OF CHAR);
  7.     CONST bel = CHR(7);
  8.   BEGIN
  9.     IO.WrChar(bel);
  10.     IO.WrStr(name);
  11.     IO.WrStr(": ");
  12.     IO.WrStr(msg);
  13.     IO.WrLn
  14.   END WrErr;
  15.  
  16.   PROCEDURE Fatal(pathname: ARRAY OF CHAR; errCode: CARDINAL); (* private *)
  17.   BEGIN
  18.     CASE errCode OF
  19.       1: WrErr(pathname, "Invalid function number")
  20.     | 2: WrErr(pathname, "File not found")
  21.     | 3: WrErr(pathname, "Path not found")
  22.     | 5: WrErr(pathname, "Access denied")
  23.     |15: WrErr(pathname, "Invalid drive specification")
  24.     |16: WrErr(pathname, "Attempt to remove the current directory")
  25.     END;
  26.     HALT
  27.   END Fatal;
  28.  
  29.   PROCEDURE SetAttr(pathname: ARRAY OF CHAR; attr: FIO.FileAttr);
  30.    VAR r: SYSTEM.Registers;
  31.   BEGIN
  32.     WITH r DO
  33.       AH := 43H;                (* Get or Set File Attributes (CHMOD) *)
  34.       AL := 01H;                (* Set attributes *)
  35.       CH := 0H;                 (* Clear upper byte of CX *)
  36.       CL := SHORTCARD(attr);    (* Desired attributes *)
  37.       DS := SYSTEM.Seg(pathname);
  38.       DX := SYSTEM.Ofs(pathname);
  39.       Lib.Dos(r);               (* INT 21H Function Call *)
  40.       IF CarryFlag IN Flags THEN Fatal(pathname, AX) END
  41.     END
  42.   END SetAttr;
  43.  
  44.   PROCEDURE ReadFirstEntry(pathname: ARRAY OF CHAR;
  45.                            attr: FIO.FileAttr;
  46.                            VAR D: FIO.DirEntry): BOOLEAN;
  47.     VAR r: SYSTEM.Registers;
  48.   BEGIN
  49.     WITH r DO
  50.       AH := 1AH;                (* Set DTA *)
  51.       DS := SYSTEM.Seg(D);
  52.       DX := SYSTEM.Ofs(D);
  53.       Lib.Dos(r);               (* INT 21H Function Call *)
  54.       AH := 4EH;                (* FIND FIRST *)
  55.       CL := SHORTCARD(attr);    (* File attribute *)
  56.       DS := SYSTEM.Seg(pathname);(* Pointer to filespec *)
  57.       DX := SYSTEM.Ofs(pathname);
  58.       Lib.Dos(r);               (* INT 21H Function Call *)
  59.       IF CarryFlag IN Flags THEN
  60.         IF AX = 18 THEN RETURN FALSE
  61.         ELSE Fatal(pathname, AX)
  62.         END
  63.       ELSE RETURN TRUE
  64.       END
  65.     END
  66.   END ReadFirstEntry;
  67.  
  68.   PROCEDURE ReadNextEntry(VAR D: FIO.DirEntry): BOOLEAN;
  69.     VAR r: SYSTEM.Registers;
  70.   BEGIN
  71.     WITH r DO
  72.       AH := 1AH;                (* Set DTA *)
  73.       DS := SYSTEM.Seg(D);
  74.       DX := SYSTEM.Ofs(D);
  75.       Lib.Dos(r);               (* INT 21H Function Call *)
  76.       AH := 4FH;                (* FIND NEXT *)
  77.       Lib.Dos(r);               (* INT 21H Function Call *)
  78.       IF (CarryFlag IN Flags) OR (AX = 18) THEN
  79.         RETURN FALSE
  80.       ELSE RETURN TRUE
  81.       END
  82.     END
  83.   END ReadNextEntry;
  84.  
  85.   PROCEDURE ChDir(pathname: ARRAY OF CHAR);
  86.     VAR r: SYSTEM.Registers;
  87.   BEGIN
  88.     WITH r DO
  89.       AH := 3BH;                (* CHDIR *)
  90.       DS := SYSTEM.Seg(pathname);(* Pointer to new default directory name *)
  91.       DX := SYSTEM.Ofs(pathname);
  92.       Lib.Dos(r);               (* INT 21H Function Call *)
  93.       IF CarryFlag IN Flags THEN Fatal(pathname, AX) END
  94.     END
  95.   END ChDir;
  96.  
  97.   PROCEDURE RmDir(pathname: ARRAY OF CHAR);
  98.     VAR r: SYSTEM.Registers;
  99.   BEGIN
  100.     WITH r DO
  101.       AH := 3AH;                (* RMDIR *)
  102.       DS := SYSTEM.Seg(pathname);(* Pointer to directory name to remove *)
  103.       DX := SYSTEM.Ofs(pathname);
  104.       Lib.Dos(r);               (* INT 21H Function Call *)
  105.       IF CarryFlag IN Flags THEN Fatal(pathname, AX) END
  106.     END
  107.   END RmDir;
  108.  
  109.   PROCEDURE Erase(pathname: ARRAY OF CHAR);
  110.     VAR r: SYSTEM.Registers;
  111.   BEGIN
  112.     WITH r DO
  113.       AH := 41H;                (* Delete File (UNLINK) *)
  114.       DS := SYSTEM.Seg(pathname);(* Pointer to directory name to remove *)
  115.       DX := SYSTEM.Ofs(pathname);
  116.       Lib.Dos(r);               (* INT 21H Function Call *)
  117.       IF CarryFlag IN Flags THEN Fatal(pathname, AX) END
  118.     END
  119.   END Erase;
  120.  
  121.   PROCEDURE AddDrive(drive: SHORTCARD; VAR pathname: ARRAY OF CHAR);
  122.   BEGIN
  123.     Str.Insert(pathname, " :", 0);
  124.     pathname[0] := CHR( CARDINAL(drive) + ORD('A') )
  125.   END AddDrive;
  126.  
  127.   PROCEDURE GetDir(drive: SHORTCARD;            (* private procedure *)
  128.                    VAR pathname: ARRAY OF CHAR);
  129.     VAR r: SYSTEM.Registers;
  130.   BEGIN
  131.     WITH r DO
  132.       AH := 47H;                (* Get Current Directory *)
  133.       DL := drive;              (* Drive number (0=default, 1=A, etc.) *)
  134.       DS := SYSTEM.Seg(pathname);(* Pointer to 64-byte buffer *)
  135.       SI := SYSTEM.Ofs(pathname);
  136.       Lib.Dos(r);               (* INT 21H Function Call *)
  137.       IF CarryFlag IN Flags THEN Fatal(pathname, AX) END
  138.     END
  139.   END GetDir;
  140.  
  141.   PROCEDURE GetDrive(): SHORTCARD;      (* private procedure *)
  142.     VAR r: SYSTEM.Registers;
  143.   BEGIN
  144.     r.AH := 19H;                (* Get Current Disk *)
  145.     Lib.Dos(r);                 (* INT 21H Function Call *)
  146.     RETURN r.AL
  147.   END GetDrive;
  148.  
  149.   PROCEDURE FormName(VAR pathname: ARRAY OF CHAR;
  150.                      VAR drive: SHORTCARD;
  151.                      VAR currDir: ARRAY OF CHAR);
  152.  
  153.   BEGIN
  154.     IF Str.Pos(pathname, ":") = MAX(CARDINAL) THEN (* if no drive indicated *)
  155.       drive := GetDrive();                         (* then insert current   *)
  156.       AddDrive(drive, pathname)                    (* drive designation     *)
  157.     ELSE
  158.       drive := SHORTCARD( ORD( CAP(pathname[0]) ) - ORD('A') )
  159.     END;
  160.  
  161.     GetDir(drive+1, currDir);
  162.     Str.Insert(currDir, "\", 0);
  163.  
  164.     IF pathname[2] # '\' THEN
  165.       Str.Insert( pathname, "\", 2 );
  166.       IF Str.Length(currDir) > 1 THEN Str.Insert(pathname, currDir, 2) END
  167.     END
  168.   END FormName;
  169.  
  170. END AltFIO.
  171.