IF Computer > IF/Prolog > Manuals > IF/Prolog V4.1 マニュアル > IF/Prolog Interfaces > IF/PrologからC言語へのインタフェ−ス > IF/Prolog ストリーム ・インタフェース > 新しいストリーム・クラスの定義

新しいストリーム・クラスの定義

IF/Prolog by Siemens
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; }

document: http://www.ifcomputer.co.jp/IFProlog/Manuals/v4.1/advanced_feature/c_interface/strint/defansc/print_en.html
published 2008/9/1 update 1995/11/6 (c) 1996-2006 IF Computer Japan
IF Computer 5-28-2 Sendagi, Bunkyo-ku Tel +81-3-5814-3352 start (AT) ifcomputer.com
Customer Support Tokyo 113-0022 Japan   http://www.ifcomputer.com
Back> managed with ubiCMS