|
|
1.1 ! root 1: #include <sys/types.h> ! 2: #include <sys/dir.h> ! 3: /* ! 4: * char *spname(name) ! 5: * char name[]; ! 6: * ! 7: * returns pointer to correctly spelled name, ! 8: * or 0 if no reasonable name is found; ! 9: * uses a static buffer to store correct name, ! 10: * so copy it if you want to call the routine again. ! 11: */ ! 12: char * ! 13: spname(name) ! 14: register char *name; ! 15: { ! 16: register char *p, *q, *new; ! 17: register d, nd, dir; ! 18: static char newname[80], guess[DIRSIZ+1], best[DIRSIZ+1]; ! 19: static struct{ ! 20: ino_t ino; ! 21: char name[DIRSIZ+1]; ! 22: } nbuf; ! 23: ! 24: new = newname; ! 25: nbuf.name[DIRSIZ] = '\0'; ! 26: for(;;){ ! 27: while(*name == '/') ! 28: *new++ = *name++; ! 29: *new = '\0'; ! 30: if(*name == '\0') ! 31: return(newname); ! 32: p = guess; ! 33: while(*name!='/' && *name!='\0'){ ! 34: if(p != guess+DIRSIZ) ! 35: *p++ = *name; ! 36: name++; ! 37: } ! 38: *p = '\0'; ! 39: if((dir=open(newname,0)) < 0) ! 40: return((char *)0); ! 41: d = 3; ! 42: while(read(dir, &nbuf, sizeof (struct direct)) == sizeof (struct direct)) ! 43: if(nbuf.ino){ ! 44: nd=SPdist(nbuf.name, guess); ! 45: if(nd<=d && nd!=3) { /* <= to avoid "." */ ! 46: p = best; ! 47: q = nbuf.name; ! 48: do; while(*p++ = *q++); ! 49: d = nd; ! 50: if(d == 0) ! 51: break; ! 52: } ! 53: } ! 54: close(dir); ! 55: if(d == 3) ! 56: return(0); ! 57: p = best; ! 58: do; while(*new++ = *p++); ! 59: --new; ! 60: } ! 61: } ! 62: /* ! 63: * very rough spelling metric ! 64: * 0 if the strings are identical ! 65: * 1 if two chars are interchanged ! 66: * 2 if one char wrong, added or deleted ! 67: * 3 otherwise ! 68: */ ! 69: SPdist(s, t) ! 70: register char *s, *t; ! 71: { ! 72: while(*s++ == *t) ! 73: if(*t++ == '\0') ! 74: return(0); ! 75: if(*--s){ ! 76: if(*t){ ! 77: if(s[1] && t[1] && *s==t[1] && *t==s[1] && SPeq(s+2,t+2)) ! 78: return(1); ! 79: if(SPeq(s+1, t+1)) ! 80: return(2); ! 81: } ! 82: if(SPeq(s+1, t)) ! 83: return(2); ! 84: } ! 85: if(*t && SPeq(s, t+1)) ! 86: return(2); ! 87: return(3); ! 88: } ! 89: SPeq(s, t) ! 90: register char *s, *t; ! 91: { ! 92: while(*s++ == *t) ! 93: if(*t++ == '\0') ! 94: return(1); ! 95: return(0); ! 96: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.