/* 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 <dos.h>
#include <libraries/xpk.h>

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

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);
}

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

void
packerquery(char *packer)
{
	XPINFO xpinfo;
	XMINFO xminfo;
	LONG   mode, res, n;
	char   buf[20];

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

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

		strcpy(buf,"           ");
		strcpy(buf+(9-strlen(xminfo.Description))/2,xminfo.Description);
		sprintf( line1+9*n,"%3ld..%-3ld ",mode,xminfo.Upto);
		sprintf( line2+9*n,"%-9.9s ",     buf);
		sprintf( line3+9*n,"%4ld K/s  ",  xminfo.PackSpeed);
		sprintf( line4+9*n,"%4ld K/s  ",  xminfo.UnpackSpeed);
		sprintf( line5+9*n,"%4ld %%   ",  xminfo.Ratio/10);
	}
	printf("\23332mMode   :\233m %s\n", line1 );
	printf("\23332mDescr. :\233m %s\n", line2 );
	printf("\23332mPkSpeed:\233m %s\n", line3 );
	printf("\23332mUpSpeed:\233m %s\n", line4 );
	printf("\23332mRatio  :\233m %s\n", line5 );

	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);
}
