ex1.c revision 1.4.18.1 1 1.4.18.1 blymn /* $NetBSD: ex1.c,v 1.4.18.1 2007/01/21 11:38:59 blymn Exp $ */
2 1.2 perry
3 1.1 cgd /*
4 1.1 cgd * Copyright (c) 1992, 1993
5 1.1 cgd * The Regents of the University of California. All rights reserved.
6 1.1 cgd *
7 1.1 cgd *
8 1.1 cgd * Redistribution and use in source and binary forms, with or without
9 1.1 cgd * modification, are permitted provided that the following conditions
10 1.1 cgd * are met:
11 1.1 cgd * 1. Redistributions of source code must retain the above copyright
12 1.1 cgd * notice, this list of conditions and the following disclaimer.
13 1.1 cgd * 2. Redistributions in binary form must reproduce the above copyright
14 1.1 cgd * notice, this list of conditions and the following disclaimer in the
15 1.1 cgd * documentation and/or other materials provided with the distribution.
16 1.4 agc * 3. Neither the name of the University nor the names of its contributors
17 1.1 cgd * may be used to endorse or promote products derived from this software
18 1.1 cgd * without specific prior written permission.
19 1.1 cgd *
20 1.1 cgd * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
21 1.1 cgd * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22 1.1 cgd * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23 1.1 cgd * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24 1.1 cgd * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25 1.1 cgd * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26 1.1 cgd * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27 1.1 cgd * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28 1.1 cgd * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29 1.1 cgd * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30 1.1 cgd * SUCH DAMAGE.
31 1.1 cgd */
32 1.1 cgd
33 1.1 cgd #ifndef lint
34 1.1 cgd static char copyright[] =
35 1.1 cgd "@(#) Copyright (c) 1992, 1993\n\
36 1.1 cgd The Regents of the University of California. All rights reserved.\n";
37 1.1 cgd #endif /* not lint */
38 1.1 cgd
39 1.1 cgd #ifndef lint
40 1.1 cgd static char sccsid[] = "@(#)ex1.c 8.1 (Berkeley) 6/4/93";
41 1.1 cgd #endif /* not lint */
42 1.1 cgd #include <sys/types.h>
43 1.1 cgd #include <curses.h>
44 1.1 cgd #include <stdio.h>
45 1.1 cgd #include <signal.h>
46 1.4.18.1 blymn #include <locale.h>
47 1.4.18.1 blymn #include <assert.h>
48 1.1 cgd
49 1.4.18.1 blymn #define YSIZE 4
50 1.4.18.1 blymn #define XSIZE 30
51 1.1 cgd
52 1.4.18.1 blymn void quit( int );
53 1.1 cgd
54 1.1 cgd main()
55 1.1 cgd {
56 1.4.18.1 blymn int i, j, c, n = 0, ac = 0;
57 1.1 cgd size_t len;
58 1.1 cgd char id[100];
59 1.1 cgd FILE *fp;
60 1.1 cgd char *s;
61 1.4.18.1 blymn cchar_t cc, ncc, cstr[ 128 ], icc, icstr[ 128 ], bcc;
62 1.4.18.1 blymn int wc_on = 0, wgc_on = 0;
63 1.4.18.1 blymn char mbs[] = "";
64 1.4.18.1 blymn char mbstr[] = " (Liji)";
65 1.4.18.1 blymn wchar_t wstr[ 128 ], owstr[ 4 ], gwstr[ 128 ], iwstr[ 128 ];
66 1.4.18.1 blymn int wslen = 0;
67 1.4.18.1 blymn wint_t wc;
68 1.4.18.1 blymn char nostr[ 128 ];
69 1.4.18.1 blymn attr_t al[ 15 ] = { WA_BLINK,
70 1.4.18.1 blymn WA_BOLD,
71 1.4.18.1 blymn WA_DIM,
72 1.4.18.1 blymn WA_LOW,
73 1.4.18.1 blymn WA_TOP,
74 1.4.18.1 blymn WA_INVIS,
75 1.4.18.1 blymn WA_HORIZONTAL,
76 1.4.18.1 blymn WA_VERTICAL,
77 1.4.18.1 blymn WA_LEFT,
78 1.4.18.1 blymn WA_RIGHT,
79 1.4.18.1 blymn WA_PROTECT,
80 1.4.18.1 blymn WA_REVERSE,
81 1.4.18.1 blymn WA_STANDOUT,
82 1.4.18.1 blymn WA_UNDERLINE };
83 1.4.18.1 blymn
84 1.4.18.1 blymn fprintf( stderr, "Current locale: %s\n", setlocale(LC_ALL, ""));
85 1.4.18.1 blymn if (( wslen = mbstowcs( &cc.vals[ 0 ], mbs, strlen( mbs ))) < 0 ) {
86 1.4.18.1 blymn fprintf( stderr, "mbstowcs() failed\n" );
87 1.4.18.1 blymn return -1;
88 1.4.18.1 blymn }
89 1.4.18.1 blymn fprintf( stderr, "WC string length: %d\n", wslen );
90 1.4.18.1 blymn fprintf( stderr, "WC width: %d\n", wcwidth( cc.vals[ 0 ]));
91 1.4.18.1 blymn cc.elements = ncc.elements = 8;
92 1.4.18.1 blymn cc.attributes = ncc.attributes = 0;
93 1.4.18.1 blymn ncc.vals[ 0 ] = 0xda00;
94 1.4.18.1 blymn cc.vals[ 1 ] = ncc.vals[ 1 ] = 0xda01;
95 1.4.18.1 blymn cc.vals[ 2 ] = ncc.vals[ 2 ] = 0xda02;
96 1.4.18.1 blymn cc.vals[ 3 ] = ncc.vals[ 3 ] = 0xda03;
97 1.4.18.1 blymn cc.vals[ 4 ] = ncc.vals[ 4 ] = 0xda04;
98 1.4.18.1 blymn cc.vals[ 5 ] = ncc.vals[ 5 ] = 0xda05;
99 1.4.18.1 blymn cc.vals[ 6 ] = ncc.vals[ 6 ] = 0xda06;
100 1.4.18.1 blymn cc.vals[ 7 ] = ncc.vals[ 7 ] = 0xda07;
101 1.4.18.1 blymn
102 1.4.18.1 blymn if (( wslen = mbstowcs( &wstr, mbstr, strlen( mbstr ))) < 0 ) {
103 1.4.18.1 blymn fprintf( stderr, "mbstowcs() failed\n" );
104 1.4.18.1 blymn return -1;
105 1.4.18.1 blymn }
106 1.4.18.1 blymn
107 1.4.18.1 blymn for ( i = 0; i < wslen; i++ ) {
108 1.4.18.1 blymn cstr[ i ].vals[ 0 ] = wstr[ i ];
109 1.4.18.1 blymn }
110 1.4.18.1 blymn cstr[ wslen ].vals[ 0 ] = 0;
111 1.4.18.1 blymn
112 1.4.18.1 blymn bcc.elements = 8;
113 1.4.18.1 blymn bcc.attributes = 0;
114 1.4.18.1 blymn bcc.vals[ 0 ] = L'_';
115 1.4.18.1 blymn bcc.vals[ 1 ] = 0xda01;
116 1.4.18.1 blymn bcc.vals[ 2 ] = 0xda02;
117 1.4.18.1 blymn bcc.vals[ 3 ] = 0xda03;
118 1.4.18.1 blymn bcc.vals[ 4 ] = 0xda04;
119 1.4.18.1 blymn bcc.vals[ 5 ] = 0xda05;
120 1.4.18.1 blymn bcc.vals[ 6 ] = 0xda06;
121 1.4.18.1 blymn bcc.vals[ 7 ] = 0xda07;
122 1.1 cgd
123 1.1 cgd initscr(); /* Always call initscr() first */
124 1.1 cgd signal(SIGINT, quit); /* Make sure wou have a 'cleanup' fn */
125 1.1 cgd crmode(); /* We want cbreak mode */
126 1.1 cgd noecho(); /* We want to have control of chars */
127 1.1 cgd delwin(stdscr); /* Create our own stdscr */
128 1.4.18.1 blymn stdscr = newwin(YSIZE, XSIZE, 1, 1);
129 1.1 cgd flushok(stdscr, TRUE); /* Enable flushing of stdout */
130 1.1 cgd scrollok(stdscr, TRUE); /* Enable scrolling */
131 1.1 cgd erase(); /* Initially, clear the screen */
132 1.1 cgd
133 1.1 cgd standout();
134 1.1 cgd move(0,0);
135 1.1 cgd while (1) {
136 1.4.18.1 blymn if ( !wgc_on ) {
137 1.4.18.1 blymn c = getchar();
138 1.4.18.1 blymn switch(c) {
139 1.4.18.1 blymn case 'q': /* Quit on 'q' */
140 1.4.18.1 blymn quit( 0 );
141 1.4.18.1 blymn break;
142 1.4.18.1 blymn case 'p':
143 1.4.18.1 blymn keypad( stdscr, TRUE );
144 1.4.18.1 blymn break;
145 1.4.18.1 blymn case 'P':
146 1.4.18.1 blymn keypad( stdscr, FALSE );
147 1.4.18.1 blymn break;
148 1.4.18.1 blymn case 'g':
149 1.4.18.1 blymn wgc_on = 1;
150 1.4.18.1 blymn echo();
151 1.4.18.1 blymn break;
152 1.4.18.1 blymn case 'b':
153 1.4.18.1 blymn get_wstr( gwstr );
154 1.4.18.1 blymn move( 1, 0 );
155 1.4.18.1 blymn addstr( "Input:" );
156 1.4.18.1 blymn addwstr( gwstr );
157 1.4.18.1 blymn refresh();
158 1.4.18.1 blymn break;
159 1.4.18.1 blymn case 'h':
160 1.4.18.1 blymn move( 0, 0 );
161 1.4.18.1 blymn in_wch( &icc );
162 1.4.18.1 blymn move( 1, 0 );
163 1.4.18.1 blymn add_wch( &icc );
164 1.4.18.1 blymn refresh();
165 1.4.18.1 blymn break;
166 1.4.18.1 blymn case 'y':
167 1.4.18.1 blymn move( 0, 0 );
168 1.4.18.1 blymn in_wchstr( icstr );
169 1.4.18.1 blymn move( 1, 0 );
170 1.4.18.1 blymn add_wchstr( icstr );
171 1.4.18.1 blymn refresh();
172 1.4.18.1 blymn break;
173 1.4.18.1 blymn case 'u':
174 1.4.18.1 blymn move( 0, 0 );
175 1.4.18.1 blymn inwstr( iwstr );
176 1.4.18.1 blymn move( 1, 0 );
177 1.4.18.1 blymn addwstr( iwstr );
178 1.4.18.1 blymn refresh();
179 1.4.18.1 blymn break;
180 1.4.18.1 blymn case 'i':
181 1.4.18.1 blymn move( 0, 0 );
182 1.4.18.1 blymn hline_set( &cc, 20 );
183 1.4.18.1 blymn move( 0, 0 );
184 1.4.18.1 blymn vline_set( &cc, 20 );
185 1.4.18.1 blymn refresh();
186 1.4.18.1 blymn break;
187 1.4.18.1 blymn case 'o':
188 1.4.18.1 blymn clrtobot();
189 1.4.18.1 blymn refresh();
190 1.4.18.1 blymn break;
191 1.4.18.1 blymn case 's': /* Go into standout mode on 's' */
192 1.4.18.1 blymn standout();
193 1.4.18.1 blymn break;
194 1.4.18.1 blymn case 'e': /* Exit standout mode on 'e' */
195 1.4.18.1 blymn standend();
196 1.4.18.1 blymn break;
197 1.4.18.1 blymn case 'r': /* Force a refresh on 'r' */
198 1.4.18.1 blymn wrefresh(curscr);
199 1.4.18.1 blymn break;
200 1.4.18.1 blymn case 'w': /* Turn on/off add_wch() tests */
201 1.4.18.1 blymn wc_on = 1 - wc_on;
202 1.4.18.1 blymn break;
203 1.4.18.1 blymn case 'd':
204 1.4.18.1 blymn add_wchstr(( const cchar_t *)&cstr );
205 1.4.18.1 blymn refresh();
206 1.4.18.1 blymn break;
207 1.4.18.1 blymn case 'c':
208 1.4.18.1 blymn addwstr(( const wchar_t *)&wstr );
209 1.4.18.1 blymn refresh();
210 1.4.18.1 blymn break;
211 1.4.18.1 blymn case 'z':
212 1.4.18.1 blymn move( 0, 1 );
213 1.4.18.1 blymn if ( wc_on )
214 1.4.18.1 blymn add_wch( &cc );
215 1.4.18.1 blymn else
216 1.4.18.1 blymn addch( c );
217 1.4.18.1 blymn refresh();
218 1.4.18.1 blymn break;
219 1.4.18.1 blymn case 'x':
220 1.4.18.1 blymn move( 0, 3 );
221 1.4.18.1 blymn if ( wc_on )
222 1.4.18.1 blymn add_wch( &cc );
223 1.4.18.1 blymn else
224 1.4.18.1 blymn addch( c );
225 1.4.18.1 blymn refresh();
226 1.4.18.1 blymn break;
227 1.4.18.1 blymn case 'n':
228 1.4.18.1 blymn add_wch( &ncc );
229 1.4.18.1 blymn refresh();
230 1.4.18.1 blymn break;
231 1.4.18.1 blymn case 'm':
232 1.4.18.1 blymn //border( 0, 0, 0, 0, 0, 0, 0, 0 );
233 1.4.18.1 blymn border_set( NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL );
234 1.4.18.1 blymn refresh();
235 1.4.18.1 blymn break;
236 1.4.18.1 blymn case 'j':
237 1.4.18.1 blymn box_set( stdscr, &cc, &cc );
238 1.4.18.1 blymn refresh();
239 1.4.18.1 blymn break;
240 1.4.18.1 blymn case 'k':
241 1.4.18.1 blymn erase();
242 1.4.18.1 blymn refresh();
243 1.4.18.1 blymn break;
244 1.4.18.1 blymn case '1':
245 1.4.18.1 blymn move( 0, 0 );
246 1.4.18.1 blymn clrtoeol();
247 1.4.18.1 blymn refresh();
248 1.4.18.1 blymn break;
249 1.4.18.1 blymn case '2':
250 1.4.18.1 blymn move( 0, 0 );
251 1.4.18.1 blymn sprintf( nostr, "Orig:%x", al[ ac ]);
252 1.4.18.1 blymn addstr( nostr );
253 1.4.18.1 blymn ac = ( ac + 1 ) % 16;
254 1.4.18.1 blymn bcc.attributes = al[ ac ];
255 1.4.18.1 blymn bkgrnd( &bcc );
256 1.4.18.1 blymn move( 1, 0 );
257 1.4.18.1 blymn sprintf( nostr, "New:%x", al[ ac ]);
258 1.4.18.1 blymn //addstr( nostr );
259 1.4.18.1 blymn insstr( nostr );
260 1.4.18.1 blymn refresh();
261 1.4.18.1 blymn break;
262 1.4.18.1 blymn case 'v':
263 1.4.18.1 blymn if ( wc_on )
264 1.4.18.1 blymn ins_wch( &cc );
265 1.4.18.1 blymn else
266 1.4.18.1 blymn insch( c );
267 1.4.18.1 blymn refresh();
268 1.4.18.1 blymn break;
269 1.4.18.1 blymn case 'f':
270 1.4.18.1 blymn ins_wstr(( const wchar_t *)&wstr );
271 1.4.18.1 blymn refresh();
272 1.4.18.1 blymn break;
273 1.4.18.1 blymn case 't':
274 1.4.18.1 blymn for ( i = 0; i < 4; i++ ) {
275 1.4.18.1 blymn owstr[ i ] = wstr[ i + 5 ];
276 1.4.18.1 blymn wstr[ i + 5 ] = i + 0xda05;
277 1.4.18.1 blymn }
278 1.4.18.1 blymn ins_wstr(( const wchar_t *)&wstr );
279 1.4.18.1 blymn refresh();
280 1.4.18.1 blymn for ( i = 0; i < 4; i++ )
281 1.4.18.1 blymn wstr[ i + 5 ] = owstr[ i ];
282 1.4.18.1 blymn break;
283 1.4.18.1 blymn default: /* By default output the character */
284 1.4.18.1 blymn if ( wc_on )
285 1.4.18.1 blymn add_wch( &cc );
286 1.4.18.1 blymn else {
287 1.4.18.1 blymn if ( c < 0x7F )
288 1.4.18.1 blymn addch( c );
289 1.4.18.1 blymn else {
290 1.4.18.1 blymn addstr( keyname( c ));
291 1.4.18.1 blymn }
292 1.4.18.1 blymn }
293 1.4.18.1 blymn refresh();
294 1.4.18.1 blymn }
295 1.4.18.1 blymn } else {
296 1.4.18.1 blymn get_wch( &wc );
297 1.4.18.1 blymn switch ( wc ) {
298 1.4.18.1 blymn case L'w':
299 1.4.18.1 blymn wgc_on = 0;
300 1.4.18.1 blymn noecho();
301 1.4.18.1 blymn break;
302 1.4.18.1 blymn case L'q':
303 1.4.18.1 blymn quit( 0 );
304 1.4.18.1 blymn break;
305 1.4.18.1 blymn case L't':
306 1.4.18.1 blymn notimeout( stdscr, TRUE );
307 1.4.18.1 blymn break;
308 1.4.18.1 blymn case L'T':
309 1.4.18.1 blymn notimeout( stdscr, FALSE );
310 1.4.18.1 blymn break;
311 1.4.18.1 blymn case L'd':
312 1.4.18.1 blymn nodelay( stdscr, TRUE );
313 1.4.18.1 blymn break;
314 1.4.18.1 blymn case L'D':
315 1.4.18.1 blymn nodelay( stdscr, FALSE );
316 1.4.18.1 blymn break;
317 1.4.18.1 blymn case L'p':
318 1.4.18.1 blymn keypad( stdscr, TRUE );
319 1.4.18.1 blymn break;
320 1.4.18.1 blymn case L'P':
321 1.4.18.1 blymn keypad( stdscr, FALSE );
322 1.4.18.1 blymn break;
323 1.4.18.1 blymn default:
324 1.4.18.1 blymn break;
325 1.4.18.1 blymn }
326 1.4.18.1 blymn }
327 1.1 cgd }
328 1.1 cgd }
329 1.1 cgd
330 1.4.18.1 blymn void quit( int sig )
331 1.1 cgd {
332 1.1 cgd erase(); /* Terminate by erasing the screen */
333 1.1 cgd refresh();
334 1.1 cgd endwin(); /* Always end with endwin() */
335 1.1 cgd delwin(curscr); /* Return storage */
336 1.1 cgd delwin(stdscr);
337 1.1 cgd putchar('\n');
338 1.4.18.1 blymn exit( sig );
339 1.1 cgd }
340 1.1 cgd
341