[BACK]Return to genget.c CVS log [TXT][DIR] Up to [local] / src / usr.bin / telnet

Annotation of src/usr.bin/telnet/genget.c, Revision 1.1

1.1     ! deraadt     1: /*     $OpenBSD: genget.c,v 1.2 2003/06/02 19:38:25 millert 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: #ifndef lint
        !            33: /* from: static char sccsid[] = "@(#)genget.c  8.2 (Berkeley) 5/30/95"; */
        !            34: /* from: static char *rcsid = "$NetBSD: genget.c,v 1.5 1996/02/24 01:15:21 jtk Exp $"; */
        !            35: static char *rcsid = "$OpenBSD: genget.c,v 1.2 2003/06/02 19:38:25 millert Exp $";
        !            36: #endif /* not lint */
        !            37:
        !            38: /* $KTH: genget.c,v 1.6 1997/05/04 09:01:34 assar Exp $ */
        !            39:
        !            40: #include <ctype.h>
        !            41: #include "misc-proto.h"
        !            42:
        !            43: #define        LOWER(x) (isupper((int)x) ? tolower((int)x) : (x))
        !            44: /*
        !            45:  * The prefix function returns 0 if *s1 is not a prefix
        !            46:  * of *s2.  If *s1 exactly matches *s2, the negative of
        !            47:  * the length is returned.  If *s1 is a prefix of *s2,
        !            48:  * the length of *s1 is returned.
        !            49:  */
        !            50: int
        !            51: isprefix(char *s1, char *s2)
        !            52: {
        !            53:     char *os1;
        !            54:     char c1, c2;
        !            55:
        !            56:     if (*s1 == '\0')
        !            57:        return(-1);
        !            58:     os1 = s1;
        !            59:     c1 = *s1;
        !            60:     c2 = *s2;
        !            61:     while (LOWER(c1) == LOWER(c2)) {
        !            62:        if (c1 == '\0')
        !            63:            break;
        !            64:        c1 = *++s1;
        !            65:        c2 = *++s2;
        !            66:     }
        !            67:     return(*s1 ? 0 : (*s2 ? (s1 - os1) : (os1 - s1)));
        !            68: }
        !            69:
        !            70: static char *ambiguous;                /* special return value for command routines */
        !            71:
        !            72: char **
        !            73: genget(char *name, char **table, int stlen)
        !            74:      /* name to match */
        !            75:      /* name entry in table */
        !            76:
        !            77: {
        !            78:     char **c, **found;
        !            79:     int n;
        !            80:
        !            81:     if (name == 0)
        !            82:        return 0;
        !            83:
        !            84:     found = 0;
        !            85:     for (c = table; *c != 0; c = (char **)((char *)c + stlen)) {
        !            86:        if ((n = isprefix(name, *c)) == 0)
        !            87:            continue;
        !            88:        if (n < 0)              /* exact match */
        !            89:            return(c);
        !            90:        if (found)
        !            91:            return(&ambiguous);
        !            92:        found = c;
        !            93:     }
        !            94:     return(found);
        !            95: }
        !            96:
        !            97: /*
        !            98:  * Function call version of Ambiguous()
        !            99:  */
        !           100: int
        !           101: Ambiguous(void *s)
        !           102: {
        !           103:     return((char **)s == &ambiguous);
        !           104: }