home *** CD-ROM | disk | FTP | other *** search
/ ANews 1 / AnewsCD01.iso / Indispensables / Compression / xfd / Developer / Sources / C / ExeHead.c next >
C/C++ Source or Header  |  1999-08-03  |  5KB  |  165 lines

  1. /* Objectheader
  2.  
  3.     Name:        ExeHead.c
  4.     Version:    $VER: ExeHead.c 1.5 (22.02.1999)
  5.     Description:    Exe C header for xfd externals testing
  6.     Author:        SDI
  7.     Distribution:    PD
  8.  
  9.  1.0   22.12.97 : first version
  10.  1.1   04.06.98 : little bugfix
  11.  1.2   04.08.98 : added SysBase
  12.  1.3   31.10.98 : SysBase passed to client in pseudo-master-base
  13.  1.4   07.12.98 : added error output
  14.  1.5   22.02.99 : added V39 auto allocation feature
  15. */
  16.  
  17. #include <proto/dos.h>
  18. #include <proto/exec.h>
  19. #include <libraries/xfdmaster.h>
  20. #include <exec/memory.h>
  21.  
  22. #ifdef __MAXON__
  23.   #define __asm
  24. #endif
  25.  
  26. #define PARAM "FROM/A,TO"
  27.  
  28. typedef BOOL __asm (*RecogFunc) (register __a0 STRPTR,
  29.      register __d0 ULONG, register __a1 struct xfdRecogResult *);
  30. typedef BOOL __asm (*DecrunchFunc) (register __a0 struct xfdBufferInfo *,
  31. register __a6 struct xfdMasterBase *);
  32.  
  33. struct DosLibrary *DOSBase = 0;
  34. struct ExecBase   *SysBase = 0;
  35. extern struct xfdSlave FirstSlave;
  36.  
  37. /* NOTE: The methods used in this program do not cover all the
  38.    xfdmaster.library methods, so this file is no replace for xfdmaster.
  39.    It is for tests only! */
  40.  
  41. LONG main(void)
  42. {
  43.   STRPTR args[2];
  44.   LONG ret = RETURN_FAIL;
  45.   struct RDArgs *rda;
  46.  
  47.   SysBase = (*((struct ExecBase **) 4));
  48.  
  49.   if(!(DOSBase = (struct DosLibrary *) OpenLibrary("dos.library", 37)))
  50.     return ret;
  51.  
  52.   args[1] = 0;
  53.  
  54.   if((rda = ReadArgs(PARAM, (LONG *) &args, 0)))
  55.   {
  56.     ULONG fh;
  57.  
  58.     if((fh = Open(args[0], MODE_OLDFILE)))
  59.     {
  60.       struct FileInfoBlock *fib;
  61.  
  62.       if((fib = (struct FileInfoBlock *) AllocDosObject(DOS_FIB, 0)))
  63.       {
  64.         if((ExamineFH(fh, fib)))
  65.         {
  66.       ULONG insize;
  67.       STRPTR inbuf;
  68.  
  69.           insize = fib->fib_Size;
  70.           if((inbuf = (STRPTR) AllocMem(insize, MEMF_ANY)))
  71.           {
  72.             if(Read(fh, inbuf, insize) == insize)
  73.             {
  74.               struct xfdSlave *slave = &FirstSlave;
  75.               struct xfdRecogResult rr;
  76.               ret = 0;
  77.  
  78.           while(slave)
  79.           {
  80.         if(slave->xfds_MinBufferSize <= insize &&
  81.         ((RecogFunc)slave->xfds_RecogBuffer)(inbuf, insize, &rr))
  82.         {
  83.           /* We do use xfdBufferInfo only local, so it is ok not
  84.              to get it with xfdmaster functions. */
  85.           struct xfdBufferInfo xbi;
  86.           struct xfdMasterBase xb;
  87.  
  88.           /* We set only these fields, which are accessed by the
  89.              slaves. When test slaves access more than these fields,
  90.              we need to init these new fields as well!!! */
  91.           xbi.xfdbi_SourceBuffer = inbuf;
  92.           xbi.xfdbi_SourceBufLen = insize;
  93.           xbi.xfdbi_TargetBufMemType = MEMF_ANY;
  94.           xbi.xfdbi_Error = 0;
  95.           xbi.xfdbi_Flags = 0;
  96.           xb.xfdm_ExecBase = SysBase;
  97.  
  98.           Printf("Type is '%s'\n", slave->xfds_PackerName);
  99.  
  100.           /* V39 feature of minimum sourcelen check is not supplied! */
  101.  
  102.           if((slave->xfds_PackerFlags & XFDPFF_USERTARGET) &&
  103.           rr.xfdrr_MinTargetLen != -1)
  104.           {
  105.             if((xbi.xfdbi_UserTargetBuf = AllocMem(rr.xfdrr_MinTargetLen, MEMF_ANY)))
  106.             {
  107.               xbi.xfdbi_Flags |= XFDFF_MASTERALLOC|XFDPFF_USERTARGET;
  108.               xbi.xfdbi_UserTargetBufLen = 
  109.               xbi.xfdbi_TargetBufLen = rr.xfdrr_MinTargetLen;
  110.               xbi.xfdbi_TargetBufSaveLen = rr.xfdrr_FinalTargetLen;
  111.               xbi.xfdbi_TargetBuffer = xbi.xfdbi_UserTargetBuf;
  112.             }
  113.             else
  114.               ret = XFDERR_NOMEMORY;
  115.           }
  116.  
  117.           if(!ret)
  118.           {
  119.             if(((DecrunchFunc) slave->xfds_DecrunchBuffer)(&xbi, &xb))
  120.             {
  121.               if(args[1])
  122.               {
  123.                 ULONG destfh;
  124.  
  125.                     if((destfh = Open(args[1], MODE_NEWFILE)))
  126.                     {
  127.                       if(Write(destfh, xbi.xfdbi_TargetBuffer,
  128.                       xbi.xfdbi_TargetBufSaveLen) != xbi.xfdbi_TargetBufSaveLen)
  129.                         ret = RETURN_ERROR;
  130.                       Close(destfh);
  131.                     }
  132.                     else
  133.                       ret = RETURN_ERROR;
  134.                   }
  135.                   FreeMem(xbi.xfdbi_TargetBuffer, xbi.xfdbi_TargetBufLen);
  136.             }
  137.             else
  138.             {
  139.               if(xbi.xfdbi_Flags & XFDFF_MASTERALLOC)
  140.                 FreeMem(xbi.xfdbi_UserTargetBuf, xbi.xfdbi_UserTargetBufLen);
  141.                   ret = -xbi.xfdbi_Error;
  142.                   Printf("Error %ld\n", xbi.xfdbi_Error);
  143.                 }
  144.               }
  145.               slave = 0;
  146.         } /* RecogFunc */
  147.         else
  148.           slave = slave->xfds_Next;
  149.           } /* while */
  150.         } /* Read */
  151.             FreeMem(inbuf, insize);
  152.           } /* AllocMem(inbuf, insize) */
  153.         } /* Examine */
  154.         FreeDosObject(DOS_FIB, fib);
  155.       } /* AllocDosObject */
  156.       Close(fh);
  157.     } /* Open */
  158.     FreeArgs(rda);
  159.   } /* ReadArgs */
  160.  
  161.   CloseLibrary((struct Library *) DOSBase);
  162.  
  163.   return ret;
  164. }
  165.