sprintfは悩みに悩みまくります。元々バグの温床であるsprintfを書込する内容によってバッファが増えるように以前作成したのですが、大昔のBorland c++ Builder6(以下BCB6)で作るとva_copyが無くて使えない状況に。
前回作成したのはva_copyでコピーしたva_argについて書き込みサイズ0でシミュレーションすると実際に必要なサイズがわかるという技を使ったものでした。ところがこれにはva_copyが必須なので古いコンパイラだとダメみたいなんですね。
そこで今回はva_copyが定義されてないなら自力でvsprintfをシミュレートするという話です。
毎度コピペで申し訳ないですが、下のサイトを参考に自作の文字出力ライブラリに対応させました。
http://hp.vector.co.jp/authors/VA007110/technicalworkshop/sprintf/
書き込みの所は最後は文字列+=になるわけですから、
/*
数値 => 1文字キャラクタ変換
*/
int wString::tsprintf_char(int ch)
{
*this += (char)ch;
return(1);
}
このように文字列加算についてバッファを増加させておけばOKです。ちなみに私はまたチョンボして毎回バッファを16個くらい増やしてました。毎回16個増えるのでmallocが毎回起きてました。才能ないなぁ。
とまれこれで殆どの処理系でsprintf系の処理についてメモリで悩む事はなくなりました。BCB6のcodeguardでもlinuxのvalgrindでもエラー無く進みます。
細かいことからコツコツやっていくのは楽しいですよ。文字列ライブラリは私のgithubにあるので適当に落としてください。mp3タグの抽出とかnkfとかも取り込んでますが必要なのだけ抜き出せば割合小さくできてます。一部AnsiStringにも対応していて文字列リストが簡単に作れます。他の処理系でどうやってるかは知らないですが一時文字列バッファにはN88BASICで採用されていたString Accumulaterを採用しています。一時バッファをリングで構成してるのです。ではEnjoy your hack!
Copyright(c) 2015 Birdland Ltd. All Rights Reserved.