これは可能であるはずですが、私は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、またはよりポータブルなシェルコマンド)を知っているなら、私は大いに感謝します。