home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 137.lha / filefind / ff12.c < prev    next >
C/C++ Source or Header  |  1986-11-20  |  6KB  |  243 lines

  1. cd; /*    Auto-Compile + Link
  2. lc -l ff12
  3. blink with SRC:linkff12
  4. quit
  5.  
  6.  
  7.     FF.C will search all directories on a disk for occurances of a
  8.         particular file.
  9.  
  10.     Version 1.1: Now will support the more-popular MSDOS wildcard character: *
  11.                     Also: smaller code and a little quicker execution.
  12.  
  13.     Version 1.2: Uses AmigaDOS' Lock(), Examine() & ExNext() instead of
  14.                     Lattice's dfind() & dnext(). AmigaDOS' routines are
  15.                     much faster and can be used recursively so it is not
  16.                     neccesary to use the heap to make a list of directories.
  17.                     Lattice's stcpm() is used to compare filenames that are
  18.                     found to the user-supplied wildcard. If stcpm() says that
  19.                     a filename matches, then the name is displayed. This
  20.                     change increases the speed of this routine by an average
  21.                     of 55%!!! One additional mod allows the user to specify
  22.                     a directory to look in. This effectively defines a branch
  23.                     of the directory tree to search in, rather than starting
  24.                     with the root and scanning all directories on the disk.
  25.                         4-10-88        Finished....  4-22-88
  26.     
  27.     Copyright 1988 Ray Lambert
  28. */
  29.  
  30. #define VERSION "1.2\n"
  31.  
  32. #include <dos.h>    
  33. #include <stdio.h>
  34. #include <libraries/dosextens.h>
  35. #include <exec/memory.h>
  36. #include <stdlib.h>
  37. #include <string.h>
  38. #include <proto/dos.h>
  39.  
  40. #define MAX_PATH_LEN 108
  41.  
  42. char
  43.     str[MAX_PATH_LEN],
  44.   *ptr,
  45.   *ArgPtr,
  46.     file_mask[MAX_PATH_LEN],
  47.   drive[MAX_PATH_LEN];
  48.  
  49. int
  50.     Level,
  51.     status,
  52.     count;
  53.  
  54. /****/
  55.  
  56. void amiga_write(St)
  57. char *St;
  58. {
  59.     Write(Output(),St,strlen(St));
  60. }
  61.  
  62. /****/
  63.  
  64. void amiga_write_int(num)
  65. int num;
  66. {
  67.     char st[10];
  68.     char *p;
  69.     register int j;
  70.     p = st;
  71.     for (j=10000; ( (j>num) && (j>1) ); j/=10);    /* Find beginning divisor */
  72.     do
  73.         {
  74.             *p = (num/j) + 0x30;
  75.             num%=j;
  76.             j/=10;
  77.             p++;
  78.         }
  79.     while (j>=1);
  80.     *p = '\0';
  81.     amiga_write(st);
  82. }
  83.  
  84. /****/
  85.  
  86. void dtree(Root)
  87. char *Root;
  88. {
  89.     BPTR lock;
  90.     struct FileInfoBlock *info;
  91.     int status;
  92.     char temp_str[MAX_PATH_LEN];
  93.  
  94.     info = (struct FileInfoBlock *) AllocMem(sizeof(struct FileInfoBlock),
  95.         MEMF_CLEAR);
  96.     if (!info)
  97.         {
  98.             amiga_write("Unable to allocate memory!\n");
  99.             return;
  100.         }
  101.     lock = Lock(Root,ACCESS_READ);
  102.     if (!lock)
  103.         {
  104.             FreeMem(info,sizeof(struct FileInfoBlock));
  105.             return;
  106.         }
  107.     status = Examine(lock,info);
  108.     if (!status)
  109.         {
  110.             UnLock(lock);
  111.             FreeMem(info,sizeof(struct FileInfoBlock));
  112.             return;
  113.         }
  114.     status = ExNext(lock,info);
  115.     while (status)
  116.         {
  117.       strcpy(temp_str,Root);
  118.       if (Level>0) strcat(temp_str,"/");
  119.       strcat(temp_str,info->fib_FileName);
  120.             if (info->fib_DirEntryType>0)
  121.           {        /* It is a directory */
  122.                     Level++;
  123.                     dtree(temp_str);
  124.                     Level--;
  125.         }
  126.             else
  127.         {        /* It is a normal file */
  128.                     ptr = strupr(info->fib_FileName);
  129.                     if ( stcpma(info->fib_FileName,file_mask) )
  130.                         {
  131.                             amiga_write("Found: ");
  132.                             amiga_write(temp_str);
  133.                             amiga_write("\n");
  134.                             count++;
  135.                         }
  136.                 }
  137.             status = ExNext(lock,info);
  138.         }
  139.     UnLock(lock);
  140.     FreeMem(info,sizeof(struct FileInfoBlock));
  141. }
  142.  
  143. /****/
  144.  
  145. void fixWC(St)
  146. char *St;
  147. {
  148.     char *p;
  149.     ptr = strupr(St);
  150.     while( stcpm(St,"#\?",&ptr) )
  151.         {
  152.             *(ptr++) = '*';
  153.             for(p=ptr+1; *ptr; ptr++, p++) *ptr = *p;
  154.         }
  155. }
  156.  
  157. /****/
  158.  
  159. void usage()
  160. {
  161.      amiga_write("\nUsage: FF [DRIVE:[PATH/]]FILENAME ...\n\n");
  162.   amiga_write("    [DRIVE:] = Optional drive to scan\n");
  163.     amiga_write("    [PATH/]  = Optional path to begin scan at\n");
  164.     amiga_write("    FILENAME = File to search for (Wildcards allowed)\n\n");
  165.   exit(1);
  166. }
  167.  
  168. /****/
  169.  
  170. void _main(Arg)
  171. char *Arg;
  172. {
  173.   amiga_write("\nFileFind Amiga! Version ");
  174.     amiga_write(VERSION);
  175.     amiga_write("Copyright 1988 by Ray Lambert\n");
  176.     ptr = strchr(Arg,'\n');    /* Change terminating newline to a NULL */
  177.     if (ptr) *ptr = NULL;        
  178.   ArgPtr = strchr(Arg,' ');    /* Skip over command "FF " */
  179.   if (!ArgPtr) usage();    /* No Args */
  180.     while (*ArgPtr==' ') ArgPtr++;    /* Check for no args some more */
  181.     if (!*ArgPtr) usage();
  182.     do
  183.         {
  184.             /* Skip over leading spaces */
  185.             while (*ArgPtr==' ') ArgPtr++;
  186.             if (!*ArgPtr) continue;        /* Check for NULL */
  187.             for (ptr = drive; (*ArgPtr!=' ') && (*ArgPtr!=NULL); ptr++, ArgPtr++)
  188.                 *ptr = *ArgPtr;
  189.             *ptr = '\0';
  190.         ptr = strchr(drive,':');    /* Check for user drive spec */
  191.         if (ptr)
  192.           {        /* Drive was supplied by user */
  193.                     while(*ptr) ptr++;    /* Get pointer to last xter */
  194.                         /* Find beginning of mask.... */
  195.                     while( (*ptr!='/') && (*ptr!=':') ) ptr--;
  196.                     strcpy(file_mask,++ptr);
  197.                     *ptr = '\0';
  198.                     if (*(--ptr)=='/') *ptr = '\0';
  199.                 }
  200.             else            
  201.           {        /* Get drive from system */
  202.                     strcpy(file_mask,drive);
  203.           ptr = getcwd(drive,MAX_PATH_LEN);
  204.           if (ptr!=drive)
  205.             {
  206.               amiga_write("\nCan't read current directory!\nAborted.\n");
  207.               exit(20);
  208.             }
  209.                 ptr = strchr(drive,':');    /* Cut path off */
  210.                 if (ptr) *(++ptr)='\0';
  211.           }
  212.             if (strlen(file_mask)==0) usage();
  213.         amiga_write("\nSearching for file '");
  214.             amiga_write(file_mask);
  215.             amiga_write("' on drive '");
  216.             amiga_write(drive);
  217.             amiga_write("'\n\n");
  218.             count = 0;
  219.         ptr = strchr(drive,':');    /* Check for path */
  220.             if (*(++ptr))
  221.                 Level = 1;
  222.             else
  223.                 Level = 0;
  224.             fixWC(file_mask);    /* Converts all instances of '#?' to '*' and... */
  225.             dtree(drive);            /* ....makes file_mask all uppercase */
  226.             if (count==0)
  227.                 amiga_write("No matches Found.\n");
  228.         else
  229.                 {
  230.                     amiga_write("\nFound ");
  231.                     amiga_write_int(count);
  232.                     amiga_write(" match");
  233.                     if (count==1)
  234.                         amiga_write(".\n");
  235.                     else
  236.                         amiga_write("es.\n");
  237.                 }
  238.         }
  239.     while(*ArgPtr);
  240.     amiga_write("\n");
  241. }
  242.  
  243.