home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD1.iso / Cruncher / XPK416SR.LHA / xpk_Source / xpkmaster / query.c < prev    next >
Encoding:
C/C++ Source or Header  |  1997-09-06  |  4.6 KB  |  184 lines

  1. #ifndef XPKMASTER_QUERY_C
  2. #define XPKMASTER_QUERY_C
  3.  
  4. /* Routinesheader
  5.  
  6.     Name:        query.c
  7.     Main:        xpkmaster
  8.     Versionstring:    $VER: query.c 1.4 (09.06.97)
  9.     Author:        SDI
  10.     Distribution:    Freeware
  11.     Description:    Implementation of XpkQuery
  12.  
  13.  1.0   06.10.96 : first real version
  14.  1.1   27.12.96 : removed 1.3 specific functions
  15.  1.2   09.03.97 : added USER mode
  16.  1.3   31.03.97 : made tag processing better, nearly rewritten all, removed
  17.      goto's this way
  18.  1.4   09.06.97 : fixed Enforcer hit, when library opening failed
  19. */
  20.  
  21. #include <exec/memory.h>
  22. #include <proto/exec.h>
  23. #include <proto/dos.h>
  24. #include "xpkmaster.h"
  25. #include "xpk_strings.h"
  26.  
  27. /************************************************************************
  28.  *
  29.  *  Information query
  30.  *
  31.  */
  32.  
  33. static struct XpkMode USERMode = { 0,100,0,0,0,0,0,0,0,"user"};
  34.  
  35. static struct XpkInfo USERInfo = { 1,0,0,1,"USER","User",
  36. 0, 0x55534552, XPKIF_PK_CHUNK|XPKIF_UP_CHUNK, 50000, 10, 50000,
  37. 0,0,0,0,100,0,&USERMode,0,0,0,0,0,0};
  38.  
  39. #ifdef __cplusplus
  40.   extern "C"
  41. #endif
  42.  
  43. LONG __asm LIBXpkQuery(register __a0 struct TagItem *ti)
  44. {
  45.   struct TagItem    *tags = ti;
  46.   STRPTR        packmethod = 0,
  47.               errtext = 0;
  48.   ULONG            packmode = 0,
  49.               prefs = 1; /* use prefs, default is true */
  50.   LONG            error = 0;
  51.   struct XpkPackerInfo *pinfo = 0;
  52.   struct XpkPackerList *plist = 0;
  53.   struct XpkMode *    pmode = 0;
  54.   struct Library *    XpkSubBase = 0;
  55.   struct XpkInfo *    sinfo = 0;
  56.   UBYTE            libname[] = "compressors/xpk____.library";
  57.  
  58. #ifdef DEBUG
  59.   DebugTagList("XpkQuery", tags);
  60. #endif
  61.  
  62.   while((ti = NextTagItem(&tags)))
  63.   {
  64.     switch(ti->ti_Tag)
  65.     {
  66.     case XPK_PackersQuery: plist = (struct XpkPackerList *) ti->ti_Data;
  67.       break;
  68.     case XPK_ModeQuery: pmode = (struct XpkMode *) ti->ti_Data; break;
  69.     case XPK_PackerQuery: pinfo = (struct XpkPackerInfo *) ti->ti_Data;
  70.       break;
  71.     case XPK_PackMethod: packmethod = (STRPTR) ti->ti_Data; break;
  72.     case XPK_PackMode: packmode = ti->ti_Data; break;
  73.     case XPK_GetError: errtext = (STRPTR) ti->ti_Data; break;
  74.     case XPK_Preferences: prefs = ti->ti_Data; break;
  75.     };
  76.   }
  77.  
  78.   if(packmethod)
  79.   {
  80.     libname[15] = toupper(packmethod[0]);
  81.     libname[16] = toupper(packmethod[1]);
  82.     libname[17] = toupper(packmethod[2]);
  83.     libname[18] = toupper(packmethod[3]);
  84.  
  85.     if(strnicmp("USER", libname+15, 4))
  86.     {
  87.       if(!(XpkSubBase = OpenLibrary(libname, 0)) ||
  88.       !(sinfo = XpksPackerInfo()))
  89.         error = XPKERR_MISSINGLIB;
  90.     }
  91.     else
  92.     {
  93.       sinfo = &USERInfo;
  94.       sinfo->xi_Description = strings[TXT_USER_DESCRIPTION];
  95.     }
  96.   }
  97.  
  98.   if(!error)
  99.   {
  100.     if(plist)
  101.     {
  102.       struct FileInfoBlock *fib;
  103.  
  104.       if(!(fib = (struct FileInfoBlock *) AllocDosObject(DOS_FIB, 0)))
  105.         error = XPKERR_NOMEM;
  106.       else
  107.       {
  108.         ULONG lock;
  109.  
  110.         memset(plist, 0, sizeof(struct XpkPackerList));
  111.         if(!(lock = Lock("libs:compressors", ACCESS_READ)))
  112.           error = XPKERR_NOINFO;
  113.         else
  114.         {
  115.           if(!Examine(lock, fib) || fib->fib_DirEntryType < 0)
  116.             error = XPKERR_NOINFO;
  117.       else
  118.       {
  119.         while(ExNext(lock, fib))
  120.         {
  121.           if(!strncmp("xpk", fib->fib_FileName, 3) &&
  122.               !strcmp(".library", fib->fib_FileName+7))
  123.           {
  124.             ULONG ID = idfromname(fib->fib_FileName+3), i;
  125.  
  126.             for(i = plist->xpl_NumPackers; i > 0 &&
  127.             *(ULONG *) plist->xpl_Packer[i - 1] > ID; i--)
  128.           *(ULONG *) plist->xpl_Packer[i] =
  129.           *(ULONG *) plist->xpl_Packer[i-1];
  130.             *(ULONG *) plist->xpl_Packer[i] = ID;
  131.  
  132.             if(++plist->xpl_NumPackers == MAXPACKERS)
  133.           break;
  134.           }
  135.         }
  136.         if(prefs) /* add USER mode */
  137.         {
  138.           if(plist->xpl_NumPackers == MAXPACKERS)
  139.             --plist->xpl_NumPackers;
  140.               *(ULONG *) plist->xpl_Packer[plist->xpl_NumPackers++] = 0x55534552;
  141.             }
  142.           }
  143.           UnLock(lock);
  144.         }
  145.         FreeDosObject(DOS_FIB, fib);
  146.       }
  147.     }
  148.     else if(pinfo)
  149.     {
  150.       sprintf(pinfo->xpi_Name, sinfo->xi_Name);
  151.       sprintf(pinfo->xpi_LongName, sinfo->xi_LongName);
  152.       sprintf(pinfo->xpi_Description, sinfo->xi_Description);
  153.       pinfo->xpi_Flags = sinfo->xi_Flags;
  154.       pinfo->xpi_MaxChunk = sinfo->xi_MaxPkInChunk;
  155.       pinfo->xpi_DefChunk = sinfo->xi_DefPkInChunk;
  156.       pinfo->xpi_DefMode = sinfo->xi_DefMode;
  157.     }
  158.     else if(pmode)
  159.     {
  160.       struct XpkMode* m = sinfo->xi_ModeDesc;
  161.       while(m && m->xm_Upto < packmode)
  162.         m = m->xm_Next;
  163.  
  164.       if(!m)
  165.         error = XPKERR_NOINFO;
  166.       else
  167.         CopyMem(m, pmode, sizeof(struct XpkMode));
  168.     }
  169.     else
  170.       error = XPKERR_BADPARAMS;
  171.   }
  172.  
  173.   if(errtext)
  174.     sprintf(errtext, XpkErrs[-error]);
  175.  
  176.   if(XpkSubBase)
  177.     CloseLibrary(XpkSubBase);
  178.  
  179.   return error;
  180. }
  181.  
  182. #endif /* XPKMASTER_QUERY_C */
  183.  
  184.