home *** CD-ROM | disk | FTP | other *** search
/ Amiga MA Magazine 1998 #6 / amigamamagazinepolishissue1998.iso / packery / realsize / realsize.lha / RealSize / RealSize.e < prev    next >
Text File  |  1997-08-20  |  2KB  |  101 lines

  1. /* RealSize v1.0 by Kyzer/CSG */
  2.  
  3. OPT OSVERSION=34
  4.  
  5. MODULE 'exec/memory', 'exec/libraries', 'xfdmaster', 'libraries/xfdmaster'
  6.  
  7. DEF ret=20,err=0
  8.  
  9. PROC main()
  10.   DEF args:PTR TO LONG,rdargs=0,mem,len,reallen,fh,bi,cmd[200]:STRING,
  11.   varname, filename=0
  12.  
  13.   xfdmasterbase:=OpenLibrary('xfdmaster.library',37)
  14.  
  15.   args:=[0,0]; varname:='RealSizeError'
  16.  
  17.   IF KickVersion(36)
  18.     IF rdargs:=ReadArgs('FILE/A,NE=NOEXTERN/S',args,NIL)
  19.       filename:=args[0]
  20.     ENDIF
  21.   ELSE
  22.     filename:=arg
  23.   ENDIF
  24.   IF filename
  25.     IF (len:=FileLength(filename))>0
  26.       reallen:=len
  27.       ret:=5
  28.       IF mem:=AllocMem(len,MEMF_PUBLIC)
  29.  
  30.         IF fh:=Open(filename,OLDFILE)
  31.           IF (reallen:=Read(fh,mem,len))<>-1
  32.             Close(fh)
  33.             IF xfdmasterbase
  34.               IF bi:=XfdAllocObject(XFDOBJ_BUFFERINFO)
  35.                 reallen:=decr(bi,args[1],mem,reallen)
  36.                 XfdFreeObject(bi)
  37.               ELSE
  38.                 err:='can\at allocate XFD buffer'
  39.               ENDIF
  40.             ELSE
  41.               err:='can\at open xfdmaster.library'
  42.             ENDIF
  43.           ELSE
  44.             err:='read error'
  45.           ENDIF
  46.         ELSE
  47.           err:='can\at open file'
  48.         ENDIF
  49.  
  50.         FreeMem(mem,len)
  51.       ELSE
  52.         err:='out of memory'
  53.       ENDIF
  54.       WriteF('\d\n',reallen)
  55.     ELSE
  56.       err:='can\at examine file'
  57.     ENDIF
  58.     IF rdargs THEN FreeArgs(rdargs)
  59.   ELSE
  60.     err:='bad args'
  61.   ENDIF
  62.  
  63.   IF err
  64.     IF KickVersion(36)
  65.       SetVar(varname,err,-1,0)
  66.     ELSE
  67.       /* 1.3 compatible method */
  68.       StringF(cmd,'set \s "\s"',varname,err)
  69.       Execute(cmd,0,0)
  70.     ENDIF
  71.   ENDIF
  72.   IF xfdmasterbase THEN CloseLibrary(xfdmasterbase)
  73. ENDPROC ret
  74.  
  75. PROC decr(bufinf:PTR TO xfdbufferinfo,noextern,mem,len)
  76.   bufinf.sourcebuffer:=mem
  77.   bufinf.sourcebuflen:=len
  78.   bufinf.flags:=IF noextern THEN 0 ELSE XFDFB_RECOGEXTERN
  79.   IF XfdRecogBuffer(bufinf)
  80.     IF 0=(bufinf.packerflags AND (XFDPFF_PASSWORD OR XFDPFF_KEY16 OR XFDPFF_KEY32))
  81.       IF bufinf.packerflags AND XFDPFF_RECOGLEN
  82.         ret:=0
  83.         RETURN bufinf.finaltargetlen
  84.       ELSE
  85.         bufinf.targetbufmemtype:=MEMF_PUBLIC
  86.         IF XfdDecrunchBuffer(bufinf)
  87.           FreeMem(bufinf.targetbuffer,bufinf.targetbuflen)
  88.           ret:=0
  89.           RETURN bufinf.targetbufsavelen
  90.         ELSE
  91.           err:='couldn\at decrunch file'
  92.         ENDIF
  93.       ENDIF
  94.     ELSE
  95.       err:='file needs password or key'
  96.     ENDIF
  97.   ELSE
  98.     err:='not crunched/unknown cruncher'
  99.   ENDIF
  100. ENDPROC len
  101.