home *** CD-ROM | disk | FTP | other *** search
/ Amiga MA Magazine 1998 #6 / amigamamagazinepolishissue1998.iso / packery / xpk_source / xpkmaster / hook_mem.c < prev    next >
C/C++ Source or Header  |  1996-10-19  |  3KB  |  117 lines

  1. #ifndef XPKMASTER_HOOK_MEM_C
  2. #define XPKMASTER_HOOK_MEM_C
  3.  
  4. /* Routinesheader
  5.  
  6.     Name:        hook_mem.c
  7.     Main:        xpkmaster
  8.     Versionstring:    $VER: hook_mem.c 1.0 (06.10.96)
  9.     Author:        SDI
  10.     Distribution:    PD
  11.     Description:    Memory IO hooks
  12.  
  13.  1.0   06.10.96 : first real version
  14. */
  15.  
  16. #include <exec/types.h>
  17. #include <pragma/exec_lib.h>
  18. #include "xpkmaster.h"
  19.  
  20. #ifdef __MAXON__
  21.   #define __asm
  22. #endif
  23.  
  24. /*************************** read-from-mem hook **************************/
  25. static LONG __asm meminfunc(register __a1 struct XpkMasterMsg *msg)
  26. {
  27.   STRPTR bufpos;
  28.   LONG ofs;
  29.  
  30.   bufpos = (STRPTR) msg->xmm_Buf + msg->xmm_BufOfs;
  31.  
  32.   switch (msg->xmm_Type)
  33.   {
  34.   case XIO_READ:
  35.     if(msg->xmm_BufOfs + msg->xmm_Size > msg->xmm_Len)
  36.       return XPKERR_TRUNCATED;
  37.     msg->xmm_BufOfs += msg->xmm_Size;
  38.     if(!msg->xmm_Ptr)
  39.       msg->xmm_Ptr = bufpos;
  40.     else if(bufpos != msg->xmm_Ptr)
  41.       CopyMem(bufpos, msg->xmm_Ptr, msg->xmm_Size);
  42.     break;
  43.   case XIO_SEEK:
  44.     msg->xmm_Ptr = (STRPTR) 42;    /* something > 0. */
  45.     ofs = msg->xmm_BufOfs + msg->xmm_Size;
  46.     if((ofs < 0) || (ofs > msg->xmm_Len))
  47.       return XPKERR_IOERRIN;
  48.     msg->xmm_Size = msg->xmm_BufOfs;    /* preSEEK position. */
  49.     msg->xmm_BufOfs = ofs;
  50.     break;
  51. //  case XIO_ABORT:
  52. //  case XIO_FREE:
  53.   }
  54.  
  55.   return 0;
  56. }
  57.  
  58. struct Hook meminhook = { {0}, (ULONG (*) ()) meminfunc, 0, 0};
  59.  
  60. /*************************** write-to-mem hook **************************/
  61. static LONG __asm memoutfunc(register __a1 struct XpkMasterMsg *msg)
  62. {
  63.   STRPTR bufpos = (STRPTR) msg->xmm_Buf + msg->xmm_BufOfs;
  64.   LONG ofs;
  65.  
  66.   switch (msg->xmm_Type)
  67.   {
  68.   case XIO_SEEK:
  69.     msg->xmm_Ptr = (STRPTR) 42;    /* something > 0. */
  70.     ofs = msg->xmm_BufOfs + msg->xmm_Size;
  71.     if((ofs < 0) || (ofs > msg->xmm_BufLen))
  72.       return XPKERR_IOERROUT;
  73.     msg->xmm_Size = msg->xmm_BufOfs;    /* preSEEK position. */
  74.     msg->xmm_BufOfs = ofs;
  75.     break;
  76.   case XIO_TOTSIZE:
  77.     if(msg->xmm_Flags & XIO_GETOUTBUF)
  78.     {
  79.       if(!(msg->xmm_Buf = (STRPTR) AllocMem(msg->xmm_Size, msg->xmm_MemType)))
  80.     return XPKERR_NOMEM;
  81.       msg->xmm_BufLen = msg->xmm_Size;
  82.     }
  83.     else if(!msg->xmm_Buf)
  84.       return XPKERR_SMALLBUF;
  85.     break;
  86.   case XIO_GETBUF:
  87.     if(msg->xmm_BufOfs + msg->xmm_Size > msg->xmm_BufLen)
  88.       return XPKERR_SMALLBUF;
  89.     msg->xmm_Ptr = bufpos;
  90.     break;
  91.   case XIO_WRITE:
  92.     if(msg->xmm_BufOfs + msg->xmm_Size > msg->xmm_BufLen)
  93.       return XPKERR_SMALLBUF;
  94.     if(msg->xmm_Ptr && (msg->xmm_Ptr != bufpos))
  95.       CopyMem (msg->xmm_Ptr, bufpos, msg->xmm_Size);
  96.     msg->xmm_BufOfs += msg->xmm_Size;
  97.     break;
  98.   case XIO_ABORT:
  99.     if((msg->xmm_Flags & XIO_GETOUTBUF) && msg->xmm_Buf)
  100.     {
  101.       FreeMem(msg->xmm_Buf, msg->xmm_BufLen);
  102.       msg->xmm_Buf = 0;
  103.     }
  104.     break;
  105.   }
  106.  
  107. /* FUTURE_CODE
  108.   if(msg->xmm_BufOfs > msg->xmm_Len)
  109.     msg->xmm_Len = msg->xmm_BufOfs;
  110. */
  111.   return 0;
  112. }
  113.  
  114. struct Hook memouthook = {{0}, (ULONG (*) ()) memoutfunc,0 ,0};
  115.  
  116. #endif
  117.