1 /* $OpenBSD: genget.c,v 1.6 2019/07/11 05:11:16 deraadt Exp $ */
2
3 /*-
4 * Copyright (c) 1991, 1993
5 * The Regents of the University of California. All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * 3. Neither the name of the University nor the names of its contributors
16 * may be used to endorse or promote products derived from this software
17 * without specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29 * SUCH DAMAGE.
30 */
31
32 /* $KTH: genget.c,v 1.6 1997/05/04 09:01:34 assar Exp $ */
33
34 #include <ctype.h>
35 #include "telnet_locl.h"
36
37 /*
38 * The prefix function returns 0 if *s1 is not a prefix
39 * of *s2. If *s1 exactly matches *s2, the negative of
40 * the length is returned. If *s1 is a prefix of *s2,
41 * the length of *s1 is returned.
42 */
43 int
isprefix(char * s1,char * s2)44 isprefix(char *s1, char *s2)
45 {
46 char *os1;
47 char c1, c2;
48
49 if (*s1 == '\0')
50 return(-1);
51 os1 = s1;
52 c1 = *s1;
53 c2 = *s2;
54 while (tolower((unsigned char)c1) == tolower((unsigned char)c2)) {
55 if (c1 == '\0')
56 break;
57 c1 = *++s1;
58 c2 = *++s2;
59 }
60 return(*s1 ? 0 : (*s2 ? (s1 - os1) : (os1 - s1)));
61 }
62
63 static char *ambiguous; /* special return value for command routines */
64
65 char **
genget(char * name,char ** table,int stlen)66 genget(char *name, char **table, int stlen)
67 /* name to match */
68 /* name entry in table */
69 {
70 char **c, **found;
71 int n;
72
73 if (name == NULL)
74 return (NULL);
75
76 found = NULL;
77 for (c = table; *c != NULL; c = (char **)((char *)c + stlen)) {
78 if ((n = isprefix(name, *c)) == 0)
79 continue;
80 if (n < 0) /* exact match */
81 return(c);
82 if (found)
83 return(&ambiguous);
84 found = c;
85 }
86 return(found);
87 }
88
89 /*
90 * Function call version of Ambiguous()
91 */
92 int
Ambiguous(void * s)93 Ambiguous(void *s)
94 {
95 return((char **)s == &ambiguous);
96 }
97