lib_freeall.c revision 166124
1/****************************************************************************
2 * Copyright (c) 1998-2005,2006 Free Software Foundation, Inc.              *
3 *                                                                          *
4 * Permission is hereby granted, free of charge, to any person obtaining a  *
5 * copy of this software and associated documentation files (the            *
6 * "Software"), to deal in the Software without restriction, including      *
7 * without limitation the rights to use, copy, modify, merge, publish,      *
8 * distribute, distribute with modifications, sublicense, and/or sell       *
9 * copies of the Software, and to permit persons to whom the Software is    *
10 * furnished to do so, subject to the following conditions:                 *
11 *                                                                          *
12 * The above copyright notice and this permission notice shall be included  *
13 * in all copies or substantial portions of the Software.                   *
14 *                                                                          *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  *
16 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               *
17 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   *
18 * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   *
19 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    *
20 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    *
21 * THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               *
22 *                                                                          *
23 * Except as contained in this notice, the name(s) of the above copyright   *
24 * holders shall not be used in advertising or otherwise to promote the     *
25 * sale, use or other dealings in this Software without prior written       *
26 * authorization.                                                           *
27 ****************************************************************************/
28
29/****************************************************************************
30 *  Author: Thomas E. Dickey                    1996,1997                   *
31 ****************************************************************************/
32
33#include <curses.priv.h>
34#include <term_entry.h>
35#include <tic.h>
36
37#if HAVE_NC_FREEALL
38
39#if HAVE_LIBDBMALLOC
40extern int malloc_errfd;	/* FIXME */
41#endif
42
43MODULE_ID("$Id: lib_freeall.c,v 1.38 2006/12/02 22:36:43 tom Exp $")
44
45/*
46 * Free all ncurses data.  This is used for testing only (there's no practical
47 * use for it as an extension).
48 */
49NCURSES_EXPORT(void)
50_nc_freeall(void)
51{
52    WINDOWLIST *p, *q;
53    char *s;
54    static va_list empty_va;
55
56    T((T_CALLED("_nc_freeall()")));
57#if NO_LEAKS
58    _nc_free_tparm();
59    if (_nc_oldnums != 0) {
60	FreeAndNull(_nc_oldnums);
61    }
62#endif
63    if (SP != 0) {
64	while (_nc_windows != 0) {
65	    /* Delete only windows that're not a parent */
66	    for (p = _nc_windows; p != 0; p = p->next) {
67		bool found = FALSE;
68
69		for (q = _nc_windows; q != 0; q = q->next) {
70		    if ((p != q)
71			&& (q->win._flags & _SUBWIN)
72			&& (&(p->win) == q->win._parent)) {
73			found = TRUE;
74			break;
75		    }
76		}
77
78		if (!found) {
79		    delwin(&(p->win));
80		    break;
81		}
82	    }
83	}
84	delscreen(SP);
85    }
86#if NO_LEAKS
87    _nc_tgetent_leaks();
88#endif
89    del_curterm(cur_term);
90    _nc_free_entries(_nc_head);
91    _nc_get_type(0);
92    _nc_first_name(0);
93#if USE_WIDEC_SUPPORT
94    FreeIfNeeded(_nc_wacs);
95#endif
96#if NO_LEAKS
97    _nc_alloc_entry_leaks();
98    _nc_captoinfo_leaks();
99    _nc_comp_scan_leaks();
100    _nc_keyname_leaks();
101    _nc_tic_expand(0, FALSE, 0);
102#endif
103
104    if ((s = _nc_home_terminfo()) != 0)
105	free(s);
106
107    (void) _nc_printf_string(0, empty_va);
108#ifdef TRACE
109    (void) _nc_trace_buf(-1, 0);
110#endif
111
112#if HAVE_LIBDBMALLOC
113    malloc_dump(malloc_errfd);
114#elif HAVE_LIBDMALLOC
115#elif HAVE_LIBMPATROL
116    __mp_summary();
117#elif HAVE_PURIFY
118    purify_all_inuse();
119#endif
120    returnVoid;
121}
122
123NCURSES_EXPORT(void)
124_nc_free_and_exit(int code)
125{
126    char *last_setbuf = (SP != 0) ? SP->_setbuf : 0;
127
128    _nc_freeall();
129#ifdef TRACE
130    trace(0);			/* close trace file, freeing its setbuf */
131    free(_nc_varargs("?", 0));
132#endif
133    fclose(stdout);
134    FreeIfNeeded(last_setbuf);
135    exit(code);
136}
137
138#else
139NCURSES_EXPORT(void)
140_nc_freeall(void)
141{
142}
143#endif
144