home *** CD-ROM | disk | FTP | other *** search
- MODULE XFDsupport;
-
- IMPORT
- d : Dos,
- ds : DosSupport,
- e : Exec,
- xfd : XFDmaster,
- Y : SYSTEM;
-
- TYPE
- FileDescr * = RECORD
- name * : e.LSTRPTR;
- passwd * : xfd.SpecialPtr;
- address - : e.APTR;
- size - : e.ULONG;
- memSize : e.ULONG;
- END;
-
- (* load the specified file into memory, with XFD if available *)
- PROCEDURE LoadFile * (VAR f : FileDescr): BOOLEAN;
- VAR
- fh : d.FileHandlePtr;
- bi : xfd.BufferInfoPtr;
- ret : BOOLEAN;
- BEGIN
- (* $IFNOT ClearVars *) ret := FALSE; (* $END *)
- fh := d.Open(f.name^,d.oldFile);
- IF fh = NIL THEN
- ds.PrintFault;
- ELSE
- f.size := d.Seek(fh,0,d.end); f.size := d.Seek(fh,0,d.beginning);
- IF f.size # 0 THEN
- f.memSize := f.size;
- f.address := e.AllocMem(f.size,e.any);
- IF f.address = NIL THEN
- ds.PrintMemErr;
- ELSE
- IF f.size # d.Read(fh,Y.VAL(e.LSTRPTR,f.address)^,f.size) THEN
- ds.PrintFault; e.FreeMem(f.address,f.size);
- ELSE
- ret := TRUE; (* success *)
- IF xfd.base # NIL THEN
- bi := xfd.AllocBufferInfo();
- IF bi # NIL THEN
- bi.sourceBuffer := f.address;
- bi.sourceBufLen := f.size;
- bi.special := f.passwd;
- IF xfd.RecogBuffer(bi) THEN
- IF (xfd.password IN bi.packerFlags) & (f.passwd = NIL) THEN
- d.PrintF("encrypted file need password\n");
- ELSE
- bi.targetBufMemType := e.any;
- IF ~ xfd.DecrunchBuffer(bi) THEN
- d.PrintF("decrunching error: %s\n",xfd.GetErrorText(bi.error));
- ELSE
- e.FreeMem(f.address,f.memSize);
- f.address := bi.targetBuffer;
- f.size := bi.targetBufSaveLen;
- f.memSize := bi.targetBufLen;
- END
- END
- END;
- xfd.FreeBufferInfo(bi);
- END
- END;
- END;
- END;
- END;
- IF ~ d.Close(fh) THEN ds.PrintFault END;
- END;
- RETURN ret;
- END LoadFile;
-
- (* remove loaded file from memory *)
- PROCEDURE UnLoadFile * (VAR f : FileDescr);
- BEGIN
- e.FreeMem(f.address,f.memSize);
- END UnLoadFile;
-
- END XFDsupport.
-