150276Speter/****************************************************************************
2184989Srafan * Copyright (c) 1998-2007,2008 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
3150276Speter *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
32184989Srafan *     and: Thomas E. Dickey                        1996 on                 *
3350276Speter ****************************************************************************/
3450276Speter
3550276Speter#include <curses.priv.h>
3650276Speter
37184989SrafanMODULE_ID("$Id: lib_screen.c,v 1.31 2008/08/16 19:05:37 tom Exp $")
3850276Speter
39184989Srafan#define MAX_SIZE 0x3fff		/* 16k is big enough for a window or pad */
40184989Srafan
4176726SpeterNCURSES_EXPORT(WINDOW *)
42166124Srafangetwin(FILE *filep)
4350276Speter{
4476726Speter    WINDOW tmp, *nwin;
4576726Speter    int n;
4650276Speter
4776726Speter    T((T_CALLED("getwin(%p)"), filep));
4850276Speter
49166124Srafan    clearerr(filep);
5076726Speter    (void) fread(&tmp, sizeof(WINDOW), 1, filep);
51184989Srafan    if (ferror(filep)
52184989Srafan	|| tmp._maxy == 0
53184989Srafan	|| tmp._maxy > MAX_SIZE
54184989Srafan	|| tmp._maxx == 0
55184989Srafan	|| tmp._maxx > MAX_SIZE)
5676726Speter	returnWin(0);
5750276Speter
58166124Srafan    if (tmp._flags & _ISPAD) {
59166124Srafan	nwin = newpad(tmp._maxy + 1, tmp._maxx + 1);
60166124Srafan    } else {
61166124Srafan	nwin = newwin(tmp._maxy + 1, tmp._maxx + 1, 0, 0);
62166124Srafan    }
6350276Speter
6476726Speter    /*
6576726Speter     * We deliberately do not restore the _parx, _pary, or _parent
6676726Speter     * fields, because the window hierarchy within which they
6776726Speter     * made sense is probably gone.
6876726Speter     */
69166124Srafan    if (nwin != 0) {
70166124Srafan	nwin->_curx = tmp._curx;
71166124Srafan	nwin->_cury = tmp._cury;
72166124Srafan	nwin->_maxy = tmp._maxy;
73166124Srafan	nwin->_maxx = tmp._maxx;
74166124Srafan	nwin->_begy = tmp._begy;
75166124Srafan	nwin->_begx = tmp._begx;
76166124Srafan	nwin->_yoffset = tmp._yoffset;
77166124Srafan	nwin->_flags = tmp._flags & ~(_SUBWIN);
7850276Speter
79166124Srafan	WINDOW_ATTRS(nwin) = WINDOW_ATTRS(&tmp);
80166124Srafan	nwin->_nc_bkgd = tmp._nc_bkgd;
8150276Speter
82166124Srafan	nwin->_notimeout = tmp._notimeout;
83166124Srafan	nwin->_clear = tmp._clear;
84166124Srafan	nwin->_leaveok = tmp._leaveok;
85166124Srafan	nwin->_idlok = tmp._idlok;
86166124Srafan	nwin->_idcok = tmp._idcok;
87166124Srafan	nwin->_immed = tmp._immed;
88166124Srafan	nwin->_scroll = tmp._scroll;
89166124Srafan	nwin->_sync = tmp._sync;
90166124Srafan	nwin->_use_keypad = tmp._use_keypad;
91166124Srafan	nwin->_delay = tmp._delay;
9250276Speter
93166124Srafan	nwin->_regtop = tmp._regtop;
94166124Srafan	nwin->_regbottom = tmp._regbottom;
9550276Speter
96166124Srafan	if (tmp._flags & _ISPAD)
97166124Srafan	    nwin->_pad = tmp._pad;
98166124Srafan
99166124Srafan	for (n = 0; n <= nwin->_maxy; n++) {
100166124Srafan	    clearerr(filep);
101166124Srafan	    (void) fread(nwin->_line[n].text,
102166124Srafan			 sizeof(NCURSES_CH_T),
103166124Srafan			 (size_t) (nwin->_maxx + 1),
104166124Srafan			 filep);
105166124Srafan	    if (ferror(filep)) {
106166124Srafan		delwin(nwin);
107166124Srafan		returnWin(0);
108166124Srafan	    }
10950276Speter	}
110166124Srafan	touchwin(nwin);
11176726Speter    }
11276726Speter    returnWin(nwin);
11350276Speter}
11450276Speter
11576726SpeterNCURSES_EXPORT(int)
116166124Srafanputwin(WINDOW *win, FILE *filep)
11750276Speter{
11876726Speter    int code = ERR;
11976726Speter    int n;
12050276Speter
12176726Speter    T((T_CALLED("putwin(%p,%p)"), win, filep));
12250276Speter
123166124Srafan    if (win != 0) {
124184989Srafan	size_t len = (size_t) (win->_maxx + 1);
12550276Speter
126166124Srafan	clearerr(filep);
127166124Srafan	if (fwrite(win, sizeof(WINDOW), 1, filep) != 1
128166124Srafan	    || ferror(filep))
129166124Srafan	      returnCode(code);
130166124Srafan
131166124Srafan	for (n = 0; n <= win->_maxy; n++) {
132166124Srafan	    if (fwrite(win->_line[n].text,
133166124Srafan		       sizeof(NCURSES_CH_T), len, filep) != len
134166124Srafan		|| ferror(filep)) {
13550276Speter		returnCode(code);
136166124Srafan	    }
13750276Speter	}
13876726Speter	code = OK;
13976726Speter    }
14076726Speter    returnCode(code);
14150276Speter}
14250276Speter
14376726SpeterNCURSES_EXPORT(int)
14476726Speterscr_restore(const char *file)
14550276Speter{
14676726Speter    FILE *fp = 0;
14750276Speter
14876726Speter    T((T_CALLED("scr_restore(%s)"), _nc_visbuf(file)));
14950276Speter
15076726Speter    if (_nc_access(file, R_OK) < 0
151166124Srafan	|| (fp = fopen(file, "rb")) == 0) {
15276726Speter	returnCode(ERR);
153166124Srafan    } else {
15476726Speter	delwin(newscr);
155174993Srafan	SP->_newscr = getwin(fp);
156174993Srafan#if !USE_REENTRANT
157174993Srafan	newscr = SP->_newscr;
158174993Srafan#endif
15976726Speter	(void) fclose(fp);
16076726Speter	returnCode(OK);
16176726Speter    }
16250276Speter}
16350276Speter
16476726SpeterNCURSES_EXPORT(int)
16576726Speterscr_dump(const char *file)
16650276Speter{
16776726Speter    FILE *fp = 0;
16850276Speter
16976726Speter    T((T_CALLED("scr_dump(%s)"), _nc_visbuf(file)));
17050276Speter
17176726Speter    if (_nc_access(file, W_OK) < 0
172166124Srafan	|| (fp = fopen(file, "wb")) == 0) {
17376726Speter	returnCode(ERR);
174166124Srafan    } else {
17576726Speter	(void) putwin(newscr, fp);
17676726Speter	(void) fclose(fp);
17776726Speter	returnCode(OK);
17876726Speter    }
17950276Speter}
18050276Speter
18176726SpeterNCURSES_EXPORT(int)
18276726Speterscr_init(const char *file)
18350276Speter{
18476726Speter    FILE *fp = 0;
18550276Speter
18676726Speter    T((T_CALLED("scr_init(%s)"), _nc_visbuf(file)));
18750276Speter
18876726Speter    if (exit_ca_mode && non_rev_rmcup)
18976726Speter	returnCode(ERR);
19050276Speter
19176726Speter    if (_nc_access(file, R_OK) < 0
192166124Srafan	|| (fp = fopen(file, "rb")) == 0) {
19376726Speter	returnCode(ERR);
194166124Srafan    } else {
19576726Speter	delwin(curscr);
196174993Srafan	SP->_curscr = getwin(fp);
197174993Srafan#if !USE_REENTRANT
198174993Srafan	curscr = SP->_curscr;
199174993Srafan#endif
20076726Speter	(void) fclose(fp);
20176726Speter	returnCode(OK);
20276726Speter    }
20350276Speter}
20450276Speter
20576726SpeterNCURSES_EXPORT(int)
20676726Speterscr_set(const char *file)
20750276Speter{
20850276Speter    T((T_CALLED("scr_set(%s)"), _nc_visbuf(file)));
20950276Speter
210166124Srafan    if (scr_init(file) == ERR) {
21150276Speter	returnCode(ERR);
212166124Srafan    } else {
21350276Speter	delwin(newscr);
214174993Srafan	SP->_newscr = dupwin(curscr);
215174993Srafan#if !USE_REENTRANT
216174993Srafan	newscr = SP->_newscr;
217174993Srafan#endif
21850276Speter	returnCode(OK);
21950276Speter    }
22050276Speter}
221