home *** CD-ROM | disk | FTP | other *** search
/ Microsoft Programmer's Library 1.3 / Microsoft-Programers-Library-v1.3.iso / sampcode / msj / msjv2_2 / finddemo / finder.c < prev    next >
Encoding:
C/C++ Source or Header  |  1989-02-28  |  2.4 KB  |  89 lines

  1. /*
  2. ==============================================================================
  3. ==============================================================================
  4. Figure 3: FINDER.C
  5.  
  6. ==============================================================================
  7. */
  8.  
  9. /* finder.c -- child process of finddemo */
  10.  
  11. #include <doscall.h>
  12.  
  13. unsigned index ;
  14. unsigned queuehandle ;
  15. unsigned parentPID ;
  16.  
  17. main (argc, argv)
  18.      int  argc ;
  19.      char *argv [] ;
  20.      {
  21.      if (argc < 4) {
  22.           puts ("Run FINDDEMO rather than FINDER") ;
  23.           DOSEXIT (1, 1) ;
  24.           }
  25.      if (DOSOPENQUEUE (&parentPID, &queuehandle, argv [2])) {
  26.           puts ("FINDER: Cannot open queue") ;
  27.           DOSEXIT (1, 1) ;
  28.           }
  29.      index = atoi (argv [3]) ;
  30.  
  31.      writequeue ("") ;
  32.      chdir ("\\") ;
  33.      find (argv [1]) ;
  34.      writequeue ("") ;
  35.  
  36.      DOSCLOSEQUEUE (queuehandle) ;
  37.      DOSEXIT (1, 0) ;
  38.      }
  39.  
  40. find (searchstr)
  41.      char     *searchstr ;
  42.      {
  43.      struct   FileFindBuf ffb ;
  44.      char     cwd [81], pathname [100] ;
  45.      unsigned handle = 0xFFFF, num = 1 ;
  46.  
  47.      if (cwd [strlen (getcwd (cwd, 80)) - 1] != '\\')
  48.           strcat (cwd, "\\") ;
  49.  
  50.      DOSFINDFIRST (searchstr, &handle, 7, &ffb, sizeof ffb, &num, 0L) ;
  51.      while (num) {
  52.           writequeue (strcat (strcpy (pathname, cwd), ffb.file_name)) ;
  53.           DOSFINDNEXT (handle, &ffb, sizeof ffb, &num) ;
  54.           }
  55.      DOSFINDCLOSE (handle) ;
  56.  
  57.      handle = 0xFFFF ;
  58.      num  = 1 ;
  59.      DOSFINDFIRST ("*.*", &handle, 0x17, &ffb, sizeof ffb, &num, 0L) ;
  60.      while (num) {
  61.           if (ffb.attributes & 0x10 && ffb.file_name [0] != '.') {
  62.                chdir (ffb.file_name) ;
  63.                find (searchstr) ;
  64.                chdir ("..") ;
  65.                }
  66.           DOSFINDNEXT (handle, &ffb, sizeof ffb, &num) ;
  67.           }
  68.      DOSFINDCLOSE (handle) ;
  69.      }
  70.  
  71. writequeue (str)
  72.      char *str ;
  73.      {
  74.      unsigned selector, parentselector ;
  75.      char far *farptr ;
  76.      int      len = strlen (str) ;
  77.  
  78.      DOSALLOCSEG (len + 1, &selector, 1) ;
  79.      farptr = (char far *) (((unsigned long) selector) << 16) ;
  80.  
  81.      while (*farptr++ = *str++) ;
  82.  
  83.      DOSGIVESEG (selector, parentPID, &parentselector) ;
  84.      DOSFREESEG (selector) ;
  85.      farptr = (char far *) (((unsigned long) parentselector) << 16) ;
  86.  
  87.      DOSWRITEQUEUE (queuehandle, index, len, farptr, 0) ;
  88.      }
  89.