//
// Pattern driven file/dir scanner (one 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 "FILE/A/M,ALL/S"

struct RDArgs *MyRdargs;
struct {
	UBYTE **file;
	ULONG all;
} MyArgs;

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

static VOID pr_ap_flags(struct AnchorPath *ap)
{
	Printf("\tap_Flags: 0x%02lx ",ap->ap_Flags);
	if (ap->ap_Flags) Printf("( ");
	if (ap->ap_Flags & APF_DOWILD) Printf("DOWILD ");
	if (ap->ap_Flags & APF_ITSWILD) Printf("ITSWILD ");
	if (ap->ap_Flags & APF_DODIR) Printf("DODIR ");
	if (ap->ap_Flags & APF_DIDDIR) Printf("DIDDIR ");
	if (ap->ap_Flags & APF_NOMEMERR) Printf("NOMEMERR ");
	if (ap->ap_Flags & APF_DirChanged) Printf("DIRCHG ");
	if (ap->ap_Flags & APF_FollowHLinks) Printf("FLW_HL ");
	if (ap->ap_Flags) Printf(")\n");
	else WriteChar('\n');
}

static LONG __saveds ASM ff_dh_entry(
	REG(a0) struct Hook *hk,
	REG(a2) struct AnchorPath *ap,
	REG(a1) LONG *msg)
{
	switch (*msg) {

		case FFHOOK_ENTERDIR:
			Printf("%s (Dir)\t*** ENTER ***\n",ap->ap_Buf);
			break;

		case FFHOOK_LEAVEDIR:
			Printf("%s (Dir)\t*** LEAVE ***\n",ap->ap_Buf);
			break;

		case FFHOOK_IGNORED:
			Printf("%s (Dir)\t--- ignored ---\n",ap->ap_Buf);
			break;

	}

	pr_ap_flags(ap);

	return 0;
}

static struct Hook filefinder_dirhook = {
	{ NULL, NULL },
	(HOOKFUNC)ff_dh_entry,
};

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

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

		if (ff=CreateFileFinder(
			FILEFT_Argv,			MyArgs.file,
			FILEFT_All,				MyArgs.all,
			FILEFT_DirHook,		&filefinder_dirhook,
			TAG_END)) {

			while (FindFiles(ff))
				Printf("%s\n",GetFoundFileName(ff));

			errcode = IoErr();

			DeleteFileFinder(ff);
		} else errcode=ERROR_NO_FREE_STORE;

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

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

	return RETURN_OK;
}

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

void main(void)
{
	LONG res;

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