GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: usr.bin/telnet/genget.c Lines: 0 18 0.0 %
Date: 2017-11-13 Branches: 0 18 0.0 %

Line Branch Exec Source
1
/*     $OpenBSD: genget.c,v 1.5 2014/07/20 10:32:23 jsg 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
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 **
66
genget(char *name, char **table, int stlen)
67
     /* name to match */
68
     /* name entry in table */
69
70
{
71
    char **c, **found;
72
    int n;
73
74
    if (name == NULL)
75
	return (NULL);
76
77
    found = NULL;
78
    for (c = table; *c != NULL; c = (char **)((char *)c + stlen)) {
79
	if ((n = isprefix(name, *c)) == 0)
80
	    continue;
81
	if (n < 0)		/* exact match */
82
	    return(c);
83
	if (found)
84
	    return(&ambiguous);
85
	found = c;
86
    }
87
    return(found);
88
}
89
90
/*
91
 * Function call version of Ambiguous()
92
 */
93
int
94
Ambiguous(void *s)
95
{
96
    return((char **)s == &ambiguous);
97
}