名前 | 形式 | 機能説明 | オプション | 使用例 | ファイル | 属性 | 関連項目 | 診断
exstr ユーティリティは、 C 言語のソースファイルから文字列を抽出し、 それをメッセージ検索関数の呼び出し ( gettxt(3C) を参照) に置き換えます。 このユーティリティは、 printf コマンドや printf ルーチンへの引数として指定された文字列だけではなく、 二重引用符で囲まれている文字列もすべて抽出します。第 1 の形式では、exstr はソースファイルからすべての文字列を取り出して、標準出力上に書き出します。 各文字列の先頭には、ソースファイル名とコロン (:) が付加されます。
最初のステップとして、まず exstr -e を使って一群の文字列を入力ファイルから取り出し、 別のファイルに保存します。 次にそれらのうちどの文字列が、 あとでメッセージ検索関数で検索できるように変換可能かを 見つけ出します。 次に、変換可能でない行を削除し、変換可能な行に関しては メッセージファイル名とメッセージ番号を第 4 項目 (msgfile) と第 5 項目 (msgnum) として追加します。 指定するメッセージファイルは、 mkmsgs(1) で作成したもので、 /usr/lib/locale/locale/LC_MESSAGES ディレクトリ中に存在している必要があります。 このパス中の locale は、テキスト文字列が書かれている言語に対応しています。 詳しくは setlocale(3C) を参照してください。 指定するメッセージ番号は、メッセージファイル中の文字列の シーケンス番号に一致している必要があります。
次に、このようにして編集したファイルを入力に指定して exstr -r を実行します。これにより元の C 言語のソースファイルの新バージョンとして、 文字列がメッセージ検索関数 gettxt() の呼び出しに置き換えられているファイルが生成されます。 msgfile と msgnum の 2 つのフィールドは、gettxt() へ渡す第 1 引数を構築するために用いられます。gettxt() への第 2 引数は、実行時にメッセージ検索が失敗したときに印刷されます。 この引数は、-d オプションが指定された場合を除き、 NULL 文字列です。
このユーティリティは、 すべての場合に文字列を変換できるわけではありません。 たとえば、静的初期化文字列を関数呼び出しに 置き換えることはできません。 また文字列が、変換できないエスケープシーケンスの形式を とっている場合もあります。 既存のコードを破壊しないようにするため、exstr -e を使って生成したファイルの中身をよく検査して、 関数呼び出しに置換できない文字列を 含んでいる行を必ず削除してください。 また場合によっては、文字列が抽出されて メッセージ検索関数の呼び出しに置き換えられるように、 コードを修正する必要があります。
以下のオプションを指定できます。
指定した C 言語のソースファイルから、文字列リストと 位置情報を取り出します。 リストは以下に示す形式で標準出力上に 書き出されます。
file:line:position:msgfile:msgnum:string
C 言語のソースファイル
ファイル中の行番号
その行における文字位置
NULL 文字列
NULL 文字列
抽出されたテキスト文字列
この出力先としてファイルを指定することも可能です。 ファイルに書き出せば、あとでその内容を編集して msgfile と msgnum 用に使いたい値を追加することができます。
string を置き換えるテキスト文字列を含んでいるファイル。mkmsgs(1) ユーティリティを使って、この名前を持つファイルを作成して 適切なディレクトリに置いておく必要があります。
msgfile 中のシーケンス番号
次の手順として、 exstr -r を使って file の string を置き換えます。
C 言語のソースファイル中の文字列を、 メッセージ検索関数 gettxt() の呼び出しに置き換えます。
このオプションは、 -r オプションとともに使用します。 実行時に gettxt() を呼び出してメッセージの検索が成功しなかった場合、 抽出された文字列が印刷されます。 国際的環境で動作してメッセージを 複数の言語で印刷するような アプリケーションプログラム上では、 exstr が提供する機能を使います。 exstr は、テキスト文字列を、メッセージデータベース中の 文字列を指す関数呼び出しに置き換えます。 どのデータベースを用いるかは、環境変数 LC_MESSAGES の実行時の値により決まります (environ(5) を参照)。
main() { printf("This is an example\n"); printf("Hello world!\n"); }
このとき、以下のように example.c を引数として指定して exstr を実行すると、これらの文字列が取り出されて 標準出力上に書き出されます。
example% exstr example.c |
example.c:This is an example\n example.c:Hello world!\n |
example% exstr -e example.c > example.stringsout |
example.c:3:8:::This is an example\n example.c:4:8:::Hello world!\n |
example.c:3:8:UX:1:This is an example\n example.c:4:8:UX:2:Hello world!\n |
example% exstr -r example.c <example.stringsout >intlexample.c |
extern char *gettxt(); main() { printf(gettxt("UX:1", "")); printf(gettxt("UX:2", "")); } |
example% exstr -rd example.c <example.stringsout >intlexample.c |
extern char *gettxt(); main() { printf(gettxt("UX:1", "This is an example\n")); printf(gettxt("UX:2", "Hello world!\n")); } |
mkmsgs(1) が生成したファイル
次の属性については attributes(5) のマニュアルページを参照してください。
属性タイプ | 属性値 |
使用条件 | SUNWtoo |
gettxt(1), mkmsgs(1), printf(1), srchtxt(1), gettxt(3C), printf(3C), setlocale(3C), attributes(5), environ(5)
exstr が発行するエラーメッセージは、 メッセージテキストを読めば意味が分かるようになっています。 エラーメッセージはコマンド行で見つかったエラー、また 入力ファイル中で見つかった形式エラーを 表します。