/****************************************************************************
- * Copyright 2018-2021,2022 Thomas E. Dickey *
+ * Copyright 2018-2023,2024 Thomas E. Dickey *
* Copyright 1998-2016,2017 Free Software Foundation, Inc. *
* *
* Permission is hereby granted, free of charge, to any person obtaining a *
#include <tic.h>
-MODULE_ID("$Id: comp_parse.c,v 1.122 2022/05/08 00:11:44 tom Exp $")
+MODULE_ID("$Id: comp_parse.c,v 1.134 2024/02/10 15:52:11 tom Exp $")
static void sanity_check2(TERMTYPE2 *, bool);
NCURSES_IMPEXP void (NCURSES_API *_nc_check_termtype2) (TERMTYPE2 *, bool) = sanity_check2;
{
ENTRY *newp;
- DEBUG(1, (T_CALLED("enqueue(ep=%p)"), (void *) ep));
+ DEBUG(2, (T_CALLED("enqueue(ep=%p)"), (void *) ep));
newp = _nc_copy_entry(ep);
if (newp == 0)
newp->next = 0;
if (newp->last)
newp->last->next = newp;
- DEBUG(1, (T_RETURN("")));
+ DEBUG(2, (T_RETURN("")));
}
#define NAMEBUFFER_SIZE (MAX_NAME_SIZE + 2)
bool oldsuppress = _nc_suppress_warnings;
int immediate = 0;
- DEBUG(1,
- (T_CALLED("_nc_read_entry_source(file=%p, buf=%p, literal=%d, silent=%d, hook=%p)"),
- (void *) fp, buf, literal, silent, (void *) hook));
+ DEBUG(2,
+ (T_CALLED("_nc_read_entry_source("
+ "file=%p, buf=%p, literal=%d, silent=%d, hook=%#"
+ PRIxPTR ")"),
+ (void *) fp, buf, literal, silent, CASTxPTR(hook)));
if (silent)
_nc_suppress_warnings = TRUE; /* shut the lexer up, too */
FreeIfNeeded(thisentry.tterm.Booleans);
FreeIfNeeded(thisentry.tterm.Numbers);
FreeIfNeeded(thisentry.tterm.Strings);
+ FreeIfNeeded(thisentry.tterm.str_table);
#if NCURSES_XNAMES
FreeIfNeeded(thisentry.tterm.ext_Names);
FreeIfNeeded(thisentry.tterm.ext_str_table);
if (_nc_tail) {
/* set up the head pointer */
- for (_nc_head = _nc_tail; _nc_head->last; _nc_head = _nc_head->last)
- continue;
+ for (_nc_head = _nc_tail; _nc_head->last; _nc_head = _nc_head->last) {
+ /* EMPTY */ ;
+ }
DEBUG(2, ("head = %s", _nc_head->tterm.term_names));
DEBUG(2, ("tail = %s", _nc_tail->tterm.term_names));
#endif
_nc_suppress_warnings = oldsuppress;
+ DEBUG(2, (T_RETURN("")));
}
#if 0 && NCURSES_XNAMES
ENTRY *qp, *rp, *lastread = 0;
bool keepgoing;
unsigned i, j;
- int unresolved, total_unresolved, multiples;
+ int total_unresolved, multiples;
DEBUG(2, (T_CALLED("_nc_resolve_uses2")));
for_entry_list(qp) {
int matchcount = 0;
- for_entry_list(rp) {
+ for_entry_list2(rp, qp->next) {
if (qp > rp
&& check_collisions(qp->tterm.term_names,
rp->tterm.term_names,
total_unresolved = 0;
_nc_curr_col = -1;
for_entry_list(qp) {
- unresolved = 0;
for (i = 0; i < qp->nuses; i++) {
bool foundit;
char *child = _nc_first_name(qp->tterm.term_names);
for_entry_list(rp) {
if (rp != qp
&& _nc_name_match(rp->tterm.term_names, lookfor, "|")) {
- DEBUG(2, ("%s: resolving use=%s (in core)",
- child, lookfor));
+ DEBUG(2, ("%s: resolving use=%s %p (in core)",
+ child, lookfor, lookfor));
qp->uses[i].link = rp;
foundit = TRUE;
/* no good, mark this one unresolvable and complain */
if (!foundit) {
- unresolved++;
total_unresolved++;
_nc_curr_line = (int) lookline;
for_entry_list(qp) {
if (qp->nuses > 0) {
- DEBUG(2, ("%s: attempting merge",
- _nc_first_name(qp->tterm.term_names)));
+ DEBUG(2, ("%s: attempting merge of %d entries",
+ _nc_first_name(qp->tterm.term_names),
+ qp->nuses));
/*
* If any of the use entries we're looking for is
* incomplete, punt. We'll catch this entry on a
* subsequent pass.
*/
- for (i = 0; i < qp->nuses; i++)
+ for (i = 0; i < qp->nuses; i++) {
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;
}
+ }
/*
* First, make sure there is no garbage in the
* (reverse) order.
*/
for (; qp->nuses; qp->nuses--) {
- validate_merge(&merged,
- qp->uses[qp->nuses - 1].link);
- _nc_merge_entry(&merged,
- qp->uses[qp->nuses - 1].link);
+ int n = (int) (qp->nuses - 1);
+ validate_merge(&merged, qp->uses[n].link);
+ _nc_merge_entry(&merged, qp->uses[n].link);
+ free(qp->uses[n].name);
}
/*
DEBUG(2, ("MERGES COMPLETED OK"));
}
- /*
- * We'd like to free entries read in off disk at this point, but can't.
- * The merge_entry() code doesn't copy the strings in the use entries,
- * it just aliases them. If this ever changes, do a
- * free_entries(lastread) here.
- */
-
DEBUG(2, ("RESOLUTION FINISHED"));
if (fullresolve) {