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 );
|
||
}
|
||
|