/****************************************************************************
- * Copyright (c) 1998-2017,2018 Free Software Foundation, Inc. *
+ * Copyright 2018-2019,2020 Thomas E. Dickey *
+ * Copyright 1998-2016,2017 Free Software Foundation, Inc. *
* *
* Permission is hereby granted, free of charge, to any person obtaining a *
* copy of this software and associated documentation files (the *
#include <tic.h>
-MODULE_ID("$Id: comp_parse.c,v 1.101 2018/02/24 22:33:40 tom Exp $")
+MODULE_ID("$Id: comp_parse.c,v 1.110 2020/02/29 15:46:00 anonymous.maarten Exp $")
static void sanity_check2(TERMTYPE2 *, bool);
-NCURSES_IMPEXP void NCURSES_API(*_nc_check_termtype2) (TERMTYPE2 *, bool) = sanity_check2;
+NCURSES_IMPEXP void (NCURSES_API *_nc_check_termtype2) (TERMTYPE2 *, bool) = sanity_check2;
static void fixup_acsc(TERMTYPE2 *, int);
size_t len = strlen(src);
if (len > MAX_NAME_SIZE)
len = MAX_NAME_SIZE;
- _nc_STRNCPY(dst, src, len);
+ _nc_STRNCPY(dst, src, MAX_NAME_SIZE);
_nc_STRCPY(dst + len, "|", NAMEBUFFER_SIZE - len);
src = dst;
}
++qend;
while ((*qstart++ = *qend++) != '\0') ;
fprintf(stderr, "...now\t%s\n", p2);
+ removed = TRUE;
} else {
fprintf(stderr, "Cannot remove alias '%.*s'\n",
(int) (qend - qstart), qstart);
}
- removed = TRUE;
break;
}
}
{
unsigned num_names = NUM_EXT_NAMES(p);
unsigned n;
- for (n = 0; n < num_names; ++n) {
- if (!strcmp(p->ext_Names[n], name))
- break;
+ if (name != 0) {
+ for (n = 0; n < num_names; ++n) {
+ if (!strcmp(p->ext_Names[n], name))
+ break;
+ }
+ } else {
+ n = num_names + 1;
}
return n;
}
return result;
}
+#define valid_TERMTYPE2(p) \
+ ((p) != 0 && \
+ (p)->term_names != 0 && \
+ (p)->ext_Names != 0)
+
/*
* Disallow changing the type of an extended capability when doing a "use"
* if one or the other is a string.
invalid_merge(TERMTYPE2 *to, TERMTYPE2 *from)
{
int rc = FALSE;
- char *to_name = _nc_first_name(to->term_names);
- char *from_name = strdup(_nc_first_name(from->term_names));
- unsigned num_names = NUM_EXT_NAMES(from);
- unsigned n;
-
- for (n = 0; n < num_names; ++n) {
- const char *capname = from->ext_Names[n];
- int tt = extended_captype(to, find_capname(to, capname));
- int tf = extended_captype(from, n);
-
- if (tt <= STRING
- && tf <= STRING
- && (tt == STRING) != (tf == STRING)) {
- if (from_name != 0 && strcmp(to_name, from_name)) {
- DEBUG(2,
- ("merge of %s to %s changes type of %s from %s to %s",
- from_name,
- to_name,
- from->ext_Names[n],
- name_of_captype(tf),
- name_of_captype(tt)));
- } else {
- DEBUG(2, ("merge of %s changes type of %s from %s to %s",
- to_name,
- from->ext_Names[n],
- name_of_captype(tf),
- name_of_captype(tt)));
+ if (valid_TERMTYPE2(to)
+ && valid_TERMTYPE2(from)) {
+ char *to_name = _nc_first_name(to->term_names);
+ char *from_name = strdup(_nc_first_name(from->term_names));
+ unsigned num_names = NUM_EXT_NAMES(from);
+ unsigned n;
+
+ for (n = 0; n < num_names; ++n) {
+ const char *capname = from->ext_Names[n];
+ int tt = extended_captype(to, find_capname(to, capname));
+ int tf = extended_captype(from, n);
+
+ if (tt <= STRING
+ && tf <= STRING
+ && (tt == STRING) != (tf == STRING)) {
+ if (from_name != 0 && strcmp(to_name, from_name)) {
+ DEBUG(2,
+ ("merge of %s to %s changes type of %s from %s to %s",
+ from_name,
+ to_name,
+ from->ext_Names[n],
+ name_of_captype(tf),
+ name_of_captype(tt)));
+ } else {
+ DEBUG(2, ("merge of %s changes type of %s from %s to %s",
+ to_name,
+ from->ext_Names[n],
+ name_of_captype(tf),
+ name_of_captype(tt)));
+ }
+ _nc_warning("merge changes type of %s from %s to %s",
+ from->ext_Names[n],
+ name_of_captype(tf),
+ name_of_captype(tt));
+ rc = TRUE;
}
- _nc_warning("merge changes type of %s from %s to %s",
- from->ext_Names[n],
- name_of_captype(tf),
- name_of_captype(tt));
- rc = TRUE;
}
+ free(from_name);
}
- free(from_name);
return rc;
}
#define validate_merge(p, q) \
char *lookfor = qp->uses[i].name;
long lookline = qp->uses[i].line;
+ if (lookfor == 0)
+ continue;
+
foundit = FALSE;
_nc_set_type(child);
* subsequent pass.
*/
for (i = 0; i < qp->nuses; i++)
- if (qp->uses[i].link->nuses) {
+ if (qp->uses[i].link
+ && qp->uses[i].link->nuses) {
DEBUG(2, ("%s: use entry %d unresolved",
_nc_first_name(qp->tterm.term_names), i));
goto incomplete;
_nc_free_tic(int code)
{
_nc_leaks_tic();
- _nc_free_tinfo(code);
+ exit_terminfo(code);
}
#endif