M4(1)

名称
m4 - マクロ言語プロセッサ

書式
m4 [-d flags] [-t name] [-gs] [-D name[=value]] [-U name] [-I dirname] [file ...]

解説
m4 ユーティリティは、さまざまな言語 (たとえば C, ratfor, fortran, lex, yacc など) のフロントエンドとして 利用できるマクロプロセッサです。 m4 ユーティリティは、標準入力から読み込みます。 また、処理結果のテキストを標準出力へ書き出します。

マクロの呼び出しは name(argument1[, argument2, ..., argumentN]) の 形式を取っています。

マクロ名とそれに続く開き括弧 (‘(’) との間にはスペースがあってはいけません。 もしマクロ名の直後に開き括弧が続いていなければ引数なしのマクロ呼び出しとして 処理されます。

マクロ名として先頭はアルファベットまたはアンダスコアが、2 文字目以降は 英数字またはアンダスコアが使えます。 よって正しいマクロ名にマッチする正規表現は “[a-zA-Z_][a-zA-Z0-9_]*” となります。

マクロの引数のうちで、先頭のクォートされていない空白、タブ、 改行文字 (‘\n’) は無視されます。 文字列をクォートするためには、左、および右シングルクォートを使用して ください (例: ‘ this is a string with a leading space’) 。 組み込みマクロ changequote を使ってクォート文字を変更することができます。

大抵の組み込みマクロは、引数がないと意味をなしませんので、 開き括弧が後に続かない場合、特別のものとして認識されません。

オプションは以下の通りです:

-s  cpp(1) 用に、 #line ディレクティブを出力します。

-D name[=value]
    シンボル name の値を value (無指定時は NULL) と定義します。

-U name
    シンボル name を未定義にします。

-I dirname
    include パスに ディレクトリ dirname を追加します。

-d flags
    トレースフラグをセットします。 flags 引数は、以下の通りです:

    a   マクロの引数を表示します。
    c   マクロの展開を複数行で表示します。
    e   マクロの展開結果を表示します。
    f   ファイル名の場所を表示します。
    l   行数を表示します。
    q   引数と現在のクォートの結果を引用します。
    t   すべてのマクロをトレースします。
    x   マクロを展開する時に番号を付けます。
    V   すべてのオプションフラグをオンにします。

    デフォルトでは、トレースは eq にセットしています。

-t macro
    macro をトレーシングします。

-g  GNU-m4 互換モードを有効にします。 このモードでは changequote に 2 つの空のパラメータをつけることで クォートの使用をやめられます。 translit は、 単一の文字範囲 (例えば a-z) を扱い、 正規表現で emacs(1) のように動作します。 変換の数は無制限です。

文法
m4 ユーティリティには以下に示す組み込みマクロが実装されています。 これらのマクロは再定義可能であり、その場合には元の定義は失われます。 特に記述のない限り戻り値は NULL です。

builtin
    指定した組み込みマクロを呼び出します。 名前が再定義されていたとしても名前の持つ本来の機能を呼び出します。

changecom
    コメントの開始文字列と終了文字列を変更します。 デフォルトでは、ポンド記号 (‘#’) と改行文字です。 引数を指定しなかった場合はコメントシーケンスがリセットされます。 GNU モードの m4 では、コメントはオフです。 設定できる文字列の長さは最大で 5 文字です。

changequote
    第 1、第 2 引数をクォートシンボルとして定義します。 シンボルは、長さ 5 文字以内にしてください。 引数が与えられなかった場合にはデフォルトの左右シングルクォートに 設定されます。

decr
    引数の値を 1 だけ減少させます。 引数は正しく数値を表現する文字列でなければなりません。

define
    第 1 引数で指定した名前の新しいマクロを定義します。 定義内容は第 2 引数で与えます。 定義中での ‘$n’ ( n は 0 から 9 まで) は それぞれそのマクロに与えられる 第 n 引数に置換されます。 ‘$0’ はマクロ名そのものです。 指定されなかった引数は NULL 文字列に置換されます。 また ‘$#’ は引数の数を表し、 ‘$*’ はコンマで区切られた全引数になります。 ‘$@’ は ‘$*’ と同様ですが、更なる置換が行われないように全部の引数が クォートされます。

defn
    各引数で指定されたマクロの定義内容をクォートして返します。 これはマクロ定義の名称変更 (組み込みマクロであっても) に利用できます。

divert
    m4 には 10 本の出力キューが用意されています (0 から 9 までの番号がついています)。 処理の最後に、全てのキューは番号順に連結されて最終的な出力を 生成するようになっています。 初期状態では出力キューは 0 番に設定されています。 divert マクロを使って新しい出力キューを選ぶことが出来ます ( divert に不正な引数を与えると出力が破棄されてしまいます)。

divnum
    現在の出力キューの番号を返します。

dnl 改行文字を含めた行末までの入力文字を破棄します。

dumpdef
    引数で指定した項目に関して、その名前と定義を出力します。 引数が与えられなかった場合は全てのマクロについて出力します。

errprint
    第 1 引数を標準エラー出力ストリームへ出力します。

esyscmd
    その最初の引数をシェルへ渡し、シェルの標準出力を返します。 シェルはその標準入力および標準エラー出力を m4 と共有することに注意してください。

eval
    第 1 引数を計算式とみなして 32-bit 幅の算術演算を用いて計算します。 演算子としては標準の C で用いられるもの、すなわち 3 項、 算術、論理、シフト、関係、ビットの各演算子、および括弧が 利用可能です。 また数値も C と同様に 8 進、10 進、16 進で記述できます。 第 2 引数で (もしあれば) 演算結果の基数を指定でき、 第 3 引数で (もしあれば) 演算結果の最小桁数を指定できます。

expr
    eval の別名です。

ifdef
    第 1 引数で指定した名前のマクロが定義されていれば第 2 引数を返し、 定義されていなければ第 3 引数を返します。 第 3 引数が省略されていた場合は、その値は NULL になります。 ちなみに unix という単語があらかじめ定義されています。

ifelse
    第 1 引数が第 2 引数とマッチしたら第 3 引数を返します。 マッチしなかった場合 (ifelse)、 その 3 個の引数は捨てられて次の 3 引数を 用いて同様の検査を繰り返します。 この処理は引数がなくなるか あるいは 1 つだけ残るまで繰り返され、 どれにもマッチしなかった場合には その最後に残った引数または NULL (引数がなくなった場合) が返されます。

include
    第 1 引数で指定されたファイルの内容を返します。 指定通りの名前のファイルが見つからなかった場合は、 include パスを探します。 最初にまず コマンドラインで -I 指定されたディレクトリを順に、 次に 環境変数 M4PATH に設定されたコロン区切りのディレクトリリストを順に探します。 ファイルを include できない場合は、 エラーメッセージを表示して異常終了します。

incr
    引数を 1 だけ増加させます。 引数は正しく数値を表現する文字列でなければいけません。

index
    第 2 引数が、第 1 引数の中で、何文字目に出現するかを返します (たとえば index(the quick brown fox jumped, fox) では 16 が返ります)。 第 2 引数が第 1 引数の中に含まれていなかった場合には index は -1 を返します。

indir
    第 1 引数として渡される項目のマクロを間接的に呼びます。 それ以降は、第 1 引数のマクロに対する引数です。

len 第 1 引数の文字数を返します。余分な引数は無視されます。

m4exit
    第 1 引数 (指定されなかった場合は 0) を終了コードとして即座に終了します。

m4wrap
    入力が最後の EOF に達したときに、どのような動作を行うかを設定します。 一般には種々の後始末を行うマクロを設定します (たとえば、 m4wrap(cleanup(tempfile)) ) とすると他の全ての処理が終了した 後に cleanup マクロが呼び出されます)。

maketemp
    第 1 引数の中の文字列 “XXXXX” を現在のプロセス ID に置換します。 その他の部分はそのままです。 これはユニークなテンポラリファイル名の生成に利用できます。

paste
    第 1 引数で指定されたファイルの内容をマクロ処理を一切行わずに include します。 もしファイルが読み込めない場合にはエラーメッセージを出力して処理を 中断します。

patsubst
    文字列のうち、正規表現にマッチする部分が置換文字列で置き換えられます。 通常は次の代入規則が適用されます: アンパサンド (‘&’) は、正規表現にマッチした文字列で置き換えられます。 文字列 ‘\#’ (# は数値) は、一致する後方参照と置き換えられます。

popdef
    各引数へ pushdef されている定義を戻します。

pushdef
    define と同様の引数をとってマクロを定義しますが元の定義をスタックへ 保存しておきます。 保存された定義は後で popdef で戻すことができます。

regexp
    正規表現に基づき、文字を見つけます。 第 2 引数までの場合は 最初にマッチする文字位置を、 マッチする文字がない場合は -1 を返します。 第 3 引数がある場合、 その中に含まれるパターンを置き換えた文字列を返します。

shift
    第 1 引数を除いた全ての引数を返します。 残りの引数はクォートされてコンマで区切られます。 クォートすることによって以降の処理で置換が行われないようにしています。

sinclude
    エラーが起きても無視される点を除いて include と同じです。

spaste
    エラーが起きても無視される点を除いて paste と同じです。

substr
    第 1 引数の文字列のうちの、第 2 引数で指定されるオフセットから始まり 第 3 引数で指定される文字数の範囲の部分文字列を返します。 第 3 引数が省略された場合は残りの文字列全てを返します。

syscmd
    第 1 引数をシェルに渡します。戻り値はありません。

sysval
    最後に実行した syscmd の戻り値を返します。

traceon
    引数がある場合はそのマクロの展開をトレースをオンにします。 引数がない場合はすべてのマクロをトレースをオンにします。

traceoff
    引数がある場合はそのマクロの展開をトレースをオフにします。 引数がない場合はすべてのマクロをトレースをオフにします。

translit
    第 1 引数の中の文字を、第 2 引数で指定された文字集合から第 3 引数で 指定された文字集合へ書き直します。ただし tr(1) 式の省略指定を用いることはできません。

undefine
    引数で指定されたマクロを未定義にします。

undivert
    指定された出力キュー (引数がない場合は全てのキュー) の内容を掃き出します。

unix
    OS プラットフォームを調べるために予め定義されているマクロです。

__line__
    現在のファイルの行番号を返します。

__file__
    現在のファイル名を返します。

診断

入力ファイルから終了状態を変更するために、 m4exit マクロを使用することができます。

互換性
m4 ユーティリティは、GNU-m4 から加えられた少々の拡張に加えて、 susv2 に追従しています。 フラグ -I, -d, -t は非標準です。

トレースと dumpdef の出力フォーマットは、 どの標準でも規定されていませんので 変更される可能性があります。 これらに依存するべきではありません。 現在のトレース出力フォーマットは、 autoconf が機能できるよう GNU-m4 に基づいて厳密に作成されています。

移植性のためには、 builtin, esyscmd, expr, indir, paste, patsubst, regexp, spaste, unix, __line__, および __file__ のマクロは、使用しないほうがよいです。

他の多くの m4 の実装では、 すべての組み込みマクロは引数なしでも展開されます。

他の多くの m4 の実装は、 バッファサイズに関して、きびしい制限があります。

規格
m4 ユーティリティは p1003.1-2001 に適合します。

歴史
m4 コマンドは、PWB UNIX から登場しました。

作者
-nosplit Ozan Yigit <oz@sis.yorku.ca> および Richard A. O'Keefe <ok@goanna.cs.rmit.OZ.AU>.
Marc Espie <espie@cvs.openbsd.org> による GNU-m4 互換性拡張

バグ
m4 ユーティリティは、マルチバイト文字を認識しません。