web-dev-qa-db-ja.com

m4のdumpdefをループします

dumpdefで指定されたマクロ名のリストをループすることは可能ですか?名前に特定のプレフィックスが含まれる特定のマクロを処理したいと思います。

1
Rnet

dumpdefは、マクロのリストとその定義をファイルに書き込みます。 標準m4 では、そのファイルは標準エラーであるため、それを取得する唯一の方法は、m4スクリプトの外部にあるリダイレクトを使用することです。 GNU m4は debugfile マクロを提供して、出力をinputで読み戻すことができるファイルにリダイレクトしますが、 autoconfでのm4の特定の実装に依存しないでください。

dumpdefからの出力を取得できたとしても、出力の形式は指定されていません。 indexsubstrを使用して文字列を行に分割できますが、これは実装が1行に1つのマクロを出力することを前提としています。これは保証されていません。さらに、マクロ値には改行を含めることができます。 GNU m4の場合、出力はあいまいです。区別できません。

define(`foo', `hello')
define(`fooo', `world')

から

 define(`foo', `hello
 fooo:   world')

M4実装が1行に1つのマクロを出力し、名前の後にコロンを付けると仮定すると、この方法で潜在的なマクロ名を収集し、ifdefを使用してそれらが本当にマクロ名であるかどうかを確認できます。しかし、あなたは同じデバッグ印刷フォーマットを使用しない実装に翻弄されています。

問題を解決する最善の方法は、おそらくm4の外部です。