#ifndef lint
static char copyright[] =
"@(#) Copyright (c) 1992, 1993\n\
The Regents of the University of California. All rights reserved.\n";
#endif
#ifndef lint
static char sccsid[] = "@(#)ex1.c 8.1 (Berkeley) 6/4/93";
#endif
#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[] = "´ó";
char mbstr[] = "´óѧ֮µÀ£¬ÔÚÃ÷Ã÷µÂ£¬ÔÚÇ×Ãñ£¬ÔÚÖ¹ÓÚÖÁÉÆ¡£ (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();
signal(SIGINT, quit);
crmode();
noecho();
delwin(stdscr);
stdscr = newwin(YSIZE, XSIZE, 1, 1);
flushok(stdscr, TRUE);
scrollok(stdscr, TRUE);
erase();
standout();
move(0,0);
while (1) {
if ( !wgc_on ) {
c = getchar();
switch(c) {
case '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':
standout();
break;
case 'e':
standend();
break;
case 'r':
wrefresh(curscr);
break;
case 'w':
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_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 ]);
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:
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();
refresh();
endwin();
delwin(curscr);
delwin(stdscr);
putchar('\n');
exit( sig );
}