home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume17 / e2 / part02 / dir_find.c < prev    next >
C/C++ Source or Header  |  1989-02-08  |  4KB  |  153 lines

  1. #include "e.h"
  2. #include "dir_find.h"
  3.  
  4. /*
  5.  * dir_find()
  6.  *
  7.  * This takes the environment variable which is #defined as PATH and 
  8.  * extracts the directory names from it. They may be separated by 
  9.  * arbitrary numbers of delimiter characters (currently "\n", "\t", " " 
  10.  * and ":"). Each directory is then checked to see if it contains the 
  11.  * desired filename (with a call to check). Spelling corrections are 
  12.  * not attempted.
  13.  *
  14.  * This could have been done more simply using strtok() but I didn't know
  15.  * about that then... You'll have to bear with me.
  16.  *
  17.  * 'this_dir' will point at the start of the directory name that is to be
  18.  * processed. 'cp' will be advanced to the next delimiter which will be zeroed
  19.  * and then 'cp' will be again advanced until it reaches a non-delimiter. This
  20.  * marks the start of the next name and at the bottom of the loop 'this_dir'
  21.  * is set to be 'cp' and we begin again.
  22.  *
  23.  * skip_delim() and friends are macros that live in dir_find.h
  24.  *
  25.  */
  26. void
  27. dir_find()
  28. {
  29.     char *p;
  30.     char path[E_PATH_LEN];
  31.     char *this_dir;
  32.     char *cp;
  33.  
  34.     /*
  35.      * Get the environment variable, check its length and cp it to a safe spot.
  36.      *
  37.      */
  38.     p = getenv(E_PATH);
  39.     if (!p) return;
  40.  
  41.     if (strlen(p) >= E_PATH_LEN){
  42.         e_error("Length of '%s' variable exceeds %d.", E_PATH, MAXPATHLEN);
  43.     }
  44.  
  45.     strcpy(path, p);
  46.  
  47.     /*
  48.      * Begin at the beginning...
  49.      *
  50.      */
  51.     cp = path;
  52.     skip_delim(cp);
  53.  
  54.     if (!*cp){
  55.         /* 
  56.          * There was nothing there but delimiters! 
  57.          *
  58.          */
  59.         return;
  60.     }
  61.  
  62.     this_dir = cp;
  63.  
  64.     while (*this_dir){
  65.  
  66.         /* 
  67.          * Move "cp" along to the first delimiter. 
  68.          *
  69.          */
  70.         skip_to_next_delim(cp);
  71.  
  72.         /*
  73.          * If it's not already '\0' then zero it and move on. Otherwise we
  74.          * have reached the end of the string.
  75.          *
  76.          */
  77.         if (*cp){
  78.             *cp = '\0';
  79.             cp++;
  80.         }
  81.  
  82.         /* 
  83.          * Move "cp" along over delimiters unitl the next directory name. 
  84.          *
  85.          */
  86.         skip_delim(cp);
  87.  
  88.         /* 
  89.          * Check the directory "this_dir" for the filename "arg". 
  90.          * If it's there, offer it to them.
  91.          *
  92.          */
  93.         if (dir_check(arg, this_dir)){
  94.  
  95.             char prompt[MAXPATHLEN + 128];
  96.             ok_sprintf(prompt, "%s/%s [y]? ", this_dir, arg);
  97.  
  98.             /* 
  99.              * Get and process the reply. 
  100.              *
  101.              */
  102.             switch (char_in(prompt)){
  103.  
  104.                 case 'N':{
  105.                     /*
  106.                      * They don't want it and they don't want more help.
  107.                      *
  108.                      */
  109.                     ok_fprintf(stderr, "No!\n");
  110.                     return;
  111.                 }
  112.  
  113.                 case 'n':{
  114.                     /*
  115.                      * They don't want it but continue to search for another.
  116.                      *
  117.                      */
  118.                     ok_fprintf(stderr, "no\n");
  119.                     break;
  120.                 }
  121.  
  122.                 case 'q':
  123.                 case 'Q':{
  124.                     /*
  125.                      * Get out.
  126.                      *
  127.                      */
  128.                     ok_fprintf(stderr, "quit\n");
  129.                     abandon();
  130.                     exit(0);
  131.                 }
  132.  
  133.                 default :{
  134.                     /*
  135.                      * They want it. Set up the filename in 'arg'.
  136.                      *
  137.                      */
  138.                     char tmp[MAXPATHLEN];
  139.  
  140.                     ok_fprintf(stderr, "yes\n");
  141.                     ok_sprintf(tmp, "%s/%s", this_dir, arg);
  142.                     arg[0] = '\0';
  143.                     strcat(arg, tmp);
  144.                     return;
  145.                 }
  146.             }
  147.         }
  148.         this_dir = cp;
  149.     }
  150.  
  151.     return;
  152. }
  153.