UNIFDEF(1)

名称
unifdef - ifdef 行を取り除く

書式
unifdef [-clt] [ -Dsym -Usym -iDsym -iDsym] ... [file]

解説
unifdef は、ファイルから ifdef された行をそれ以外の部分には構わずに削除する場合に 有効です。 unifdef は #ifdef, #ifndef, #else, #endif 行を解釈します。また unifdef は、これらがコメントやシングルクォートやダブルクォートの中にあることで 無効化されいるかどうかを判断するための必要最小限の C 言語の知識しかありません。 クォートの解析は非常に単純です。クォートに遭遇すると (エスケープされたクォートを除いて) 対応するクォートが出現するまでの部分を全て無視します。 途中で行末に到達し、かつ、行継続のためのバックスラッシュがない場合でも 警告しません。

利用可能なオプションは以下の通りです:
-Dsym
-Usym
    指定したシンボルを定義するかまたは未定義にするかを指示します。 ifdef の内側の行は、シンボルの定義状態に合わせて適切に、 出力先にコピーされたり削除されたりします。 指定されたシンボル Sym に関する ifdef, ifndef, else, endif 行は削除されます。 指定していないシンボルが含まれる ifdef や ``#if'' 行には触れず、 これらが関連している ifdef, else, endif 行と一緒にそのまま出力されます。 もし ifdef X が別の ifdef X 中に入れ子状態で出現した場合、 内側の ifdef は指定されなかったシンボルと同等に扱われます。 同じシンボルの指定が引数上に複数個あった場合は、 最後の指定が有効となります。

-c  -c フラグが指定されると、 unifdef の動作が逆転します。すなわち、削除されたり空行にされていた行を残すという動作と その逆の動作が起こります。

-l  不要な部分を削除するのではなく、空行で置き換えます。
-t  C 言語のコメントとクォートの解釈を禁止します。 通常のテキストファイルの場合に有効です。

-iDsym
-iUsym
    無視すべき ifdef を指定します。C 言語コード内で、 作りかけのコメントやコードのような C 言語ではないものを区切るために ifdef を用いている場合は、その内部のクォートやコメントを無視するように unifdef に指示する必要があります。無視すべき ifdef は -Dsym や -Usym と同様に -iDsym や -iUsym で指定します。

unifdef は出力を stdout にコピーし、入力は、引数 file が指定されなかった場合には stdin を使用します。

unifdef は、4.1 BSD の diff(1) の -Dsym オプションと一緒に使うとうまくいきます。

関連項目
diff(1)

診断
不適切な else や endif を検出した場合に ``Inappropriate else または endif'' と表示します。 #ifdef が終了しない場合に、行番号つきで ``Premature EOF'' と表示します。
入力と出力が同一になる場合 0、そうでなければ 1、エラー時には 2 を終了ステータスとして返します。

バグ
unifdef が `#if' を処理できるようにするべきです。

ヌル文字を含む入力の場合には正しく動作しません。

歴史
unifdef コマンドは 4.3BSD で登場しました。