2009年11月9日月曜日

vsnprintf

この下はちょっと濃い話です。



printf系列の関数はSJISの文字コードで使うと時々文字化けする。これは2バイト文字の2バイト目が0x5cになっていると発生する現象で、対処も容易…なんだけど!

PSPSDKのlibc/xprintf.cで定義されている関数を使うと一気に実行ファイルのサイズが膨れる。これなんとかならないものか…

png読み込みルーチンみたく、自分で実装しようかと思った。適当にフォーマット文字列を一文字ずつ読み込んでいけばいいやー♪とか思ったら

え?可変引数のn番目を参照する必要がある…だと?

%*5fとか指定されたとき、5番目の可変引数を精度として使わなきゃいけないわけですよ。つまり可変引数にランダムアクセスできなきゃいけない。でもCの標準だとシーケンシャルしかできないから適当にリスト構造でも作らないといけないわけで。しかも可変引数がいくつ有るかはフォーマット文字列解析しないといけないわけで

処理としては以下のとおり

  1. フォーマット文字列を解析して可変引数がいくつあるか、どんな型なのか調べる

  2. 可変引数へのポインタををリスト構造で作る

  3. フォーマット文字列からバッファにデータを移す。2バイト文字ならそのまま2バイトうつし、%文字と\文字があれば条件分岐、その他の1バイト文字ならそのままうつす


けっこう面倒くさいなぁ…あ、だから標準関数を使うと実行ファイルが膨れるのかw

しかも、これがDXPの内部で使いたいvsnprintfだったりすると、戻り値は「format文字列から算出される結果のバイト数」であり「出力したバイト数」ではない。更に面倒くさい…

どこかに軽量なvsnprintfのソースでも転がってないかな

神は死んだ!(byニーチェ)などと叫びたくなった15分でした。

1 件のコメント: