extern struct DosLibrary	*DOSBase;

UBYTE				 Pattern[1024],Name[1024];
LONG				 Matches = 0;
struct FileInfoBlock __aligned	 FileInfo;

int CXBRK(VOID) { return(0); }

VOID __regargs
FindFile(BPTR Dir)
{
	if(Examine(Dir,&FileInfo))
	{
		while(ExNext(Dir,&FileInfo))
		{
			if(SetSignal(0,0) & SIGBREAKF_CTRL_C)
				break;

			if(FileInfo . fib_DirEntryType > 0)
			{
				BPTR FileLock;

				if(FileLock = Lock(FileInfo . fib_FileName,ACCESS_READ))
				{
					BPTR OldDir = CurrentDir(FileLock);

					FindFile(FileLock);

					CurrentDir(OldDir);

					UnLock(FileLock);
				}
			}
			else
			{
				if(MatchPatternNoCase(Pattern,FileInfo . fib_FileName))
				{
					if(NameFromLock(Dir,Name,1024))
					{
						AddPart(Name,FileInfo . fib_FileName,1024);

						Printf("%s\n",Name);

						Matches++;
					}
				}
			}
		}
	}
}

VOID
main(int argc,char **argv)
{
	LONG	Result = RETURN_FAIL;
	UBYTE	**Arg;

	if(DOSBase -> dl_lib . lib_Version < 37)
		exit(RETURN_FAIL);

	if(Arg = (UBYTE **)AllocVec(sizeof(UBYTE *) * 2,MEMF_PUBLIC|MEMF_CLEAR))
	{
		struct RDArgs *ArgsPtr;

		if(ArgsPtr = ReadArgs("DIR/A,PATTERN/A",(LONG *)Arg,NULL))
		{
			BPTR OldDir,FileLock;

			if(FileLock = Lock(Arg[0],ACCESS_READ))
			{
				if(ParsePatternNoCase(Arg[1],Pattern,1024) != -1)
				{
					OldDir = CurrentDir(FileLock);

					FindFile(FileLock);

					if(SetSignal(0,0) & SIGBREAKF_CTRL_C)
					{
						SetSignal(0,SIGBREAKF_CTRL_C);

						Printf("\n*** BREAK: Find\a\n\n");
					}

					if(!Matches)
						Result = RETURN_WARN;
					else
						Result = RETURN_OK;

					CurrentDir(OldDir);
				}
				else
					Printf("Find: error parsing pattern \"%s\".\a\n",Arg[1]);

				UnLock(FileLock);
			}
			else
				Printf("Find: unable to find directory \"%s\".\a\n",Arg[0]);

			FreeArgs(ArgsPtr);
		}
		else
			PrintFault(IoErr(),"Find\a");

		FreeVec(Arg);
	}
}
