Go to main content
マニュアルページ セク ション 1: ユー ザーコマンド

印刷ビューの終了

更新: 2016年12月6日
 
 

exstr(1)

名前

exstr - ソースファイルからの文字列の抽出

形式

exstr filename...
exstr -e filename...
exstr -r [-d] filename...

説明

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() の呼び出しに置き換えられているファイルが生成されます。msgfilemsgnum の 2 つのフィールドは、gettxt() へ渡す第 1 引数を構築するために用いられます。gettxt() への第 2 引数は、実行時にメッセージ検索が失敗したときに印刷されます。この引数は、–d オプションが指定された場合を除き、 NULL 文字列です。

このユーティリティーは、すべての場合に文字列を変換できるわけではありません。たとえば、静的初期化文字列を関数呼び出しに 置き換えることはできません。また文字列が、変換できないエスケープシーケンスの形式を とっている場合もあります。既存のコードを破壊しないようにするため、exstr –e を使って生成したファイルの中身をよく検査して、 関数呼び出しに置換できない文字列を 含んでいる行を必ず削除してください。また場合によっては、文字列が抽出されて メッセージ検索関数の呼び出しに置き換えられるように、 コードを修正する必要があります。

オプション

サポートしているオプションは、次のとおりです。

–e

指定した C 言語のソースファイルから、文字列リストと 位置情報を取り出します。リストは以下に示す形式で標準出力上に 書き込まれます。

file:line:position:msgfile:msgnum:string

各情報の意味は次のとおりです。

file

C 言語のソースファイル

line

ファイル中の行番号

position

その行における文字位置

msgfile

NULL 文字列

msgnum

NULL 文字列

string

抽出されたテキスト文字列

この出力先としてファイルを指定することも可能です。ファイルに書き出せば、あとでその内容を編集して msgfilemsgnum 用に使いたい値を追加することができます。

msgfile

string を置き換えるテキスト文字列を含んでいるファイル。mkmsgs(1) ユーティリティーを使って、この名前を持つファイルを作成して適切なディレクトリに置いておく必要があります。

msgnum

msgfile 中のシーケンス番号

次の手順として、 exstr –r を使って filestring を置き換えます。

–r

C 言語のソースファイル中の文字列を、 メッセージ検索関数 gettxt() の呼び出しに置き換えます。

–d

このオプションは、 –r オプションとともに使用します。実行時に gettxt() を呼び出してメッセージの検索が成功しなかった場合、抽出された文字列が印刷されます。国際的環境で動作してメッセージを 複数の言語で印刷するような アプリケーションプログラム上では、 exstr が提供する機能を使います。exstr は、テキスト文字列を、メッセージデータベース中の 文字列を指す関数呼び出しに置き換えます。どのデータベースを用いるかは、環境変数 LC_MESSAGES の実行時の値により決まります (environ(5) を参照)。

使用例 1 exstr の使用例

example.c というファイル中に、次のような 2 つの文字列が含まれていると想定します。

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

次に –e オプションと出力ファイル名を指定した例を示します。

example% exstr -e example.c > example.stringsout

この場合には、 example.stringsout というファイルに以下の出力が得られます。

example.c:3:8:::This is an example\n
example.c:4:8:::Hello world!\n

次にこの example.stringsout ファイルを編集して、 これらの文字列が検索関数呼び出しに置き換えられる前に、msgfilemsgnum の両フィールド用に使用したい値を追加します。たとえばメッセージファイルの名前が UX で、ファイル中の文字列のシーケンス番号が 12 であったとすると、 example.stringsout ファイルを編集して次のような内容に変更します。

example.c:3:8:UX:1:This is an example\n
example.c:4:8:UX:2:Hello world!\n

このように準備を整えたら、–r オプション付きで exstr ユーティリティーを実行して、ソースファイル中の文字列をメッセージ検索関数 gettxt() の呼び出しに置き換えることができます。

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

この場合には、抽出された文字列が gettxt() 関数への第 2 引数として用いられます。

extern char *gettxt();

main()

{

        printf(gettxt("UX:1", "This is an example\n"));

        printf(gettxt("UX:2", "Hello world!\n"));

}

ファイル

/usr/lib/locale/locale/LC_MESSAGES/*

mkmsgs(1) が生成したファイル

属性

属性についての詳細は、マニュアルページの attributes(5) を参照してください。

属性タイプ
属性値
使用条件
text/locale

関連項目

gettxt(1), mkmsgs(1), printf(1), srchtxt(1), gettxt(3C), printf(3C), setlocale(3C), attributes(5), environ(5)

診断

exstr が発行するエラーメッセージは、 メッセージテキストを読めば意味が分かるようになっています。エラーメッセージはコマンド行で見つかったエラー、また 入力ファイル中で見つかった形式エラーを 表します。