X-Git-Url: https://ncurses.scripts.mit.edu/?a=blobdiff_plain;f=ncurses%2Ftinfo%2Fcomp_parse.c;h=4244df4efed8f84a2c7d4c79a0b8245069387a80;hb=d1a029866f6d84087781eaa81de19949d8533426;hp=8acdbdd4eafc64e89e57b1b5d67994634be521d4;hpb=d761c922d94448b16b71061ee5efeb346b744f13;p=ncurses.git diff --git a/ncurses/tinfo/comp_parse.c b/ncurses/tinfo/comp_parse.c index 8acdbdd4..4244df4e 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-2022,2023 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.123 2022/09/03 20:02:45 tom Exp $") +MODULE_ID("$Id: comp_parse.c,v 1.133 2023/05/27 20:13:10 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 */ @@ -252,6 +254,7 @@ _nc_read_entry_source(FILE *fp, char *buf, 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); @@ -261,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)); @@ -411,7 +415,7 @@ _nc_resolve_uses2(bool fullresolve, bool literal) 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, @@ -570,10 +574,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); } /* @@ -611,13 +615,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) {