.\" 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.43 2003/01/20 11:36:12 fanf2 Exp % .\" %FreeBSD: src/usr.bin/unifdef/unifdef.1,v 1.20 2003/02/24 22:53:24 ru Exp % .\" $FreeBSD$ .\" .Dd September 24, 2002 .Dt UNIFDEF 1 .Os .Sh 名称 .Nm unifdef , unifdefall .Nd プリプロセッサ条件行を取り除く .Sh 書式 .Nm .Op Fl ceklst .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 ディレクティブはシンボルがコマンドラインで指定された場合だけ 処理されます。その他の場合には変更されずに、素通りさせます。 デフォルトでは、定数式を持つ .Ic #if と .Ic #elif の行は無視しますが、コマンドラインに .Fl k フラグを指定することによりこれらを処理できます。 .Pp .Nm ユーティリティにはコメントやバックスラッシュによる行継続 で無効にされたディレクティブも理解することができます。 また、普通ではない形式のプリプロセッサディレクティブを指摘することで、 レイアウトが変になりすぎてもう扱えないことを検知します。 .Pp .Nm unifdefall シェルスクリプトはファイルから .Xr cpp 1 の条件処理ディレクティブをすべて削除することができます。 すべての制御シンボルとその定義 (または未定義) のリストを得るために、 .Nm Fl s と .Nm cpp Fl dM を使用します。 それからそのファイルを処理するのに適切な引数を付けて .Nm を呼び出します。 .Pp 利用可能なオプション : .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 e .Nm は入力行を 1 度に 1 行ずつ処理しますので、 複数行にまたがるプリプロセッサディレクティブを削除できません。 もっとも一般的な例は、 複数行にわたって右側にぶらさがるコメントが付く、ディレクティブです。 デフォルトでは、 .Nm がそのようなディレクティブを処理するときは、行が分かりにくいと文句を言います。 .Fl e オプションはこの動作を変え、 可能ならばエラーを報告する代りにそのような行をそのまま残します。 .Pp .It Fl k 定数式を持つ .Ic #if と .Ic #elif の行を処理します。 デフォルトでは、このような行で制御される部分は変更されずに素通りされます。 なぜなら、これらは典型的には .Dq Li "#if 0" で始まり、未来または過去の開発の概要を記述するコメント的に使用されるからです。 通常のコメントを削除してしまうことが失礼かもしれないのと同様、 これらを削除してしまうのは失礼かもしれません。 .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 多過ぎるネストレベルを検出します。 .It 不適切な .Ic #elif , .Ic #else , .Ic #endif を検出します。 .It 分かりにくいプリプロセッサ制御行を検出します。 .It 早過ぎる .Tn EOF を検出します (もっとも最近の未完了の .Ic #if の行番号を表示します)。 .It コメント中の .Tn EOF を検出します。 .El .Nm ユーティリティは出力が入力と同じになる場合 0、 そうでなければ 1、エラー時には 2 を終了ステータスとして返します。 .Sh バグ 構文評価がたいへん限定的です。 .Pp (コメントまたはバックスラッシュと改行によって) 複数の物理行にまたがるプリプロセッサ制御行は、 すべての状況において正しく扱われるわけではありません。 .Pp トライグラフは認識されません。 .Pp ソースファイル中の複数の場所で異なった定義を持つシンボルはサポートされません。 .Pp テキストモードおよび機能無視は、最近の .Xr cpp 1 の動作とは対応していません。 .Sh 歴史 .Nm は .Bx 4.3 から登場しました。 .Tn ANSI\~C サポートは .Fx 4.7 で追加されました。