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

  1. #ifndef XPKMASTER_TAGS_C
  2. #define XPKMASTER_TAGS_C
  3.  
  4. /* Routinesheader
  5.  
  6.     Name:        tags.c
  7.     Main:        xpkmaster
  8.     Versionstring:    $VER: tags.c 1.0 (09.10.96)
  9.     Author:        SDI
  10.     Distribution:    PD
  11.     Description:    Tag handling functions
  12.  
  13.  1.0   09.10.96 : first real version
  14. */
  15.  
  16. #include <pragma/dos_lib.h>
  17. #include <pragma/exec_lib.h>
  18. #include <pragma/utility_lib.h>
  19. #include <exec/types.h>
  20. #include "xpkmaster.h"
  21. #include "xpk_strings.h"
  22.  
  23. static LONG findmethod(struct XpkBuffer *xbuf, STRPTR name);
  24.  
  25. /* Parse input/output buffer specification tags before an operation */
  26. LONG parsebuftags(struct XpkBuffer *xbuf, struct TagItem *tags,
  27.     ULONG readonly)
  28. {
  29.   struct TagItem *ti, *scan = tags;
  30. //  LONG i = 0, o = 0;
  31.   ULONG data, fh;
  32.   STRPTR inname = NULL, outname = NULL;
  33.  
  34.   xbuf->xb_Prog.xp_FileName = NULL;
  35.  
  36.   /* Pass 1 */
  37.  
  38.   while((ti = MyNextTagItem(&scan)))
  39.   {
  40.     data = ti->ti_Data;
  41.  
  42. #ifdef BUGGY_SASC
  43.     /* if ti->ti_Tag is 0x40000000 the code produced by SAS jumps to dragonland. */
  44.     /* This together with buggy applications which forget the TAG_END gurus. */
  45.     if((ti->ti_Tag>=XPK_TagBase) && (ti->ti_Tag<=XPK_NoCRC))
  46. #endif
  47.     switch(ti->ti_Tag)
  48.     {
  49.     case XPK_NoClobber:
  50.       if(data) xbuf->xb_Flags |= XMF_NOCLOBBER; break;
  51.     case XPK_FileName:
  52.       xbuf->xb_Prog.xp_FileName = basename((STRPTR) data); break;
  53.     case XPK_GetOutLen:
  54.       xbuf->xb_GetOutLen = (ULONG *) data; break;
  55.     case XPK_GetOutBufLen:
  56.       xbuf->xb_GetOutBufLen = (ULONG *) data; break;
  57.     case XPK_GetError:
  58.       xbuf->xb_ErrBuf = (STRPTR) data; xbuf->xb_ErrBuf[0] = 0; break;
  59.     case XPK_GetOutBuf:
  60.       xbuf->xb_Flags |= XMF_GETOUTBUF;
  61.       xbuf->xb_WMsg.xmm_Flags |= XIO_GETOUTBUF;
  62.       xbuf->xb_WMsg.xmm_BufOfs = 0;
  63.       xbuf->xb_PackParam.xsp_Flags |= XSF_PREVCHUNK;
  64.       xbuf->xb_WHook = &memouthook;
  65.       xbuf->xb_GetOutBuf = (STRPTR *) data;
  66. //      o++;
  67.       break;
  68.     }
  69.   }
  70.  
  71.   /* Pass 2 */
  72.  
  73.   while((ti = MyNextTagItem(&tags)))
  74.   {
  75.     data = ti->ti_Data;
  76. #ifdef BUGGY_SASC
  77.     /* if ti->ti_Tag is 0x40000000 the code produced by SAS jumps to dragonland. */
  78.     /* This together with buggy applications which forget the TAG_END gurus. */
  79.     if((ti->ti_Tag>=XPK_TagBase) && (ti->ti_Tag<=XPK_NoCRC))
  80. #endif
  81.     switch(ti->ti_Tag)
  82.     {
  83.       /* Ways to specify input data */
  84.     case XPK_InName:
  85.       inname = basename((STRPTR) data);        /* ??? Why ??? CvR */
  86.       if(!(data = Open((STRPTR) data, MODE_OLDFILE)))
  87.       {
  88.         xbuf->xb_Result = XPKERR_IOERRIN; xbuf->xb_Result2 = IoErr();
  89.     return xbuf->xb_Result;
  90.       }
  91.       xbuf->xb_RMsg.xmm_Flags |= XMF_PRIVFH;
  92.     case XPK_InFH:
  93.       xbuf->xb_RMsg.xmm_FH = data;
  94.       xbuf->xb_RHook = &fhinhook;
  95. //      i++;
  96.       break;
  97.     case XPK_InBuf:
  98.       xbuf->xb_RMsg.xmm_Buf = (STRPTR) data;
  99.       xbuf->xb_RMsg.xmm_BufOfs = 0;
  100.       xbuf->xb_RHook = &meminhook;
  101. //      i++;
  102.       break;
  103.     case XPK_InLen:
  104.       xbuf->xb_InLen = xbuf->xb_RMsg.xmm_Len = data; break;
  105.     case XPK_InHook:
  106.       xbuf->xb_RHook = (struct Hook *) data;
  107. //      i++;
  108.       break;
  109.  
  110.       /* Ways to specify output data */
  111.     case XPK_OutName:
  112.       outname = basename((STRPTR) data);    /* ??? Why ??? CvR */
  113.       if(xbuf->xb_Flags & XMF_NOCLOBBER)
  114.     if((fh = Open((STRPTR) data, MODE_OLDFILE)))
  115.       return Close(fh), xbuf->xb_Result = XPKERR_FILEEXISTS;
  116.       xbuf->xb_OutName = (STRPTR) data;
  117.       if(!(data = Open((STRPTR) data, MODE_NEWFILE)))
  118.       {
  119.         xbuf->xb_Result = XPKERR_IOERROUT; xbuf->xb_Result2 = IoErr();
  120.         return xbuf->xb_Result;
  121.       }
  122.       xbuf->xb_WMsg.xmm_Flags |= XMF_PRIVFH;
  123.     case XPK_OutFH:
  124.       xbuf->xb_WMsg.xmm_FH = data;
  125.       xbuf->xb_WHook = &fhouthook;
  126. //      o++;
  127.       break;
  128.     case XPK_OutBuf:
  129.       xbuf->xb_WMsg.xmm_Buf = (STRPTR) data;
  130.       xbuf->xb_WMsg.xmm_BufOfs = 0;
  131.       xbuf->xb_WHook = &memouthook;
  132.       xbuf->xb_PackParam.xsp_Flags |= XSF_PREVCHUNK;
  133. //      o++;
  134.       break;
  135.     case XPK_OutBufLen:
  136.       xbuf->xb_WMsg.xmm_BufLen = data;
  137.       break;
  138.     case XPK_OutHook:
  139.       xbuf->xb_WHook = (struct Hook *) data;
  140. //      o++;
  141.       break;
  142.  
  143.       /* Other junk */
  144.     case XPK_PackMethod:
  145.       xbuf->xb_Flags |= XMF_PACKING;
  146.       if(findmethod(xbuf, (STRPTR) data))
  147.       return xbuf->xb_Result;
  148.       break;
  149.     case XPK_Password:
  150.       xbuf->xb_Password = (STRPTR) data;
  151.       break;
  152.     case XPK_PassThru:
  153.       if (data)
  154.     xbuf->xb_Flags |= XMF_PASSTHRU;
  155.       break;
  156.     case XPK_OutMemType:
  157.       xbuf->xb_WMsg.xmm_MemType = data;
  158.       break;
  159.     case XPK_ChunkHook:
  160.       xbuf->xb_ChunkHook = (struct Hook *) data;
  161.       break;
  162.     case XPK_ChunkSize:
  163.       xbuf->xb_ChunkSize = ROUNDLONG(data);    /* This may get adjusted later */
  164.       break;
  165.     case XPK_PackMode:
  166.       xbuf->xb_PackingMode = data;
  167.       break;
  168.     case XPK_TaskPri:
  169.       SetTaskPri(FindTask(NULL), data);
  170.       xbuf->xb_Flags |= XMF_OWNTASKPRI;
  171.       break;
  172.     case XPK_ShortError:
  173.       xbuf->xb_Flags |= XMF_SHORTERR;
  174.       break;
  175.     case XPK_StepDown:
  176.       xbuf->xb_PackParam.xsp_Flags |= XSF_STEPDOWN;
  177.       break;
  178.     case XPK_LossyOK:
  179.       xbuf->xb_Flags |= XMF_LOSSYOK;
  180.       break;
  181.     case XPK_NoCRC:
  182.       xbuf->xb_Flags |= XMF_NOCRC;
  183.       break;
  184.     }
  185.   }
  186.  
  187.   if(xbuf->xb_Flags & XMF_PACKING)
  188.     xbuf->xb_PackParam.xsp_Flags &= ~XSF_PREVCHUNK;
  189.  
  190.   if(xbuf->xb_Password && !*xbuf->xb_Password)
  191.     xbuf->xb_Password = NULL;
  192.  
  193.   if(!inname)
  194.     inname = outname;
  195.   if(!outname)
  196.     outname = inname;
  197.  
  198.   if(!xbuf->xb_Prog.xp_FileName)
  199.     if(xbuf->xb_Flags & XMF_PACKING)
  200.       xbuf->xb_Prog.xp_FileName = inname;
  201.     else
  202.       xbuf->xb_Prog.xp_FileName = outname;
  203.  
  204.   if(!xbuf->xb_Prog.xp_FileName)
  205.     xbuf->xb_Prog.xp_FileName = "";
  206.  
  207.   /* Make sure we got ONE input and ONE output */
  208. //  if(i != 1 || (!readonly && o != 1))
  209. //  {
  210. //    xbuf->xb_Result = XPKERR_BADPARAMS;
  211. //    return xbuf->xb_Result;
  212. //  }
  213.  
  214.   return (xbuf->xb_Result = 0);
  215. }
  216.  
  217. #ifndef XPK_MINOS_37
  218. ULONG findtag (struct TagItem *tags, ULONG tag)
  219. {
  220.   struct TagItem *ti;
  221.  
  222.   while((ti = MyNextTagItem(&tags)))
  223.     if(ti->ti_Tag == tag)
  224.       return ti->ti_Data;
  225.   return 0;
  226. }
  227. #endif
  228.  
  229. void parseerrortags (struct TagItem *tags)
  230. {
  231.   struct TagItem *ti;
  232.  
  233.   while((ti = MyNextTagItem(&tags)))
  234.   {
  235.     if(ti->ti_Tag == XPK_GetError)
  236.       sprintf((STRPTR) ti->ti_Data, TXT_OUT_OF_MEMORY);
  237.   }
  238. }
  239.  
  240. /* Parse XPK_Get... tags after an operation is finished */
  241. void parsegettags(struct XpkBuffer *xbuf)
  242. {
  243.   if(xbuf->xb_GetOutBuf)
  244.     *xbuf->xb_GetOutBuf = xbuf->xb_WMsg.xmm_Buf;
  245.  
  246.   if(xbuf->xb_GetOutLen)
  247.     if(xbuf->xb_Flags & XMF_PACKING)
  248.       *xbuf->xb_GetOutLen = xbuf->xb_Fib.xf_CLen;
  249.     else
  250.       *xbuf->xb_GetOutLen = xbuf->xb_Fib.xf_ULen;
  251.  
  252.   if(xbuf->xb_GetOutBufLen)
  253.     *xbuf->xb_GetOutBufLen = xbuf->xb_WMsg.xmm_BufLen;
  254.  
  255.   if(xbuf->xb_ErrBuf)
  256.     geterror(xbuf);
  257. }
  258.  
  259. #ifndef XPK_MINOS_37
  260. /* Routines to emulate utility.library routines on pre-2.0 machines */
  261. /* should be killed next time */
  262. struct TagItem *MyNextTagItem(struct TagItem **listpt)
  263. {
  264.   if(UtilityBase)
  265.     return (struct TagItem *) NextTagItem(listpt);
  266.   else
  267.   {
  268.     if((listpt) && (*listpt) && ((*listpt)->ti_Tag != TAG_DONE))
  269.       return ((*listpt)++);
  270.     else
  271.       return (0L);
  272.   }
  273. }
  274. #endif
  275.  
  276. /* Find a compression library/method given a name */
  277. static LONG findmethod(struct XpkBuffer *xbuf, STRPTR name)
  278. {
  279.   struct Library *XpkSubBase;
  280.   struct XpkInfo *subinfo;
  281.   STRPTR t;
  282.  
  283.   /* Try to use the first four letters as the ID */
  284.   xbuf->xb_PackingMode = 0;
  285.   if((XpkSubBase = opensub(xbuf, idfromname(name))))
  286.   {
  287.     subinfo = XpksPackerInfo();
  288.     xbuf->xb_PackingMode = subinfo->xi_DefMode;
  289.     if(name[4] == '.' && name[5])
  290.       xbuf->xb_PackingMode = strtol(name + 5, 0, 10);
  291.     if((t = strchr(name, '/')))
  292.       xbuf->xb_Password = t + 1;
  293.     return 0;
  294.   }
  295.   return xbuf->xb_Result;
  296. }
  297. #endif /* XPKMASTER_TAGS_C */
  298.