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

  1. #include "e.h"
  2.  
  3. /*
  4.  * spell_help()
  5.  *
  6.  * Read the directory and if the file they want (in 'arg') does not
  7.  * exist then see if there is one that does which has similar spelling
  8.  * to what they requested. Offer the change and handle the reply.
  9.  *
  10.  * The argument tells us how we should form the prompt if we get a match.
  11.  * 1 = this file was one of several arguments to e and so we should say
  12.  * "correct 'frde' to 'fred'?". If there were only one argument it would
  13.  * be redundant to say that, they know their argument was 'frde', so we
  14.  * just say "correct to 'frde'?". Little things make all the difference.
  15.  *
  16.  * Return 1 if we were able to help, 0 otherwise.
  17.  *
  18.  */
  19. int
  20. spell_help(flag)
  21. int flag;
  22. {
  23.     DIR *dp; 
  24.     DIR *opendir();
  25.     struct direct *readdir();
  26.     struct direct *entry;
  27.     register int len = strlen(arg);
  28.     struct stat buf;
  29.     int ch;
  30.  
  31.     /* 
  32.      * If the file already exists just return - they don't need help. 
  33.      *
  34.      */
  35.     if (stat(arg, &buf) == 0){
  36.         return 1;
  37.     }
  38.  
  39.     /* 
  40.      * If the current directory can't be read then return. 
  41.      *
  42.      */
  43.     if ((dp = opendir(".")) == NULL){
  44.         return 0;
  45.     }
  46.  
  47.     for (entry = readdir(dp); entry != NULL; entry = readdir(dp)){
  48.  
  49. #ifdef Sysv
  50.         register int dlen = strlen(entry->d_name);
  51. #else
  52.         register int dlen = entry->d_namlen;
  53. #endif
  54.  
  55.         if (stat(entry->d_name, &buf) == -1){
  56.             continue;
  57.         }
  58.  
  59.         /* 
  60.          * If it's not a regular file then continue. 
  61.          *
  62.          */
  63.         if ((buf.st_mode&S_IFMT) != S_IFREG){
  64.             continue;
  65.         }
  66.  
  67.         /* 
  68.          * If this entry has a non-zero inode number and
  69.          *
  70.          *      name length == sought length +/- 1 
  71.          *
  72.          * then it should be checked.
  73.          *
  74.          */
  75.  
  76.         if (entry->d_ino && dlen >= len - 1 && dlen <= len + 1){
  77.  
  78.             char prompt[MAXPATHLEN + 128];
  79.  
  80.             /* 
  81.              * If the distance between this name and the one the user enetered
  82.              * is too great then just continue.
  83.              *
  84.              */
  85.  
  86.             if (sp_dist(entry->d_name, arg) == 3) continue;
  87.  
  88.  
  89.             /* 
  90.              * Otherwise offer them this one and get the response.
  91.              *
  92.              */
  93.             if (flag){
  94.                 ok_sprintf(prompt, "correct '%s' to '%s' [y]? ", arg, 
  95.                     entry->d_name);
  96.             }
  97.             else{
  98.                 ok_sprintf(prompt, "correct to '%s' [y]? ", entry->d_name);
  99.             }
  100.             ch = char_in(prompt);
  101.  
  102.             if (ch == 'N'){
  103.                 /* 
  104.                  * No, and they mean it. Offer no more help. 
  105.                  *
  106.                  */
  107.                 ok_fprintf(stderr, "No!\n");
  108.                 break;
  109.             }
  110.  
  111.             else if (ch == 'n'){
  112.                 /* 
  113.                  * No, but they'd like more help. 
  114.                  *
  115.                  */
  116.                 ok_fprintf(stderr, "no\n");
  117.                 continue;
  118.             }
  119.  
  120.             else if (ch == 'q' || ch == 'Q' || ch == (int)erase){
  121.                 /* 
  122.                  * Quit. 
  123.                  *
  124.                  */
  125.                 ok_fprintf(stderr, "quit\n");
  126.                 closedir(dp);
  127.                 abandon();
  128.                 exit(0);
  129.             }
  130.  
  131.             else{
  132.                 /* 
  133.                  * Yes. 
  134.                  *
  135.                  */
  136.                 ok_fprintf(stderr, "yes\n");
  137.                 closedir(dp);
  138.                 strcpy(arg, entry->d_name);
  139.                 return 1;
  140.             }
  141.         }
  142.     }
  143.     closedir(dp);
  144.     return 0;
  145. }
  146.