# 2.11BSD#431 - /usr/src/bin/tcsh/tw.spell.c

##### Functions

    spdir             X
    spdist            X
    spell_me          X

##### Macros

    EQ                X

       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

- in /usr/src/bin/tcsh/tw.parse.c line 814

spdist defined in line 118; used 1 times

- in /usr/src/bin/tcsh/tw.parse.c line 804

spell_me defined in line 50; used 2 times

- in /usr/src/bin/tcsh/tw.parse.c line 271, 302

#### Defined macros

EQ defined in line 104; used 4 times

- in line 128-136(4)

Last modified: 1991-08-20 Generated: 2016-12-26 | Generated by src2html V0.67 page hit count: 604 |