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の呼び出しには使用できません。