/******************************** DOS Interfacing Routines ***********************
  FindFile's DOS interface routines

  FFSearch.c 1.2 1993/04/01 21:49:08 RUSS Exp

  1.2

  FFSearch.c
 * Revision 1.2  1993/04/01  21:49:08  RUSS
 * Changed to use conform to new display format,
 * i.e. now determines path from the directory
 * lock, not a linked list.
 *
 * Revision 1.1  1993/02/28  00:49:57  RUSS
 * Initial revision
 *

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

#include "FindFile.h"

/**********************************************************
  Copy a BSTR to CSTR. Equivalent to strcpy().
**********************************************************/

void
Bstrcpy( UBYTE *dest , BSTR bsrc )
{
  UBYTE *src = ( UBYTE *)BADDR( bsrc );
  SHORT  pos;
  UBYTE  len;

  len = *src++;

  for ( pos = 0; pos < len; pos++ )
    *dest++ = *src++;

  *dest++ = ':';
  *dest   = '\0';

}

STRPTR *
GetDevList( struct controlPanel *cp )
{
  struct DosList    *dList,
		    *sdList;
  STRPTR	    *devList;
  int		     numVols = 0;

  dList = LockDosList( LDF_VOLUMES|LDF_READ );

  sdList = dList;

  while( dList = NextDosEntry( dList , LDF_VOLUMES|LDF_READ ) )
    numVols++;

  cp->numDevs = numVols;

  if( !( devList = AllocVec( (numVols + 1) * sizeof( STRPTR ) , MEMF_ANY|MEMF_CLEAR )))
    goto exitgdl;

  numVols = 0;

  while( sdList = NextDosEntry( sdList , LDF_VOLUMES|LDF_READ ) )
  {
    if( !( devList[numVols] = AllocVec( MAXSTR , MEMF_ANY|MEMF_CLEAR )))
      goto exitgdl;

    Bstrcpy( devList[numVols++] , sdList->dol_Name );
  }

exitgdl:

  UnLockDosList( LDF_VOLUMES|LDF_READ );

  return( devList );
}

void
FreeDevList( STRPTR *devList )
{
  int loc = 0;

  while( devList[loc] )
    FreeVec( devList[loc++] );

  FreeVec( devList );

}

BOOL
ScanDir( STRPTR dirName , struct controlPanel *cp )
{
  BPTR			currentDir,
			parentDir;
  struct FileInfoBlock *fib;
  BOOL			cont = FALSE,
			done = FALSE;


  if(!(fib = AllocDosObject( DOS_FIB, NULL ) ) )
    return( FALSE );


  currentDir = Lock( dirName, ACCESS_READ );

  Examine( currentDir, fib );

  parentDir = CurrentDir( currentDir );

  while( !done )
  {
    if( !ExNext( currentDir, fib ) )
      break;

    if( fib->fib_DirEntryType >= 0 )
    {
      cont = ScanDir( fib->fib_FileName, cp );
    }
    else
    {
      if( MatchFile( cp, fib->fib_FileName ) )
      {
	AddFoundFile( cp, currentDir, fib->fib_FileName );

	/* Gadget Work */
	GT_SetGadgetAttrs( cp->ffWinGads[ID_FOUNDLIST],
			   cp->ffWindow, NULL,
			     GTLV_Labels, (&cp->foundList),
			     GTLV_Selected, 0L,
			   TAG_DONE );

	GT_SetGadgetAttrs( cp->ffWinGads[ID_FOUNDLIST],
			   cp->ffWindow, NULL,
			     GTLV_Labels, ~0L,
			   TAG_DONE );

      }
    }

    if( cont )
    {
      done = QuitCheck( cp );
    }
  }

  currentDir = CurrentDir( parentDir );

  UnLock( currentDir );

  if( done == FALSE && IoErr() == ERROR_NO_MORE_ENTRIES )
    cont = TRUE;
  else
    cont = FALSE;

  FreeDosObject( DOS_FIB, fib );

  return( cont );

}

BOOL
MatchFile( struct controlPanel *cp, STRPTR fileName )
{
  if( MatchPatternNoCase( cp->ignoreIconsPat, fileName ) )
  {
    if( MatchPatternNoCase( cp->searchPattern, fileName ) )
    {
      return( TRUE );
    }
  }
  return( FALSE );

}

