xstr - 共有文字列を実装するための C プログラムからの文字列抽出
xstr -c filename [-v] [-l array]
xstr [-l array]
xstr filename [-v] [-l array]
xstr は、大きなプログラムのコンポーネント部分の文字列がハッシュされている strings と呼ばれるファイルを管理します。これらの文字列は、この共通領域への参照で置き換えられます。これは、共有定数文字列 (読み取り専用でもある場合にもっとも有用) の実装に役立ちます。
次のコマンド
example% xstr −c filename
名前が指定された C ソースから文字列を抽出し、&xstr[number] 形式の式で参照される文字列を数値で置き換えます。xstr の適切な宣言が、ファイルの先頭に付加されます。生成される C テキストは、ファイル x.c 内に配置され、ついでコンパイルされます。このファイルからの文字列が strings データベース内にまだ存在しない場合には、そこに配置されます。繰り返される文字列および既存の文字列の接尾辞である文字列の場合、データベースは変更されません。
大きなプログラムのすべてのコンポーネントがコンパイルされたあと、次の形式のコマンドを使って、xs.c と呼ばれる共通の xstr 空間を宣言するファイルを作成できます。
example% xstr
次に xs.c ファイルをコンパイルして、プログラムの残りとともにロードします。可能な場合には、配列を読み取り専用 (共有) にして、空間とスワップのオーバーヘッドを節約できます。
xstr は、単一のファイルでも使用できます。次のコマンドは、
example% xstr filename
前のコマンドと同様にファイル x.c および xs.c を作成し、同じディレクトリ内の strings ファイルを使用したり、それに影響を及ぼしたりすることがありません。
マクロ定義によって文字列が作られたり、実際には不要な文字列を含む条件コードがある場合は、C プリプロセッサのあとで xstr コマンドを実行するのが有用です。xstr は、引数 `-' が指定されているときは標準入力から読み取ります。C プリプロセッサのあとで xstr を実行するための適切なコマンドシーケンスを次に示します。
example% cc −E name.c | xstr −c − example% cc −c x.c example% mv x.o name.o
xstr は、新しい項目が追加されないかぎり、ファイル strings を処理しません。このため、make(1S) は、本当に必要な場合以外は xs.o を再作成するのを回避できます。
C ソーステキストを filename から取得します。
詳細: 新しいまたは重複する文字列が見つかった場所を示す進捗レポートを表示します。
抽象化された文字列へのプログラム参照内で、名前付きの array を指定します。デフォルトの配列名は xstr です。
文字列のデータベース
対象の C ソース
配列 “xstr*(rq の定義用 C ソース
xstr filename が strings を処理しない場合の一時ファイル
属性についての詳細は、マニュアルページの attributes(7) を参照してください。
|
ある文字列がデータベース内の別の文字列の接尾辞であるが、より短い文字列が xstr によって最初に見つかった場合、長い方の文字列を配置すればよい場合でも、両方の文字列がデータベース内に配置されます。
xstr は、すべての文字列を、元の C コードでその文字列がどのように使用されていたかに関係なく、&xstr[number] 形式の式で無差別に置換することに留意してください。たとえば、sizeof() を使用してリテラル文字列の長さを判定するコードの場合、xstr は、リテラル文字列をそれとはサイズが異なる可能性の高いポインタで置き換えてしまうため、問題が発生します。
この問題を回避するには:
sizeof() の代わりに strlen() を使用します。strlen() は null バイトをカウントしないのに対し、sizeof() は配列のサイズ (末尾の null バイトを含む) を返すことに留意してください。sizeof(" xxx") と真に等価なのは、(strlen("xxx"))+1 です。
sizeof() のオペランドとして #define を使用し、define されたバージョンを使用します。xstr は、#define 文を無視します。xstr をプリプロセッサ上で実行する前に、必ず filename 上で実行してください。
次の形式の初期化済み文字配列を宣言する際にも問題が発生します。
char x[] = "xxx";
xstr は xxx を &xstr[number] 形式の式で置き換えますが、これはコンパイルを実行しません。この問題を回避するには、static char x[] = "xxx" の代わりに static char *x = "xxx" を使用します。