.\" Copyright (c) 1985, 1991, 1993 .\" The Regents of the University of California. All rights reserved. .\" .\" This code is derived from software contributed to Berkeley by .\" Dave Yost. Support for #if and #elif was added by Tony Finch. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" 3. All advertising materials mentioning features or use of this software .\" must display the following acknowledgement: .\" This product includes software developed by the University of .\" California, Berkeley and its contributors. .\" 4. Neither the name of the University nor the names of its contributors .\" may be used to endorse or promote products derived from this software .\" without specific prior written permission. .\" .\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE .\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" .\" @(#)unifdef.1 8.2 (Berkeley) 4/1/94 .\" $dotat: things/unifdef.1,v 1.23 2002/05/14 22:15:03 fanf Exp $ .\" %FreeBSD: src/usr.bin/unifdef/unifdef.1,v 1.4.2.6 2002/06/21 20:52:32 fanf Exp % .\" $FreeBSD$ .\" .Dd April 26, 2002 .Dt UNIFDEF 1 .Os .Sh 名称 .Nm unifdef , unifdefall .Nd プリプロセッサ条件行を取り除く .Sh 書式 .Nm .Op Fl clst .Oo .Fl I Ns Ar path .Fl D Ns Ar sym Ns Op = Ns Ar val .Fl U Ns Ar sym .Fl iD Ns Ar sym Ns Op = Ns Ar val .Fl iU Ns Ar sym .Oc .Ar ... .Op Ar file .Nm unifdefall .Op Fl I Ns Ar path .Ar ... .Ar file .Sh 解説 .Nm ユーティリティは .Xr cpp 1 の条件ディレクティブ (前処理指令) を選択的に処理します。 ファイルから削除するように特定されたディレクティブとテキストの 両方を削除します。 そうでない場合はファイルをそのままにしておきます。 .Pp .Nm ユーティリティは .Ic #if , #ifdef , #ifndef , #elif , #else , #endif 行に働きますが、 .Ic #if と .Ic #elif 行の式文法のよく使われるサブセットしか理解しません。 コマンドラインで定義されたシンボルの整数値や .Fn defined オペレータがコマンドラインで define したり、undefine したシンボルや 演算子 .Ic \&! , < , > , <= , >= , == , != , && , || と括弧で囲まれた式を扱うことができます。 より複雑なものはそのまま無傷で通過させます。 .Ic #ifdef と .Ic #ifndef ディレクティブはシンボルがコマンドラインで指定された場合だけ 処理されます。その他の場合には変更されずに、素通りさせます。 .Pp .Nm ユーティリティにはコメントやシングルクォートやダブルクォートで 囲まれた中で無効にされたディレクティブも理解することができます。 クォートの解析はたいへんシンプルです : 開きクォートが見つかったとき、閉じクォートが見つかるまで (エスケープされたクォートを除いて) すべて無視されます。 もし、バックスラッシュなしの改行が見つかっても 警告しません。 .Pp .Nm unifdefall シェルスクリプトはファイルから .Xr cpp 1 の条件処理ディレクティブをすべて削除することができます。 すべての制御シンボルとその定義 (または未定義) のリストを得るために、 .Nm Fl s と .Nm cpp Fl dM を使用します。 それからそのファイルを処理するのに適切な引数を付けて .Nm を呼び出します。 .Pp 利用可能なオプション : .Bl -tag -width indent -compact .It Fl D Ns Ar sym Ns Op = Ns Ar val 定義されるシンボルを指定します。 また、オプションで .Ic #if と .Ic #elif ディレクティブを操作するためにシンボルに与える値を指定します。 .Pp .It Fl U Ns Ar sym 未定義にするシンボルを指定します。 同じシンボルを複数指定した場合には、 最後に指定されたものが有効になります。 .Pp .It Fl c .Fl c フラグが指定された場合には、 .Nm の動作は逆にされます。 すなわち、削除されるか空白にされる行を残し、 逆に残すはずだった行を削除します。 .Pp .It Fl l 削除される行を削除する代わりに空行に置き換えます。 .Pp .It Fl s 通常の入力ファイルを処理する代わりに、 このオプションは .Nm に .Nm が理解する式に現れたシンボルのリストを生成させます。 それは、 .Xr cpp 1 の .Fl dM オプションと協力して .Nm のコマンドラインを生成するのに有用です。 .Pp .It Fl t C 言語のコメントとクォートの解釈を禁止します。 通常のテキストファイル等に .Nm を適用する場合に有用です。 .Pp .It Fl iD Ns Ar sym Ns Op = Ns Ar val .It Fl iU Ns Ar sym .Ic #ifdef を無視します。C 言語のコードで .Ic #ifdef をコメントや作りかけのコードのような C 言語でない部分を区切るために用いている場合は、 .Nm が .Ic #ifdef の中のクォートやコメントを解析しないように どのシンボルがその目的で使用されているかを指示する必要があります。 無視するシンボルを指示する方法は .Fl iD Ns Ar sym Ns Oo = Ns Ar val Oc や .Fl iU Ns Ar sym で、上記の .Fl D Ns Ar sym Ns Op = Ns Ar val や .Fl U Ns Ar sym と同様です。 .Pp .It Fl I Ns Ar path .Nm unifdefall に追加の場所にある .Ic #include ファイルを探すように指示します。 .Xr cpp 1 との互換性と .Nm unifdefall の実装を簡単にするために .Nm はこのオプションは無視します。 .El .Pp .Nm ユーティリティはその出力を .Em stdout にコピーします。 .Ar file 引数が指定されなかった場合は .Em stdin から読み込みます。 .Pp .Nm ユーティリティは .Xr diff 1 の .Fl D Ns Ar sym オプションとともに使用することができます。 .Sh 関連項目 .Xr cpp 1 , .Xr diff 1 .Sh 診断 .Bl -item .It 不適切な elif, else, endif を検出します。 .It .Ic #ifdef の終了前に .Tn EOF を検出した場合、その行番号を出力します。 .El .Nm ユーティリティは出力が入力と同じになる場合 0、 そうでなければ 1、エラー時には 2 を終了ステータスとして返します。 .Sh バグ 構文評価がたいへん限定的です。 .Pp ヌル文字を含む入力の場合には正しく動作しません。 .Sh 歴史 .Nm は .Bx 4.3 から登場しました。