OpenCoverage

spell.c

Absolute File Name:/home/opencoverage/opencoverage/guest-scripts/bash/src/lib/sh/spell.c
Source codeSwitch to Preprocessed file
LineSourceCount
1/* spell.c -- spelling correction for pathnames. */-
2-
3/* Copyright (C) 2000 Free Software Foundation, Inc.-
4-
5 This file is part of GNU Bash, the Bourne Again SHell.-
6-
7 Bash is free software: you can redistribute it and/or modify-
8 it under the terms of the GNU General Public License as published by-
9 the Free Software Foundation, either version 3 of the License, or-
10 (at your option) any later version.-
11-
12 Bash is distributed in the hope that it will be useful,-
13 but WITHOUT ANY WARRANTY; without even the implied warranty of-
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the-
15 GNU General Public License for more details.-
16-
17 You should have received a copy of the GNU General Public License-
18 along with Bash. If not, see <http://www.gnu.org/licenses/>.-
19*/-
20-
21#include <config.h>-
22-
23#if defined (HAVE_UNISTD_H)-
24# ifdef _MINIX-
25# include <sys/types.h>-
26# endif-
27# include <unistd.h>-
28#endif-
29-
30#include <bashtypes.h>-
31#include <posixdir.h>-
32#include <posixstat.h>-
33#if defined (HAVE_SYS_PARAM_H)-
34#include <sys/param.h>-
35#endif-
36-
37#include <stdio.h>-
38-
39#include <bashansi.h>-
40#include <maxpath.h>-
41#include <stdc.h>-
42-
43static int mindist __P((char *, char *, char *));-
44static int spdist __P((char *, char *));-
45-
46/*-
47 * `spname' and its helpers are inspired by the code in "The UNIX-
48 * Programming Environment", Kernighan & Pike, Prentice-Hall 1984,-
49 * pages 209 - 213.-
50 */-
51-
52/*-
53 * `spname' -- return a correctly spelled filename-
54 *-
55 * int spname(char * oldname, char * newname)-
56 * Returns: -1 if no reasonable match found-
57 * 0 if exact match found-
58 * 1 if corrected-
59 * Stores corrected name in `newname'.-
60 */-
61int-
62spname(oldname, newname)-
63 char *oldname;-
64 char *newname;-
65{-
66 char *op, *np, *p;-
67 char guess[PATH_MAX + 1], best[PATH_MAX + 1];-
68-
69 op = oldname;-
70 np = newname;-
71 for (;;)-
72 {-
73 while (*op == '/') /* Skip slashes */
*op == '/'Description
TRUEnever evaluated
FALSEnever evaluated
0
74 *np++ = *op++;
never executed: *np++ = *op++;
0
75 *np = '\0';-
76-
77 if (*op == '\0') /* Exact or corrected */
*op == '\0'Description
TRUEnever evaluated
FALSEnever evaluated
0
78 {-
79 /* `.' is rarely the right thing. */-
80 if (oldname[1] == '\0' && newname[1] == '\0' &&
oldname[1] == '\0'Description
TRUEnever evaluated
FALSEnever evaluated
newname[1] == '\0'Description
TRUEnever evaluated
FALSEnever evaluated
0
81 oldname[0] != '.' && newname[0] == '.')
oldname[0] != '.'Description
TRUEnever evaluated
FALSEnever evaluated
newname[0] == '.'Description
TRUEnever evaluated
FALSEnever evaluated
0
82 return -1;
never executed: return -1;
0
83 return strcmp(oldname, newname) != 0;
never executed: return __extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p ( oldname ) && __builtin_constant_p ( newname ) && (__s1_len = __builtin_strlen ( oldname ), __s2_len = __builtin_strlen ( newname ), (!((size_t)(const void *)(( oldname ) + 1) - (si...((const unsigned char *) (const char *) ( newname ))[2] - __s2[2]); if (__s2_len > 2 && __result == 0) __result = (((const unsigned char *) (const char *) ( newname ))[3] - __s2[3]); } } __result; }))) : __builtin_strcmp ( oldname , newname )))); }) != 0;
never executed: __result = (((const unsigned char *) (const char *) ( oldname ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( newname ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
__s1_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
84 }-
85-
86 /* Copy next component into guess */-
87 for (p = guess; *op != '/' && *op != '\0'; op++)
*op != '/'Description
TRUEnever evaluated
FALSEnever evaluated
*op != '\0'Description
TRUEnever evaluated
FALSEnever evaluated
0
88 if (p < guess + PATH_MAX)
p < guess + 4096Description
TRUEnever evaluated
FALSEnever evaluated
0
89 *p++ = *op;
never executed: *p++ = *op;
0
90 *p = '\0';-
91-
92 if (mindist(newname, guess, best) >= 3)
mindist(newnam...ss, best) >= 3Description
TRUEnever evaluated
FALSEnever evaluated
0
93 return -1; /* Hopeless */
never executed: return -1;
0
94-
95 /*-
96 * Add to end of newname-
97 */-
98 for (p = best; *np = *p++; np++)
*np = *p++Description
TRUEnever evaluated
FALSEnever evaluated
0
99 ;
never executed: ;
0
100 }
never executed: end of block
0
101}
never executed: end of block
0
102-
103/*-
104 * Search directory for a guess-
105 */-
106static int-
107mindist(dir, guess, best)-
108 char *dir;-
109 char *guess;-
110 char *best;-
111{-
112 DIR *fd;-
113 struct dirent *dp;-
114 int dist, x;-
115-
116 dist = 3; /* Worst distance */-
117 if (*dir == '\0')
*dir == '\0'Description
TRUEnever evaluated
FALSEnever evaluated
0
118 dir = ".";
never executed: dir = ".";
0
119-
120 if ((fd = opendir(dir)) == NULL)
(fd = opendir(...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
121 return dist;
never executed: return dist;
0
122-
123 while ((dp = readdir(fd)) != NULL)
(dp = readdir(...!= ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
124 {-
125 /*-
126 * Look for a better guess. If the new guess is as-
127 * good as the current one, we take it. This way,-
128 * any single character match will be a better match-
129 * than ".".-
130 */-
131 x = spdist(dp->d_name, guess);-
132 if (x <= dist && x != 3)
x <= distDescription
TRUEnever evaluated
FALSEnever evaluated
x != 3Description
TRUEnever evaluated
FALSEnever evaluated
0
133 {-
134 strcpy(best, dp->d_name);-
135 dist = x;-
136 if (dist == 0) /* Exact match */
dist == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
137 break;
never executed: break;
0
138 }
never executed: end of block
0
139 }
never executed: end of block
0
140 (void)closedir(fd);-
141-
142 /* Don't return `.' */-
143 if (best[0] == '.' && best[1] == '\0')
best[0] == '.'Description
TRUEnever evaluated
FALSEnever evaluated
best[1] == '\0'Description
TRUEnever evaluated
FALSEnever evaluated
0
144 dist = 3;
never executed: dist = 3;
0
145 return dist;
never executed: return dist;
0
146}-
147-
148/*-
149 * `spdist' -- return the "distance" between two names.-
150 *-
151 * int spname(char * oldname, char * newname)-
152 * Returns: 0 if strings are identical-
153 * 1 if two characters are transposed-
154 * 2 if one character is wrong, added or deleted-
155 * 3 otherwise-
156 */-
157static int-
158spdist(cur, new)-
159 char *cur, *new;-
160{-
161 while (*cur == *new)
*cur == *newDescription
TRUEnever evaluated
FALSEnever evaluated
0
162 {-
163 if (*cur == '\0')
*cur == '\0'Description
TRUEnever evaluated
FALSEnever evaluated
0
164 return 0; /* Exact match */
never executed: return 0;
0
165 cur++;-
166 new++;-
167 }
never executed: end of block
0
168-
169 if (*cur)
*curDescription
TRUEnever evaluated
FALSEnever evaluated
0
170 {-
171 if (*new)
*newDescription
TRUEnever evaluated
FALSEnever evaluated
0
172 {-
173 if (cur[1] && new[1] && cur[0] == new[1] && cur[1] == new[0] && strcmp (cur + 2, new + 2) == 0)
never executed: __result = (((const unsigned char *) (const char *) ( cur + 2 ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( new + 2 ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
cur[1]Description
TRUEnever evaluated
FALSEnever evaluated
new[1]Description
TRUEnever evaluated
FALSEnever evaluated
cur[0] == new[1]Description
TRUEnever evaluated
FALSEnever evaluated
cur[1] == new[0]Description
TRUEnever evaluated
FALSEnever evaluated
__extension__ ... )))); }) == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
174 return 1; /* Transposition */
never executed: return 1;
0
175-
176 if (strcmp (cur + 1, new + 1) == 0)
never executed: __result = (((const unsigned char *) (const char *) ( cur + 1 ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( new + 1 ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
__extension__ ... )))); }) == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
177 return 2; /* One character mismatch */
never executed: return 2;
0
178 }
never executed: end of block
0
179-
180 if (strcmp(&cur[1], &new[0]) == 0)
never executed: __result = (((const unsigned char *) (const char *) ( &cur[1] ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( &new[0] ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
__extension__ ... )))); }) == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
181 return 2; /* Extra character */
never executed: return 2;
0
182 }
never executed: end of block
0
183-
184 if (*new && strcmp(cur, new + 1) == 0)
never executed: __result = (((const unsigned char *) (const char *) ( cur ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( new + 1 ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
*newDescription
TRUEnever evaluated
FALSEnever evaluated
__extension__ ... )))); }) == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
185 return 2; /* Missing character */
never executed: return 2;
0
186-
187 return 3;
never executed: return 3;
0
188}-
189-
190char *-
191dirspell (dirname)-
192 char *dirname;-
193{-
194 int n;-
195 char *guess;-
196-
197 n = (strlen (dirname) * 3 + 1) / 2 + 1;-
198 guess = (char *)malloc (n);-
199 if (guess == 0)
guess == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
200 return 0;
never executed: return 0;
0
201-
202 switch (spname (dirname, guess))-
203 {-
204 case -1:
never executed: case -1:
0
205 default:
never executed: default:
0
206 free (guess);-
207 return (char *)NULL;
never executed: return (char *) ((void *)0) ;
0
208 case 0:
never executed: case 0:
0
209 case 1:
never executed: case 1:
0
210 return guess;
never executed: return guess;
0
211 }-
212}-
Source codeSwitch to Preprocessed file

Generated by Squish Coco 4.1.2