| ||||||||||
| MINERVA superseeded IF/Prolog.
Please see
http://www.ifcomputer.co.jp/MINERVA
for details.
We discontinued to sell IF/Prolog Dec 31. 2003. For current customers, we continue to provide professional support for IF/Prolog until Dec 31, 2008. 異なるまたはより複雑な媒体に対応する新しいストリーム・クラスは、Cプログラミング・インタフェースを使って直接に定義できます。新しいストリーム・クラス定義の仕方を理解するために、ここでは、既存のストリーム定義であるファイルを簡単にしたものを説明します。この例に関するソースファイルは$PROROOT/demos/stream/fileディレクトリの下にありますので参照して下さい。 例を単純化するため、ファイルの定義を簡単にしています。以下に示すプログラムはすべてファイルfile.cに書かれています。 ユーザー定義のストリーム・クラスは、C関数svInstall()を使ってインストールします:
Cboot() { svInstall(ioSERVER *server); } ここで、serverとは新しいストリーム・クラスを記述する構造体へのポインターです。各ストリーム定義とIF/Prologとのインタフェースはインクルード・ファイルio.hで定義されているデータ構造ioSERVERを通してなされます。新しいストリーム定義では必ずgetとput及び制御に関する動作を定義しなければなりません。こうすることによって、PrologのI/O述語から操作できるようになります。 ストリーム・クラスで定義されている関数は、次のようにioCNTLとioSERVERという二つのデータ構造を通してIF/Prologの述語からアクセスできます。 static ioCNTL fileTable[] = { { "at_eof", 1, 1, fileError }, { (char*)0 } } ; static ioSERVER fileServer = { "file_stream", fileTable, fileOpen, fileClose, fileStop, filePut, fileGet, fileEof, fileFlush } ; ioSERVERの宣言はIF/Prologとの総称的なストリーム・インタフェースを提供するもので、すべてのストリーム定義に使用します。定義するべき操作はopen、close、stop、put、get、eof、flushです。 ioCNTLの宣言により、I/Oを含まない他の操作を可能にします。ここで扱う例では、ストリームがEOFにあるかどうかを検査する簡単なテストを提供します。 次に、file_streamを開いたり閉じたりするためのCのコードを示します。ここではストリームを入力または出力のどちらかで開けるようにしています: static STREAM fileOpen(name, mode) char *name; int mode; { switch (mode) { case IO_INPUT: return (STREAM)fopen(name,"r"); break; case IO_OUTPUT: return (STREAM)fopen(name,"w"); break; default: return (STREAM)0; } } static int fileClose(s) ioUNIT *s; { fclose((FILE*)s->stream); return 1; } GetとputのためのCのコードではCのファイルI/O関数getcとputcを使います: static int fileGet(s) ioUNIT *s; { return getc((FILE*)s->stream); } static int filePut(s,c) ioUNIT *s; int c; { putc(c, (FILE*)s->stream); return 1; } いつEOFになったかをチェックするためのCの手続きもCのファイルI/O関数を使用します: static int fileEof(s) ioUNIT *s; { return feof((FILE*)s->stream); } ストリームはデータをフラッシュすることもできますが、これも、CのファイルI/O関数を用いて直接に実現できます: static int fileFlush(s) ioUNIT *s; { fflush((FILE*)s->stream); } ファイルの場合は何もする必要がありませんが、ストリームを停止させる機能も提供されています: static int fileStop() { return 1; } | ||||||||||
|
| Back> |
|