1fdd4e1e0SJan Lentfer /****************************************************************************
2*32bb5217SDaniel Fojt  * Copyright 2020 Thomas E. Dickey                                          *
3*32bb5217SDaniel Fojt  * Copyright 1998-2013,2016 Free Software Foundation, Inc.                  *
4fdd4e1e0SJan Lentfer  *                                                                          *
5fdd4e1e0SJan Lentfer  * Permission is hereby granted, free of charge, to any person obtaining a  *
6fdd4e1e0SJan Lentfer  * copy of this software and associated documentation files (the            *
7fdd4e1e0SJan Lentfer  * "Software"), to deal in the Software without restriction, including      *
8fdd4e1e0SJan Lentfer  * without limitation the rights to use, copy, modify, merge, publish,      *
9fdd4e1e0SJan Lentfer  * distribute, distribute with modifications, sublicense, and/or sell       *
10fdd4e1e0SJan Lentfer  * copies of the Software, and to permit persons to whom the Software is    *
11fdd4e1e0SJan Lentfer  * furnished to do so, subject to the following conditions:                 *
12fdd4e1e0SJan Lentfer  *                                                                          *
13fdd4e1e0SJan Lentfer  * The above copyright notice and this permission notice shall be included  *
14fdd4e1e0SJan Lentfer  * in all copies or substantial portions of the Software.                   *
15fdd4e1e0SJan Lentfer  *                                                                          *
16fdd4e1e0SJan Lentfer  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  *
17fdd4e1e0SJan Lentfer  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               *
18fdd4e1e0SJan Lentfer  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   *
19fdd4e1e0SJan Lentfer  * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   *
20fdd4e1e0SJan Lentfer  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    *
21fdd4e1e0SJan Lentfer  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    *
22fdd4e1e0SJan Lentfer  * THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               *
23fdd4e1e0SJan Lentfer  *                                                                          *
24fdd4e1e0SJan Lentfer  * Except as contained in this notice, the name(s) of the above copyright   *
25fdd4e1e0SJan Lentfer  * holders shall not be used in advertising or otherwise to promote the     *
26fdd4e1e0SJan Lentfer  * sale, use or other dealings in this Software without prior written       *
27fdd4e1e0SJan Lentfer  * authorization.                                                           *
28fdd4e1e0SJan Lentfer  ****************************************************************************/
29fdd4e1e0SJan Lentfer 
30fdd4e1e0SJan Lentfer /****************************************************************************
311d102085SJan Lentfer  *  Author: Thomas E. Dickey                    1999-on                     *
32fdd4e1e0SJan Lentfer  ****************************************************************************/
33fdd4e1e0SJan Lentfer 
34fdd4e1e0SJan Lentfer #include <curses.priv.h>
35fdd4e1e0SJan Lentfer #include <tic.h>
36fdd4e1e0SJan Lentfer 
37*32bb5217SDaniel Fojt MODULE_ID("$Id: name_match.c,v 1.25 2020/02/02 23:34:34 tom Exp $")
38fdd4e1e0SJan Lentfer 
391d102085SJan Lentfer #define FirstName _nc_globals.first_name
40fdd4e1e0SJan Lentfer 
413468e90cSJohn Marino #if NCURSES_USE_TERMCAP && NCURSES_XNAMES
423468e90cSJohn Marino static const char *
skip_index(const char * name)433468e90cSJohn Marino skip_index(const char *name)
443468e90cSJohn Marino {
453468e90cSJohn Marino     if ((_nc_syntax == SYN_TERMCAP) && _nc_user_definable) {
463468e90cSJohn Marino 	const char *bar = strchr(name, '|');
473468e90cSJohn Marino 	if (bar != 0 && (bar - name) == 2)
483468e90cSJohn Marino 	    name = bar + 1;
493468e90cSJohn Marino     }
503468e90cSJohn Marino     return name;
513468e90cSJohn Marino }
523468e90cSJohn Marino #endif
533468e90cSJohn Marino 
543468e90cSJohn Marino /*
553468e90cSJohn Marino  * Get the primary name from the given name list.  For terminfo, this is the
563468e90cSJohn Marino  * first name.  For termcap, this may be the second name, if the first one
573468e90cSJohn Marino  * happens to be two characters.
583468e90cSJohn Marino  */
59fdd4e1e0SJan Lentfer NCURSES_EXPORT(char *)
_nc_first_name(const char * const sp)60fdd4e1e0SJan Lentfer _nc_first_name(const char *const sp)
61fdd4e1e0SJan Lentfer {
621d102085SJan Lentfer #if NO_LEAKS
631d102085SJan Lentfer     if (sp == 0) {
643468e90cSJohn Marino 	if (FirstName != 0) {
651d102085SJan Lentfer 	    FreeAndNull(FirstName);
663468e90cSJohn Marino 	}
671d102085SJan Lentfer     } else
681d102085SJan Lentfer #endif
691d102085SJan Lentfer     {
701d102085SJan Lentfer 	if (FirstName == 0)
711d102085SJan Lentfer 	    FirstName = typeMalloc(char, MAX_NAME_SIZE + 1);
721d102085SJan Lentfer 
731d102085SJan Lentfer 	if (FirstName != 0) {
74*32bb5217SDaniel Fojt 	    unsigned n;
753468e90cSJohn Marino 	    const char *src = sp;
763468e90cSJohn Marino #if NCURSES_USE_TERMCAP && NCURSES_XNAMES
773468e90cSJohn Marino 	    src = skip_index(sp);
783468e90cSJohn Marino #endif
79fdd4e1e0SJan Lentfer 	    for (n = 0; n < MAX_NAME_SIZE; n++) {
803468e90cSJohn Marino 		if ((FirstName[n] = src[n]) == '\0'
811d102085SJan Lentfer 		    || (FirstName[n] == '|'))
82fdd4e1e0SJan Lentfer 		    break;
83fdd4e1e0SJan Lentfer 	    }
841d102085SJan Lentfer 	    FirstName[n] = '\0';
851d102085SJan Lentfer 	}
861d102085SJan Lentfer     }
871d102085SJan Lentfer     return (FirstName);
88fdd4e1e0SJan Lentfer }
89fdd4e1e0SJan Lentfer 
90fdd4e1e0SJan Lentfer /*
91fdd4e1e0SJan Lentfer  * Is the given name matched in namelist?
92fdd4e1e0SJan Lentfer  */
93fdd4e1e0SJan Lentfer NCURSES_EXPORT(int)
_nc_name_match(const char * const namelst,const char * const name,const char * const delim)941d102085SJan Lentfer _nc_name_match(const char *const namelst, const char *const name, const char *const delim)
95fdd4e1e0SJan Lentfer {
96*32bb5217SDaniel Fojt     const char *s;
97fdd4e1e0SJan Lentfer 
98fdd4e1e0SJan Lentfer     if ((s = namelst) != 0) {
99fdd4e1e0SJan Lentfer 	while (*s != '\0') {
100*32bb5217SDaniel Fojt 	    const char *d, *t;
101*32bb5217SDaniel Fojt 	    int code, found;
102*32bb5217SDaniel Fojt 
103fdd4e1e0SJan Lentfer 	    for (d = name; *d != '\0'; d++) {
104fdd4e1e0SJan Lentfer 		if (*s != *d)
105fdd4e1e0SJan Lentfer 		    break;
106fdd4e1e0SJan Lentfer 		s++;
107fdd4e1e0SJan Lentfer 	    }
108fdd4e1e0SJan Lentfer 	    found = FALSE;
109fdd4e1e0SJan Lentfer 	    for (code = TRUE; *s != '\0'; code = FALSE, s++) {
110fdd4e1e0SJan Lentfer 		for (t = delim; *t != '\0'; t++) {
111fdd4e1e0SJan Lentfer 		    if (*s == *t) {
112fdd4e1e0SJan Lentfer 			found = TRUE;
113fdd4e1e0SJan Lentfer 			break;
114fdd4e1e0SJan Lentfer 		    }
115fdd4e1e0SJan Lentfer 		}
116fdd4e1e0SJan Lentfer 		if (found)
117fdd4e1e0SJan Lentfer 		    break;
118fdd4e1e0SJan Lentfer 	    }
119fdd4e1e0SJan Lentfer 	    if (code && *d == '\0')
120fdd4e1e0SJan Lentfer 		return code;
121fdd4e1e0SJan Lentfer 	    if (*s++ == 0)
122fdd4e1e0SJan Lentfer 		break;
123fdd4e1e0SJan Lentfer 	}
124fdd4e1e0SJan Lentfer     }
125fdd4e1e0SJan Lentfer     return FALSE;
126fdd4e1e0SJan Lentfer }
127