150276Speter/****************************************************************************
2262685Sdelphij * Copyright (c) 1998-2011,2012 Free Software Foundation, Inc.              *
350276Speter *                                                                          *
450276Speter * Permission is hereby granted, free of charge, to any person obtaining a  *
550276Speter * copy of this software and associated documentation files (the            *
650276Speter * "Software"), to deal in the Software without restriction, including      *
750276Speter * without limitation the rights to use, copy, modify, merge, publish,      *
850276Speter * distribute, distribute with modifications, sublicense, and/or sell       *
950276Speter * copies of the Software, and to permit persons to whom the Software is    *
1050276Speter * furnished to do so, subject to the following conditions:                 *
1150276Speter *                                                                          *
1250276Speter * The above copyright notice and this permission notice shall be included  *
1350276Speter * in all copies or substantial portions of the Software.                   *
1450276Speter *                                                                          *
1550276Speter * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  *
1650276Speter * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               *
1750276Speter * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   *
1850276Speter * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   *
1950276Speter * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    *
2050276Speter * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    *
2150276Speter * THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               *
2250276Speter *                                                                          *
2350276Speter * Except as contained in this notice, the name(s) of the above copyright   *
2450276Speter * holders shall not be used in advertising or otherwise to promote the     *
2550276Speter * sale, use or other dealings in this Software without prior written       *
2650276Speter * authorization.                                                           *
2750276Speter ****************************************************************************/
2850276Speter
2950276Speter/****************************************************************************
30174993Srafan *  Author: Thomas E. Dickey                    1996-on                     *
3150276Speter ****************************************************************************/
3250276Speter
3350276Speter#include <curses.priv.h>
34166124Srafan#include <tic.h>
3550276Speter
3650276Speter#if HAVE_NC_FREEALL
3750276Speter
3850276Speter#if HAVE_LIBDBMALLOC
3950276Speterextern int malloc_errfd;	/* FIXME */
4050276Speter#endif
4150276Speter
42262685SdelphijMODULE_ID("$Id: lib_freeall.c,v 1.62 2012/11/17 23:53:03 tom Exp $")
4350276Speter
4450276Speter/*
4550276Speter * Free all ncurses data.  This is used for testing only (there's no practical
4650276Speter * use for it as an extension).
4750276Speter */
4876726SpeterNCURSES_EXPORT(void)
49262629SdelphijNCURSES_SP_NAME(_nc_freeall) (NCURSES_SP_DCL0)
5050276Speter{
5162449Speter    WINDOWLIST *p, *q;
52166124Srafan    static va_list empty_va;
5350276Speter
54166124Srafan    T((T_CALLED("_nc_freeall()")));
5550276Speter#if NO_LEAKS
56262629Sdelphij    if (SP_PARM != 0) {
57262629Sdelphij	if (SP_PARM->_oldnum_list != 0) {
58262629Sdelphij	    FreeAndNull(SP_PARM->_oldnum_list);
59174993Srafan	}
60262629Sdelphij	if (SP_PARM->_panelHook.destroy != 0) {
61262629Sdelphij	    SP_PARM->_panelHook.destroy(SP_PARM->_panelHook.stdscr_pseudo_panel);
62184989Srafan	}
63166124Srafan    }
6450276Speter#endif
65262629Sdelphij    if (SP_PARM != 0) {
66184989Srafan	_nc_lock_global(curses);
67174993Srafan
68262629Sdelphij	while (WindowList(SP_PARM) != 0) {
69174993Srafan	    bool deleted = FALSE;
70174993Srafan
7162449Speter	    /* Delete only windows that're not a parent */
72262629Sdelphij	    for (each_window(SP_PARM, p)) {
73262685Sdelphij		WINDOW *p_win = &(p->win);
7462449Speter		bool found = FALSE;
7550276Speter
76262629Sdelphij		for (each_window(SP_PARM, q)) {
77262685Sdelphij		    WINDOW *q_win = &(q->win);
7862449Speter		    if ((p != q)
79262685Sdelphij			&& (q_win->_flags & _SUBWIN)
80262685Sdelphij			&& (p_win == q_win->_parent)) {
8162449Speter			found = TRUE;
8262449Speter			break;
8362449Speter		    }
8462449Speter		}
8550276Speter
8662449Speter		if (!found) {
87262685Sdelphij		    if (delwin(p_win) != ERR)
88174993Srafan			deleted = TRUE;
8962449Speter		    break;
9050276Speter		}
9162449Speter	    }
92174993Srafan
93174993Srafan	    /*
94174993Srafan	     * Don't continue to loop if the list is trashed.
95174993Srafan	     */
96174993Srafan	    if (!deleted)
97174993Srafan		break;
9850276Speter	}
99262629Sdelphij	delscreen(SP_PARM);
100184989Srafan	_nc_unlock_global(curses);
101166124Srafan    }
102174993Srafan
103166124Srafan    (void) _nc_printf_string(0, empty_va);
10450276Speter#ifdef TRACE
105262685Sdelphij    (void) _nc_trace_buf(-1, (size_t) 0);
10650276Speter#endif
107184989Srafan#if USE_WIDEC_SUPPORT
108184989Srafan    FreeIfNeeded(_nc_wacs);
109174993Srafan#endif
110174993Srafan    _nc_leaks_tinfo();
111174993Srafan
11250276Speter#if HAVE_LIBDBMALLOC
11362449Speter    malloc_dump(malloc_errfd);
11450276Speter#elif HAVE_LIBDMALLOC
115166124Srafan#elif HAVE_LIBMPATROL
116166124Srafan    __mp_summary();
11750276Speter#elif HAVE_PURIFY
11862449Speter    purify_all_inuse();
11950276Speter#endif
120166124Srafan    returnVoid;
12150276Speter}
12250276Speter
123262629Sdelphij#if NCURSES_SP_FUNCS
12476726SpeterNCURSES_EXPORT(void)
125262629Sdelphij_nc_freeall(void)
12650276Speter{
127262629Sdelphij    NCURSES_SP_NAME(_nc_freeall) (CURRENT_SCREEN);
128262629Sdelphij}
129262629Sdelphij#endif
130166124Srafan
131262629SdelphijNCURSES_EXPORT(void)
132262629SdelphijNCURSES_SP_NAME(_nc_free_and_exit) (NCURSES_SP_DCLx int code)
133262629Sdelphij{
134262685Sdelphij    char *last_buffer = (SP_PARM != 0) ? SP_PARM->out_buffer : 0;
135262629Sdelphij
136262685Sdelphij    NCURSES_SP_NAME(_nc_flush) (NCURSES_SP_ARG);
137262629Sdelphij    NCURSES_SP_NAME(_nc_freeall) (NCURSES_SP_ARG);
138166124Srafan#ifdef TRACE
139166124Srafan    trace(0);			/* close trace file, freeing its setbuf */
140184989Srafan    {
141184989Srafan	static va_list fake;
142184989Srafan	free(_nc_varargs("?", fake));
143184989Srafan    }
144166124Srafan#endif
145262685Sdelphij    FreeIfNeeded(last_buffer);
14662449Speter    exit(code);
14750276Speter}
14862449Speter
14950276Speter#else
15076726SpeterNCURSES_EXPORT(void)
15162449Speter_nc_freeall(void)
15262449Speter{
15362449Speter}
154184989Srafan
155184989SrafanNCURSES_EXPORT(void)
156262629SdelphijNCURSES_SP_NAME(_nc_free_and_exit) (NCURSES_SP_DCLx int code)
157184989Srafan{
158262629Sdelphij    if (SP_PARM) {
159262629Sdelphij	delscreen(SP_PARM);
160262629Sdelphij	if (SP_PARM->_term)
161262629Sdelphij	    NCURSES_SP_NAME(del_curterm) (NCURSES_SP_ARGx SP_PARM->_term);
162262629Sdelphij    }
163184989Srafan    exit(code);
164184989Srafan}
16550276Speter#endif
166262629Sdelphij
167262629Sdelphij#if NCURSES_SP_FUNCS
168262629SdelphijNCURSES_EXPORT(void)
169262629Sdelphij_nc_free_and_exit(int code)
170262629Sdelphij{
171262629Sdelphij    NCURSES_SP_NAME(_nc_free_and_exit) (CURRENT_SCREEN, code);
172262629Sdelphij}
173262629Sdelphij#endif
174