From 9ebaa2982c2214f9472f542a11a93ac5f5bec0fd Mon Sep 17 00:00:00 2001 From: Louis Burke Date: Sun, 27 Oct 2024 20:31:16 -0400 Subject: [PATCH] Made m4 more readable --- misc/utils.m4 | 85 +++++++++++++++++++++++--------------------- src/arch/x86_64.h.m4 | 52 +++++++++++++-------------- 2 files changed, 70 insertions(+), 67 deletions(-) diff --git a/misc/utils.m4 b/misc/utils.m4 index 47c37e9..d5d28ff 100644 --- a/misc/utils.m4 +++ b/misc/utils.m4 @@ -1,50 +1,53 @@ divert(`-1')dnl -#changequote(`[', `]')dnl +changequote(`«', `»') +changecom(«/*», «*/») +\ note: use https://github.com/vim-scripts/syntaxm4.vim.git + vim-m4-syntax: quote=«,» comment=\\ -define(`TICK', changequote([,])[changequote([,])'changequote(`,')]changequote(`,')) +define(«TICK», changequote([,])[changequote([,])»changequote(«,»)]changequote(«,»)) -# forloop(var, from, to, stmt) - improved version: -# works even if VAR is not a strict macro name -# performs sanity check that FROM is larger than TO -# allows complex numerical expressions in TO and FROM -define(`forloop', `ifelse(eval(`($2) <= ($3)'), `1', - `pushdef(`$1')_$0(`$1', eval(`$2'), - eval(`$3'), `$4')popdef(`$1')')') -define(`_forloop', - `define(`$1', `$2')$4`'ifelse(`$2', `$3', `', - `$0(`$1', incr(`$2'), `$3', `$4')')') +\ forloop(var, from, to, stmt) - improved version: +\ works even if VAR is not a strict macro name +\ performs sanity check that FROM is larger than TO +\ allows complex numerical expressions in TO and FROM +define(«forloop», «ifelse(eval(«($2) <= ($3)»), «1», + «pushdef(«$1»)_$0(«$1», eval(«$2»), + eval(«$3»), «$4»)popdef(«$1»)»)») +define(«_forloop», + «define(«$1», «$2»)$4«»ifelse(«$2», «$3», «», + «$0(«$1», incr(«$2»), «$3», «$4»)»)») -# foreachq(x, `item_1, item_2, ..., item_n', stmt) -# quoted list, version based on forloop -define(`foreachq', -`ifelse(`$2', `', `', `_$0(`$1', `$3', $2)')') -define(`_foreachq', -`pushdef(`$1', forloop(`$1', `3', `$#', - `$0_(`1', `2', indir(`$1'))')`popdef( - `$1')')indir(`$1', $@)') -define(`_foreachq_', -``define(`$$1', `$$3')$$2`''') +\ foreachq(x, «item_1, item_2, ..., item_n», stmt) +\ quoted list, version based on forloop +define(«foreachq», +«ifelse(«$2», «», «», «_$0(«$1», «$3», $2)»)») +define(«_foreachq», +«pushdef(«$1», forloop(«$1», «3», «$#», + «$0_(«1», «2», indir(«$1»))»)«popdef( + «$1»)»)indir(«$1», $@)») +define(«_foreachq_», +««define(«$$1», «$$3»)$$2«»»») -# foreach(x, (item_1, item_2, ..., item_n), stmt) -# parenthesized list, improved version -define(`foreach', `pushdef(`$1')_$0(`$1', - (dquote(dquote_elt$2)), `$3')popdef(`$1')') -define(`_arg1', `$1') -define(`_foreach', `ifelse(`$2', `(`')', `', - `define(`$1', _arg1$2)$3`'$0(`$1', (dquote(shift$2)), `$3')')') +\ foreach(x, (item_1, item_2, ..., item_n), stmt) +\ parenthesized list, improved version +define(«foreach», «pushdef(«$1»)_$0(«$1», + (dquote(dquote_elt$2)), «$3»)popdef(«$1»)») +define(«_arg1», «$1») +define(«_foreach», «ifelse(«$2», «(«»)», «», + «define(«$1», _arg1$2)$3«»$0(«$1», (dquote(shift$2)), «$3»)»)») -# hextox(x) -# hexadecimal number to series of X(0xZZ)X(0xZZ)... -define(`hextox', `patsubst(`$1', `..', `X(0x\&)')') +\ hextox(x) +\ hexadecimal number to series of X(0xZZ)X(0xZZ)... +define(«hextox», «patsubst(«$1», «..», «X(0x\&)»)») -# hashtag(x) -# expands to #x -define(`hashtag', `changecom()dnl -#$1`'dnl -changecom(`#')') +\ hashtag(x) +\ expands to #x +define(«hashtag», «changecom()dnl +#$1«»dnl +changecom(«#»)») -# rtrimn(x, n) -# expands to all but the last n characters of x -define(`rtrimn', `substr($1, 0, eval(len($1)-$2))') +\ rtrimn(x, n) +\ expands to all but the last n characters of x +define(«rtrimn», «substr($1, 0, eval(len($1)-$2))») -divert(`0')dnl +divert(«0»)dnl diff --git a/src/arch/x86_64.h.m4 b/src/arch/x86_64.h.m4 index bc42ee8..9e4bb84 100644 --- a/src/arch/x86_64.h.m4 +++ b/src/arch/x86_64.h.m4 @@ -1,19 +1,19 @@ +include(`misc/utils.m4')dnl vim-m4-syntax: quote=«,» comment=\\ #ifndef X86_64_H #define X86_64_H #include "../utils.h" /******************************************************************************* -include(`misc/utils.m4')dnl -divert(`-1')dnl +divert(«-1»)dnl -define(`registers', `RAX, RCX, RDX, RBX, R8, R9, R10, R11, R12, R13, R14, R15') +define(«registers», «RAX, RCX, RDX, RBX, R8, R9, R10, R11, R12, R13, R14, R15») -define(`x86_encoding_of', `translit(esyscmd(`echo 'TICK`$1'TICK` | ./tools/x86_64dump'),` -')') -define(`assemble', `hextox(x86_encoding_of($1)) Y("$1")') +define(«x86_encoding_of», «translit(esyscmd(«echo '$1' | ./tools/x86_64dump»),« +»)») +define(«assemble», «hextox(x86_encoding_of($1)) Y("$1")») -divert(`0')dnl +divert(«0»)dnl Types: @@ -40,29 +40,29 @@ Implementations (auto generated): #define XX(x) X(BYTE_0xFF(x)) X(BYTE_0xFF00(x)) #define XXX(x) X(BYTE_0xFF(x)) X(BYTE_0xFF00(x)) X(BYTE_0xFF0000(x)) #define XXXX(x) X(BYTE_0xFF(x)) X(BYTE_0xFF00(x)) X(BYTE_0xFF0000(x)) X(BYTE_0xFF000000(x)) -foreachq(register, `registers', `hashtag(define) PUSH_`'register`' assemble(`push register') -') +foreachq(register, «registers», «#define PUSH_«»register«» assemble(«push register») +») #define PUSH_BYTE(x) X(0x6a) X(x) Y("push " #x) #define PUSH_WORD(x) X(0x86) XXXX(x) Y("push " #x) -foreachq(register, `registers', `hashtag(define) POP_`'register`' assemble(`pop register') -') -foreachq(registera, `registers', ` -foreachq(registerb, `registers', `ifelse(registera,registerb,,hashtag(define) MOV_`'registera`'_`'registerb`' assemble(`mov registera`,'registerb') -)')') -foreachq(register, `registers', `hashtag(define) MOV_`'register`'_WORD(x) hextox(rtrimn(x86_encoding_of(`mov 'register`, 0'), 8)) XXXX(x) Y("mov register," hashtag(x)) -') +foreachq(register, «registers», «#define POP_«»register«» assemble(«pop register») +») +foreachq(registera, «registers», « +foreachq(registerb, «registers», «ifelse(registera,registerb,,#define MOV_«»registera«»_«»registerb«» assemble(«mov registera«,»registerb») +)»)») +foreachq(register, «registers», «#define MOV_«»register«»_WORD(x) hextox(rtrimn(x86_encoding_of(«mov »register«, 0»), 8)) XXXX(x) Y("mov register," #x) +») -foreachq(registera, `registers', ` -foreachq(registerb, `registers', `ifelse(registera,registerb,,hashtag(define) ADD_`'registera`'_`'registerb`' assemble(`add registera`,'registerb') -)')') -foreachq(register, `registers', `hashtag(define) ADD_`'register`'_WORD(x) hextox(rtrimn(x86_encoding_of(`add 'register`, 0x12345678'), 8)) XXXX(x) Y("add register," hashtag(x)) -') +foreachq(registera, «registers», « +foreachq(registerb, «registers», «ifelse(registera,registerb,,#define ADD_«»registera«»_«»registerb«» assemble(«add registera«,»registerb») +)»)») +foreachq(register, «registers», «#define ADD_«»register«»_WORD(x) hextox(rtrimn(x86_encoding_of(«add »register«, 0x12345678»), 8)) XXXX(x) Y("add register," #x) +») -foreachq(registera, `registers', ` -foreachq(registerb, `registers', `ifelse(registera,registerb,,hashtag(define) SUB_`'registera`'_`'registerb`' assemble(`sub registera`,'registerb') -)')') -foreachq(register, `registers', `hashtag(define) SUB_`'register`'_WORD(x) hextox(rtrimn(x86_encoding_of(`sub 'register`, 0x12345678'), 8)) XXXX(x) Y("sub register," hashtag(x)) -') +foreachq(registera, «registers», « +foreachq(registerb, «registers», «ifelse(registera,registerb,,#define SUB_«»registera«»_«»registerb«» assemble(«sub registera«,»registerb») +)»)») +foreachq(register, «registers», «#define SUB_«»register«»_WORD(x) hextox(rtrimn(x86_encoding_of(«sub »register«, 0x12345678»), 8)) XXXX(x) Y("sub register," #x) +») #endif /* X86_64_H */