システム・プログラムI 電子・情報工学系 新城 靖 <yas@is.tsukuba.ac.jp>
このページは、次の URL にあります。
http://www.hlla.is.tsukuba.ac.jp/~yas/coins/syspro1-1997/1997-06-24
あるいは、次のページから手繰っていくこともできます。
http://www.hlla.is.tsukuba.ac.jp/~yas/coins/
http://www.hlla.is.tsukuba.ac.jp/~yas/index-j.html
---------------------------------------------------------------------- 1: /* 2: term-cbreak.c -- 端末から文字単位で入力する 3: /usr/local/LECTURES/syspro-1997-shinjo/term/term-cbreak.c 4: $Header: term-cbreak.c,v 1.2 97/06/23 22:43:32 yas Exp $ 5: Start: 1997/06/23 22:26:31 6: */ 7: 8: #include <stdio.h> /* stderr */ 9: #include <termios.h> /* struct termios */ 10: 11: main( argc,argv ) 12: int argc ; 13: char *argv[] ; 14: { 15: struct termios tattr, tattr_save ; 16: 17: if( ! isatty(0) ) 18: { 19: fprintf(stderr,"stdin is not tty\n"); 20: exit( 1 ); 21: } 22: if( tcgetattr( 0, &tattr ) < 0 ) 23: { 24: perror("tcgetattr"); 25: exit( 1 ); 26: } 27: tattr_save = tattr ; 28: 29: tattr.c_iflag &= ~(BRKINT|ISTRIP|IXON); 30: tattr.c_lflag &= ~(ICANON|IEXTEN); 31: tattr.c_cc[VMIN] = 1 ; 32: tattr.c_cc[VTIME] = 0 ; 33: if( tcsetattr( 0, TCSANOW, &tattr )<0 ) 34: { 35: perror("tcsetattr"); 36: exit( 1 ); 37: } 38: 39: getputchar(); 40: 41: if( tcsetattr( 0,TCSANOW, &tattr_save ) < 0 ) 42: { 43: perror("tcsetattr"); 44: exit( 1 ); 45: } 46: } 47: 48: getputchar() 49: { 50: int c ; 51: while( (c=getchar()) > 0 ) 52: { 53: putchar( c ); 54: if( c == 'q' ) 55: break; 56: } 57: } ----------------------------------------------------------------------
実行例。
---------------------------------------------------------------------- % ../file/stdio-thruabc
abc q
q ^D % ./term-cbreak
aabbcc
qq%
%
----------------------------------------------------------------------
エコーバックを抑止するには、c_iflag の ECHO, ECHOK, ECHOKE などのビッ トも落とす(c_flag &=~(...))。割り込みも効かないようにする には、ISIG を落とす。
出力の処理(CRをCR,LNに変換)などの処理を抑止するには、 c_oflag で OPOST ビットを落とす。
くわしくは、man termio 。
---------------------------------------------------------------------- 1: /* 2: term-rev.c -- 反転で出力する 3: /usr/local/LECTURES/syspro-1997-shinjo/term/term-rev.c 4: $Header: term-rev.c,v 1.1 97/06/23 23:19:00 yas Exp $ 5: Start: 1997/06/23 22:26:31 6: */ 7: main() 8: { 9: printf("012"); 10: putchar( 0x1b );putchar('[');putchar('7');putchar('m'); 11: printf("345"); 12: putchar( 0x1b );putchar('[');putchar('m'); 13: printf("678\n"); 14: } ----------------------------------------------------------------------
実行例。
この方法は、端末の種類によってことなる。どの端末でも働くようなプログラ ムを作るには、terminfo ライブラリ(または termcap ライブラリ)を使う。こ れは、ファイルに保存されているエスケープ・シーケンスを利用するためのラ イブラリ関数である。
---------------------------------------------------------------------- % ls /usr/lib/terminfo/v/vt100/usr/lib/terminfo/v/vt100 % ls /usr/lib/terminfo/k/kterm
/usr/lib/terminfo/k/kterm % ls /usr/lib/terminfo/h/hpterm
/usr/lib/terminfo/h/hpterm %
----------------------------------------------------------------------
---------------------------------------------------------------------- 1: /* 2: term-rev-info.c -- 反転で出力する(terminfoを使う) 3: 「cc term-rev-info.c -o term-rev-info -lcurses」でコンパイル 4: /usr/local/LECTURES/syspro-1997-shinjo/term/term-rev.c 5: $Header: term-rev-info.c,v 1.2 97/06/23 23:50:30 yas Exp $ 6: Start: 1997/06/23 22:26:31 7: */ 8: #include <stdio.h> 9: #include <curses.h> 10: #include <term.h> 11: 12: main() 13: { 14: setupterm(NULL, 1, NULL); 15: putp("012"); 16: putp(enter_reverse_mode); 17: putp("345"); 18: putp(exit_attribute_mode); 19: putp("678\n"); 20: } ----------------------------------------------------------------------
cursesでは、文字端末で動作する画面指向のアプリケーションを開発するため のライブラリです。cursesでは、画面を直接操作するのではなく、内部的なバッ ファを操作することになります。そして、このバッファは、refresh() が呼ば れてはじめて表示されます。このとき、前に refresh() を呼び出した時との 差分だけが自動的に出力されます。
詳しくは、man curses。
締切は、7月4日とします。