typo
[unix-history] / usr / src / lib / libtelnet / genget.c
CommitLineData
059be884 1/*-
8aa89157
KB
2 * Copyright (c) 1991, 1993
3 * The Regents of the University of California. All rights reserved.
059be884
DB
4 *
5 * %sccs.include.redist.c%
6 */
7
8#ifndef lint
8aa89157 9static char sccsid[] = "@(#)genget.c 8.1 (Berkeley) %G%";
059be884
DB
10#endif /* not lint */
11
12
13#include <ctype.h>
14
15#define LOWER(x) (isupper(x) ? tolower(x) : (x))
16/*
17 * The prefix function returns 0 if *s1 is not a prefix
18 * of *s2. If *s1 exactly matches *s2, the negative of
19 * the length is returned. If *s1 is a prefix of *s2,
20 * the length of *s1 is returned.
21 */
22 int
23isprefix(s1, s2)
24 register char *s1, *s2;
25{
26 register int n = 0;
27 char *os1;
28 register char c1, c2;
29
30 if (*s1 == '\0')
31 return(-1);
32 os1 = s1;
33 c1 = *s1;
34 c2 = *s2;
35 while (LOWER(c1) == LOWER(c2)) {
36 if (c1 == '\0')
37 break;
38 c1 = *++s1;
39 c2 = *++s2;
40 }
41 return(*s1 ? 0 : (*s2 ? (s1 - os1) : (os1 - s1)));
42}
43
44static char *ambiguous; /* special return value for command routines */
45
46 char **
47genget(name, table, stlen)
48 char *name; /* name to match */
49 char **table; /* name entry in table */
50 int stlen;
51{
52 register char **c, **found;
53 register int n;
54
55 if (name == 0)
56 return 0;
57
58 found = 0;
59 for (c = table; *c != 0; c = (char **)((char *)c + stlen)) {
60 if ((n = isprefix(name, *c)) == 0)
61 continue;
62 if (n < 0) /* exact match */
63 return(c);
64 if (found)
65 return(&ambiguous);
66 found = c;
67 }
68 return(found);
69}
70
71/*
72 * Function call version of Ambiguous()
73 */
74 int
75Ambiguous(s)
76 char *s;
77{
78 return((char **)s == &ambiguous);
79}