
/* xQuery - Query packer properties */

char ver[]= "$VER: xQuery 1.2 (" __DATE__ ")";

#include <proto/xpk.h>
#include <proto/dos.h>
#include <proto/exec.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dos.h>

struct Library *XpkBase = NULL;
char errbuf[XPKERRMSGSIZE];
char line1[200], line2[200], line3[200], line4[200];
char line5[200], line6[200], line7[200];

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

int
breakfunc (void)
{
  end ("***Break\n");
  return 0;
}

void
packerquery (char *packer)
{
  XPINFO xpinfo;
  XMINFO xminfo;
  LONG mode, res;
  char name[5];

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

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

  printf ("\23332mName   :\233m %s\n", xpinfo.LongName);
  printf ("\23332mDescr. :\233m %s\n", xpinfo.Description);
  printf ("\23332mDefMode:\233m %d\t", xpinfo.DefMode);
  printf ("\23332mDefChunk:\233m %ld Kb\t", xpinfo.DefChunk / 1024);
  printf ("\23332mMaxChunk:\233m %ld Kb\n", xpinfo.MaxChunk / 1024);

  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 */

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

  for (mode = 0; mode < 100; mode = xminfo.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.Upto,
	    xminfo.Ratio / 10, xminfo.Ratio % 10,
	    xminfo.PackSpeed, xminfo.UnpackSpeed,
	    xminfo.PackMemory / 1024, xminfo.UnpackMemory / 1024,
	    xminfo.Description);

  }
  printf ("\n");
}


void
main (int argc, char *argv[])
{
  XPLIST 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.NumPackers; i++)
      packerquery (list.Packer[i]);
  else
    for (i = 1; i < argc; i++)
      packerquery (argv[i]);

  end (NULL);
}
