1: /* $Header: /home/hyperion/mu/christos/src/sys/tcsh-6.00/RCS/tw.spell.c,v 3.0 1991/07/04 21:49:28 christos Exp $ */
   2: /*
   3:  * tw.spell.c: Spell check words
   4:  */
   5: /*-
   6:  * Copyright (c) 1980, 1991 The Regents of the University of California.
   7:  * All rights reserved.
   8:  *
   9:  * Redistribution and use in source and binary forms, with or without
  10:  * modification, are permitted provided that the following conditions
  11:  * are met:
  12:  * 1. Redistributions of source code must retain the above copyright
  13:  *    notice, this list of conditions and the following disclaimer.
  14:  * 2. Redistributions in binary form must reproduce the above copyright
  15:  *    notice, this list of conditions and the following disclaimer in the
  16:  *    documentation and/or other materials provided with the distribution.
  17:  * 3. All advertising materials mentioning features or use of this software
  18:  *    must display the following acknowledgement:
  19:  *	This product includes software developed by the University of
  20:  *	California, Berkeley and its contributors.
  21:  * 4. Neither the name of the University nor the names of its contributors
  22:  *    may be used to endorse or promote products derived from this software
  23:  *    without specific prior written permission.
  24:  *
  25:  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  26:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  27:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  28:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  29:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  30:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  31:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  32:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  33:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  34:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  35:  * SUCH DAMAGE.
  36:  */
  37: #include "config.h"
  38: #if !defined(lint) && !defined(pdp11)
  39: static char *rcsid()
  40:     { return "$Id: tw.spell.c,v 3.0 1991/07/04 21:49:28 christos Exp $"; }
  41: #endif
  42: 
  43: #include "sh.h"
  44: #include "tw.h"
  45: 
  46: extern Char **com_list;
  47: extern int numcommands;
  48: 
  49: /* spell_me : return corrrectly spelled filename.  From K&P spname */
  50: int
  51: spell_me(oldname, oldsize, look_cmd)
  52:     Char   *oldname;
  53:     int     oldsize, look_cmd;
  54: {
  55:     /* The +1 is to fool hp's optimizer */
  56:     Char    guess[FILSIZ + 1], newname[FILSIZ + 1];
  57:     register Char *new = newname, *old = oldname;
  58:     register Char *p, *cp, *ws;
  59:     bool    foundslash = 0;
  60:     int     retval;
  61: 
  62:     for (;;) {
  63:     while (*old == '/') {   /* skip '/' */
  64:         *new++ = *old++;
  65:         foundslash = 1;
  66:     }
  67:     /* do not try to correct spelling of single letter words */
  68:     if (*old != '\0' && old[1] == '\0')
  69:         *new++ = *old++;
  70:     *new = '\0';
  71:     if (*old == '\0') {
  72:         retval = (StrQcmp(oldname, newname) != 0);
  73:         copyn(oldname, newname, oldsize);   /* shove it back. */
  74:         return retval;
  75:     }
  76:     p = guess;      /* start at beginning of buf */
  77:     if (newname[0])     /* add current dir if any */
  78:         for (cp = newname; *cp; cp++)
  79:         if (p < guess + FILSIZ)
  80:             *p++ = *cp;
  81:     ws = p;
  82:     for (; *old != '/' && *old != '\0'; old++)/* add current file name */
  83:         if (p < guess + FILSIZ)
  84:         *p++ = *old;
  85:     *p = '\0';      /* terminate it */
  86: 
  87:     /*
  88: 	 * Don't tell t_search we're looking for cmd if no '/' in the name so
  89: 	 * far but there are later - or it will look for *all* commands
  90: 	 */
  91:     /* (*should* say "looking for directory" whenever '/' is next...) */
  92:     if (t_search(guess, p, SPELL, FILSIZ,
  93:              look_cmd && (foundslash || *old != '/'), 1) >= 4)
  94:         return -1;      /* hopeless */
  95:     for (p = ws; *new = *p++;)
  96:         new++;
  97:     }
  98: /*NOTREACHED*/
  99: #ifdef notdef
 100:     return (0);         /* lint on the vax under mtXinu complains! */
 101: #endif
 102: }
 103: 
 104: #define EQ(s,t) (StrQcmp(s,t) == 0)
 105: 
 106: /*
 107:  * spdist() is taken from Kernighan & Pike,
 108:  *  _The_UNIX_Programming_Environment_
 109:  * and adapted somewhat to correspond better to psychological reality.
 110:  * (Note the changes to the return values)
 111:  *
 112:  * According to Pollock and Zamora, CACM April 1984 (V. 27, No. 4),
 113:  * page 363, the correct order for this is:
 114:  * OMISSION = TRANSPOSITION > INSERTION > SUBSTITUTION
 115:  * thus, it was exactly backwards in the old version. -- PWP
 116:  */
 117: 
 118: int
 119: spdist(s, t)
 120:     register Char *s, *t;
 121: {
 122:     for (; (*s & TRIM) == (*t & TRIM); t++, s++)
 123:     if (*t == '\0')
 124:         return 0;       /* exact match */
 125:     if (*s) {
 126:     if (*t) {
 127:         if (s[1] && t[1] && (*s & TRIM) == (t[1] & TRIM) &&
 128:         (*t & TRIM) == (s[1] & TRIM) && EQ(s + 2, t + 2))
 129:         return 1;   /* transposition */
 130:         if (EQ(s + 1, t + 1))
 131:         return 3;   /* 1 char mismatch */
 132:     }
 133:     if (EQ(s + 1, t))
 134:         return 2;       /* extra character */
 135:     }
 136:     if (*t && EQ(s, t + 1))
 137:     return 1;       /* missing character */
 138:     return 4;
 139: }
 140: 
 141: int
 142: spdir(extended_name, tilded_dir, entry, name)
 143:     Char   *extended_name;
 144:     Char   *tilded_dir;
 145:     Char   *entry;
 146:     Char   *name;
 147: {
 148:     Char    path[1024];
 149:     Char   *s;
 150:     Char    oldch;
 151: 
 152:     for (s = name; *s != 0 && (*s & TRIM) == (*entry & TRIM); s++, entry++);
 153:     if (*s == 0 || s[1] == 0 || *entry != 0)
 154:     return 0;
 155: 
 156:     (void) Strcpy(path, tilded_dir);
 157:     oldch = *s;
 158:     *s = '/';
 159:     catn(path, name, sizeof(path) / sizeof(Char));
 160:     if (access(short2str(path), F_OK) == 0) {
 161:     (void) Strcpy(extended_name, name);
 162:     return 1;
 163:     }
 164:     *s = oldch;
 165:     return 0;
 166: }

Defined functions

rcsid defined in line 39; never used
spdir defined in line 141; used 1 times
spdist defined in line 118; used 1 times
spell_me defined in line 50; used 2 times

Defined macros

EQ defined in line 104; used 4 times
Last modified: 1991-08-20
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 98
Valid CSS Valid XHTML 1.0 Strict