home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Usenet 1994 October
/
usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso
/
unix
/
volume17
/
e2
/
part02
/
spell_help.c
< prev
next >
Wrap
C/C++ Source or Header
|
1989-02-08
|
4KB
|
146 lines
#include "e.h"
/*
* spell_help()
*
* Read the directory and if the file they want (in 'arg') does not
* exist then see if there is one that does which has similar spelling
* to what they requested. Offer the change and handle the reply.
*
* The argument tells us how we should form the prompt if we get a match.
* 1 = this file was one of several arguments to e and so we should say
* "correct 'frde' to 'fred'?". If there were only one argument it would
* be redundant to say that, they know their argument was 'frde', so we
* just say "correct to 'frde'?". Little things make all the difference.
*
* Return 1 if we were able to help, 0 otherwise.
*
*/
int
spell_help(flag)
int flag;
{
DIR *dp;
DIR *opendir();
struct direct *readdir();
struct direct *entry;
register int len = strlen(arg);
struct stat buf;
int ch;
/*
* If the file already exists just return - they don't need help.
*
*/
if (stat(arg, &buf) == 0){
return 1;
}
/*
* If the current directory can't be read then return.
*
*/
if ((dp = opendir(".")) == NULL){
return 0;
}
for (entry = readdir(dp); entry != NULL; entry = readdir(dp)){
#ifdef Sysv
register int dlen = strlen(entry->d_name);
#else
register int dlen = entry->d_namlen;
#endif
if (stat(entry->d_name, &buf) == -1){
continue;
}
/*
* If it's not a regular file then continue.
*
*/
if ((buf.st_mode&S_IFMT) != S_IFREG){
continue;
}
/*
* If this entry has a non-zero inode number and
*
* name length == sought length +/- 1
*
* then it should be checked.
*
*/
if (entry->d_ino && dlen >= len - 1 && dlen <= len + 1){
char prompt[MAXPATHLEN + 128];
/*
* If the distance between this name and the one the user enetered
* is too great then just continue.
*
*/
if (sp_dist(entry->d_name, arg) == 3) continue;
/*
* Otherwise offer them this one and get the response.
*
*/
if (flag){
ok_sprintf(prompt, "correct '%s' to '%s' [y]? ", arg,
entry->d_name);
}
else{
ok_sprintf(prompt, "correct to '%s' [y]? ", entry->d_name);
}
ch = char_in(prompt);
if (ch == 'N'){
/*
* No, and they mean it. Offer no more help.
*
*/
ok_fprintf(stderr, "No!\n");
break;
}
else if (ch == 'n'){
/*
* No, but they'd like more help.
*
*/
ok_fprintf(stderr, "no\n");
continue;
}
else if (ch == 'q' || ch == 'Q' || ch == (int)erase){
/*
* Quit.
*
*/
ok_fprintf(stderr, "quit\n");
closedir(dp);
abandon();
exit(0);
}
else{
/*
* Yes.
*
*/
ok_fprintf(stderr, "yes\n");
closedir(dp);
strcpy(arg, entry->d_name);
return 1;
}
}
}
closedir(dp);
return 0;
}