root/usr/src/ucblib/libcurses/delwin.c
/*
 * Copyright 2001 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

/*      Copyright (c) 1983, 1984, 1985, 1986, 1987, 1988, 1989 AT&T     */
/*        All Rights Reserved   */

/*
 * Copyright (c) 1980 Regents of the University of California.
 * All rights reserved.  The Berkeley software License Agreement
 * specifies the terms and conditions for redistribution.
 */

/*LINTLIBRARY*/

#ifndef lint
static char
sccsid[] = "@(#)delwin.c 1.6 88/02/08 SMI"; /* from UCB 5.1 85/06/07 */
#endif /* not lint */

#include        "curses.ext"
#include        <malloc.h>

/*
 *      This routine deletes a window and releases it back to the system.
 */

int
delwin(WINDOW *win)
{
        int     i;
        WINDOW  *wp, *np;

        if (win->_orig == NULL) {
                /*
                 * If we are the original window, delete the space for
                 * all the subwindows, and the array of space as well.
                 */
                for (i = 0; i < win->_maxy && win->_y[i]; i++)
                        free(win->_y[i]);
                free(win->_firstch);
                free(win->_lastch);
                wp = win->_nextp;
                while (wp != win) {
                        np = wp->_nextp;
                        (void) delwin(wp);
                        wp = np;
                }
        } else {
                /*
                 * If we are a subwindow, take ourselves out of the
                 * list.  NOTE: if we are a subwindow, the minimum list
                 * is orig followed by this subwindow, so there are
                 * always at least two windows in the list.
                 */
                for (wp = win->_nextp; wp->_nextp != win; wp = wp->_nextp)
                        continue;
                wp->_nextp = win->_nextp;
        }
        free(win->_y);
        free(win);

        return (OK);
}