/* XPK - General XPK file-to-file packer/unpacker   */
/* This is the version to be compiled with DICE     */
/* Watch the special handing of the progress report */

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

extern hookstub();

struct Library *XpkBase, *OpenLibrary( UBYTE *libName, ULONG version );
char errbuf[XPKERRMSGSIZE + 1];      /* +1 to make room for '\n'        */

__stkargs long chunkfunc(struct Hook *myhook, struct XpkProgress *prog)
{
	printf("\r%4s: %-9s %-12s (%6d bytes, %3d%% done, %2d%% CF, %6d cps) ",
		prog->PackerName,  prog->Activity,  prog->FileName,
		prog->ULen,        prog->Done,      prog->CF,       prog->Speed);
	fflush(stdout);
	if( prog->Type==XPKPROG_END ) printf("\n");

	return (long)SetSignal(0, SIGBREAKF_CTRL_C) & SIGBREAKF_CTRL_C;
}
struct Hook chunkhook = {{0},(void*)hookstub,(void*)chunkfunc};


struct TagItem tags[] = {
	XPK_InName,    (long)NULL ,
	XPK_OutName,   (long)NULL ,
	XPK_GetError,  (long)NULL,
	XPK_ChunkHook, (long)NULL,
	XPK_Ignore,    (long)0    ,
	XPK_NoClobber, (long)TRUE ,
	TAG_DONE};


void end( char *text )
{
	if( text ) Write(Output(), text, strlen(text));
	if( XpkBase ) CloseLibrary( XpkBase );
	exit(text ? 10 : 0);
}

void main(int argc, char *argv[])
{
	int res;

	if(!(XpkBase=OpenLibrary( XPKNAME,0)))
		end("Cannot open "XPKNAME"\n");
	
	if((argc < 3) || (argc > 4))
		end("Usage: XPK [<method>] <infile> <outfile>\n");
	
	tags[0].ti_Data = (long)argv[argc-2]; /* First try to decompress... */
	tags[1].ti_Data = (long)argv[argc-1];
	tags[2].ti_Data = (long)errbuf;
	tags[3].ti_Data = (long)&chunkhook;

	if( argc==3 )
		res=XpkUnpack( tags );
	else {
		tags[4].ti_Tag = XPK_FindMethod;
		tags[4].ti_Data= (long)argv[1];
		res=XpkPack(tags);
	}
	if( res )
		end(strcat(errbuf,"\n"));
	
	end(NULL);
}
