KEY - みる会図書館


検索対象: 月刊 C MAGAZINE 1990年10月号
13件見つかりました。

1. 月刊 C MAGAZINE 1990年10月号

List 4 21 : #define 20 : #define 19 : #define 18 : #define 17 : #define 16 : #define 15 : #define 14 : #define 13 : #define 12 : #define 11 : #def i ne 10 : #define 9 : #define 8 : #define 7 : #define 6 : #define 5 : #define 4 : #define 3 : #define 2 : #define 1 : #define List 2 10 : { ret = F 1 ret = F3 ret = F4 ret ニ F5 ret ニ F6 ret ニ F8 11 : #define CREVERSE 4 12 : #define CUNDER し N 8 printf( ” \033C ” ) uscandir. C 2 : 3 : 4 : 5 : 7 : 9 : 13 : 14 : 17 : 20 : 22 : 23 : 24 : 25 : 26 : 28 : 29 : 30 : 32 : 33 : 34 : 35 : 36 : 37 : 38 : 39 : 40 : 42 : 43 : 44 : 45 : SeriaI CM9009 * Copyright 1990 E. Toyokuni update 90.08. #include く curses. h> 6 : #include "fkey. h" 8 : uscandir(dummy) int *dummy; int c,ret; cbreak ( ) : nonl ( ) : noecho ( ) : 応用 C 言語 C の道具箱 uscandir( ) 関数 ・ ( 整理番号に℃ M900903 ) 0 押下キーの取得 [ 書式 ] #include く curses. h> #include "fkey. h" uscandi 「 (dummy) int *dummy keypad(stdscr,TRUE) : switch (c) { C = getch ( ) : flushinp(); case case case case case case case case case case case case case case case case case case case KEY_ し EFT : KEY DOWN : KEY_RIGHT: KEY_F(I) : KEY-F(2) : KEY-F(3) ・ KEY_F(4) : KEY-F(5) ・ KEY-F(6) : KEY_F(7) ・ KEY-F(8) : KBY_F(9) ・ KEY-F(IO): 0X20 0x0d 0X09 0X08 0x 1 b KEY_UP ret ニ CLEFT ;break ・ ret = CDOWN ;break ・ ret ニ CUP ;break ・ ret = CRIGHT ;break ・ ;break ;break ;break ;break ;break ;break ret = F9 ;break ret = F7 ;break ret = F2 ;break c ;break; ret = SPACEE ;break ・ ret : CR ;break ・ ret = TAB ;break ・ ret ニ BS ;break ・ ret = ESCAPE ;break ret ニ F10 ;break ・ [ 引数 ] もたない [ 戻り値 ] dummy は , ダミーの引数て、特定の機能は 押下キーの値をリアルタイムに関数の値 [ 機能 ] として返す。 押下キーの値 ( fkey. h て、定義 ) を関数の値 として返す ( リターンは不要 ) 。 List 3 color. h default nocbreak ( ) : echo() : keypad(stdscr, FALSE) : return(ret) : ret 1 : #define CB し ACK 2 : #define CB し UE 3 : #define CRED 4 : #define CPURPLE 5 : #define CGREEN 6 : #define CSKY 7 : #define CYB しし0W 8 : #define CWHITE 9 : #define CNONSEC 10 : #define CB い NK 0 * 0X20 + 1 1 * 0X20 + 1 2 * 0X20 + 1 3 * 0X20 + 1 4 * 0X20 + 1 5 * 0X20 + 1 6 * 0X20 + 1 7 * 0X20 + 1 2 1 upescape. h PRED PB し UE PPURP し E PGREEN PYE しし OW PSKY PWHITE PRRED PRB し UE PRPURP し E PRGREEN PRYEL し OW PRSKY PRWHITE PNONSET PSCRR ES ET PC し S PCURON PCUROFP PCURB い NK PCURNOB い NK printf("%033C31m") printf ( " \ 033 [ 34m " ) printf("Y033[35m ” ) printf("%033[32m") printf ( " \ 033 [ 33 田” ) printf("Y033[36n") printf ( " \ 033 [ 37 田” ) printf("Y033[41m") printf("Y033[44m") pri ntf ( " \ 033 [ 45 ) pri ntf ( " \ 033 [ 42 田つ printf (" \ 033 [ 43 ) printf ぐ \ 033 [ 46 ) printf ぐ \ 033 [ 47 田つ printf("%033[0n") printf("Y033[2J") pri ntf("Y033[0v") printf("Y033[lv") printf("Y033[4v つ printf("Y033[5v") 22 : #define 23 : #define 24 : #define 25 : #define 26 : #define 27 : #define 28 : #define 29 : #define 30 : #define 31 : #define 32 : #define 33 : #define 34 : #define 35 : #define 36 : #define 37 : #define 38 : #define 39 : #define PCURLEFT PCURRIGHT PCURUP PCURDOWN P し OCATE (), y) PUNDER い NE PB い NK PREVERSE PGRAPH PSCRREVERSE PSCRNORMA し PCURORGSET PCURORGRESET PAUTOWRAPON PAUTOWRAPOPP PSCRO しし (ux, dx) PSCRO しい N PSCRO し LOUT printf("Y033[1D") printf("Y033[lC つ printf("Y033[1A") printf("W033[1B") printf("Y033[Xd:XdH",Y,x) printf("Y033[4m") printf("Y033[5m") printf("Y033[7m つ printf("Y033[6m") printf("Y033[>11 ド ) printf("Y033[>llh") printf("Y033[Xdßdr",ux,dx) printf("Y033[?71") printf ( " \ 033 [ ? 7h つ printf("Y033[?61") printf("Y033[?6h") printf("Y033[?51") printf("Y033[?5h") 応用 c 言語 107

2. 月刊 C MAGAZINE 1990年10月号

TabIe 2 CURSES ( 3X ) のファンクションキー 名前 KEY BREAK KEY DOWN KEY RIGHT KEY HOME KEY BACKSPACE KEY CLEAR KEY NPAGE KEY PPAGE KEY STAB KEY_ CTAB KEY_ CATAB KEY_ ENTER KEY_ SRESET KEY_ RESET KEY_ PRINT ー B2 ー CI KEY— CANCEL KEY— CLOSE KEY- COMMAND KEY— COPY KEY— CREATE KEY— MARK KEY- MESSAGE KEY— MOVE KEY— OPTIONS KEY— PREVIOUS KEY— REDO KEY— REFERENCE KEY— REFRESH KEY— REPLACE KEY— RESTART KEY— RESUME KEY— SCANCEL KEY— SCOMMAND KEY— SCOPY KEY- SBEG KEY— SAVE KEY— OPEN KEY— NEXT KEY— HELP KEY— FIND KEY— EXIT KEY— END KEY— BEG KEY— BTAB KEY- C3 K EY K EY KEY- A3 KEY- AI KEY_ LL KEY SR KEY SF KEY EOL KEY EOS KDY EIC KEY ℃ KEY DC KEY に KEY DL KEY-F(n) K EY FO KEY LEFT KEY UP 値 (KEY F0 十 (n)) 0575 0574 0573 0572 0571 0570 0567 0566 0565 0564 0563 0562 0561 0560 0557 0556 0555 0554 0553 0552 0551 0550 0547 0546 0545 0544 0543 0542 0541 0540 0537 0536 0535 0534 0533 0532 0531 0530 0527 0526 0525 0524 0523 0522 0521 0520 0517 0516 0515 0514 0513 0512 0511 0510 0410 0407 0406 0405 0404 0403 0402 0401 キーの名前 break キー ( 信頼できない ) 4 つの矢印キー Home キー ( 上十左 ) 矢印 backspace( 信頼できない ) ファンクションキー 64 のキー用のスペースが予約されている。 fn に関する式 delete line キー insert line キー delete character キー insert char または insert mode キー exit insert charmode キー clear SC 「 een キ ー clear tO end Of screen キー clearto end Of line キー sc 「 0ⅱ 1 line fo a 「 d キー scroll 1 line backward ( 逆 ) キー next page キー previous page キー set TAB キー clea 「 TAB キー clea 「 all TAB characte 「 s enter または send キー SO 負 (partial) 「 eset キー reset または hard 「 eset キー print または copy キー home down または bo om ( 左下 ) キー キーバッドの右下 キーバッドの左下 キーバッドの中央 キーバッドの右上 キーバッドの左上 CI 下 C3 左 B2 右 AI 上 A3 キーバッドは次のように配列されている。 shift 十 copy キー shift 十 command キー shift 十 cancel キー shift 十 beginning キー save キ・・一・ resume キ ー「 restart キー replace キー 「 efresh キー ref(erence) キー 「 edo キー previous Object キー options キー open キー next object キー m ove キ・一・ message キー mark キー help キー find キー exit キー end キー create キー copy キー cmd(command) キー close キー cancel キー beg (inning) キー back TAB キー C の道自箱 printw( ) 関数や addch( ) 関数などによって書 き込みを行う関数を呼んて、も , すぐに画面 には表示されず , 特定のメモリに書き込み が行われるだけて、ある。そしてこの「 ef 「 esh ( ) 関数が呼ばれると画面に表示される。これ により複数行画面をスクロールする場合な どに最終的な画面だけを表示することがて、 き , 表示速度の高速化が可能となる (Fig. 1 参照 ) 。 CURSES ライプラリを使用するメリット は , プログラムを作成する際に端末のキー の属性などをいちいち考慮する必要がなく , 移植性の高いプログラムを書くことがて、き る点にある。 List 2 の CASE 中の定数 KEY LEFT, KEY DOWN などは , 矢印キーの押下値てあ る。 keypad() 関数により , キーパッドの使 用が可能になるとこのように端末の種類の いかんにかかわらず , 押下値を統一して管 理てきる。ただし , サポートされていない キーもあるのて、 , 注意が必要てある (PC-UX/ V< は , 矢印キーは定義どおりてあったが , ファンクションキーについては別の値が返 された。 Table 2 参照 ) 。 また , プログラム中の cb 「 eak( ) 関数 , nonl( ) 関数および noecho( ) 関数は , 固キー の入力を待たずに , 各キーの押下状態を把 握するために指定する。 flushinp( ) 関数は , 先行入力値を捨てるた めのものてある。 道具箱に追加された関数 ucolo ) 関数 ~ 0 ( 整理番号。 : CM900901 ) : ; 、 = をナ、表示色 ; 属性の変更 [ 書式 ] #include "upescape. h" ucolo 「 (attr) char attr [ 引数 ] attr には , 表示色・属性を指定する。指定 には , C010r. h て定義されている定数を用い 応用 c 言語 105

