가변 개수의 탭을 사용하여 열을 정렬하는 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

')

목표는 _DEBUG0문자 사이에 올바른 수의 탭 문자를 배치하여 모두 정렬되도록 하는 것입니다. 괄호나 따옴표가 누락되었을 수 있지만 내 요점을 이해하시기 바랍니다.

저는 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입니다).

탭 들여쓰기를 사용하는 두 번째로 쉬운 방법은 공백이 포함된 파일을 생성하고 다음을 호출하는 것입니다.unexpand공백을 탭으로 바꾸세요.

즉, m4에서도 이 작업을 수행할 수 있지만 좀 더 익숙해져야 합니다. 단계별로 표현을 작성하세요. 한 부분이 작동하도록 두고 다음 단계로 넘어갑니다.

forloop표준 m4 매크로가 아닙니다. 내 생각엔 당신이 말하는 것 같아요forloopGNU m4 매뉴얼에 설명된 매크로. 이것은 GNU m4와 함께 제공되는 샘플 코드입니다(설명서에는 이에 대해 명시적으로 명시되어 있지 않습니다). 이를 코드에서 사용하려면 명시적으로 포함해야 합니다. 배포판은 함께 제공될 수도 있고 포함되지 않을 수도 있으므로 코드와 함께 배포하는 것이 좋습니다.

코드에 몇 가지 구문 문제가 있습니다.

  • 호출을 따옴표 밖에 두었 으므로 평가 시간 이 아닌 평가 시간에 forloop평가됩니다 .definedebug_macro
  • ifelse매크로는 첫 번째 인수의 값만을 기준으로 선택하지 않고 처음 두 인수를 비교합니다. 이는 케이스 매크로와 비슷합니다. 호출은 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

관련 정보