diff options
Diffstat (limited to 'contrib/ncurses/ncurses/base/lib_freeall.c')
-rw-r--r-- | contrib/ncurses/ncurses/base/lib_freeall.c | 87 |
1 files changed, 44 insertions, 43 deletions
diff --git a/contrib/ncurses/ncurses/base/lib_freeall.c b/contrib/ncurses/ncurses/base/lib_freeall.c index 2063c6f..27897a9 100644 --- a/contrib/ncurses/ncurses/base/lib_freeall.c +++ b/contrib/ncurses/ncurses/base/lib_freeall.c @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright (c) 1998,1999,2000 Free Software Foundation, Inc. * + * Copyright (c) 1998-2005,2006 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 * @@ -27,11 +27,12 @@ ****************************************************************************/ /**************************************************************************** - * Author: Thomas E. Dickey <dickey@clark.net> 1996,1997 * + * Author: Thomas E. Dickey 1996,1997 * ****************************************************************************/ #include <curses.priv.h> #include <term_entry.h> +#include <tic.h> #if HAVE_NC_FREEALL @@ -39,31 +40,7 @@ extern int malloc_errfd; /* FIXME */ #endif -MODULE_ID("$Id: lib_freeall.c,v 1.19 2001/09/15 21:32:48 tom Exp $") - -static void -free_slk(SLK * p) -{ - if (p != 0) { - FreeIfNeeded(p->ent); - FreeIfNeeded(p->buffer); - free(p); - } -} - -static void -free_tries(struct tries *p) -{ - struct tries *q; - - while (p != 0) { - q = p->sibling; - if (p->child != 0) - free_tries(p->child); - free(p); - p = q; - } -} +MODULE_ID("$Id: lib_freeall.c,v 1.38 2006/12/02 22:36:43 tom Exp $") /* * Free all ncurses data. This is used for testing only (there's no practical @@ -73,9 +50,15 @@ NCURSES_EXPORT(void) _nc_freeall(void) { WINDOWLIST *p, *q; + char *s; + static va_list empty_va; + T((T_CALLED("_nc_freeall()"))); #if NO_LEAKS _nc_free_tparm(); + if (_nc_oldnums != 0) { + FreeAndNull(_nc_oldnums); + } #endif if (SP != 0) { while (_nc_windows != 0) { @@ -98,39 +81,57 @@ _nc_freeall(void) } } } - - free_tries(SP->_keytry); - free_tries(SP->_key_ok); - free_slk(SP->_slk); - FreeIfNeeded(SP->_color_pairs); - FreeIfNeeded(SP->_color_table); - FreeIfNeeded(SP->oldhash); - FreeIfNeeded(SP->newhash); - FreeIfNeeded(SP->hashtab); -#if !BROKEN_LINKER - FreeAndNull(SP); -#endif + delscreen(SP); } +#if NO_LEAKS + _nc_tgetent_leaks(); +#endif + del_curterm(cur_term); + _nc_free_entries(_nc_head); + _nc_get_type(0); + _nc_first_name(0); +#if USE_WIDEC_SUPPORT + FreeIfNeeded(_nc_wacs); +#endif +#if NO_LEAKS + _nc_alloc_entry_leaks(); + _nc_captoinfo_leaks(); + _nc_comp_scan_leaks(); + _nc_keyname_leaks(); + _nc_tic_expand(0, FALSE, 0); +#endif - if (cur_term != 0) { - _nc_free_termtype(&(cur_term->type)); - free(cur_term); - } + if ((s = _nc_home_terminfo()) != 0) + free(s); + + (void) _nc_printf_string(0, empty_va); #ifdef TRACE (void) _nc_trace_buf(-1, 0); #endif + #if HAVE_LIBDBMALLOC malloc_dump(malloc_errfd); #elif HAVE_LIBDMALLOC +#elif HAVE_LIBMPATROL + __mp_summary(); #elif HAVE_PURIFY purify_all_inuse(); #endif + returnVoid; } NCURSES_EXPORT(void) _nc_free_and_exit(int code) { + char *last_setbuf = (SP != 0) ? SP->_setbuf : 0; + _nc_freeall(); +#ifdef TRACE + trace(0); /* close trace file, freeing its setbuf */ + free(_nc_varargs("?", 0)); +#endif + fclose(stdout); + FreeIfNeeded(last_setbuf); exit(code); } |