这应该是可能的,但是由于我是 m4 的新手,我不确定如何去做,或者如何编写算法来做到这一点(在 m4 中)。
编辑:
刚刚解决了,反正为了以后参考,我有一系列字符,它们需要被翻译成它们等效的ASCII码点,例如
ascii(-{COLON}-, -{:}-) => #define TKN_COLON 58
这应该是可能的,但是由于我是 m4 的新手,我不确定如何去做,或者如何编写算法来做到这一点(在 m4 中)。
编辑:
刚刚解决了,反正为了以后参考,我有一系列字符,它们需要被翻译成它们等效的ASCII码点,例如
ascii(-{COLON}-, -{:}-) => #define TKN_COLON 58
为了其他对纯 m4 实现感兴趣的人的利益,我设法创建了以下转换宏。它必须干预引用字符以支持正常的 m4 引用字符。如果这不重要,它可以简化一点。
changequote(<!,!>) # Change quotes so we can handle "`" and "'"
# Change quotes every time this macro is called
define(<!asciiord!>,<!changequote(<!,!>)<!!>_asciiord(<!$1!>)<!!>changequote`'dnl
!>)
# Convert chars one at a time in the string argument
define(<!_asciiord!>,<!ifelse(<!$1!>,,, dnl
<!_aconv(substr(<!$1!>,0,1))<!!>ifelse(len(<!$1!>),1,,<!,!>) $0(substr(<!$1!>,1))!>)!>)
# Map ASCII chars to their integer index by position
# Control chars are not supported.
# If the comment character is changed you must alter the map accordingly
define(<!_aconv!>,<!ifelse(<!$1!>,<! !>,32,<!$1!>,<!#!>,35,dnl
<!index(<! !" $%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ !>,<!$1!>)!>)!>)
changequote # Restore normal quoting chars
用法:
asciiord(`hello') --> 104, 101, 108, 108, 111
我通过以下代码部分完成了此操作
divert(-1)
changequote(-{,}-)
changecom(/*,*/)
define(-{ascii}-,-{#define TKN_-{}-$1 esyscmd(-{python -c "import sys; sys.stdout.write('%d'%ord('$2'))"}-)}-)
divert(0)dnl
如果有人知道这样做的更好方法(例如本机 m4 或更便携的 shell 命令),我将不胜感激。