ex1.c revision 1.5 1 1.5 blymn /* $NetBSD: ex1.c,v 1.5 2007/05/28 15:01:58 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.5 blymn #include <stdlib.h>
46 1.5 blymn #include <string.h>
47 1.1 cgd #include <signal.h>
48 1.5 blymn #include <locale.h>
49 1.5 blymn #include <assert.h>
50 1.1 cgd
51 1.5 blymn #define YSIZE 4
52 1.5 blymn #define XSIZE 30
53 1.1 cgd
54 1.5 blymn void quit( int );
55 1.1 cgd
56 1.1 cgd main()
57 1.1 cgd {
58 1.5 blymn int i, j, c, n = 0, ac = 0;
59 1.1 cgd size_t len;
60 1.1 cgd char id[100];
61 1.1 cgd FILE *fp;
62 1.1 cgd char *s;
63 1.5 blymn cchar_t cc, ncc, cstr[ 128 ], icc, icstr[ 128 ], bcc;
64 1.5 blymn int wc_on = 0, wgc_on = 0;
65 1.5 blymn char mbs[] = "";
66 1.5 blymn char mbstr[] = " (Liji)";
67 1.5 blymn wchar_t wstr[ 128 ], owstr[ 4 ], gwstr[ 128 ], iwstr[ 128 ];
68 1.5 blymn int wslen = 0;
69 1.5 blymn wint_t wc;
70 1.5 blymn char nostr[ 128 ];
71 1.5 blymn attr_t al[ 15 ] = { WA_BLINK,
72 1.5 blymn WA_BOLD,
73 1.5 blymn WA_DIM,
74 1.5 blymn WA_LOW,
75 1.5 blymn WA_TOP,
76 1.5 blymn WA_INVIS,
77 1.5 blymn WA_HORIZONTAL,
78 1.5 blymn WA_VERTICAL,
79 1.5 blymn WA_LEFT,
80 1.5 blymn WA_RIGHT,
81 1.5 blymn WA_PROTECT,
82 1.5 blymn WA_REVERSE,
83 1.5 blymn WA_STANDOUT,
84 1.5 blymn WA_UNDERLINE };
85 1.5 blymn
86 1.5 blymn fprintf( stderr, "Current locale: %s\n", setlocale(LC_ALL, ""));
87 1.5 blymn if (( wslen = mbstowcs( &cc.vals[ 0 ], mbs, strlen( mbs ))) < 0 ) {
88 1.5 blymn fprintf( stderr, "mbstowcs() failed\n" );
89 1.5 blymn return -1;
90 1.5 blymn }
91 1.5 blymn fprintf( stderr, "WC string length: %d\n", wslen );
92 1.5 blymn fprintf( stderr, "WC width: %d\n", wcwidth( cc.vals[ 0 ]));
93 1.5 blymn cc.elements = ncc.elements = 8;
94 1.5 blymn cc.attributes = ncc.attributes = 0;
95 1.5 blymn ncc.vals[ 0 ] = 0xda00;
96 1.5 blymn cc.vals[ 1 ] = ncc.vals[ 1 ] = 0xda01;
97 1.5 blymn cc.vals[ 2 ] = ncc.vals[ 2 ] = 0xda02;
98 1.5 blymn cc.vals[ 3 ] = ncc.vals[ 3 ] = 0xda03;
99 1.5 blymn cc.vals[ 4 ] = ncc.vals[ 4 ] = 0xda04;
100 1.5 blymn cc.vals[ 5 ] = ncc.vals[ 5 ] = 0xda05;
101 1.5 blymn cc.vals[ 6 ] = ncc.vals[ 6 ] = 0xda06;
102 1.5 blymn cc.vals[ 7 ] = ncc.vals[ 7 ] = 0xda07;
103 1.5 blymn
104 1.5 blymn if (( wslen = mbstowcs( wstr, mbstr, strlen( mbstr ))) < 0 ) {
105 1.5 blymn fprintf( stderr, "mbstowcs() failed\n" );
106 1.5 blymn return -1;
107 1.5 blymn }
108 1.5 blymn
109 1.5 blymn for ( i = 0; i < wslen; i++ ) {
110 1.5 blymn cstr[ i ].vals[ 0 ] = wstr[ i ];
111 1.5 blymn }
112 1.5 blymn cstr[ wslen ].vals[ 0 ] = 0;
113 1.5 blymn
114 1.5 blymn bcc.elements = 8;
115 1.5 blymn bcc.attributes = 0;
116 1.5 blymn bcc.vals[ 0 ] = L'_';
117 1.5 blymn bcc.vals[ 1 ] = 0xda01;
118 1.5 blymn bcc.vals[ 2 ] = 0xda02;
119 1.5 blymn bcc.vals[ 3 ] = 0xda03;
120 1.5 blymn bcc.vals[ 4 ] = 0xda04;
121 1.5 blymn bcc.vals[ 5 ] = 0xda05;
122 1.5 blymn bcc.vals[ 6 ] = 0xda06;
123 1.5 blymn bcc.vals[ 7 ] = 0xda07;
124 1.1 cgd
125 1.1 cgd initscr(); /* Always call initscr() first */
126 1.1 cgd signal(SIGINT, quit); /* Make sure wou have a 'cleanup' fn */
127 1.1 cgd crmode(); /* We want cbreak mode */
128 1.1 cgd noecho(); /* We want to have control of chars */
129 1.1 cgd delwin(stdscr); /* Create our own stdscr */
130 1.5 blymn stdscr = newwin(YSIZE, XSIZE, 1, 1);
131 1.1 cgd flushok(stdscr, TRUE); /* Enable flushing of stdout */
132 1.1 cgd scrollok(stdscr, TRUE); /* Enable scrolling */
133 1.1 cgd erase(); /* Initially, clear the screen */
134 1.1 cgd
135 1.1 cgd standout();
136 1.1 cgd move(0,0);
137 1.1 cgd while (1) {
138 1.5 blymn if ( !wgc_on ) {
139 1.5 blymn c = getchar();
140 1.5 blymn switch(c) {
141 1.5 blymn case 'q': /* Quit on 'q' */
142 1.5 blymn quit( 0 );
143 1.5 blymn break;
144 1.5 blymn case 'p':
145 1.5 blymn keypad( stdscr, TRUE );
146 1.5 blymn break;
147 1.5 blymn case 'P':
148 1.5 blymn keypad( stdscr, FALSE );
149 1.5 blymn break;
150 1.5 blymn case 'g':
151 1.5 blymn wgc_on = 1;
152 1.5 blymn echo();
153 1.5 blymn break;
154 1.5 blymn case 'b':
155 1.5 blymn get_wstr( gwstr );
156 1.5 blymn move( 1, 0 );
157 1.5 blymn addstr( "Input:" );
158 1.5 blymn addwstr( gwstr );
159 1.5 blymn refresh();
160 1.5 blymn break;
161 1.5 blymn case 'h':
162 1.5 blymn move( 0, 0 );
163 1.5 blymn in_wch( &icc );
164 1.5 blymn move( 1, 0 );
165 1.5 blymn add_wch( &icc );
166 1.5 blymn refresh();
167 1.5 blymn break;
168 1.5 blymn case 'y':
169 1.5 blymn move( 0, 0 );
170 1.5 blymn in_wchstr( icstr );
171 1.5 blymn move( 1, 0 );
172 1.5 blymn add_wchstr( icstr );
173 1.5 blymn refresh();
174 1.5 blymn break;
175 1.5 blymn case 'u':
176 1.5 blymn move( 0, 0 );
177 1.5 blymn inwstr( iwstr );
178 1.5 blymn move( 1, 0 );
179 1.5 blymn addwstr( iwstr );
180 1.5 blymn refresh();
181 1.5 blymn break;
182 1.5 blymn case 'i':
183 1.5 blymn move( 0, 0 );
184 1.5 blymn hline_set( &cc, 20 );
185 1.5 blymn move( 0, 0 );
186 1.5 blymn vline_set( &cc, 20 );
187 1.5 blymn refresh();
188 1.5 blymn break;
189 1.5 blymn case 'o':
190 1.5 blymn clrtobot();
191 1.5 blymn refresh();
192 1.5 blymn break;
193 1.5 blymn case 's': /* Go into standout mode on 's' */
194 1.5 blymn standout();
195 1.5 blymn break;
196 1.5 blymn case 'e': /* Exit standout mode on 'e' */
197 1.5 blymn standend();
198 1.5 blymn break;
199 1.5 blymn case 'r': /* Force a refresh on 'r' */
200 1.5 blymn wrefresh(curscr);
201 1.5 blymn break;
202 1.5 blymn case 'w': /* Turn on/off add_wch() tests */
203 1.5 blymn wc_on = 1 - wc_on;
204 1.5 blymn break;
205 1.5 blymn case 'd':
206 1.5 blymn add_wchstr(( const cchar_t *)&cstr );
207 1.5 blymn refresh();
208 1.5 blymn break;
209 1.5 blymn case 'c':
210 1.5 blymn addwstr(( const wchar_t *)&wstr );
211 1.5 blymn refresh();
212 1.5 blymn break;
213 1.5 blymn case 'z':
214 1.5 blymn move( 0, 1 );
215 1.5 blymn if ( wc_on )
216 1.5 blymn add_wch( &cc );
217 1.5 blymn else
218 1.5 blymn addch( c );
219 1.5 blymn refresh();
220 1.5 blymn break;
221 1.5 blymn case 'x':
222 1.5 blymn move( 0, 3 );
223 1.5 blymn if ( wc_on )
224 1.5 blymn add_wch( &cc );
225 1.5 blymn else
226 1.5 blymn addch( c );
227 1.5 blymn refresh();
228 1.5 blymn break;
229 1.5 blymn case 'n':
230 1.5 blymn add_wch( &ncc );
231 1.5 blymn refresh();
232 1.5 blymn break;
233 1.5 blymn case 'm':
234 1.5 blymn //border( 0, 0, 0, 0, 0, 0, 0, 0 );
235 1.5 blymn border_set( NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL );
236 1.5 blymn refresh();
237 1.5 blymn break;
238 1.5 blymn case 'j':
239 1.5 blymn box_set( stdscr, &cc, &cc );
240 1.5 blymn refresh();
241 1.5 blymn break;
242 1.5 blymn case 'k':
243 1.5 blymn erase();
244 1.5 blymn refresh();
245 1.5 blymn break;
246 1.5 blymn case '1':
247 1.5 blymn move( 0, 0 );
248 1.5 blymn clrtoeol();
249 1.5 blymn refresh();
250 1.5 blymn break;
251 1.5 blymn case '2':
252 1.5 blymn move( 0, 0 );
253 1.5 blymn sprintf( nostr, "Orig:%x", al[ ac ]);
254 1.5 blymn addstr( nostr );
255 1.5 blymn ac = ( ac + 1 ) % 16;
256 1.5 blymn bcc.attributes = al[ ac ];
257 1.5 blymn bkgrnd( &bcc );
258 1.5 blymn move( 1, 0 );
259 1.5 blymn sprintf( nostr, "New:%x", al[ ac ]);
260 1.5 blymn //addstr( nostr );
261 1.5 blymn insstr( nostr );
262 1.5 blymn refresh();
263 1.5 blymn break;
264 1.5 blymn case 'v':
265 1.5 blymn if ( wc_on )
266 1.5 blymn ins_wch( &cc );
267 1.5 blymn else
268 1.5 blymn insch( c );
269 1.5 blymn refresh();
270 1.5 blymn break;
271 1.5 blymn case 'f':
272 1.5 blymn ins_wstr(( const wchar_t *)&wstr );
273 1.5 blymn refresh();
274 1.5 blymn break;
275 1.5 blymn case 't':
276 1.5 blymn for ( i = 0; i < 4; i++ ) {
277 1.5 blymn owstr[ i ] = wstr[ i + 5 ];
278 1.5 blymn wstr[ i + 5 ] = i + 0xda05;
279 1.5 blymn }
280 1.5 blymn ins_wstr(( const wchar_t *)&wstr );
281 1.5 blymn refresh();
282 1.5 blymn for ( i = 0; i < 4; i++ )
283 1.5 blymn wstr[ i + 5 ] = owstr[ i ];
284 1.5 blymn break;
285 1.5 blymn default: /* By default output the character */
286 1.5 blymn if ( wc_on )
287 1.5 blymn add_wch( &cc );
288 1.5 blymn else {
289 1.5 blymn if ( c < 0x7F )
290 1.5 blymn addch( c );
291 1.5 blymn else {
292 1.5 blymn addstr( keyname( c ));
293 1.5 blymn }
294 1.5 blymn }
295 1.5 blymn refresh();
296 1.5 blymn }
297 1.5 blymn } else {
298 1.5 blymn get_wch( &wc );
299 1.5 blymn switch ( wc ) {
300 1.5 blymn case L'w':
301 1.5 blymn wgc_on = 0;
302 1.5 blymn noecho();
303 1.5 blymn break;
304 1.5 blymn case L'q':
305 1.5 blymn quit( 0 );
306 1.5 blymn break;
307 1.5 blymn case L't':
308 1.5 blymn notimeout( stdscr, TRUE );
309 1.5 blymn break;
310 1.5 blymn case L'T':
311 1.5 blymn notimeout( stdscr, FALSE );
312 1.5 blymn break;
313 1.5 blymn case L'd':
314 1.5 blymn nodelay( stdscr, TRUE );
315 1.5 blymn break;
316 1.5 blymn case L'D':
317 1.5 blymn nodelay( stdscr, FALSE );
318 1.5 blymn break;
319 1.5 blymn case L'p':
320 1.5 blymn keypad( stdscr, TRUE );
321 1.5 blymn break;
322 1.5 blymn case L'P':
323 1.5 blymn keypad( stdscr, FALSE );
324 1.5 blymn break;
325 1.5 blymn default:
326 1.5 blymn break;
327 1.5 blymn }
328 1.5 blymn }
329 1.1 cgd }
330 1.1 cgd }
331 1.1 cgd
332 1.5 blymn void quit( int sig )
333 1.1 cgd {
334 1.1 cgd erase(); /* Terminate by erasing the screen */
335 1.1 cgd refresh();
336 1.1 cgd endwin(); /* Always end with endwin() */
337 1.1 cgd delwin(curscr); /* Return storage */
338 1.1 cgd delwin(stdscr);
339 1.1 cgd putchar('\n');
340 1.5 blymn exit( sig );
341 1.1 cgd }
342 1.1 cgd
343