4.2 gperfが生成するCコードの出力形式

標準出力に生成するCコードの形式を制御するオプションがいくつかあります。2つのC関数が生成されます。名前はhashとin_word_setですが、コマンドラインオプションで変更できます。どちらの関数にも、文字列char * strと、長さのパラメーターint lenの2つの引数が必要です。デフォルトの関数プロトタイプは次のとおりです。

関数: unsigned int hash (const char * str, size_t len)
デフォルトでは、生成するhash関数は、利用者が指定するstr内の複数のバイト位置を使って関連値テーブルを参照し、その値とlenを加算して得られる整数値を返します。関連値テーブルはローカルな静的配列に格納されます。このテーブルはgperf内部で構築され、後で‘hash_table’という名前の静的なローカルC配列として出力されます。使用する位置、つまりstrへのインデックスは、gperfの実行時に‘-k’オプションで指定します。詳細は後述のオプションの節(5 gperfの実行)を参照してください。

関数: in_word_set (const char * str, size_t len)
strがキーワード集合に含まれていれば、そのキーワードへのポインターを返します。より正確には、‘-t’オプション、または同じ働きをする‘%struct-type’宣言を指定した場合は、一致するキーワードの構造体へのポインターを返します。それ以外の場合はNULLを返します。

‘-c’オプション、または同じ働きをする‘%compare-strncmp’宣言を使わない場合、strは長さがちょうどlenのNUL終端文字列でなければなりません。‘-c’、または同じ働きをする‘%compare-strncmp’を使う場合は、strは単にlenバイトの配列であればよく、NUL終端は不要です。

この2つの関数の生成コードには、次のオプションが影響します。

‘-t’
‘--struct-type’
利用者が定義するstructを使います。
‘-S total-switch-statements’
‘--switch=total-switch-statements’
大きな静的配列(疎な配列になる可能性もあります)を使う代わりに、1つ以上のCのswitch文を生成します。実行時間と記憶領域の節約量はCコンパイラの最適化の程度によって異なりますが、この方法ではコードが小さくなり、速くなることがよくあります。

‘-t’と‘-S’のオプション、または同じ働きをする‘%struct-type’と‘%switch’の宣言を省略すると、デフォルトでは、キーワードを格納するchar *配列と、その配列の空きを埋める追加の空文字列が生成されます。さまざまな入力・出力オプションを試し、生成されたCコードの実行時間を測定することで、キーワード集合の特性に応じた最適なオプションの選び方を判断できます。