3. 月刊 C MAGAZINE 1990年10月号

る。色と属性はそれぞれの定数の和をとる TabIe 2 ことにより , 同時に指定て、きる。たとえば , 名前 黄色て、プリンク表示させたい場合には , 以 KEY ー SCREATE KEY ー SDC 下のようにする (List 3 参照 ) 。 KEY-SDL uC010r(CYELLOW ー CBLINK) KEY ー SELECT KEY—SEND こての色・属性の指定には , 工スケー KEY—SEOL KEY ー SEXIT プシーケンスを使用している。その定義に KEY ー S 日 N D ついては , 以下のとおりて、ある (List 4 参 KEY ー SHELP KEY-SHOME KEY-S ℃ KEY ー SLEFT ただし , 工スケープシーケンスといって KEY ー SMESSAGE も各メーカーて、統一がとれているわけて、は KEY ー SMOVE KEY— SNEXT ない。この定義は PC ー UX / V 用のものて、あ KEY—SOPTIONS KEY—SPREVIOUS たとえばソニーの NEWS などてあれ KEY—SPRINT ば , 色の指定にはまず , 参照用テープルに KEY—SREDO KEY—SREPLACE 独自の色を調合して指定しておく必要があ KEY—SRIGHT KEY—SRSUME KEY ー SSAVE また色の選択コードも異なる。したがっ KEY-SSUSPEND KEY—SUNDO て読者は , この upescape. h(List 4 ) ( : 各表 KEY— SUSPEND KEY ー U N DO 示色・属性に対応したコードを必要に応じ て , 定義し直していただきたい [ 戻り値 ] 正常終了の場合 , 0 を返す。 [ 機能 ] 表示画面を att 「の色・属性にする (List 5 参 uprintv(;) 関数 ( 整理番号 : C M 900902 第 女を・指定座標への文字の書き込み [ 書式 ] #include く stdiO. h 〉 #include "upescape. h" キーの名前 shift 十 create キー shift 十 delete char キー shift 十 delete line キー select キー shift 十 end キー shift 十 clear line キー shift 十 exit キー shift 十 find キー shift 十 help キー shift 十 home キー shift 十 input キー shift 十厄負 a ow キー shift 十 m essage キ・一 shift 十 move キ・ - ー・ shift 十 next キー shift 十 options キー shift 十 prev キー shift 十 print キー shift 十「 edo キー shift 十 replace キー shift 十「 ight arrow キー shift 十 resu m e キー - shift 十 - save キー・ shift 十 suspend キー shift 十 undo キー suspend キー undO キー 0576 0577 0600 0601 0602 0603 0604 0605 0606 0607 0610 0611 0612 0613 0614 0615 0616 0617 0620 0621 0622 0623 0624 0625 0626 0627 0630 test. C List 1 1 : #define EXTERN 2 : 3 : # i nc 1 ud e く std i 0. h > 4 : # i nc 1 ud e く string. h> 5 : #include く curses. h> 6 : #include "fkey. h" 7 : #include menurd. h ” 8 : #include "upldwn. h" 9 : #include "upescape. h" 10 : #include ” C010r. h ” 1 2 : v 0 i d ma i n ( ) mn [ ] 14 : static struct Gmnstr ” , 32 , 4 , ” n i C h i ” 日次処理 ” , 32 , 4,"nichi ” 月次処理 ” , 32 , 8 , "getsu" { " 随時処理 ” , 32 , 12 , ' ' zu ー Z ー 20 : 21 : 22 : 23 : 24 : 25 : 26 : 28 : 29 : 30 : 32 : 33 : } 照 ) 。 1 ー - 1 ・よ 1 ・よ uprintv(str, attr, x, y, ura) char st 「ロ ; unsigned char attr int x, y, u 「 a [ 引数 ] str 口には , 表示する文字列を指定す attr には , 表示属性を指定する。指定に は , C010r. h て定義されている定数を用いる。 ない x, y には , それぞれ表示する画面の X 座 [ 戻り値 ] 標および Y 座標を指定する。 正常終了の場合 , 0 を返す。 ura は , ダミーの引数て特定の機能はもた 106 CMAGAZINE 19 10 initscr(); refresh() : PCLS; PCUROFF; utextkei(20,2,60,14,CSKY); uselbar(mn, CB し UE,CRED, 3 , I, の : PCURON; flushinp(); endwin(); ex i t ( の : [ 機能 ] 文字列 s 汁を画面の ( x , y ) の位置に , attr の 属性て表示する (List 6 参照 ) 。

4. 月刊 C MAGAZINE 1990年10月号

List 2 0 るなどの動作のたびに , すべてのキャラク タを再表示します。 MS ー DOS ては基本的に カーソルが表示されています。したがって , これは画面がちらついているというよりも , 表示のたびにカーソルがいっしょに動くの て、 , そのカーソルの残像 ( ? ) が見えている のて、す。 どうすればよいて、しようか。答えは簡単 て、すね。プログラムの最初て、カーソルを消 してしまえばよいのて、す ( List 2 の 124 行 ) 。 とはいえ , カーソルが消えたままプログラ ムが終了したら困りますのて , プログラム 終了時は , 消したカーソルをもとに戻すの を忘れないようにします (List 2 の 131 行 ) 。 カーソルの表示 / 非表示もマクロて、定義して います (List 2 の 25 行 ) 。 キーの取りこぼし さて最後の問題 , キーの取りこばしにつ いて考えてみましよう。関数 keyin( ) に問題 があるようて、す。佐伯さんのプログラムは , ① PC ー 9801 の ROM - 引 OS の呼び出しに よる押下されているキーのスキャン ② getch( ) を用いたキーの取得 の両方を使用しています。 getch ( ) は内部的 に MS-DOS のシステムコールて、キー取得処 理をします。 MS-DOS のシステムコールを 使用しないて、直接ハードウェアにアクセス したり , ROM ー BIOS をコールする方法 ( ① に相当 ) と , 標準ライプラリを経由して MS ー DOS のシステムコールを使用する方法 ( ② に相当 ) , それらを組み合わせる方法は以下 の問題点があります。 ( a ) ①では高速な処理は望めるが , ほか の機種への可搬性がなくなる ( 低くな ( b ) ②では高速な処理はあまり望めない ( c ) ①と②を組み合わせると , 内部的に 整合性が合わなくなることがある ラムは , 2 か所て、 getch( ) を使用しています 詳しい説明は省略しますが , 以上のよう のて、 , そこを変更しなければなりません。 な問題点の存在だけは覚えてください。さ ・の取得 こて、はリアルタイムな処理を実現す て , るために , キーの取り込みに関しては①の List 1 の 99 行て、固キーが押されたかどうか みを使うことにします。佐伯さんのプログ の処理を以下のように行っています。 146 CMAGAZINE 19 10 第 printf(ESC "[m") 28 : #define normal 29 : #define color (c) printf(ESC " C3%cm" 30 : #define reverse(c) printf(ESC " C4%cm" 32 : / * キーバッファクリア * / 0X502 ) , pokeb ( 0 , 0X528 , 0 ) ) 33 : #define clear_kbuf (poke ( 0 , 0X524 , 0X502 ) , poke(), 0X526 , 34 : 35 : i nt count; int a[WIDTH] : 36 : 37 : int keyscan(int l) 38 : 39 : 40 : union REGS reg; 42 : reg. h. ah ニ 0X04 ; (uns igned char•) l; 43 : reg. h. 引 int86 ( 0X18 , &reg, 44 : &reg) ; return(reg. h. (h) : 45 : 46 : } 48 : key in(V()l d) i n t 4 9 : 50 : 52 : 53 : 54 : 55 : 56 : 58 : } 97 : yoid change(void) 98 : { 99 : int 100 : 第 101 : d i s p (j) : for ( ・ 第 102 : switch(keyin()) 103 : ヨ 104 : 105 : 0 continue; case disp(-l);return, = 106 : case q07 : UP break, case 108 : DOWN : a [j]- break; case 、ミ 109 : LEFT ・ break,• case ミ 1 10 : R I GHT : j 十ト : break; case default continue; if (j くの 1 13 : i f (j > ニⅥ DTH) j = W IDTH i f (a Cj ] くの i f (a Cj] > 6 ) disp(j); 1 18 : 1 19 : } 120 : main(void) 121 : 122 : ヨ 123 : 124 : 1 2 5 : 鷲 1 26 : 第 128 : 朝 129 : 第 130 : - を 131 : ミ 132 : 133 : } 示 * ルラ マ一カ ノカ反 clear Kbuf; if (key.s し an(0x3) return(RET); & 0x 川 ) if (keyscan(0xc) & 0x01) ex i t ( 0 ) : if (keysca1i(0x7) & 0X04 ) return(UP) : if (keyscan(0x7) & 0X2 の return(l)()WN) : i f (keyscan(0x7) & 0X08 ) return()Æド T) : if (keyscan(0x7) & 0X10 ) return(RlGllT); rcturn(0) : c 1 s : cursor(0) : printf("auto_gamer rev. 0. 01 \ n " ) : for (count=l : ;count 十 + ) { change() : if (judge()) break; printf("Yn cursor(l) : return(0) : ー f i n i s h ー '*r') return(—l) : if (getch( ) 佐伯さんがなぜこのような記述をしてい るか理解に苦しみます。キー以外のキー は ROM-BIOS て、取得しているのに , キー だけな egetch( ) て、取得するのて、しようか ?

5. 月刊 C MAGAZINE 1990年10月号

List 1 OASYS の 1 行 40 字の文書て 12 行になること を意味している」 40X2 バイト X12 行 = 960 て、 , 1024 には ならないよ。 「実は OASYS の文書データは , 各行にヾイ トの「行情報」がある。それは文書の文字デ ータて、はないのてスキップしなければなら ない。それを 300 行てやっている。さらに 1 セクタの 1024 バイトのうち , 最後の 4 バイト は使用していないのて、 , これも 302 行てスキ ップしている。以上て、 , 計 1024 になるはず そして 215 行の fo 「文の中て , いよいよ各文 字 ( = 各 2 バイト ) の変換を行っている。 223 行から 229 行まては ASCII 半角文字の処理 , そして 230 行から 270 行まては , 0x2f て、始ま る , OASYS の特殊文字や制御文字の処理 ・ ' こての注意点は , MS ー DOS のテキス トファイルをテキストモードて、オープンし ているから , 改行は CRLF て、はなく , たんに という点だろう」 LF に変換すればよい , LF が , ディスクへは CRLF のレヾイトに 展開されて書き込まれるんだね , テキスト モードては。その理由は UNIX の世界にある 「そう。ばくも初心者のころは , CRLF が , メモリ上ては , たんに LF になることが不可 解だった。 ルーチンの最後の部分が , 特殊文字も含 む漢字コードの処理だね。最後に , 5 バイト や 4 バイトをスキップしていることの意味 は , さっきいったとおりだ e 「「 0 「 ( ) は , ディスク BIOS がエラーになっ たときの , e 「「 num 番のエラーメッセージを 表示するルーチンだ。 そして ,diskbiosl( ) がディスク BIOS をコ ' こだけインラ ールする汎用ルーチンさ。 インアセンプリて書いている。もちろん , intr( ) や int86x( ) などを使って , C だけて書け るけど , アセンプラて書くと , 引数とレジ スタとの対応関係が , 見た目にわかりやす bp へのロードを最後にしているのは , この連載の初めのほうて書いたドジにこり 320 : asm push es 321 : asm push bp 322 : asm mov ah, cmnd 323 : asm mov al, unit 324 : asm 田 ov bx, dtlen 325 : asm mov CI, cylno 326 : asm mov dh, headno 327 : asm 田 ov dl, funcval 328 : asm 田 OV Ch, Slen 329 : #if し DATA 330 : asm les bp. dtbuf 331 : #else 332 : asm push ax 333 : asm mov ax, dS 334 : asm mov es, aX 335 : asm mov bp, dtbuf 336 : asm pop ax 337 : #endi f 338 : asm int lbh 339 : asm pop bp 340 : asm pop es 341 : if(_AH & 0xf0) { 342 : error(_AH 〉 (4) : 343 : ex i t ( 2 ) : 344 : 345 : 346 : } 347 : 348 : / * 349 : 特殊文字の処理 350 : * / 351 : word tokushu(byte c2, byte cl) 352 : { 353 : regi ster word *tp; 354 : word tmp; 355 : tmp=charcat(c2, (l) : 356 : /*c2 is upper byte, cl is lower byte*/ if(c2==0x29 & & ( cl 〉 = 0X49 & & cl ← 0x5c ) ) 357 : / * 丸付き数字 * / 358 : return (0X8740 + charcat(c2, (l) ー 0X2949 ) : else if(c2==0x29 & & (cI>=0x5e & & cl ← 0X67 ) ) 359 : / * ローマ数字 * / return (0X8754 + charcat(c2, (l) ー 0X295e ) : 360 : else if ((tp=(word *)bsearch(&tmp, Tokushu. NofToku, 4. tcmp))==O) 361 : 362 : return ( の ; 363 : else return ( * ()p + I)) : 364 : 365 : } 366 : 367 : / * 368 : 比較ルーチン 369 : * / 370 : int tcmp (word *wl, word 2 ) 371 ・ if(*w1>*w2) 372 : return ( 1 ) : 373 : else if(*wl く *w2) 374 : return (-1) : 375 : 376 : return ( の : 377 : 378 : } 379 : 380 : / * 381 : 2 つのバイトの 2 バイト整数化 382 : * / 383 : word charcat(byte c0, byte cl) 384 : { register word iO; 385 : register word il; 386 : 387 : i0=c0; 388 : i 1 =c 1 : 389 : i0 く← 8 : 390 : return(i01iI); 391 : 392 : } 393 : 394 : ma in(int argc, char **argv) 395 : { 396 : char cyl, head' secno; 397 : FILE *ofile; 398 : word datlen: int X, y, convlen; 399 : 400 : if(argc>l) 401 : Kei-skip=I; 402 : e ー se 403 : Kei-sk ip=O; 404 : 405 : 406 : start: printf("Yn0ASYS 30AFII の文書ディスクを C: に .Yn") : 407 : / * ディスク BIOS コマンド・コード * / / * 装置・ドライプのコード * / / * 転送データ長 * / / * シリンダ ( トラック ) 番号 * / / * ヘッド番号 * / / * その他の引数 .. sector number*/ / * セクタ長コード * / / * if far data pointer model / * es : bp ニバッフア・アドレス * / /*SHIFT 引 S を返す * / 0 第 / * 特殊な検素作業等用に罫線もスキップする * / / * これは隠れコマンドである * / /*Kei-skip=l は Margin-iki=0 でなければ無意味 */ C 言語フォーラム 115

6. 月刊 C MAGAZINE 1990年10月号

uco ー 0 「 . C List 5 List 5 ワ 3 っ -4 ・ ^ 0 ー 8 0 CO っ 0 っっ 0 っ 0 っっっ -4 ・ 5 : PSKY ;break; case 6 : PYE しし OW ;break; case 7 : PWHITE ;break; case h ” upescape. 1 : #include 2 : 3 : ucolor(sx) 4 : Char SX 6 : unsigned char attr (unsigned char)sx 7 : attr 8 : 9 : if((attr & 0X02 ) ) { PB い NK; if((attr & 0X08 ) ) { PUNDER い NE; if( (attr & 0X04 ) ) { switch( (attr > > 5 ) 17 : 1 : PRB し UE ;break; case 2 : PRRED ;break; case 3 : PRPURP し E ;break,• case 20 : 4 : PRGREEN ;break; case 5 : PRSKY ;break,• case 22 : 6 : PRYEL し OW ;break; case 23 : 7 : PRWHITE ;break; case 24 : 25 : 26 : 28 : 29 : 30 : return( の : up 「 intv. C List 6 1 : # i nc lud e く StdiO. h> 2 : #include upescape. ド 3 : 4 : uprintv(str,attr, ura) 5 : unsigned char str ロ : 6 : char attr ; 7 : int x,y,ura; ucolor (attr) : 9 : P し 0CATE(x,y) : printf("%s", str) : PNONSET; return( の : else{ switch( (attr > > 5 ) case 1 : PB し UE ;break; case 2 : PRED : break : case 3 : PPURPLE •,break; case 4 : PGREEN : break : uscandir. C uselbarC 、関数 イ整理番号ー CM900904 ) 誉を . 、 第を、ト 1 ボックスカソルによる ~ メニュ選択 [ 書式 ] #include く stdio . h 〉 #include く string. h> #include "fkey. h" #include menurd . h ” #include "upldwn. h' #include ” COIO 「 . h ” List 7 1 : #define EXTERN extern 2 : #include く stdio. h> 3 : #include く string. h> 4 : #include く curses. h> 5 : #include "fkey. h" 6 : #include ” menurd. h ” 7 : #include "upldwn. h ” 8 : #include ” c 引 or. h ” 9 : 10 : uselbar(mn,color, rcolor, ー inenum, initl, ura) 1 1 : struct Gmnstr mn ロ : 12 : Char color,rcolor; 13 : i nt linenum, initl,ura; 14 : { 15 : i nt 16 : i nt *pluskey ニ 0 17 : int 1 8 : int selmod 19 : int zen : 20 : i nt mncnt int 22 : i nt dt 1 23 : 24 : Y 25 : for ( i 26 : linenum : 叩 rintv(mn[i]. moji,colorICNONSEC,mn[i]. x,mnCi]. y,ura); 28 : 29 : 30 : 31 : 32 : 33 : 34 : 35 : 36 : 38 : 39 : selbar(mn, CO ー 0 「 , 「 CO ー 0 「 , linenum, initl, ura) ロ ; st 「 uct Gmnstr mn Char CO ー 0 「 , 「 CO ー 0 「・ int linenum, initl, u ra , [ 引数 ] mn ロは , メニュー画面の表示内容のデ ータを収納する構造体てある。 colo 「は通常の表示色てあり , 「 colo 「はリ バース表示する場合の表示色てある。色の 指定方法は , 以下のとおりて、ある。 青 ( 1 * 0X20 十 1 ) , 赤 ( 2 * 0X20 十 1 ) , 108 CMAGAZINE 19 10 linenum : i n i tl uprintv(mn[y]. moji, rc010rlCREVERSElCNONSEC, mn[y]. x, mn[y]. y, ura) : do { zen uscand ir(pluskey) switch(ii){ case CUP: break : case SPACEB ・

7. 月刊 C MAGAZINE 1990年10月号

List 1 考書に出ているとおりに書いただけさ」 じゃあ , 次は , ルーチンを順に解説し てよ。 「 jis98( ) は , JIS 漢字コードのうち , PC ー 9800 シリーズが真面目に対応していない部分に 関しては 0 を返して , チェックするのだ。 れは , 関数てなくても , マクロてもよかっ たけどね。 jistosjis( ) は , たぶんこのプログラムて、 , もっとも頻繁にコールされる関数だろう。 JIS とシフト JIS の変換関数は , MS ー C などて、 は前から提供しているし , Turb0 C も 2.0 か ら標準ライプラリて提供している。 Turbo C 1.5 を使っていたころは , こうやって自作せ ざるを得なかったのさ」 なんだか , ややこしいアルゴリズムだ ね。 「そう。あまりキレイな変換規則て、はない ね。ただ , 事実上 , 両者がこういう関係に なっている , というだけのことだね。 conve 「 t( ) が変換実動ルーチンさ。引数の start には , 一部の例外的な場合以外は , 1 を 与えるんだ。だから 207 行の fo 「文は , セクタ 1 から 5 まて、を一度の実行て、変換することを 意味している。 OASYS の文書ディスクは , 1 セクタが 1024 バイトて , 1 トラックに 5 セク タあるからさ。 次の 208 行から 212 行まて、は , 0X40 がビッ シリ書き込まれた処女セクタは , 変換して も意味ないから , スキップする指示だ。 0X40 が最初から 4 バイトも連続していたら , 処女 セクタだろう , と判断している。ちなみに 0X4040 は , JIS コードては誓〃という字を 示している」 じゃあ , 冒頭に誓クの文字がたまた まふたっ続いているセクタは , 処女セクタ と見なされて , スキップされるわけだ。こ れはドジの一種じゃないの ? 「文書中にヾ誓クの文字がふたっ連続してい て , しかもその箇所がセクタの冒頭になる 確率は , 地球がプラックホールに吸い込ま れる確率よりも低い , と勝手に判断してる のさ。 214 行の f0 「文は , 1 セクタ 1024 バイトは ョョ ) ョ「ヨ ~ ョ〔ョョ ~ ョいョョョヨ一ヨーヨ「 ) ョ朝」 3 ョ【ヨヨーヨョ 232 : 233 : 234 : 235 : 236 : 237 : 238 : 239 : 240 : 241 : 242 : 243 : 244 : 245 : 246 : 247 : 248 : 249 : 250 : 251 : 252 : 253 : 254 : 255 : 256 : 257 : 258 : 259 : 260 : 261 : 262 : 263 : 264 : 265 : 266 : 267 : 268 : 269 : 270 : 271 : 272 : 273 : 274 : 275 : 276 : 277 : 278 : 279 : 280 : 281 : 282 : 283 : 284 : 285 : 286 : 287 : 288 : 289 : 290 : 291 : 292 : 293 : 294 : 295 : 296 : 297 : 298 : 299 : 300 : 301 : 302 : 303 : 304 : } 305 : 306 : / * 307 : ディスク田 OS 工ラー 308 : * / 309 : vo id error(int errnum) 310 : { 311 : printf("DISK_ERROR: XsYn" 312 : } 313 : 314 : / * 315 : 汎用ディスク田 OS ルーチン 316 : * / 317 : void diskbiosl(char cmnd. char unit. unsigned dtlen, char cylno, 318 : char headno, char funcval, char slen. char *dtbuf) 319 : { /* し F, CR is not needed.. * / *cvp 十十ニ0X0a: Count 十十 : /*because ofile i s text mode*/ if(j く (9) { oap + = 2 * ( 39 ー j ) : j ニ 39 : )else if(cl==0x23){ *CVP 十十 =OXOc; 十十 Count; if(j く 39){ oap + : 2 * ( 39 - j ) : j ニ 39 : }else if(cI==0x21) { /*EOF*/ end=l; }else if ( cl = 0X24 ) { /* し EFT MARGIN*/ if(Margin-iki== の /*skip margin*/ continue; se { *cvp + + =0x20;/*margin を SPACE 化 */ * cvp + + ニ 0X20 : Count + ニ2: )else if(c1==0x25) { /*RIGHT MARGIN*/ if(Margin-iki== の cont i nue : else{ * cvp + + ニ 0x0a : / * し F. CR is not needed*/ / *... because ofile is text*/ Count 十十 : if(j く (9) { oap + = 2 * ( 39 ー j ) : j : 39 : )else{ * cvp + + : 0X20 ; * cvp + + = 0X20 : Co し nt + ニ 2 : }else if((J1(c2) & & J2(cI)) & & jis98(c2, cl)){ / * 漢字 * / data=j istosj is(c2. (l) : c0=data>>8; c1=data&0x00ff; *cvp 十十 =co; *cvp 十十 =cl : Count + ニ2: }else if((data=tokushu(c2. (l)) ! = の { / * 対応可能特殊文字 * / if(Kei_skip & & (data>=Ox86a2 & & data くニ0X86ed)) continue : else{ c0=data 〉 >8 : cl=data&0x00ff : *CVP 十十 =co; *cvp 十十 : Count + :2: / * その他制御文字ニ SPACE に置換 * / }else{ if(Kei-skip) continue : else{ * cvp + + : 0X20 : * cvp + + ニ 0X20 : Count + =2 : / * 対応不可能 : SPACE に置換 * / oap 十ニ 5 : oap 十 = 4 : /*non-text last 5 of a line*/ /*unused last 4 of a sector*/ errmsg[errnum] ) : 114 CMAGAZINE 19 10

8. 月刊 C MAGAZINE 1990年10月号

C のベス N ト - ・ソースコード付属 / 組み込みロイヤルティ無料・ The C Libraries CCF / 総合コンソールコシトロールライプラ 価格 \ 59 を 800 CCFÄEX 価格 \ 98 ′ 000 ◆ TCCF/EXJ では XL 、 XL2 、 RL の八イレゾリューション / ノーマルの両モードに対応し、 キーボード、テキスト画面、クラフィック、マウス、ウインドウ、メニュー、プリンタ、拡張 一部の関数を除いて、どちらのモードでも動作するプログラムを開発することがてきます。 プリンタ関数 ( 抜粋 ) 関数等 200 以上の関数で構成される総合コンソールコントロルライプラリです。 "CG 「 aphic & MouseJv tWindow & MenLIJ 、 CKey & Dis ay 』とプリンタ関数、拡張関数て構 文字出力 / プリンタステータスの取得 / プリンタの初期化 / プリンタステータスの取得 / C 日、 成されています。 LF 出力 / 漢字文字出力 / ANK 文字列出力 / 漢字、 ANK 文字列印字 / 漢字、 ANK 文字列印 字 (ANK— > 半角変換 / 漢字 / ANK 文字列縦印字 ( ANK ー > 半角変換レプリンタのリセット ■「 G 「 a ロ c & MouseJs CWindow & MenLJJs CKey & DisplaYz については各製 品の説明をこ覧ください。ープリンタ関数は日 OS を介してプリンタに文字コード、制御コ /SELECT 、 DESELECT の切り替え / ドラフトモードの設定、解除 / 片方向、両方向の ード送り、各種アルファベットの文字印字、拡大、キャラクタモードの切り替え、フォームフ 切り替え / 改行方向の切り替え / テータのキャンセル / フォームフィード / n / 120 インチ改行 ィード、プリンタ状態の設定 / 検査、印字方向の切り替え、サプスクリプト / スーバースクリ に設定 / 1 / 6 インチ改行設定 / 1 / 8 インチ改行設定 / n 回改行 / 漢字モード設定 / 解除 / ANK モ プト文字の印字、縦印字、強調、アンダーライン、ドラフトモードの切り替え、左右マージン ードの選択、設定 /HS PIOA モード設定 /Condense モード設定 /Elite モード設定 / の設定、改行幅 / 方向の切り替え、ソフトウェアリセット等の処理を行うことができます。対 P 「 0 ロ 0 「 tion モード設定 / 拡大倍率の設定 / 強調モード設定、解除 / アンダーラインモー い 応プリンタは PC - P 日系てす。・拡張関数は MS - DOS ファンクションコールを用いたキー ド設定、解除 / 漢字縦モード設定、解除 / 漢字印字幅の変更 / 横倍角印字モード設定、解除 / 入力関数、文字列処理関数、 y ( es ) / n ( 0 ) の入力を促し、 Shift 、カナシフト、全角、半角 1 バイト文字印字モードの変更 / スクリプトモードの設定、解除 / 漢字半角モードの変更 / ド のいずれの状態ても y / n を判断する関数等があります。 ットスペースの出力 / 左、右マージンの設定 Window & Menu 価格 \ 29 ′ 800 Window & Menu/EX 価格 \ 49 ′ 800 ームキャラクタ、フレーム色、ウインドウ内の表示色の設定が可能てす。この機能により、好 テキストウインドウ、メニュー関数のライプラリバッケージ。最近のちょっとしたソフトでは みの色、キャラクタを用いたウインドウを定義可能・横長タイプ、縦長タイプ、羅列タイプ 大抵ウインドウ機能を備えています。例えばスクリーンエテイタでは画面を分割し 2 つ以上の の 3 タイプのメニューウインドウにより、用途に応したメニュー表示が可能・サンプルプロ ウインドウを開いて編集できるとか、テータベース、業務用ソフト等では簡単な説明や操作ガ グラムメニューウインドウにファイル一覧を表示し、選択されたファイル内容を上下左右ス イドをへルプウインドウを開いて表示したりしています。このような表示を行うためのマルチ クロール機能を持った文字列表示関数により、スクロール表示をおこなうサンプルプログラム ウインドウ機能とウインドウを利用したメニュー選択機能を提供します。 か付属。 CWindow & Menu/Ek は XL 、 X ピ、日 L のハイレゾリューション / ノーマルの両モー 次の関数の他、 CKey & DispIayJ の * 印か付いている関数も加わります。 い ドに対応し、互換モード ( 自動判別 ) によりどちらのモードでも動作するプログラムを開発する 関数 ( 抜粋 ) ことができます。また、八イレゾリューションモード時には 31 行 / 25 行モードを選択すること ウインドウの初期化、終了処理、オープン、クローズ / すべてのウインドウをクローズする / ができます。 表示対象となっているウインドウをクローズする / 表示対象ウインドウを別のウインドウに切 ■ウインドウ / メニューウインドウあわせて 20 個まてのウインドウがオープンできる ( 増減可 替える / ウインドウの移動 / ウインドウ内をプランク文字て消去 / ウインドウ内に文字を表示 能 ) ・オーバーラップ / 切り替え機能オーバーラップにより隠れたウインドウを一番上に表 / 上へスクロールし、文字列を表示 / 下へスクロールし、文字列を表示 / ウインドウを上、下 示■移動機能ウインドウを指定された座標へ移動■文字列表示行を指定する関数と、 にスクロール / ウインドウのフレームタイプを登録 / 文字列を指定行表示 / ウインドウ内に文 上下スクロールを伴った文字列表示機能がある・スクロールスクロール関数と、文字列表 字列を表示し、キー入力によりテキストをスクロール / ウインドウを開き、ツ・または・ n ・キーを 示を伴った上下スクロール機能がある一 V 日 AM をアクセスしてウインドウ操作を行っている 入力を促す / 水平メニューウインドウをオープン / 表示し、選択を行う / ポップアップメニュ ので高速。ウインドウの切り替えもほほ瞬時・ウインドウを開き、 y(es) 、 n ( 0 ) の入力を ーウインドウをオープン / 表示し、選択を行う / ワイドメニューウインドウをオープン / 表示 促す関数と上下左右スクロール機能を持った文字列表示関数によるテキストファイル等のスク し、選択を行う / H. ハイレゾリューション / ノーマルモード、 25 / 31 行モードの設定を行う ( H. ロール表示が可能な拡張ウインドウ機能■カスタマイズド・ウインドウウインドウのフレ マークが付いている機能はハイレソモードでのみ使用可能 ) Graphic & Mouse 鑿価格 \ 29 ′ 800 Graphic & Mouse/EX 価格 \ 59 00 ◆ CG 「 aphic & Mouse/EX' では XL 、 XL2 、日 L のハイレゾリューション / ノーマルの N88BA C 相当のグラフィック機能とマウス機能を提供するライフラリバッケージです。 両モードに対応しており、どちらのモードでも動作する互換モード ( 自動判別 ) もあります。 グラフィック機能はグラフィック画面に点、線、四方形、円、文字等を描画する機能、指定領 関数 ( 抜粋 ) 域を切り出す / 貼り戻す等の機能と表示モードの設定を行う制御機能で構成されています。 画面のモード設定 / 表示範囲の設定 / 画面色の設定 / バレットの設定 / グラフィック、テキス マウス関数にはマウスカーソルの表示 / 非表示、色指定、ボタンの押下状態の検査、移動範囲 ト画面消去 / ドットセット、リセット / 直線、円、円弧の描画 / ペイント / タイルバターンに の指定、移動距離の検査等の関数があります。 よる塗りつぶし / 描画情報の取得、貼り戻し / スクロール / ドットのバレットコードの検査 / ー N88 日 AS ℃相当のグラフィック関数を提供・高速グラフィック関数高速線分描画、高 ハードコピー / 表示範囲の検査 / 日本語全角文字列描画 / 半角を含む日本語文字列描画 / H. 速連続線分描画、高速円描画、グラフィック画面への文字表示関数を備えています。 ( ノーマル 互換モード設定 / H. 簡易スタート処理 / N. ドットバターンの描画 / N. 円描画 / N. 線 / 四辺形 モードのみ ) これらの関数はすべて日 EPLACE / CLEA 日 / 0 日 / XO 日の 4 つの描画モ 描画 / N. 連続線描画 / マウスカーソルの表示、消去、座標を取得、設定 / 左、右ホタンの押下情報 ードのいずれかを選択指定することができます。 (fline, flines. fci 「 cle, g—cha 「 ) ・マ の取得 / カーソル移動範囲の設定 / カーソルの形状、色の設定 / 移動量の取得 / ミッキー、ドット 1 比の設定 ( N. はノーマルモード、 H. は八イレゾリューションモードのそれぞれ専用関数です ) ウス関数 RS ー 232C ライプラリ ~ 価格 \ 49 ′ 800 RS ー 232C ライフラリ / EX 価格 \ 9 側 0 間関係関数、および簡易ターミナルエミュレータ、 XMODEM 送受信プログラム等がサンプ 本製品は C 言語から日 S ー 232C インターフェースを介して、各種周辺装置、コンピュータ等と ルプログラムとして提供されています。製品にはテパイスドライバを含むすべてのソースコ コミュニケーションをとるためのライブラリです。 ドか含まれています。 バッケージには日 OS を呼び出して行っている「日 S -232C ライプラリムこれに 9861K 用とマ ・用途 / 回線数によって使い分けのてきる 3 種類のライプラリ (EX) を装備。■マルチサー ルチサーバ用テパイスドライバ版を追加拡張した「日 S -232C ライプラリ / EX 」の 2 種類があり、 バホードを装着することにより 9 回線までサホート可能 (EX) ・「日 S -232C ライプラリーで 呼び出し方法は共通になっています。 は "Ve 「、 3.1 以上かっ型番が PS98-12 た ? ? ? 以降の MS - DOS でなければならない - という 「日 S -232C ライプラリ」は主に OS を呼び出して、日 S -232C のコントロール、送受信を行 制限があります。 っています。もちろん、 2 、 3 回線もサポートしています。 関数 ( 抜粋 ) 「日 S -232C ライプラリ / EX 」では日 OS 呼び出し版の他に、使用環境に制限がなく本体はテ ・共通回線の選択、初期化 / 受信バッフア内テータ長の検出 / 受信バッフア内のテータを得 バイスドライバ化され、インターフェースライプラリを介して呼び出すテパイスドライバ版と る / 1 文字出力 / 8251 にコマンドを送る / 8251 ステータスを得る / 送信レティ状態の検査 / キ マルチサーバ対応のテパイスドライバが拡張されています。また、各ライプラリ特有の関数 ( ー ャリアティテクトの検出 / 日 S -232C インターフェースのリセット / 文字列入力 / 文字列出力 部 ) を除いて上位関数の入口名、引数は共通なので、リンクするライフラリファイルを変更す / 1 文字受信 / 1 文字送信 / 漢字処理を伴うデータ送信 / モテムの初期化、接続、自動発信 るだけで切り替えることがてきます。この他、オートダイアル / モテムコントロール関数、時 ■ EX 専用プロック受信 / プロック送信 / 八ンドルのクローズ

9. 月刊 C MAGAZINE 1990年10月号

GM / クラフ作成プロクラム BGM/EX 価格 \ 98 ′ 80 、価格 \ 148 ′ 000 ぃ 引 い 叮 い 面に表示可能 25 行目に文字列を表示してもスクロールしてしまうことはありません・裏ートから箱型の文字列をコピー、移動 / * テキストから箱型に文字属性を取得、貼り戻し / * カー ・ CCF / 総合コンソールコントロールライプラリ fo 「 FORTRAN 12 種類のグラフ作成機能を提供するパッケーシです例えば、必要なバラメータを設定し、関 数を呼び出すだけで円グラフや棒グラフを簡単に描画することができます。さらに、タイルバ ターン、ラインバターンとの対応、日本語コード文字列をグラフィック画面に表示する機能を サポートしているので、ビジネスアプリケーションて必要とされるあらゆるクラフ情報を表現 できます。 ・必要なバラメータを設定し、関数を呼び出すだけで簡単にグラフを描画できます。サンプル プロクラムを見ればすぐ理解できます。円グラフの例 cg(vlist,vont,cx, cy, 「 . scalel, scale 2 ) 3 ・粍種類のグラフ作成機能・描画位置、大きさを好みに合わせて描画できる ーサポート関数を用意タイル / ヾターン ( 塗りつぶしバターン ) 、ラインバターンの一覧を表示 する関数により、例えばタイルノヾターンとその内容 ( 例えば“商品名” ) との対応を簡単に表示 0 きます。ーー多彩な表現か可能円グラフ、ドーナツッグラスパイチャート、帯グラフでは ー。 % または数値の表示 / 非表示の選択か可能、縦棒グラフ、横棒グラフ、折線クラフではスケー ルの表示 / 非表示の選択が可能、タイルバターン、ラインバターンと表示色の組み合わせ、ボ ーダーカラー ( 円、棒等の外枠の色 ) 、スケールカラー、 % または数値の表示色の指定か可能な ため、多彩な表現が可能です。ーすぐ使える、拡張もできる 24 種類のタイルバターン、 10 種類のラインバターンを登録済み、さらにユーザー登録も可能・八一ドコピーグラフィッ ク画面、テキスト画面、グラフィック画面とテキスト画面の重ね合わせが可能。日本語コード (Shift-Jis: 全角、半角、 1 / 4 角 ) 文字列をグラフィック画面に表示できるので、カイドメ ッセージ等をテキスト画面に表示したままの状態でもクラフィック画面だけのハードコピーを 印刷することかできます。 ◆ CBGM/E& では XLSD XL2 、日 L のハイレゾリューション / ノーマルの両モードに対応し ており、さらにどちらのモードでも動作する互換モード ( 自動判別 ) もあります。 以下の関数に「 G 「 a ロ hic & Mouse 』または「 G 「 a ロ h に & Mouse / EX 」の一部の関数が Key & Display 価格 \ 29 を 800 Key & Dis ay はソフト開発で欠かせないファンクションキー及び ANK 、漢字の入力、 V 日 AM を直接アクセスしての文字表示等 100 を越える関数で構成されています。ファンクション キー自身には一切特別な値や文字列を設定せすに、 B 旧 S レベルの処理で行っているため、ど のレベルの関数ても同し処理てファンクションキーの取得も可能です。また、 V 日 AM を直接 アクセスして表示するので 25 行目に文字列を表示してもスクロールしてしまうことはなく、す べての 1 バイトキャラクターコード ( 0X01 ー 0Xf7 ) を表示することがてきます。文字表示、文 字属性の設定 ( 色 / 属性 ) 、 V 日 AM 上の指定領域を切取り、貼り戻し、表 / 裏画面の切り替え 表示、全画面 / 部分スクロール、ファンクションキー表示等の機能を持っています。 ■キー入力ファンクションキー及び ANK, 漢字の入力。ファンクションキーと SH ー FT 、 CT 日 L キー等のシフトキーとの組合せで、別のキーコードを得ることもてきます。■日本語 入力フロントエンドプロセッサ ( FEP ) のコントロール日本語入力 FEP の ON / OFF 、入 カモードの切り替え等のコントロールかできます。対象となる日本語入力 FEP は ATOK4 5 / 6 / 7 ( 6 モート ) 、 VJE - / 爲です。・漢字の入力は FEP 等を介して行なわれ、 2 八イト で返されます。・ V 日 AM を直接アクセスして文字表示を行っているので非常に高速です。 すべての 1 バイトキャラクターコード ( 0X01 ー 0Xf7 ) を表示することかてきます。・全画 画面を有効に利用できる表 / 裏画面を切り替えて表示選択できるのてスピードアップ、 VR AM の有効利用が可能てす。・画面の指定領域を切取ったり / 貼り戻したりか簡単にできま ーすい・画面上に表示されている内容をそのままファイルにセープしたり、ファイルにセープ ーざれた画面内容を再表示することが可能です。セープ / ロードする領域を指定することができ るので全画面 / 部分のどちらも可能です。・すべての文字属性 ( シークレット、プリンク、リ バース、アンダーライン、一バーチカルライン、色指定 ) を画面上の指定領域に対して設定できる ので表現力豊かな画面表示か可能です。ー多彩な画面操作機能を装備画面上の指定領域に 対する文字 / 文字属性のコピー、移動、消去を行う関数が用意されています。・画面上の指 いー一定領域に対する上下左右スクロール機能により、全画面 / 部分のスクロールが可能ぐす。ーー・ 含まれます。 ンの作成 ーダチャート / ラインバターンリストの表示 / タイルバターンリストの表示 / タイルバター み重ね ) / 縦棒グラフ / 縦棒グラフ ( 複数 ) / 縦棒グラフ ( 積み重ね ) / 帯グラフ / 折線グラフ / レ 円グラフ / ドーナツッグラフ / バイチャート / 横棒グラフ / 横棒グラフ ( 複数 ) / 横棒グラフ ( 積 EX 」ても提供 ) ノーマルモードてのみ使用可能。 * は fWindow & MenuJ および TWindow & Menu/ 変更 / スクロールし、文字列を表示 / * 上、下、左、右スクロール ( 日本語入力 FEP 制御関数は 得 / カーソルプリンク、表示の ON 、 OFF/* テキストの切り替え / C 日 T のモードの検査、 置に文字列を直接表示 / * 表示文字が漢字か否かの検査 / テキストの文字、文字列コードの取 に ASCII 、全角、文字列を直接表示 / 指定されたバイト数分文字列を表示 / 現在のカーソル位 部分、文字単位ての消去 / ファンクションキー表示の退避、再設定、表示、消去 / * テキスト 左右に移動 / カーソルホームボジションを設定 / カーソルをホームホジションへ移動 / 全部、 ソルを指定座標に移動 / * カーソル座標の取得 / カーソルを移動範囲内で移動 / 力ソルを上下 接入力 / * テキストを箱型に消去 / * テキストの指定範囲のイメージの取得、貼り戻し / テキス キーを 2 バイトコードで返すキー入力 / 全角、 ANK 文字キー入力 / * ファンクションキーの直 ATOK 、 VJE のコントロール / ファンクションキーの退避、設定 / * 漢字、ファンクション 関数 ( 抜粋 ) プ / リストア / 設定 / 消去 etc ・ ルの表示 / 非表示切り替え、カーソルプリンクの ON / OFF 、ファンクションキー表示のセー 指定文字 / 文字属性による V 日 AM の消去関数、指定座標から n 文字を消去する関数、カーソ 動範囲を一定領域に限定する関数も用意しました。■まだまだある、こんな機能、こんな関数 動位置が漢字の 2 バイト目の場合はスキップし、次の位置へ移動する関数群です。カーソル移 動関数群を用意しました。この関数群は移動位置が漢字の 2 バイト目か否かの検査を行い、移 移動、カーソル位置取得機能はもちろん、表示文字列のコード識別機能を使用したカーソル移 限定機能により、多彩なカーソルワークか可能になりました。通常の上下左右移動、座標指定 ます。■カーソルコントロールシステム 2 種類のカーソル移動関数群とカーソル移動範囲 また漢字の 2 バイト目か等の識別機能により、現在表示されている文字を検査することかてき し ASCll/Shift-Jis コートへの変換が可能てす。・指定座標の表示文字が漢字か否か、 現在表示されているすべての 1 バイトキャラクタコード / 漢字の文字列を V 日 AM から取り出 フィールドリファレンス番号によって指定されたフィールドの総計を得る ースの内容を出力テパイスに書き出す / 関連テータベースと管理データベースを関連付ける / レコードをシーケンシャルに読む / レコードバッフア内のレコードを n 番目とする / テータベ ンする•[extended] レコードかプランクかどうか調べる / メモリバッフアに入るだけの と拡張子を結合する / ファイル名から拡張子、ティレクトリ名を取り除くノファイルをオープ ァイル名を探す / セクションのロック、解除 / ファイル名に適した文字か調べる / ファイル名 報を書き出す / メモフィールドを読む、テータが存在するか調べる E[utility] 次の該当フ ックの解除■ [memo] 内部的にテータが格納されているかを検査 / メモファイルにある情 し直す / キーをサーチ / ポインタを先頭へ設定 / インテックスファイルの型を文字で返す / ロ ポインタを最後尾に移動、指定キーに設定 / ファイルリファレンス番号の取得 / インテックス ンデックスファイルを作成、オープン、クローズ、ロック、ロックの解除、選択キーの追加 / 値フィールドの値を dou e 得る / 指定フィールドのバイト数の取得 U[index file] イ 番号の取得 / 論理フィールドが T 日 LJE か FALSE かの検査 / 指定フィールドの型の取得 / 数 アの先頭ポインタの取得 / レコードバッフア内の文字の総数の取得 / フィールドリファレンス の取得 / フィールド名の取得 / カレントテータベースのフィールド数の取得 / レコードバッフ る / 演算子の優先順位の取得■ [fieIdJ 1 ロ進数の桁数の取得 / フィールドリファレンス番号 Cexepression] dBASE の式を評価し、結果を得る / d 日 ASE の式を中間コンバイルす タベースを選択後、ロックする / レコードを書き出す / 指定された範囲のレコードの削除・ ・走行環境等 1 CodeBase4 価格 \ 98 を 000 い い CodeBase4 は C 言語から dBASEIII 、 dBASEIIIPIus 、 dBASEIV 、 C ⅱ P ロ e 「のファ イルシステム ( テータベース、インテックス、メモ ) とコンバチプルなテータベースライフラリ です。これらのテータベース言語にコンバチプルな関数を用意しているので d 日 ASE Ⅲ / us からの移植も簡単にてきます。 dBASE ルと比較してデータアクセスは 5 倍速く、ループでは なんと 330 倍も速くなります。 ・高速処理■最大 1 , 022 フィールド、 2 , 000.000 , 000 レコード ( 論理値 ) ■メモリモテル S ( 一部機能が限定 ) / M / L ■ 2.000 行程度のソースプログラムで 100kb 程度の . exe ファイル を作成可能■マルチューサー対応ー PC -9800 シリーズではテータベースライプラリで漢字 の使用は可能■旧 M - PC 版てはウインドウ、メニュー関数も付属■英文マニュアル◆対 応 C 言語 : Mic 「 osoft-C 4.0 / 5.1 または Tu 「 bo - C2.0 関数 ( 抜粋 ) ・ [ ock ] プロックキーを追加、削除 / フロックを検索 / キー番号のスキップ•cconve 「 sion] 指定長の ASC 文字列を dou e / int / ng に変換 ECdatabase] データ べースファイルの作成、オープン、選択 / 指定レコードに削除マークを付加 / 削除マークが付 加されているかの検査 / レコードを読む / ロック / 削除マーク付きのレコードを削除 / レコー ド数、番号の取得 / 参照番号の取得 / テータベースの選択 / インテックスファイル内の先頭レ コードを読む / カレントテータベースのロックの解除 / データベースのオープン、選択 / テー ・まだまだあるこんなライプラリ ・ CIisp 7AX-WINDOW BFMR-WINDOW EFMR-GRAPHIC ・ Ptree & Symtab お求め方・ ) 去 ー Lisp ライク関数ライプラリー ー AX マシン用テキストウインドウ / メニューライプラリー価格 \ 98 ′ 000 ー FMR - 50 / 60 用テキストウインドウ / メニューライプラリー ー FMR - 50 用グラフィックライプラリー ー構文解析 / シンポルテーカレモジュールー 価格 \ 79 ′ 800 価格 \ 69 ′ 800 価格 \ 98 ′ 000 価格 \ 98 ′ 000 価格 \ 98 ′ 000 ・お近くのパソコンソフト取扱店または弊社までこ注文ください。 ※すべての表示価格には消費税は含まれておりません。 クイック資米斗イ寸サ - ーピス ・いますく、資料をこ希望の方はお電話ください。 ・こ注文の際に製品名、対象コンバイラ ( ウアージョン ) 、メティアを指定してください。 FAX で資料をお送りいたしま魂 ・ NEC PC -9800 シリーズ ( LT 、八イレゾ リューションモードを除く ) tCCF/EXJs CBGM/EXA CG 「 aphic & Mouse/EXJs tWindow & Menu / EX 』は XL 、 XL2 、日 L のノ、イレゾリューシ ョン / ノーマルの両モードに対応。 ・ MS-DOS ・・ Ve 「 sion 2 Ⅲ / 3.1 / 3.3 ・対象 C 言語・・ Mic 「 osoft-C 4.0 / 5.1 Quick-C 1 . 1 / 2.0 Lattice-C 3.1 / 4.0 Tu 「 bO-C 2.0 ・・・ 5 ″ 2HD 、 3.5 ″ 2HD 、 5 ″ 2D ( 旧 M - PC フォーマント ) ・メティア ・機種 ・ PHONE 03 ー 866 ー 8635 ・ FAX 03 ー 866 ー 8637 ・〒 1 1 1 東京都台東区蔵前 2 ー 8 ー 10 ゾま株式会社ティッフス

10. 月刊 C MAGAZINE 1990年10月号

学 五ロ す。 eval exp が式の評価ルーチンのドライバ す。簡単なものて、しよう。 NULL ても空白て、もない文字があること て、す。工ラー処理のために setjmp を呼び出 ところて long p がどこて出てくるかというと , 関 がわかると , 数字かどうかをチェックしま 数引 ement の中の処理て、す。 element が期待 しています。 setjmp の呼び出しから戻って す。ヾ 0 〃て、はじまっているときには続く文 きたとき ( リターン値が 0 のとき ) には , 式を している入力は , W(" あるいは N U M BER, つまり数値て、す。どちらて、もない場合には 評価するために exp 「 ession を呼び出しま 字が、、 x 〃または、、 X クかを調べて , そうな す。 expression が返してくるのは式を評価 らば 16 進数として処理します。それ以外は すなわち工ラーて、すから , この default の処 理て >longjmp します。それだけて、はなく した値てすから , それを「 esu はが指すオプジ 8 進数てす。最初の数字が、、 0 〃て、ない場合 てはじまった式は、アて、閉じていなければ ェクトに代入します。この時点ては文字列 はその数値は 10 進数て、す。 さて , 最後に数字て、はない場合て、すが , 中のすべてのトークンの処理が終了してい なりませんのて、 , 正しくカッコがバランス このときには入力された文字はそのまま返 るはずてす。そのエラーチェックのために していないときにålongjmp します。 します。演算子やカッコは今回は幸いにし get_token を呼び出しています。 0 以外が返 リストの最後にある main はデバッグのた てすべて 1 文字て、すから , 特別な処理は何も ってきたときには何かが文字列のなかに残 めに加えました。コマンドラインて、入力し 必要ありません。 っていたということて、すからエラーにします。 た式を評価してその結果をプリントするだ こてはエラーの検出はしません。工ラ longjmp から戻ってきたとき (setjmp けのものて、す。コンパイル時に一 DDEBUG と ーは構文解析部が処理します。 ( Env ) ! = O ) には式の解析てエラーを検出した いうオプションをつけると , この main もコ のてすから何も考える必要はなく , 工ラー ンパイルされます。 構文解析 を報告するだけて、す。 付録のディスク ( 今月はちゃんとついてる んだろうなあ ; ) には , インプリメント 字句解析 構文解析部は List 7 の構文をそのまま素直 例 (evaIexp2. c) がもうひとつ収載されていま にコーディングします。それぞれの非終端 す。こちらのほうは , 「どうせトークンをひ 記号に対応する関数を用意します。 字句解析は入力された文字の流れをひと とつブッシュバックしなくてはいけないの 構文解析のための関数は exp 「 ession , まとまりのトークンに分解します。つまり , なら , 最初から 1 トークンだけ先読みしとけ term(List 7 て、は terminalC 相当します。プ こて入力された文字から数値や演算子を ばよいて、はないか」バージョンて、す oevalexp. ログラムを作るときに te 「 min 引にしなかった 取り出します。 c と読み比べてみるのもおもしろいて、しょ のは失敗て、した ) , factor, element とありま 数値としては C の言語仕様と同じく , 1 ~ 9 すが , exp 「 ession を例にしてその動作を説 て、はじまる 10 進数 , 0 て、はじまる 8 進数 , 0x 明します。 まとめ または 0X て、はじまる 16 進数をサポートして List 7 からもわかるように ,expression に います。ただしオーパフローしてしまった は少なくともひとつは te 「 min 引があるはずて、 setjmp/longjmp は複雑にネストした処理 場合には下位 16 ビットだけが有効てす ( MS ー す。そのため , まず te 「 m を呼び出してその の途中て、エラーを検出したときに , それま DOS 上のコンパイラの場合。なぜなら int て、 値を va に代入します。 て、の処理をご破算にして一気に上位レベル 処理をしているから ) 。これを long にすれ 次に , get_token を呼び出すことによっ の関数に戻るときに使います。とくに関数 ば , 32 ビット長の値をあっかうことがてき て , 十〃あるいは、、 〃の処理をします。 のネストが深いときなどには便利に使えま るようになります。 入力されたトークンがこれらのうちのいず す。使用上の注意をよくお読みになったう get token が字句解析関数て、す。 get れかだったときには , te 「 m を呼び出すこと えて、ご使用ください t0ken は , まずブッシュバックされたトーク によって得られた結果と val を加算あるいは ンがあるかどうかを調べます。構文解析部 減算してその結果をリターンします。 末筆になりまたが , よい飲み友達 ( ごめ は読みすぎたトークンをひとつだけブッシ 十〃ても クてもなかったときには ュバックすることがあります。このブッシ んなさい , て、もほんとうにそういう感覚て、 この関数ては処理てきません。これはトー ュノヾックを実行する関数が back token< した。とても優しくしていただきましたし ) クンをひとつ読みすぎたということてすか す。戻されたトークンは外部変数 Back token だった菊池孝編集長が急逝されてしまった ら , back token を使うことによって「まだ読 に保存しておきます。 ことは , 本当に残念てしかたがありません。 んてないの」というフリをします。 次に文字列が終了しているかどうかを調 今後もばくたちを見守っていてください この構文解析て、は基本的にこのような方 べます。ヾ \ 0 〃に出会ったときにはその NULL 法て、 List 7 をそのままコーディングしていま 文字を返すことによって疑似 EOF を示しま C 言語雑学講座 131