Next: , Previous: , Up: catgets   [Contents][Index]


11.1.1 インターフェース

catgetsの実装にたいするインターフェースには、ファイルのアクセスのための3つの関数: ファイルを開くcatopen、メッセージテーブルにアクセスするcatgets、そして処理が終わった後にファイルを閉じるためのcatcloseが含まれます。関数のプロトタイプと、必要となる定義は、<nl_types.h>というヘッダーファイルにあります。

catopenは、以下のように呼び出されます:

nl_catd catd = catopen ("catalog_name", 0);

関数の引数としてカタログ名を指定します。これは通常、プログラムかパッケージを参照する名前を指定します。2番目のパラメーターは、標準仕様では規定されていません。わたしには、それがさまざまなシステムで一貫した形で実装されているかすら、わからりません。あたりさわりのないアドバイスとしては、値として0を指定するのがよいでしょう。戻り値はメッセージカタログのハンドルで、このハンドルはopenで戻されるファイルのハンドルと同じです。

このハンドルは、以下のようにしてcatgets関数で使うことができます:

char *translation = catgets (catd, set_no, msg_id, "original string");

最初のパラメーターはcatalog descriptorです。2番目のパラメーターにはmsg_idに保持されるメッセージの、セット番号を指定します。つまりcatgetsは、以下のような3段階のアドレッシングを行います:

catalog name ⇒ set number ⇒ message ID ⇒ translation

4番目の引数は、翻訳された文字列のアドレスを指すためには使用しません。これはアドレッシングステージが失敗したとき、デフォルト値を与えるためのものです。ここで重要なのは、catgetsの戻り値の型がchar *だとしても、結果の文字列を変更してはならないということです。本来、この戻り値の型はconst char *のほうがよいのですが、この標準はANSI C標準が発行される1年前の、1988年に発行されたものなのです。

最後の関数は期待されたとおりに使用され、そのとおりに振る舞います:

catclose (catd);

この関数を呼び出すと、そのdescriptorをcatgetsの呼び出しには使用できません。