#define NAME	 "xQuery"
#define REVISION "3"

/* Programmheader

	Name:		xQuery
	Author:		SDI (before 1.2 Urban Dominik Müller)
	Distribution:	PD
	Description:	Query packer properties
	Compileropts:	-
	Linkeropts:	-l xpkmaster

 1.0	: first public release
 1.1	: version string added, docs added
 1.2	: changes by SDI
 1.3   29.11.96 : fixed for new includes and Maxon C++
*/

#include "SDI_defines.h"
#define SDI_TO_ANSI
#include "SDI_ASM_STD_protos.h"
#include <pragma/exec_lib.h>
#include <pragma/dos_lib.h>
#include <pragma/xpkmaster_lib.h>

#ifdef __MAXON__
  #define __asm
#endif

struct Library *XpkBase = 0;

UBYTE errbuf[XPKERRMSGSIZE];
UBYTE line1[200], line2[200], line3[200], line4[200];
UBYTE line5[200], line6[200], line7[200];

void end(const STRPTR text)
{
  if(text)	printf(text);
  if(XpkBase)	CloseLibrary (XpkBase);
  exit(text ? 10 : 0);
}

void packerquery(STRPTR packer)
{
  struct XpkPackerInfo xpinfo;
  struct XpkMode xminfo;
  LONG mode, res;
  UBYTE name[5];

  printf("\23332mPacker :\233m %s\n", packer);

  if(res = XpkQueryTags(XPK_PackerQuery, &xpinfo,
			XPK_PackMethod, packer,
			TAG_DONE))
    return;

  printf("\23332mName   :\233m %s\n", xpinfo.xpi_LongName);
  printf("\23332mDescr. :\233m %s\n", xpinfo.xpi_Description);
  printf("\23332mDefMode:\233m %d\t", xpinfo.xpi_DefMode);
  printf("\23332mDefChunk:\233m %ld Kb\t", xpinfo.xpi_DefChunk >> 10);
  printf("\23332mMaxChunk:\233m %ld Kb\n", xpinfo.xpi_MaxChunk >> 10);

  printf("                      Pack  Unpack  Pack Unpack\n");
  printf("Name   Mode  Ratio   Speed   Speed   Mem    Mem Description\n");
  /*       FAST 99..100 99.7% 1024K/s 1040K/s 1024K  1024K Gnubbeldubbel */

  CopyMem(packer, name, 4); name[4] = 0;

  for(mode = 0; mode < 100 && !CTRL_C; mode = xminfo.xm_Upto + 1)
  {
    if(XpkQueryTags(XPK_ModeQuery, &xminfo,
		    XPK_PackMethod, packer,
		    XPK_PackMode, mode,
		    TAG_DONE))
      break;
    printf("%4.4s %2ld..%-3ld %2ld.%1ld%% %4ldK/s %4ldK/s %4ldK  %4ldK %s\n",
      name, mode, xminfo.xm_Upto, xminfo.xm_Ratio / 10, xminfo.xm_Ratio % 10,
	    xminfo.xm_PackSpeed, xminfo.xm_UnpackSpeed,
	    xminfo.xm_PackMemory >> 10, xminfo.xm_UnpackMemory >> 10,
	    xminfo.xm_Description);
  }
  printf("\n");
}

void main(int argc, char **argv)
{
  struct XpkPackerList list;
  LONG i;

  if(!(XpkBase = OpenLibrary(XPKNAME, 0)))
    end("Cannot open " XPKNAME "\n");

  if(XpkQueryTags(XPK_PackersQuery, &list, TAG_DONE))
    end("Cannot get information");

  if(argc == 1)
    for(i = 0; i < list.xpl_NumPackers && !CTRL_C; i++)
      packerquery(list.xpl_Packer[i]);
  else
    for(i = 1; i < argc; i++)
      packerquery(argv[i]);
  
  end(CTRL_C ? "***Break\n" : NULL);
}
