m4 コマンド

目的

ファイルをプリプロセスして、マクロ定義を展開します。

構文

m4 [ -e (E)] [ - ] [ -s ] [ -B 数値 ] [ -D 名前 [ = ] ] ... [ -H 数値 ] [ -I (I) ディレクトリー ] [ -S (S) 数値 ] [ -T (T) 数値 ] [ -U (U) 名前 ] ... [ ファイル ... ]

説明

m4 コマンドは、C やその他の言語用のプリプロセッサーとして使われるマクロ・プロセッサーです。 このコマンドを使うと、組み込みマクロやユーザー定義マクロを処理できます。

File パラメーターは順番に処理されます。 File パラメーターを指定しないか、ファイル名として - (ダッシュ) を指定すると、m4 コマンドは標準入力を読み取ります。 処理済みのマクロは標準出力に書き出されます。 マクロ呼び出しの形式は次のとおりです。

macroname(argument . . . )

macroname のすぐ後に左小括弧が必要です。 定義済みマクロ名の後に左小括弧を付けないと、m4 コマンドはそれを引数を持たないマクロ・コールとして読み取ります。 マクロ名は ASCII の英字、数字、_ (下線) 文字で構成されています。 マクロ名には拡張文字は使用できません。 また、先頭の文字に数字を使用することもできません。

引数を収集するときに、m4 コマンドは引用符が付いていない先行ブランク、タブ、改行文字を無視します。 文字列に引用符を付けるときは単一引用符を使用してください。 引用符付き文字列では、引用符以外の文字列が値になります。

m4 コマンドはマクロを認識すると、一致する右小括弧を検索して引数を収集します。 マクロ定義にあるものよりも少ない引数を指定すると、m4 コマンドはマクロ定義内の末尾の引数をヌルと見なします。 マクロ評価は通常、引数の収集中に行われます。 ネストされたマクロ・コールの値にあるコンマや右括弧はすべてリテラルに変換されるので、エスケープ文字や引用符は不要です。 引数を収集すると、m4 コマンドはマクロの値を元の入力ストリームにプッシュして再びスキャンします。

組み込みマクロ

m4 コマンドは次の組み込みマクロを使用可能にします。 組み込みマクロは再定義できますが、再定義すると元の意味は失われます。 これらのマクロの値は、特に明記しなければヌルです。

