Catch up with rev 1.4.2.6

Submitted by:	OHSAWA Chitoshi <ohsawa@ccn.aitai.ne.jp>
This commit is contained in:
Kazuo Horikawa 2002-09-06 03:20:44 +00:00
parent 002a60f06e
commit 86301dd5ed
Notes: svn2git 2020-12-08 03:00:23 +00:00
svn path=/head/; revision=14184

View file

@ -2,7 +2,7 @@
.\" The Regents of the University of California. All rights reserved.
.\"
.\" This code is derived from software contributed to Berkeley by
.\" Dave Yost.
.\" 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
@ -33,106 +33,199 @@
.\" SUCH DAMAGE.
.\"
.\" @(#)unifdef.1 8.2 (Berkeley) 4/1/94
.\" %FreeBSD: src/usr.bin/unifdef/unifdef.1,v 1.4.2.4 2001/08/16 13:17:09 ru Exp %
.\" $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$
.\"
.\" $FreeBSD: doc/ja_JP.eucJP/man/man1/unifdef.1,v 1.6 2001/07/29 05:14:53 horikawa Exp $
.\"
.Dd April 1, 1994
.Dd April 26, 2002
.Dt UNIFDEF 1
.Os
.Sh 名称
.Nm unifdef
.Nd #ifdef 行を取り除く
.Nm unifdef , unifdefall
.Nd プリプロセッサ条件行を取り除く
.Sh 書式
.Nm
.Op Fl clt
.Op Fl clst
.Oo
.Fl D Ns Ar sym
.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
.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
はファイルから #ifdef された行を削除する場合に用いられます。
ユーティリティは
.Xr cpp 1
の条件ディレクティブ (前処理指令) を選択的に処理します。
ファイルから削除するように特定されたディレクティブとテキストの
両方を削除します。
そうでない場合はファイルをそのままにしておきます。
.Pp
.Nm
は #ifdef, #ifndef, #else, #endif 行を解釈します。
ユーティリティは
.Ic #if , #ifdef , #ifndef , #elif , #else , #endif
行に働きますが、
.Ic #if
.Ic #elif
行の式文法のよく使われるサブセットしか理解しません。
コマンドラインで定義されたシンボルの整数値や
.Fn defined
オペレータがコマンドラインで define したり、undefine したシンボルや
演算子
.Ic \&! , < , > , <= , >= , == , != , && , ||
と括弧で囲まれた式を扱うことができます。
より複雑なものはそのまま無傷で通過させます。
.Ic #ifdef
.Ic #ifndef
ディレクティブはシンボルがコマンドラインで指定された場合だけ
処理されます。その他の場合には変更されずに、素通りさせます。
.Pp
.Nm
にはコメント、クォート(シングルクォートとダブルクォート)で
無効になるこれらのプリプロセッサマクロを
判断するために必要な最小限の C 言語の知識しかありません。
クォートの解析は非常に単純です。クォートに遭遇すると
.Pq エスケープされたクォートを除いて
対応するクォートが
出現するまでの部分を全て無視します。途中でエスケープされていない
改行が存在しても警告はしません。
.Sh オプション
.Bl -tag -width Ds -compact
.It Fl D Ns Ar sym
ユーティリティにはコメントやシングルクォートやダブルクォートで
囲まれた中で無効にされたディレクティブも理解することができます。
クォートの解析はたいへんシンプルです :
開きクォートが見つかったとき、閉じクォートが見つかるまで
(エスケープされたクォートを除いて) すべて無視されます。
もし、バックスラッシュなしの改行が見つかっても
警告しません。
.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
指定したシンボルを定義する、または未定義にすることを指定します。
シンボルを定義するように指定した場合 ifdef で囲まれたブロックは
出力され、未定義を指定した場合は削除されます。
指定されたシンボル
.Ar sym
に対応する ifdef、ifndef、else、endif 行は削除されます。
指定しなかったシンボルに関する ifdef や if 行は、対応
する ifdef、else、endif 行とともに、そのまま出力されます。
ifdef X が別の ifdef X 中に出現した場合、内側の ifdef は指定しなかった
シンボルに関する ifdef と同等に扱われます。同じシンボルを複数指定した
場合は最後の指定が有効となります。
未定義にするシンボルを指定します。
同じシンボルを複数指定した場合には、
最後に指定されたものが有効になります。
.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 言語のコメントとクォートの解釈を禁止します。通
常のテキストファイル等に
C 言語のコメントとクォートの解釈を禁止します。
常のテキストファイル等に
.Nm
を適用する場合に有用です。
.Pp
.It Fl iD Ns Ar sym
.It Fl iD Ns Ar sym Ns Op = Ns Ar val
.It Fl iU Ns Ar sym
無視すべき ifdef を指定します。C 言語コードで、ifdef を C 言語ではない
部分やコメントや作りかけのコードを区切るために用いている場合は、その内
部のクォートやコメントを無視するように指示する必要があります。無視すべき ifdef
.Fl D 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
は、4.1 BSD の
ユーティリティは
.Xr diff 1
.Fl D Ns Ar sym
オプションとともに使用することができます。
.Sh 関連項目
.Xr cpp 1 ,
.Xr diff 1
.Sh 診断
.Bl -item -compact
.Bl -item
.It
不適切な else または endif を検出します。
不適切な elif, else, endif を検出します。
.It
#ifdef に対応する #endif が現れる前にファイルが終了したとき、
その #ifdef のある行番号を検出します。
.Ic #ifdef
の終了前に
.Tn EOF
を検出した場合、その行番号を出力します。
.El
入力と出力が同一になる場合 0、そうでなければ 1、エラー時には 2
を終了ステータスとして返します。
.Nm
ユーティリティは出力が入力と同じになる場合 0、
そうでなければ 1、エラー時には 2 を終了ステータスとして返します。
.Sh バグ
unifdef が `#if' を処理できるようにするべきです。
構文評価がたいへん限定的です。
.Pp
ヌル文字を含む入力の場合には正しく動作しません。
.Sh 歴史