/* RealSize v1.0 by Kyzer/CSG */ OPT OSVERSION=34 MODULE 'exec/memory', 'exec/libraries', 'xfdmaster', 'libraries/xfdmaster' DEF ret=20,err=0 PROC main() DEF args:PTR TO LONG,rdargs=0,mem,len,reallen,fh,bi,cmd[200]:STRING, varname, filename=0 xfdmasterbase:=OpenLibrary('xfdmaster.library',37) args:=[0,0]; varname:='RealSizeError' IF KickVersion(36) IF rdargs:=ReadArgs('FILE/A,NE=NOEXTERN/S',args,NIL) filename:=args[0] ENDIF ELSE filename:=arg ENDIF IF filename IF (len:=FileLength(filename))>0 reallen:=len ret:=5 IF mem:=AllocMem(len,MEMF_PUBLIC) IF fh:=Open(filename,OLDFILE) IF (reallen:=Read(fh,mem,len))<>-1 Close(fh) IF xfdmasterbase IF bi:=XfdAllocObject(XFDOBJ_BUFFERINFO) reallen:=decr(bi,args[1],mem,reallen) XfdFreeObject(bi) ELSE err:='can\at allocate XFD buffer' ENDIF ELSE err:='can\at open xfdmaster.library' ENDIF ELSE err:='read error' ENDIF ELSE err:='can\at open file' ENDIF FreeMem(mem,len) ELSE err:='out of memory' ENDIF WriteF('\d\n',reallen) ELSE err:='can\at examine file' ENDIF IF rdargs THEN FreeArgs(rdargs) ELSE err:='bad args' ENDIF IF err IF KickVersion(36) SetVar(varname,err,-1,0) ELSE /* 1.3 compatible method */ StringF(cmd,'set \s "\s"',varname,err) Execute(cmd,0,0) ENDIF ENDIF IF xfdmasterbase THEN CloseLibrary(xfdmasterbase) ENDPROC ret PROC decr(bufinf:PTR TO xfdbufferinfo,noextern,mem,len) bufinf.sourcebuffer:=mem bufinf.sourcebuflen:=len bufinf.flags:=IF noextern THEN 0 ELSE XFDFB_RECOGEXTERN IF XfdRecogBuffer(bufinf) IF 0=(bufinf.packerflags AND (XFDPFF_PASSWORD OR XFDPFF_KEY16 OR XFDPFF_KEY32)) IF bufinf.packerflags AND XFDPFF_RECOGLEN ret:=0 RETURN bufinf.finaltargetlen ELSE bufinf.targetbufmemtype:=MEMF_PUBLIC IF XfdDecrunchBuffer(bufinf) FreeMem(bufinf.targetbuffer,bufinf.targetbuflen) ret:=0 RETURN bufinf.targetbufsavelen ELSE err:='couldn\at decrunch file' ENDIF ENDIF ELSE err:='file needs password or key' ENDIF ELSE err:='not crunched/unknown cruncher' ENDIF ENDPROC len