/* XPK - General XPK file-to-file packer/unpacker */

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

struct Library *XpkBase;
char errbuf[XPKERRMSGSIZE];

void print(char *s) { Write(Output(),s,strlen(s));}

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

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

	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\n",xpinfo.DefMode);

	for( mode=0; mode<100; mode=xminfo.Upto+1 ) {
		if( XpkQueryTags( 
			XPK_ModeQuery,  &xminfo,
			XPK_PackMethod, packer,
			XPK_PackMode,   mode,
			TAG_DONE 
		))
			break;

		printf(" \23332mMode    :\233m %d..%d\n",mode,xminfo.Upto);
		printf("  \23332mPkSpeed:\233m %d\n",  xminfo.PackSpeed);
		printf("  \23332mUpSpeed:\233m %d\n",  xminfo.UnpackSpeed);
		printf("  \23332mRatio  :\233m %d%%\n",xminfo.Ratio/10);
		printf("  \23332mDescr. :\233m %s\n",  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);
}
