可変数のタブを使用して列を並べ替える m4 マクロ

可変数のタブを使用して列を並べ替える m4 マクロ

これはこれまで私のマクロです。

define(`debug_macro', `
#ifndef $1_DEBUG
#define $1_DEBUG'forloop(`i',`1',eval(5-(len($1)/4+ifelse(eval(len($1)%4 == 0)), `0', `1')),`   ')dnl`0
#endif

')

目標は、_DEBUG文字0と文字の間に正しい数のタブ文字を配置することで、両方を揃えるようにすることです。括弧や引用符が欠落している可能性がありますが、私のポイントを理解してください。

私はXcodeを使用しており、タブは4に設定されています。これに対応するために私が変更したものは次のとおりです。

divert(`-1')
# forloop(var, from, to, stmt)
define(`forloop',
`pushdef(`$1', `$2')_forloop(`$1', `$2', `$3', `$4')popdef(`$1')')
define(`_forloop',
`$4`'ifelse($1, `$3', ,
`define(`$1', incr($1))_forloop(`$1', `$2', `$3', `$4')')')
divert`'dnl
changecom()dnl
define(`debug_macro', `
#ifndef $1_DEBUG
#define $1_DEBUG`'forloop(`i', `1', ifelse(eval(len($1) >= 16), 1, 1, eval(5-(len($1)/4+ifelse(eval(len($1)%4 > 1), 0, `0', `1')))),`   ')0
#endif

')
changecom()dnl

私のシステムで "forloop.m4"を見つけることができなかったので、ちょうど含めました。 4ラウンドに分けて、残りが1より大きいかどうかを確認しました。また、単一のタブのスペース実行も変更しました。

興味のある人には、このマクロを使用してアプリケーションのさまざまな領域でデバッグを有効にするために使用する定数を定義します。ファイルがgitにチェックインされました。次のようにチェックインされていない個人ファイルがあります。

//#define NETWORK_DEBUG  1

このファイルは、上記のファイルを含める前にmyapp.pchファイルに含まれています。このようにして、各プログラマは自分の好みに応じて自分のデバッグ領域をオンまたはオフにすることができます。

ベストアンサー1

インデントする最も簡単な方法は、タブの代わりにスペースを使用することです。特に、標準幅以外のタブの場合(タブの標準幅は8です)。

タブのインデントを使用する2番目の簡単な方法は、スペースを含むファイルを作成して次を呼び出すことです。unexpandスペースをタブに変更します。

つまり、m4でもこれを行うことができますが、もっと慣れているはずです。段階的に表現を作成します。 1つの部分が機能するようにして、次のステップに進みます。

forloop標準のm4マクロではありません。私の考えでは、あなたが言っていると思います。forloopGNU m4 マニュアルに記載されているマクロ。これはGNU m4に付属のサンプルコードです(このマニュアルではこれについて明示的に指定されていません)。これをコードで使用するには、明示的に含める必要があります。ディストリビューションは付属している場合も含まれない場合もあるため、コードと共に配布することをお勧めします。

コードにはいくつかの構文問題があります。

  • 呼び出しは引用符の外にあるため、評価時間ではなく評価時間でforloop評価されます。definedebug_macro
  • このifelseマクロは、最初の引数の値のみに基づいて選択せず、最初の2つの引数を比較します。これはケースマクロに似ています。呼び出しはifelse(…, 0, 0, 1)orでなければなりませんifelse(… == 0, 1, 0, 1)
  • #コメントを始めてください。 M4はコメントの後のすべての内容を無視します。コメント区切り記号の変更debug_macroマクロを定義するとき。

パラメータが長すぎない場合は、次のコードが機能します。

include(`/usr/share/doc/m4/examples/forloop.m4')dnl
changecom()dnl
define(`debug_macro', `
#ifndef $1_DEBUG
#define $1_DEBUG`'forloop(`i',`1',eval(5-(len($1)/4+ifelse(eval(len($1)%4), 0, `0', `1'))),`    ')0
#endif

')dnl
changecom('#')dnl

引数によって最大ループインデックスが0以下になると、ループは約2〜32回実行されます(m4は32ビットモジュロ算術を使用します)。この場合、追加のテストを実行する必要があります。以下のコードは、引数が長すぎる場合に単一のタブ文字を挿入します。

include(`/usr/share/doc/m4/examples/forloop.m4')dnl
changecom()dnl
define(`debug_macro', `
#ifndef $1_DEBUG
#define $1_DEBUG`'forloop(`i', `1', ifelse(eval(len($1) >= 16), 1, 1, eval(5-(len($1)/4+ifelse(eval(len($1)%4), 0, `0', `1')))),`       ')0
#endif

')dnl
changecom('#')dnl

おすすめ記事