//
// Pattern driven file/dir scanner (two way)
//

#include <string.h>
#include <stdlib.h>

#include <exec/types.h>
#include <exec/memory.h>

#include <dos/dos.h>
#include <dos/stdio.h>
#include <dos/dosasl.h>
#include <dos/rdargs.h>

#include <proto/dos.h>
#include <proto/exec.h>

#include "filefinder.h"

/* ******************************************************************** */

#define _TEMPLATE "FROM/A/M,TO/A,ALL/S"

struct RDArgs *MyRdargs;
struct {
	UBYTE **source;
	UBYTE  *target;
	ULONG all;
} MyArgs;

#define TMPBUFLEN 512

/* ******************************************************************** */

#define NTABS 3
LONG ntabs = 0;

static LONG __saveds ASM trf_dh_entry(
	REG(a0) struct Hook *hk,
	REG(a2) struct FileInfoBlock *fib,
	REG(a1) LONG *msg)
{
	register LONG i;
	switch (*msg) {

		case TRFHOOK_ENTERNEWDIR:
			for (i=ntabs; i>=0; --i) WriteChar(' ');
			ntabs += NTABS;
			Printf("%s [created]\n",fib->fib_FileName);
			break;

		case TRFHOOK_ENTEROLDDIR:
			for (i=ntabs; i>=0; --i) WriteChar(' ');
			ntabs += NTABS;
			Printf("%s (Dir)\n",fib->fib_FileName);
			break;

		case TRFHOOK_OPENNEWFILE:
			for (i=ntabs; i>=0; --i) WriteChar(' ');
			Printf("%s .\n",fib->fib_FileName);
			break;

		case TRFHOOK_LEAVEDIR:
			ntabs -= NTABS;
			break;

	}

	return 0;
}

static struct Hook treefilter_displayhook = {
	{ NULL, NULL },
	(HOOKFUNC)trf_dh_entry,
};

//
// custom main function
//
static long cli_main(void)
{
	LONG errcode;
	struct TreeFilter *trf;

	if (MyRdargs=ReadArgs(_TEMPLATE,(LONG *)&MyArgs,NULL)) {

		if (trf=CreateTreeFilter(
			TREEFT_Fromv,			MyArgs.source,
			TREEFT_To,				MyArgs.target,
			TREEFT_All,				MyArgs.all,
			TREEFT_OpenFiles,		1L,
			TREEFT_DisplayHook,	&treefilter_displayhook,
			TAG_END)) {

			while (FilterTree(trf))
				;

			errcode = IoErr();

			DeleteTreeFilter(trf);
		} else errcode=ERROR_NO_FREE_STORE;

		FreeArgs(MyRdargs);
	} else errcode=IoErr();

	if (errcode) {
		PrintFault(errcode,"DirScan2");
		return RETURN_FAIL;
	}

	return RETURN_OK;
}

/* ******************************************************************** */

void main(void)
{
	LONG res;

	res = cli_main();
	exit(res);
}
