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 (c) 1995, by Sun Microsystems, Inc.
24  * All rights reserved.
25  */
26 
27 /*
28  * getwin.c
29  *
30  * XCurses Library
31  *
32  * Copyright 1990, 1995 by Mortice Kern Systems Inc.  All rights reserved.
33  *
34  */
35 
36 #if M_RCSID
37 #ifndef lint
38 static char rcsID[] = "$Header: /rd/src/libc/xcurses/rcs/getwin.c 1.2 1995/06/12 17:48:38 ant Exp $";
39 #endif
40 #endif
41 
42 #include <private.h>
43 #include <limits.h>
44 
45 static int
get_cc(w,mbs,fp)46 get_cc(w, mbs, fp)
47 WINDOW *w;
48 char *mbs;
49 FILE *fp;
50 {
51 	short co;
52 	attr_t at;
53 	int i, n, y, x;
54 
55 	if (fscanf(fp, "%d,%d,%hx,%hd,", &y, &x, &at, &co) < 4)
56 		return 0;
57 
58 	if (fscanf(fp, "%[^\n]%n ", mbs, &n) < 1)
59 		return 0;
60 
61 	if (wattr_set(w, at, co, (void *) 0) == ERR)
62 		return 0;
63 
64 	if (mvwaddstr(w, y, x, mbs) == ERR)
65 		return 0;
66 
67 	(void) wstandend(w);
68 
69 	return n;
70 }
71 
72 WINDOW *
getwin(fp)73 getwin(fp)
74 FILE *fp;
75 {
76 	char *mbs;
77 	WINDOW *w;
78 	short flags;
79 	int by, bx, my, mx;
80 
81 #ifdef M_CURSES_TRACE
82 	__m_trace("getwin(%p)", fp);
83 #endif
84 
85 	/* Get window dimensions and location to create a new window. */
86 	if (fscanf(fp, "MAX=%d,%d BEG=%d,%d ", &my, &mx, &by, &bx) < 4)
87 		goto error1;
88 
89 	if ((mbs = (char *) malloc((size_t) (LINE_MAX+1))) == (char *) 0)
90 		goto error1;
91 
92 	if ((w = newwin(my, mx, by, bx)) == (WINDOW *) 0)
93 		goto error2;
94 
95 	/* Read other window attributes. */
96 	by = fscanf(
97 		fp, "SCROLL=%hd,%hd VMIN=%hd VTIME=%hd FLAGS=%hx FG=%hx,%hd ",
98 		&w->_top, &w->_bottom, &w->_vmin, &w->_vtime, &flags,
99 		&w->_fg._at, &w->_fg._co
100 	);
101 	if (by < 7)
102 		goto error3;
103 
104 	w->_flags &= ~W_CONFIG_MASK;
105 	w->_flags |= flags;
106 
107 	by = fscanf( fp, "BG=%hx,%hd,%[^\n] ", &w->_bg._at, &w->_bg._co, mbs);
108 	if (by < 3)
109 		goto error3;
110 
111 	while (get_cc(w, mbs, fp))
112 		;
113 
114 	if (fscanf(fp, "CUR=%hd,%hd", &w->_cury, &w->_curx) < 2)
115 		goto error3;
116 
117 	free(mbs);
118 
119 	return __m_return_pointer("getwin", w);
120 error3:
121 	(void) delwin(w);
122 error2:
123 	free(mbs);
124 error1:
125 	rewind(fp);
126 
127 	return __m_return_pointer("getwin", (WINDOW *) 0);
128 }
129 
130 static int
put_cc(w,y,x,mbs,len,fp)131 put_cc(w, y, x, mbs, len, fp)
132 WINDOW *w;
133 int y, x;
134 char *mbs;
135 int len;
136 FILE *fp;
137 {
138 	int i;
139 	short co;
140 	attr_t at;
141 
142 	at = w->_line[y][x]._at;
143 	co = w->_line[y][x]._co;
144 
145 	/* Write first character as a multibyte string. */
146 	(void) __m_cc_mbs(&w->_line[y][x], mbs, len);
147 
148 	/* Write additional characters with same colour and attributes. */
149 	for (i = x;;) {
150 		i = __m_cc_next(w, y, i);
151 		if (w->_maxx <= i)
152 			break;
153 		if (w->_line[y][i]._at != at || w->_line[y][i]._co != co)
154 			break;
155 		(void) __m_cc_mbs(&w->_line[y][i], mbs, 0);
156 	}
157 
158 	/* Terminate string. */
159 	(void) __m_cc_mbs((const cchar_t *) 0, (char *) 0, 0);
160 
161 	(void) fprintf(fp, "%d,%d,%#x,%d,%s\n", y, x, at, co, mbs);
162 
163 	/* Return index of next unprocessed column. */
164 	return i;
165 }
166 
167 int
putwin(w,fp)168 putwin(w, fp)
169 WINDOW *w;
170 FILE *fp;
171 {
172 	char *mbs;
173 	int y, x, mbs_len;
174 
175 #ifdef M_CURSES_TRACE
176 	__m_trace("putwin(%p, %p)", w, fp);
177 #endif
178 
179 	mbs_len = columns * M_CCHAR_MAX * MB_LEN_MAX * sizeof *mbs + 1;
180 	if ((mbs = (char *) malloc((size_t) mbs_len)) == (char *) 0)
181 		return __m_return_code("putwin", ERR);
182 
183 	(void) fprintf(
184 		fp, "MAX=%d,%d\nBEG=%d,%d\nSCROLL=%d,%d\n",
185 		w->_maxy, w->_maxx, w->_begy, w->_begx, w->_top, w->_bottom
186 	);
187 	(void) fprintf(
188 		fp, "VMIN=%d\nVTIME=%d\nFLAGS=%#x\nFG=%#x,%d\n",
189 		w->_vmin, w->_vtime, w->_flags & W_CONFIG_MASK,
190 		w->_fg._at, w->_fg._co
191 	);
192 
193 	(void) __m_cc_mbs(&w->_bg, mbs, mbs_len);
194 	(void) __m_cc_mbs((const cchar_t *) 0, (char *) 0, 0);
195 	(void) fprintf(fp, "BG=%#x,%d,%s\n", w->_bg._at, w->_bg._co, mbs);
196 
197 	for (y = 0; y < w->_maxy; ++y) {
198 		for (x = 0; x < w->_maxx; )
199 			x = put_cc(w, y, x, mbs, mbs_len, fp);
200 	}
201 
202 	(void) fprintf(fp, "CUR=%d,%d\n", w->_curx, w->_cury);
203 
204 	free(mbs);
205 
206 	return __m_return_code("putwin", OK);
207 }
208 
209