lib_freeall.c revision 76726
150276Speter/****************************************************************************
276726Speter * Copyright (c) 1998,1999,2000 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/****************************************************************************
3050276Speter *  Author: Thomas E. Dickey <dickey@clark.net> 1996,1997                   *
3150276Speter ****************************************************************************/
3250276Speter
3350276Speter#include <curses.priv.h>
3450276Speter#include <term_entry.h>
3550276Speter
3650276Speter#if HAVE_NC_FREEALL
3750276Speter
3850276Speter#if HAVE_LIBDBMALLOC
3950276Speterextern int malloc_errfd;	/* FIXME */
4050276Speter#endif
4150276Speter
4276726SpeterMODULE_ID("$Id: lib_freeall.c,v 1.18 2000/12/10 02:43:27 tom Exp $")
4350276Speter
4462449Speterstatic void
4576726Speterfree_slk(SLK * p)
4650276Speter{
4762449Speter    if (p != 0) {
4862449Speter	FreeIfNeeded(p->ent);
4962449Speter	FreeIfNeeded(p->buffer);
5062449Speter	free(p);
5162449Speter    }
5250276Speter}
5350276Speter
5462449Speterstatic void
5562449Speterfree_tries(struct tries *p)
5650276Speter{
5762449Speter    struct tries *q;
5850276Speter
5962449Speter    while (p != 0) {
6062449Speter	q = p->sibling;
6162449Speter	if (p->child != 0)
6262449Speter	    free_tries(p->child);
6362449Speter	free(p);
6462449Speter	p = q;
6562449Speter    }
6650276Speter}
6750276Speter
6850276Speter/*
6950276Speter * Free all ncurses data.  This is used for testing only (there's no practical
7050276Speter * use for it as an extension).
7150276Speter */
7276726SpeterNCURSES_EXPORT(void)
7362449Speter_nc_freeall(void)
7450276Speter{
7562449Speter    WINDOWLIST *p, *q;
7650276Speter
7750276Speter#if NO_LEAKS
7862449Speter    _nc_free_tparm();
7950276Speter#endif
8062449Speter    if (SP != 0) {
8150276Speter	while (_nc_windows != 0) {
8262449Speter	    /* Delete only windows that're not a parent */
8362449Speter	    for (p = _nc_windows; p != 0; p = p->next) {
8462449Speter		bool found = FALSE;
8550276Speter
8662449Speter		for (q = _nc_windows; q != 0; q = q->next) {
8762449Speter		    if ((p != q)
8862449Speter			&& (q->win->_flags & _SUBWIN)
8962449Speter			&& (p->win == q->win->_parent)) {
9062449Speter			found = TRUE;
9162449Speter			break;
9262449Speter		    }
9362449Speter		}
9450276Speter
9562449Speter		if (!found) {
9662449Speter		    delwin(p->win);
9762449Speter		    break;
9850276Speter		}
9962449Speter	    }
10050276Speter	}
10150276Speter
10262449Speter	free_tries(SP->_keytry);
10362449Speter	free_tries(SP->_key_ok);
10462449Speter	free_slk(SP->_slk);
10562449Speter	FreeIfNeeded(SP->_color_pairs);
10662449Speter	FreeIfNeeded(SP->_color_table);
10750276Speter#if !BROKEN_LINKER
10862449Speter	FreeAndNull(SP);
10950276Speter#endif
11062449Speter    }
11150276Speter
11262449Speter    if (cur_term != 0) {
11362449Speter	_nc_free_termtype(&(cur_term->type));
11462449Speter	free(cur_term);
11562449Speter    }
11650276Speter#ifdef TRACE
11762449Speter    (void) _nc_trace_buf(-1, 0);
11850276Speter#endif
11950276Speter#if HAVE_LIBDBMALLOC
12062449Speter    malloc_dump(malloc_errfd);
12150276Speter#elif HAVE_LIBDMALLOC
12250276Speter#elif HAVE_PURIFY
12362449Speter    purify_all_inuse();
12450276Speter#endif
12550276Speter}
12650276Speter
12776726SpeterNCURSES_EXPORT(void)
12862449Speter_nc_free_and_exit(int code)
12950276Speter{
13062449Speter    _nc_freeall();
13162449Speter    exit(code);
13250276Speter}
13362449Speter
13450276Speter#else
13576726SpeterNCURSES_EXPORT(void)
13662449Speter_nc_freeall(void)
13762449Speter{
13862449Speter}
13950276Speter#endif
140