/*********************************************************************
----------------------------------------------------------------------

	file scanner

----------------------------------------------------------------------
*********************************************************************/


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

#include <utility/tagitem.h>
#include <exec/memory.h>

#include <clib/macros.h>

#include <proto/exec.h>
#include <proto/graphics.h>
#include <proto/utility.h>
#include <proto/guigfx.h>
#include <proto/dos.h>


#include "defs.h"
#include "global.h"
#include "tools.h"
#include "filelist.h"
#include "debug.h"


/*--------------------------------------------------------------------

	completed = Scan(filelist, filepattern, rejectpattern, recursive?, usekeys?)

	scan filepattern and include pictures to the filelist

--------------------------------------------------------------------*/

BOOL Scan(struct FileList *flist, char *filepattern, char *reject, BOOL recursive, ULONG abortsignals, BOOL usekeys)
{
	BOOL complete = TRUE;
	char fullname[MAXFULLNAMELEN];
	struct AnchorPath __aligned anchor;
	long error;
	BPTR oldlock, curlock;
	char *argument;
	char *rejectpattern;


	//
	//	create pattern string for files to be rejected
	//

	if (reject)
	{
		if (rejectpattern = Malloc(strlen(reject)*3+2))
		{
			ParsePatternNoCase(reject, rejectpattern, strlen(reject)*3+2);
		}
	}
	else
	{
		if (rejectpattern = Malloc(6))
		{
			ParsePatternNoCase("", rejectpattern, 5);
		}
	}




	//
	//	Scan
	//


	if (argument = filepattern)
	{
		memset(&anchor, 0, sizeof(struct AnchorPath));

		MatchFirst(argument, &anchor);


		while (!(error = IoErr()))
		{
			//	abort signal?
			
			if (SetSignal(0, 0) & abortsignals)
			{
				DB(kprintf(">>>*** picscanner received abort signal!!!\n"));
				complete = FALSE;
				break;
			}


			//	enter directories

			if (anchor.ap_Info.fib_DirEntryType > 0 && recursive)
			{
				if (!(anchor.ap_Flags & APF_DIDDIR))
				{
					anchor.ap_Flags |= APF_DODIR;
				}
				anchor.ap_Flags &= ~APF_DIDDIR;
			}


			//	error?

			if (error && (error != ERROR_NO_MORE_ENTRIES))
			{
				complete = FALSE;
				break;
			}



			if (anchor.ap_Info.fib_DirEntryType <= 0)
			{
				curlock = DupLock(anchor.ap_Current->an_Lock);
				oldlock = CurrentDir(curlock);

				if (NameFromLock(curlock, fullname, MAXFULLNAMELEN))
				{
					if (AddPart(fullname, anchor.ap_Info.fib_FileName, MAXFULLNAMELEN))
					{
						if (!MatchPatternNoCase(rejectpattern, fullname))
						{
							if (!FileList_AddFile(flist, fullname, usekeys))
							{
								DB(kprintf("*** error including file to list: %s\n", fullname));
							}
						}
						else
						{
							DB(kprintf("*** picture rejected: %s\n", fullname));
						}
					}
				}

				CurrentDir(oldlock);
				UnLock(curlock);
			}

		
			MatchNext(&anchor);
		}

		MatchEnd(&anchor);
	}


	Free(rejectpattern);


	return complete;
	
}
