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