divert(`-1')dnl #changequote(`[', `]')dnl 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')')') # 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')')') # 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(`#')') # 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