項目 説明
define(名前,NewName) Name に指定されたマクロ名を NewName に指定された値と置換します。 NewName 文字列の形式には $n . . .$n . . . が使用できます (n は数字)。 この場合、置換テキスト内の n の各オカレンスは、Namen 番目の引数で置換されます。$0 はマクロ名です。 脱落引数はヌル文字列に置換されます。 $# は引数の数に置換されます。$* はすべての引数がコンマで区切られたリストに置換されます。$@ は $* と同じように機能しますが、各引数は現在の引用符で囲まれます (changequote を参照)。
undefine(名前) Name の定義を除去します。
defn(Name . . . ) Name の引用符付き定義を戻します。
pushdef (名前, NewName) defineのように NewNameName を再定義しますが、以前の定義は保存します。
popdef(名前 . ) Name の現行定義を除去して、以前の定義が存在する場合はその定義に戻ります。
ifdef(Name,True,[False ]) Name が定義されている場合のみ True の値を返し、そうでない場合は False を返します。 ただし、False を指定しなければ、値はヌルになります。
注意: ifdefの動作は、Single UNIX仕様第10版に準拠するように変更されている。 ifdef の以前の動作では、Name が定義されており、かつ 0 として定義されていない場合のみ True の値を返します。 デフォルトでは、ifdef は、UNIX10 より前で動作したように動作します。 UNIX 10 の動作を取得するには、環境変数 XPG_SUS_ENVON に設定し、 XPG_UNIX98OFFに設定します。
shift(引数 )。 ) 第 1 の引数を除くすべての引数を戻します。 戻った引数には引用符が付けられて、間にコンマが付いた状態で前詰めされます。 引用符が付いているので、以降にスキャンが実行されても、その効果はありません。
changequote(LR) 引用符記号を LR に変更します。 長さ 5 バイトまでの記号が使えます。 引数を持たない changequote は元の値 (` ') を復元します。
changconversion(LR) 左右のコメント・マーカーを、デフォルトの # と改行文字から LR に変更します。 引数を付けないと、コメント機能が使用不可になります。 引数を 1 つ付けると、左マーカーがパラメーターに、右マーカーが改行文字になります。 引数を 2 つ付けると、両方のマーカーが変更されます。 長さ 5 バイトまでのコメント・マーカーが使えます。
divert(数値) 現行出力ストリームを Number に変更します。 0 から 9 の番号が付けられた 10 個の出力ストリームがあります。 最終出力は、ストリームを番号順に連結したものです。 最初は、ストリーム 0 が現行ストリームです。 m4 コマンドは、0 から 9 以外のストリームに方向転換された出力を廃棄します。
undivert(Number . . . ) 指定された逸脱 (または、引数がない場合はすべての逸脱) から即座にテキストを出力させます。 テキストは別の逸脱に方向転換を解除できます。 方向転換を解除すると、方向転換されたテキストが破棄されます。
dinum (分割数) 現行出力ストリームの値を戻します。
DNL 次の改行文字までの文字を読み取って改行文字と共に破棄します。
ifelse([String1,String2,True[False]]。 ) String1String2 が同じであれば、値は True になります。 両者が同じでない場合で、かつ、5 個以上の引数がある場合は、 m4 コマンドは余分な引数 (4、5、6、7) を使ってプロセスを 繰り返します。 そうでなければ、値は False になるか、False の値を指定していなければヌルになります。
incr(数値) 引数の値を 1 だけ増やして戻します。
decr(数値) 引数の値を 1 だけ減らして戻します。
eval(Expression[,Number1[,Number2 ]]) 32 ビットの符号付き演算を使用して、第 1 引数を演算式として評価します。 演算子として +、-、*、/、%、^ (指数)、ビット単位の &、|、~、^ 関係演算子および括弧が使えます。 8 進数と 16 進数は C の場合と同じように指定できます。 Number1 は、式の結果の基数を指定します。 デフォルトの基数は 10 です。 オプションの Number2 は計算結果の最小桁数を指定します。
注: eval の動作は、Single UNIX Specification、バージョン 10 に準拠するように変更されました。 eval の以前の動作では、32 ビットの符号なし演算を使用して、第 1 引数を演算式として評価します。 デフォルトでは、 eval は UNIX 10 より前の動作と同様に動作します。 UNIX 10 の動作を取得するには、環境変数 XPG_SUS_ENVON に設定し、 XPG_UNIX98OFFに設定します。
len(ストリング) String 内のバイト数を戻します。
dlen(ストリング) String 内の表示可能文字数を戻します。つまり、2 バイトの拡張文字は 1 表示可能文字としてカウントされます。
index(String1String2) 文字列 String1 内で文字列 String2 が始まる位置 (ゼロ原点) を戻します。また、第 2 のパラメーターが発生しなければ -1 を戻します。
substr(ストリング,位置, [数値]) String のサブストリングを戻します。 サブストリングは Position で選択され、Number はサブストリングの長さを示します。 Number を指定しなければ、サブストリングには第 1 の文字列の終わりまでのすべてのデータが含まれます。
translit(ストリングFromTo) String 内の文字を From で与えられたセットから To で与えられたセットに文字変換します。 省略形は使えません。 2 バイトの拡張文字は対応する置換文字に正しくマップされます。
include(ファイル) File の内容を戻します。そのファイルにアクセスできなければエラー・メッセージを表示します。
sinclude(ファイル) File の内容を戻しますが、File にアクセスできなくてもエラー・メッセージを表示しません。
syscmd(コマンド) Commandを実行します。 戻り値はありません。
SYSVAL syscmd への最後の呼び出しから戻りコードを戻します。
maketemp(.. nnnn 。 ) 引数内の nnnn を現行プロセス ID 番号で置換します。
mkstemp(テンプレート) template 引数内の文字列は、末尾に 6 文字以上の X 文字があるファイル名です。 mkstemp マクロはファイル名の各 X 文字を、ポータブル・ファイル名の文字セットからの文字に置き換えます。 ファイルは新たに作成されたファイル名で作成され、閉じられます。 mkstemp マクロに template 引数として空の文字列が含まれている場合、ファイルは新たに作成されたファイル名を使用して作成されず、m4 コマンドは診断メッセージを標準出力に書き込みます。 また、mkstemp マクロに template 引数として空の文字列が含まれている場合、m4 コマンドは、ファイルが作成されない場合でも入力の処理を続け、終了状況としてゼロ以外の値を返します。
m4exit() 即座に m4 コマンドを終了して、Value に指定された終了値 (デフォルトは 0) を戻します。
m4wrap (ラストマクロ ) ファイルの終わり文字を読み取ってから LastMacro を実行します。 例:m4wrap (`cleanup ()')m4の終わりでクリーンアップ・マクロを実行します。
errprint(メッセージ) 診断出力ファイルに Message を含めます。
dumpdef([名前 .. :NONE. 指定された項目、または、引数が与えられていない場合はすべての項目について、現在の名前と定義を標準出力に書き出します。
traceon(マクロ) Macro のトレースをオンにします。 マクロを指定しなければ、すべてのマクロのトレースがオンになります。
traceoff(Macro . . . ) グローバルなトレースおよび指定された Macro のトレースをオフにします。 traceon で特別にトレースされるマクロは、traceoff を特に呼び出さなければトレースを解除できません。

フラグ

項目 説明
-B 数値 Number 変数をプッシュ・バックおよびパラメーター収集バッファーのサイズ (デフォルトは 4096) にします。
-e 対話式で操作します。 割り込みは無視され、出力はバッファー化されません。
-H 数値 Number 変数を記号テーブル・ハッシュ・アレイのサイズ (デフォルトは 199) にします。 このサイズは、プライム記号番号でなければなりません。
-I ディレクトリー (大文字の i) 最初に Directory 変数を検索してから、標準リスト上のディレクトリー内で、/ (スラッシュ) で始まらない名前が付いたインクルード (組み込みマクロ) ファイルを検索します。
-l (L の小文字) アセンブラー用の行番号付き出力を使用可能にします (.xline . . .)。
-s C プリプロセッサー用の行同期出力を使用可能にします (#line . . .)。
-S 数値 Number 変数をコール・スタックのサイズ (デフォルトは 100 スロット) にします。 マクロはスロットを 3 つ使い、非マクロ引数は 1 つ使います。
-T 数値 Number 変数をトークン・バッファーのサイズ (デフォルトは 512 バイト) にします。
注: すべてのフラグ・オプションには、オペランドを混在させることができます。

ファイル名の前と -D または -U フラグの前には先行フラグを指定しなければなりません。

項目 説明
-D 名前[=] Name 変数を Value 変数として定義します。 Value 変数を指定しなければ、Name 変数はヌルになります。
-U 名前 -Dフラグで定義されていたName変数の定義を解除する。

終了状況

このコマンドは、以下の終了値を戻します。

項目 説明
0 正常終了。
>0 エラーが発生しました。

m4exit マクロを使用した場合、終了値は入力ファイルによって指定できます。

m4 コマンドを使って C 言語プログラムをプリプロセスしコンパイルするには、次のように入力します。

m4 prog.m4 > prog.c
cc prog.c

ファイル

項目 説明
/usr/ccs/bin/m4 m4 コマンドが入っています。