1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License, Version 1.0 only
6 * (the "License").  You may not use this file except in compliance
7 * with the License.
8 *
9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 * or http://www.opensolaris.org/os/licensing.
11 * See the License for the specific language governing permissions
12 * and limitations under the License.
13 *
14 * When distributing Covered Code, include this CDDL HEADER in each
15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 * If applicable, add the following below this CDDL HEADER, with the
17 * fields enclosed by brackets "[]" replaced with your own identifying
18 * information: Portions Copyright [yyyy] [name of copyright owner]
19 *
20 * CDDL HEADER END
21 */
22/*
23 * Copyright 1997 Sun Microsystems, Inc.  All rights reserved.
24 * Use is subject to license terms.
25 */
26
27/*	Copyright (c) 1988 AT&T	*/
28/*	  All Rights Reserved	*/
29
30/*
31 * University Copyright- Copyright (c) 1982, 1986, 1988
32 * The Regents of the University of California
33 * All Rights Reserved
34 *
35 * University Acknowledgment- Portions of this document are derived from
36 * software developed by the University of California, Berkeley, and its
37 * contributors.
38 */
39
40#pragma ident	"%Z%%M%	%I%	%E% SMI"
41
42/*LINTLIBRARY*/
43
44#include	<stdlib.h>
45#include	<string.h>
46#include	<sys/types.h>
47#include	"curses_inc.h"
48
49/* This routine sets up a window buffer and returns a pointer to it. */
50
51WINDOW	*
52_makenew(int nlines, int ncols, int begy, int begx)
53{
54	/* order the register allocations against highest usage */
55	WINDOW	*win;
56
57#ifdef	DEBUG
58	if (outf)
59		fprintf(outf, "MAKENEW(%d, %d, %d, %d)\n",
60		    nlines, ncols, begy, begx);
61#endif	/* DEBUG */
62
63	if ((win = (WINDOW *) malloc(sizeof (WINDOW))) == NULL)
64		goto out_no_win;
65	if ((win->_y = (chtype **) malloc(nlines * sizeof (chtype *))) == NULL)
66		goto out_win;
67#ifdef	_VR3_COMPAT_CODE
68	if ((_y16update) && ((win->_y16 = (_ochtype **)
69	    calloc(1, nlines * sizeof (_ochtype *))) == NULL)) {
70		goto out_y16;
71	}
72#endif	/* _VR3_COMPAT_CODE */
73	if ((win->_firstch = (short *) malloc(2 * nlines * sizeof (short)))
74	    == NULL) {
75#ifdef	_VR3_COMPAT_CODE
76		if ((_y16update) && (win->_y16 != NULL))
77			free((char *) win->_y16);
78out_y16:
79#endif	/* _VR3_COMPAT_CODE */
80		free((char *) win->_y);
81out_win:
82		free((char *) win);
83out_no_win:
84		curs_errno = CURS_BAD_MALLOC;
85#ifdef	DEBUG
86		strcpy(curs_parm_err, "_makenew");
87#endif	/* DEBUG */
88		return ((WINDOW *) NULL);
89	} else
90		win->_lastch = win->_firstch + nlines;
91
92	win->_cury = win->_curx = 0;
93	/*LINTED*/
94	win->_maxy = (short) nlines;
95	/*LINTED*/
96	win->_maxx = (short) ncols;
97	/*LINTED*/
98	win->_begy = (short) begy;
99	/*LINTED*/
100	win->_begx = (short) begx;
101	win->_clear = (((begy + SP->Yabove + begx) == 0) &&
102	    (nlines >= (LINES + SP->Yabove)) && (ncols >= COLS));
103	win->_leave = win->_scroll = win->_use_idl = win->_use_keypad =
104	    win->_notimeout = win->_immed = win->_sync = FALSE;
105	win->_use_idc = TRUE;
106	win->_ndescs = win->_tmarg = 0;
107	win->_bmarg = nlines - 1;
108	win->_bkgd = _BLNKCHAR;
109	win->_delay = win->_parx = win->_pary = -1;
110	win->_attrs = A_NORMAL;
111	win->_flags = _WINCHANGED;
112	win->_parent = win->_padwin = (WINDOW *) NULL;
113	(void) memset((char *) win->_firstch, 0, (nlines * sizeof (short)));
114	{
115		short	*lastch = win->_lastch,
116			*elastch = lastch + nlines;
117
118		ncols--;
119		while (lastch < elastch)
120		    /*LINTED*/
121		    *lastch++ = (short) ncols;
122	}
123
124	win->_insmode = FALSE;
125	win->_index = 0;
126	win->_nbyte = -1;
127
128#ifdef	DEBUG
129	if (outf) {
130		fprintf(outf, "MAKENEW: win->_clear = %d\n", win->_clear);
131		fprintf(outf, "MAKENEW: win->_flags = %0.2o\n", win->_flags);
132		fprintf(outf, "MAKENEW: win->_maxy = %d\n", win->_maxy);
133		fprintf(outf, "MAKENEW: win->_maxx = %d\n", win->_maxx);
134		fprintf(outf, "MAKENEW: win->_begy = %d\n", win->_begy);
135		fprintf(outf, "MAKENEW: win->_begx = %d\n", win->_begx);
136	}
137#endif	/* DEBUG */
138	return (win);
139}
140