OpenHSP ver 3.2 の strf は可変長引数対応になって便利なので、HSP 3.1 でも動かせるようにプラグインにしてみました。みんなぜひ使うといいと思うよ!
付属しているサンプルとまったく同じものをここに掲載しておきます。
// サンプル
// strf_ex : OpenHSP ver 3.2 の可変長引数対応 strf を HSP 3.1 でも使えるようにするプラグイン
// ファイル strf_ex.dll と次の 2 文で strf_ex が使えるようになります
#regcmd "hsp3cmdinit", "strf_ex.dll"
#cmd strf_ex 0
//標準の strf を置き換えることもできます
;#undef strf
;#define global strf strf_ex
mes strf_ex("<%s><%d><%f>", "hoge",123, 3.14) //=> <hoge><123><3.140000>
// 型が合わなければ自動的に変換されます
mes strf_ex( "<%s><%d><%f>", 123, 3.14, "hoge" ) //=> <123><3><0.000000>
mes strf_ex( "%%" ) //=> %
a = 0x80000000
mes strf_ex( "<%d><%u><%o><%x>", a, a, a, a ) //=> <-2147483648><2147483648><20000000000><80000000>
mes strf_ex( "%.3s", "hello" ) //=> hel
mes strf_ex( "<%06d>", 123 ) //=> <000123>
// `*' で幅や精度を引数から得る機能はありません!
;mes strf_ex( "<%.*s>", 3, "hello" ) //エラー
;mes strf_ex( "<%0*d>", 6, 123 ) //エラー
// 数が合わない場合もエラー
;mes strf_ex( "%d" ) //エラー
;mes strf_ex( "", 123 ) //エラー
// HSP 3.1 の strf では %s で文字列ポインタから文字列を取り出せました(仕様外)が、
// そうはできなくなりました。
a = "hoge"
mes strf( "<%s>", varptr(a) + 1 ) //=> <oge>
mes strf_ex( "<%s>", varptr(a) + 1 ) //=> <10683521>
// HSP 3.2 からは必ず dupptr をかましてやってください
a = "hoge"
dupptr b, varptr(a) + 1, 1, 2
mes strf_ex( "<%s>", b) //=> <oge>
// なんと3.1では第二引数が文字列だとそれ単体で返ってきてしまいます
// 3.2 ではそんなことはありません
mes strf( "<%s>", "abc") //=> abc
mes strf_ex( "<%s>", "abc") //=> <abc>
// 3.1 の strf は結果が長いと場合によっては異常終了したり、なぞのエラーが出たり、システムエラーが発生したりします
;mes strlen(strf("%05000d",0))
;mes strlen(strf("%06000d",0))
;mes strlen(strf("%07000d",0))
;mes strlen(strf("%08000d",0))
// 3.2 ではそんなことはありません
mes strlen(strf_ex("%05000d",0)) //=> 5000
mes strlen(strf_ex("%06000d",0)) //=> 6000
mes strlen(strf_ex("%07000d",0)) //=> 7000
mes strlen(strf_ex("%08000d",0)) //=> 8000
mes strlen(strf_ex("%0100000d",0)) //=> 100000
// こんなところかな。