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