home *** CD-ROM | disk | FTP | other *** search
/ MACD 4 / MACD4.iso / cdity / findfiles.lha / FindFile / FFSource.lha / FFSearch.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-04-03  |  3.2 KB  |  177 lines

  1. /******************************** DOS Interfacing Routines ***********************
  2.   FindFile's DOS interface routines
  3.  
  4.   FFSearch.c 1.2 1993/04/01 21:49:08 RUSS Exp
  5.  
  6.   1.2
  7.  
  8.   FFSearch.c
  9.  * Revision 1.2  1993/04/01  21:49:08  RUSS
  10.  * Changed to use conform to new display format,
  11.  * i.e. now determines path from the directory
  12.  * lock, not a linked list.
  13.  *
  14.  * Revision 1.1  1993/02/28  00:49:57  RUSS
  15.  * Initial revision
  16.  *
  17.  
  18. *********************************************************************************/
  19.  
  20. #include "FindFile.h"
  21.  
  22. /**********************************************************
  23.   Copy a BSTR to CSTR. Equivalent to strcpy().
  24. **********************************************************/
  25.  
  26. void
  27. Bstrcpy( UBYTE *dest , BSTR bsrc )
  28. {
  29.   UBYTE *src = ( UBYTE *)BADDR( bsrc );
  30.   SHORT  pos;
  31.   UBYTE  len;
  32.  
  33.   len = *src++;
  34.  
  35.   for ( pos = 0; pos < len; pos++ )
  36.     *dest++ = *src++;
  37.  
  38.   *dest++ = ':';
  39.   *dest   = '\0';
  40.  
  41. }
  42.  
  43. STRPTR *
  44. GetDevList( struct controlPanel *cp )
  45. {
  46.   struct DosList    *dList,
  47.             *sdList;
  48.   STRPTR        *devList;
  49.   int             numVols = 0;
  50.  
  51.   dList = LockDosList( LDF_VOLUMES|LDF_READ );
  52.  
  53.   sdList = dList;
  54.  
  55.   while( dList = NextDosEntry( dList , LDF_VOLUMES|LDF_READ ) )
  56.     numVols++;
  57.  
  58.   cp->numDevs = numVols;
  59.  
  60.   if( !( devList = AllocVec( (numVols + 1) * sizeof( STRPTR ) , MEMF_ANY|MEMF_CLEAR )))
  61.     goto exitgdl;
  62.  
  63.   numVols = 0;
  64.  
  65.   while( sdList = NextDosEntry( sdList , LDF_VOLUMES|LDF_READ ) )
  66.   {
  67.     if( !( devList[numVols] = AllocVec( MAXSTR , MEMF_ANY|MEMF_CLEAR )))
  68.       goto exitgdl;
  69.  
  70.     Bstrcpy( devList[numVols++] , sdList->dol_Name );
  71.   }
  72.  
  73. exitgdl:
  74.  
  75.   UnLockDosList( LDF_VOLUMES|LDF_READ );
  76.  
  77.   return( devList );
  78. }
  79.  
  80. void
  81. FreeDevList( STRPTR *devList )
  82. {
  83.   int loc = 0;
  84.  
  85.   while( devList[loc] )
  86.     FreeVec( devList[loc++] );
  87.  
  88.   FreeVec( devList );
  89.  
  90. }
  91.  
  92. BOOL
  93. ScanDir( STRPTR dirName , struct controlPanel *cp )
  94. {
  95.   BPTR            currentDir,
  96.             parentDir;
  97.   struct FileInfoBlock *fib;
  98.   BOOL            cont = FALSE,
  99.             done = FALSE;
  100.  
  101.  
  102.   if(!(fib = AllocDosObject( DOS_FIB, NULL ) ) )
  103.     return( FALSE );
  104.  
  105.  
  106.   currentDir = Lock( dirName, ACCESS_READ );
  107.  
  108.   Examine( currentDir, fib );
  109.  
  110.   parentDir = CurrentDir( currentDir );
  111.  
  112.   while( !done )
  113.   {
  114.     if( !ExNext( currentDir, fib ) )
  115.       break;
  116.  
  117.     if( fib->fib_DirEntryType >= 0 )
  118.     {
  119.       cont = ScanDir( fib->fib_FileName, cp );
  120.     }
  121.     else
  122.     {
  123.       if( MatchFile( cp, fib->fib_FileName ) )
  124.       {
  125.     AddFoundFile( cp, currentDir, fib->fib_FileName );
  126.  
  127.     /* Gadget Work */
  128.     GT_SetGadgetAttrs( cp->ffWinGads[ID_FOUNDLIST],
  129.                cp->ffWindow, NULL,
  130.                  GTLV_Labels, (&cp->foundList),
  131.                  GTLV_Selected, 0L,
  132.                TAG_DONE );
  133.  
  134.     GT_SetGadgetAttrs( cp->ffWinGads[ID_FOUNDLIST],
  135.                cp->ffWindow, NULL,
  136.                  GTLV_Labels, ~0L,
  137.                TAG_DONE );
  138.  
  139.       }
  140.     }
  141.  
  142.     if( cont )
  143.     {
  144.       done = QuitCheck( cp );
  145.     }
  146.   }
  147.  
  148.   currentDir = CurrentDir( parentDir );
  149.  
  150.   UnLock( currentDir );
  151.  
  152.   if( done == FALSE && IoErr() == ERROR_NO_MORE_ENTRIES )
  153.     cont = TRUE;
  154.   else
  155.     cont = FALSE;
  156.  
  157.   FreeDosObject( DOS_FIB, fib );
  158.  
  159.   return( cont );
  160.  
  161. }
  162.  
  163. BOOL
  164. MatchFile( struct controlPanel *cp, STRPTR fileName )
  165. {
  166.   if( MatchPatternNoCase( cp->ignoreIconsPat, fileName ) )
  167.   {
  168.     if( MatchPatternNoCase( cp->searchPattern, fileName ) )
  169.     {
  170.       return( TRUE );
  171.     }
  172.   }
  173.   return( FALSE );
  174.  
  175. }
  176.  
  177.