 51ffecc181
			
		
	
	
		51ffecc181
		
	
	
	
	
		
			
			. abandons mixer, gomoku, talk, talkd, top from base system . compile top with clang so no ack-compiled program needs -lcurses any more
		
			
				
	
	
		
			343 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			343 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*	$NetBSD: ex1.c,v 1.5 2007/05/28 15:01:58 blymn Exp $	*/
 | ||
| 
 | ||
| /*
 | ||
|  * Copyright (c) 1992, 1993
 | ||
|  *	The Regents of the University of California.  All rights reserved.
 | ||
|  *
 | ||
|  *
 | ||
|  * Redistribution and use in source and binary forms, with or without
 | ||
|  * modification, are permitted provided that the following conditions
 | ||
|  * are met:
 | ||
|  * 1. Redistributions of source code must retain the above copyright
 | ||
|  *    notice, this list of conditions and the following disclaimer.
 | ||
|  * 2. Redistributions in binary form must reproduce the above copyright
 | ||
|  *    notice, this list of conditions and the following disclaimer in the
 | ||
|  *    documentation and/or other materials provided with the distribution.
 | ||
|  * 3. Neither the name of the University nor the names of its contributors
 | ||
|  *    may be used to endorse or promote products derived from this software
 | ||
|  *    without specific prior written permission.
 | ||
|  *
 | ||
|  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
 | ||
|  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | ||
|  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | ||
|  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
 | ||
|  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 | ||
|  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 | ||
|  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 | ||
|  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 | ||
|  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 | ||
|  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 | ||
|  * SUCH DAMAGE.
 | ||
|  */
 | ||
| 
 | ||
| #ifndef lint
 | ||
| static char copyright[] =
 | ||
| "@(#) Copyright (c) 1992, 1993\n\
 | ||
| 	The Regents of the University of California.  All rights reserved.\n";
 | ||
| #endif /* not lint */
 | ||
| 
 | ||
| #ifndef lint
 | ||
| static char sccsid[] = "@(#)ex1.c	8.1 (Berkeley) 6/4/93";
 | ||
| #endif /* not lint */
 | ||
| #include <sys/types.h>
 | ||
| #include <curses.h>
 | ||
| #include <stdio.h>
 | ||
| #include <stdlib.h>
 | ||
| #include <string.h>
 | ||
| #include <signal.h>
 | ||
| #include <locale.h>
 | ||
| #include <assert.h>
 | ||
| 
 | ||
| #define YSIZE 4
 | ||
| #define XSIZE 30
 | ||
| 
 | ||
| void quit( int );
 | ||
| 
 | ||
| main()
 | ||
