home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format 101 / af101sub.adf / DoVer.LZX / DoVer / src / XFDsupport.mod < prev   
Encoding:
Text File  |  1995-11-15  |  2.2 KB  |  81 lines

  1. MODULE XFDsupport;
  2.  
  3. IMPORT
  4.   d   : Dos,
  5.   ds  : DosSupport,
  6.   e   : Exec,
  7.   xfd : XFDmaster,
  8.   Y   : SYSTEM;
  9.  
  10. TYPE
  11.   FileDescr * = RECORD
  12.     name    * : e.LSTRPTR;
  13.     passwd  * : xfd.SpecialPtr;
  14.     address - : e.APTR;
  15.     size    - : e.ULONG;
  16.     memSize   : e.ULONG;
  17.   END;
  18.  
  19. (* load the specified file into memory, with XFD if available *)
  20. PROCEDURE LoadFile * (VAR f : FileDescr): BOOLEAN;
  21. VAR
  22.   fh  : d.FileHandlePtr;
  23.   bi  : xfd.BufferInfoPtr;
  24.   ret : BOOLEAN;
  25. BEGIN
  26.   (* $IFNOT ClearVars *) ret := FALSE; (* $END *)
  27.   fh := d.Open(f.name^,d.oldFile);
  28.   IF fh = NIL THEN
  29.     ds.PrintFault;
  30.   ELSE
  31.     f.size := d.Seek(fh,0,d.end); f.size := d.Seek(fh,0,d.beginning);
  32.     IF f.size # 0 THEN
  33.       f.memSize := f.size;
  34.       f.address := e.AllocMem(f.size,e.any);
  35.       IF f.address = NIL THEN
  36.         ds.PrintMemErr;
  37.       ELSE
  38.         IF f.size # d.Read(fh,Y.VAL(e.LSTRPTR,f.address)^,f.size) THEN
  39.           ds.PrintFault; e.FreeMem(f.address,f.size);
  40.         ELSE
  41.           ret := TRUE;                (* success *)
  42.           IF xfd.base # NIL THEN
  43.             bi := xfd.AllocBufferInfo();
  44.             IF bi # NIL THEN
  45.               bi.sourceBuffer := f.address;
  46.               bi.sourceBufLen := f.size;
  47.               bi.special := f.passwd;
  48.               IF xfd.RecogBuffer(bi) THEN
  49.                 IF (xfd.password IN bi.packerFlags) & (f.passwd = NIL) THEN
  50.                   d.PrintF("encrypted file need password\n");
  51.                 ELSE
  52.                   bi.targetBufMemType := e.any;
  53.                   IF ~ xfd.DecrunchBuffer(bi) THEN
  54.                     d.PrintF("decrunching error: %s\n",xfd.GetErrorText(bi.error));
  55.                   ELSE
  56.                     e.FreeMem(f.address,f.memSize);
  57.                     f.address := bi.targetBuffer;
  58.                     f.size    := bi.targetBufSaveLen;
  59.                     f.memSize := bi.targetBufLen;
  60.                   END
  61.                 END
  62.               END;
  63.               xfd.FreeBufferInfo(bi);
  64.             END
  65.           END;
  66.         END;
  67.       END;
  68.     END;
  69.     IF ~ d.Close(fh) THEN ds.PrintFault END;
  70.   END;
  71.   RETURN ret;
  72. END LoadFile;
  73.  
  74. (* remove loaded file from memory *)
  75. PROCEDURE UnLoadFile * (VAR f : FileDescr);
  76. BEGIN
  77.   e.FreeMem(f.address,f.memSize);
  78. END UnLoadFile;
  79.  
  80. END XFDsupport.
  81.