X-Git-Url: http://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=ncurses%2Ftinfo%2Fcomp_parse.c;h=e47625b3dbe1735ff8cd2044bd804d6202ad9a1d;hp=ff8d5657a197a8f194b684864e8d9e0a4a1e87f1;hb=HEAD;hpb=3ffedbf1016b2d7026e7543fe73e87b046fbd862 diff --git a/ncurses/tinfo/comp_parse.c b/ncurses/tinfo/comp_parse.c index ff8d5657..dec4b925 100644 --- a/ncurses/tinfo/comp_parse.c +++ b/ncurses/tinfo/comp_parse.c @@ -1,5 +1,5 @@ /**************************************************************************** - * 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 * @@ -48,7 +48,7 @@ #include -MODULE_ID("$Id: comp_parse.c,v 1.124 2022/09/10 19:54:59 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; @@ -222,8 +222,10 @@ _nc_read_entry_source(FILE *fp, char *buf, int immediate = 0; DEBUG(2, - (T_CALLED("_nc_read_entry_source(file=%p, buf=%p, literal=%d, silent=%d, hook=%p)"), - (void *) fp, buf, literal, silent, (void *) hook)); + (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 */ @@ -262,8 +264,9 @@ _nc_read_entry_source(FILE *fp, char *buf, 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)); @@ -401,7 +404,7 @@ _nc_resolve_uses2(bool fullresolve, bool literal) 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"))); @@ -412,8 +415,8 @@ _nc_resolve_uses2(bool fullresolve, bool literal) for_entry_list(qp) { int matchcount = 0; - for_entry_list(rp) { - if (qp > rp // FIXME - pointer-comparison is wrong... + for_entry_list2(rp, qp->next) { + if (qp > rp && check_collisions(qp->tterm.term_names, rp->tterm.term_names, matchcount + 1)) { @@ -441,7 +444,6 @@ _nc_resolve_uses2(bool fullresolve, bool literal) 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); @@ -510,7 +512,6 @@ _nc_resolve_uses2(bool fullresolve, bool literal) /* no good, mark this one unresolvable and complain */ if (!foundit) { - unresolved++; total_unresolved++; _nc_curr_line = (int) lookline; @@ -571,10 +572,10 @@ _nc_resolve_uses2(bool fullresolve, bool literal) * (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); } /* @@ -612,13 +613,6 @@ _nc_resolve_uses2(bool fullresolve, bool literal) 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) {