Next: Problems with catgets, Previous: catgets, Up: catgets [Contents][Index]
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
の呼び出しには使用できません。