| {
 | ||
| 	int i, j, c, n = 0, ac = 0;
 | ||
| 	size_t len;
 | ||
| 	char id[100];
 | ||
| 	FILE *fp;
 | ||
| 	char *s;
 | ||
|     cchar_t cc, ncc, cstr[ 128 ], icc, icstr[ 128 ], bcc;
 | ||
|     int wc_on = 0, wgc_on = 0;
 | ||
|     char mbs[] = "<EFBFBD><EFBFBD>";
 | ||
|     char mbstr[] = "<EFBFBD><EFBFBD>ѧ֮<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>£<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ơ<EFBFBD> (Liji)";
 | ||
|     wchar_t wstr[ 128 ], owstr[ 4 ], gwstr[ 128 ], iwstr[ 128 ];
 | ||
|     int wslen = 0;
 | ||
|     wint_t wc;
 | ||
|     char nostr[ 128 ];
 | ||
|     attr_t al[ 15 ] = { WA_BLINK,
 | ||
|                         WA_BOLD,
 | ||
|                         WA_DIM,
 | ||
|                         WA_LOW,
 | ||
|                         WA_TOP,
 | ||
|                         WA_INVIS,
 | ||
|                         WA_HORIZONTAL,
 | ||
|                         WA_VERTICAL,
 | ||
|                         WA_LEFT,
 | ||
|                         WA_RIGHT,
 | ||
|                         WA_PROTECT,
 | ||
|                         WA_REVERSE,
 | ||
|                         WA_STANDOUT,
 | ||
|                         WA_UNDERLINE };
 | ||
| 
 | ||
|     fprintf( stderr, "Current locale: %s\n", setlocale(LC_ALL, ""));
 | ||
|     if (( wslen =  mbstowcs( &cc.vals[ 0 ], mbs, strlen( mbs ))) < 0 ) {
 | ||
|         fprintf( stderr, "mbstowcs() failed\n" );
 | ||
|         return -1;
 | ||
|     }
 | ||
|     fprintf( stderr, "WC string length: %d\n", wslen );
 | ||
|     fprintf( stderr, "WC width: %d\n", wcwidth( cc.vals[ 0 ]));
 | ||
|     cc.elements = ncc.elements = 8;
 | ||
|     cc.attributes = ncc.attributes = 0;
 | ||
|     ncc.vals[ 0 ] = 0xda00;
 | ||
|     cc.vals[ 1 ] = ncc.vals[ 1 ] = 0xda01;
 | ||
|     cc.vals[ 2 ] = ncc.vals[ 2 ] = 0xda02;
 | ||
|     cc.vals[ 3 ] = ncc.vals[ 3 ] = 0xda03;
 | ||
|     cc.vals[ 4 ] = ncc.vals[ 4 ] = 0xda04;
 | ||
|     cc.vals[ 5 ] = ncc.vals[ 5 ] = 0xda05;
 | ||
|     cc.vals[ 6 ] = ncc.vals[ 6 ] = 0xda06;
 | ||
|     cc.vals[ 7 ] = ncc.vals[ 7 ] = 0xda07;
 | ||
| 
 | ||
|     if (( wslen =  mbstowcs( wstr, mbstr, strlen( mbstr ))) < 0 ) {
 | ||
|         fprintf( stderr, "mbstowcs() failed\n" );
 | ||
|         return -1;
 | ||
|     }
 | ||
| 
 | ||
|     for ( i = 0; i < wslen; i++ ) {
 | ||
|         cstr[ i ].vals[ 0 ] = wstr[ i ];
 | ||
|     }
 | ||
|     cstr[ wslen ].vals[ 0 ] = 0;
 | ||
| 
 | ||
|     bcc.elements = 8;
 | ||
|     bcc.attributes = 0;
 | ||
|     bcc.vals[ 0 ] = L'_';
 | ||
|     bcc.vals[ 1 ] = 0xda01;
 | ||
|     bcc.vals[ 2 ] = 0xda02;
 | ||
|     bcc.vals[ 3 ] = 0xda03;
 | ||
|     bcc.vals[ 4 ] = 0xda04;
 | ||
|     bcc.vals[ 5 ] = 0xda05;
 | ||
|     bcc.vals[ 6 ] = 0xda06;
 | ||
|     bcc.vals[ 7 ] = 0xda07;
 | ||
| 
 | ||
| 	initscr();			/* Always call initscr() first */
 | ||
| 	signal(SIGINT, quit);		/* Make sure wou have a 'cleanup' fn */
 | ||
| 	crmode();			/* We want cbreak mode */
 | ||
| 	noecho();			/* We want to have control of chars */
 | ||
| 	delwin(stdscr);			/* Create our own stdscr */
 | ||
| 	stdscr = newwin(YSIZE, XSIZE, 1, 1);
 | ||
| 	flushok(stdscr, TRUE);		/* Enable flushing of stdout */
 | ||
| 	scrollok(stdscr, TRUE);		/* Enable scrolling */
 | ||
| 	erase();			/* Initially, clear the screen */
 | ||
| 
 | ||
| 	standout();
 | ||
| 	move(0,0);
 | ||
| 	while (1) {
 | ||
|         if ( !wgc_on ) {
 | ||
| 		    c = getchar();
 | ||
| 		    switch(c) {
 | ||
| 		        case 'q':		/* Quit on 'q' */
 | ||
| 			        quit( 0 );
 | ||
| 			        break;
 | ||
|                 case 'p':
 | ||
|                     keypad( stdscr, TRUE );
 | ||
|                     break;
 | ||
|                 case 'P':
 | ||
|                     keypad( stdscr, FALSE );
 | ||
|                     break;
 | ||
|                 case 'g':
 | ||
|                     wgc_on = 1;
 | ||
|                     echo();
 | ||
|                     break;
 | ||
|                 case 'b':
 | ||
|                     get_wstr( gwstr );
 | ||
|                     move( 1, 0 );
 | ||
|                     addstr( "Input:" );
 | ||
|                     addwstr( gwstr );
 | ||
|                     refresh();
 | ||
|                     break;
 | ||
|                 case 'h':
 | ||
|                     move( 0, 0 );
 | ||
|                     in_wch( &icc );
 | ||
|                     move( 1, 0 );
 | ||
|                     add_wch( &icc );
 | ||
|                     refresh();
 | ||
|                     break;
 | ||
|                 case 'y':
 | ||
|                     move( 0, 0 );
 | ||
|                     in_wchstr( icstr );
 | ||
|                     move( 1, 0 );
 | ||
|                     add_wchstr( icstr );
 | ||
|                     refresh();
 | ||
|                     break;
 | ||
|                 case 'u':
 | ||
|                     move( 0, 0 );
 | ||
|                     inwstr( iwstr );
 | ||
|                     move( 1, 0 );
 | ||
|                     addwstr( iwstr );
 | ||
|                     refresh();
 | ||
|                     break;
 | ||
|                 case 'i':
 | ||
|                     move( 0, 0 );
 | ||
|                     hline_set( &cc, 20 );
 | ||
|                     move( 0, 0 );
 | ||
|                     vline_set( &cc, 20 );
 | ||
|                     refresh();
 | ||
|                     break;
 | ||
|                 case 'o':
 | ||
|                     clrtobot();
 | ||
|                     refresh();
 | ||
|                     break;
 | ||
| 		        case 's':		/* Go into standout mode on 's' */
 | ||
| 			        standout();
 | ||
| 			        break;
 | ||
| 		        case 'e':		/* Exit standout mode on 'e' */
 | ||
| 			        standend();
 | ||
| 			        break;
 | ||
| 		        case 'r':		/* Force a refresh on 'r' */
 | ||
| 			        wrefresh(curscr);
 | ||
| 			        break;
 | ||
| 		        case 'w':		/* Turn on/off add_wch() tests */
 | ||
|                     wc_on = 1 - wc_on;
 | ||
|                     break;
 | ||
|                 case 'd':
 | ||
|                     add_wchstr(( const cchar_t *)&cstr );
 | ||
|                     refresh();
 | ||
|                     break;
 | ||
|                 case 'c':
 | ||
|                     addwstr(( const wchar_t *)&wstr );
 | ||
|                     refresh();
 | ||
|                     break;
 | ||
|                 case 'z':
 | ||
|                     move( 0, 1 );
 | ||
|                     if ( wc_on )
 | ||
|                         add_wch( &cc );
 | ||
|                     else
 | ||
|                         addch( c );
 | ||
|                     refresh();
 | ||
|                     break;
 | ||
|                 case 'x':
 | ||
|                     move( 0, 3 );
 | ||
|                     if ( wc_on )
 | ||
|                         add_wch( &cc );
 | ||
|                     else
 | ||
|                         addch( c );
 | ||
|                     refresh();
 | ||
|                     break;
 | ||
|                 case 'n':
 | ||
|                     add_wch( &ncc );
 | ||
|                     refresh();
 | ||
|                     break;
 | ||
|                 case 'm':
 | ||
|                     //border( 0, 0, 0, 0, 0, 0, 0, 0 );
 | ||
|                     border_set( NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL );
 | ||
|                     refresh();
 | ||
|                     break;
 | ||
|                 case 'j':
 | ||
|                     box_set( stdscr, &cc, &cc );
 | ||
|                     refresh();
 | ||
|                     break;
 | ||
|                 case 'k':
 | ||
|                     erase();
 | ||
|                     refresh();
 | ||
|                     break;
 | ||
|                 case '1':
 | ||
|                     move( 0, 0 );
 | ||
|                     clrtoeol();
 | ||
|                     refresh();
 | ||
|                     break;
 | ||
|                 case '2':
 | ||
|                     move( 0, 0 );
 | ||
|                     sprintf( nostr, "Orig:%x", al[ ac ]);
 | ||
|                     addstr( nostr );
 | ||
|                     ac = ( ac + 1 ) % 16;
 | ||
|                     bcc.attributes = al[ ac ];
 | ||
|                     bkgrnd( &bcc );
 | ||
|                     move( 1, 0 );
 | ||
|                     sprintf( nostr, "New:%x", al[ ac ]);
 | ||
|                     //addstr( nostr );
 | ||
|                     insstr( nostr );
 | ||
|                     refresh();
 | ||
|                     break;
 | ||
|                 case 'v':
 | ||
|                     if ( wc_on )
 | ||
|                         ins_wch( &cc );
 | ||
|                     else
 | ||
|                         insch( c );
 | ||
|                     refresh();
 | ||
|                     break;
 | ||
|                 case 'f':
 | ||
|                     ins_wstr(( const wchar_t *)&wstr );
 | ||
|                     refresh();
 | ||
|                     break;
 | ||
|                 case 't':
 | ||
|                     for ( i = 0; i < 4; i++ ) {
 | ||
|                         owstr[ i ] = wstr[ i + 5 ];
 | ||
|                         wstr[ i + 5 ] = i + 0xda05;
 | ||
|                     }
 | ||
|                     ins_wstr(( const wchar_t *)&wstr );
 | ||
|                     refresh();
 | ||
|                     for ( i = 0; i < 4; i++ )
 | ||
|                         wstr[ i + 5 ] = owstr[ i ];
 | ||
|                     break;
 | ||
| 		        default:		/* By default output the character */
 | ||
|                     if ( wc_on )
 | ||
|                         add_wch( &cc );
 | ||
|                     else {
 | ||
|                         if ( c < 0x7F )
 | ||
|                             addch( c );
 | ||
|                         else {
 | ||
|                             addstr( keyname( c ));
 | ||
|                         }
 | ||
|                     }
 | ||
|                     refresh();
 | ||
| 		    }
 | ||
|         } else {
 | ||
|             get_wch( &wc );
 | ||
|             switch ( wc ) {
 | ||
|                 case L'w':
 | ||
|                     wgc_on = 0;
 | ||
|                     noecho();
 | ||
|                     break;
 | ||
|                 case L'q':
 | ||
|                     quit( 0 );
 | ||
|                     break;
 | ||
|                 case L't':
 | ||
|                     notimeout( stdscr, TRUE );
 | ||
|                     break;
 | ||
|                 case L'T':
 | ||
|                     notimeout( stdscr, FALSE );
 | ||
|                     break;
 | ||
|                 case L'd':
 | ||
|                     nodelay( stdscr, TRUE );
 | ||
|                     break;
 | ||
|                 case L'D':
 | ||
|                     nodelay( stdscr, FALSE );
 | ||
|                     break;
 | ||
|                 case L'p':
 | ||
|                     keypad( stdscr, TRUE );
 | ||
|                     break;
 | ||
|                 case L'P':
 | ||
|                     keypad( stdscr, FALSE );
 | ||
|                     break;
 | ||
|                 default:
 | ||
|                     break;
 | ||
|             }
 | ||
|         }
 | ||
| 	}
 | ||
| }
 | ||
| 
 | ||
| void quit( int sig )
 | ||
| {
 | ||
| 	erase();		/* Terminate by erasing the screen */
 | ||
| 	refresh();
 | ||
| 	endwin();		/* Always end with endwin() */
 | ||
| 	delwin(curscr);		/* Return storage */
 | ||
| 	delwin(stdscr);
 | ||
| 	putchar('\n');
 | ||
| 	exit( sig );
 | ||
| }
 | ||
| 
 |