"util/string_ex.h"のなかで、auto_snprintfが定義されていて、ずっと追っていくと最終的に vsprintf_s/vswprintf_s を呼んでいます。
sprintf_s も snprintf も似た様なもの、と思われるかもしれませんが、出力に対しバッファが足りない場合の挙動が違います。
オンラインのMSDNを見ると、_sのほうは「バッファが小さすぎて出力テキストを格納できない場合、バッファは、空の文字列に設定され」るとあります。
snのほうは、_TRUNCATEフラグを指定した場合、「終端の null 用の空きを残して buffer に収まる限りの文字列を書き込みます。」
何が言いたいのかというと、後者のようにバッファに詰めれるだけ詰めるsprintfが欲しいのですが、現状の auto_snprintfだと期待した動作にならないので、動作を変更したい、ということです。
すでにauto_snprintfを使っている部分への影響も心配ですが、vsnprintf_sがVC依存してて、他のコンパイラでエラーにならないかが気になっています。
関数名から想像して終端処理もsnprintf相当になっているほうが
紛らわしくなくていいかな?、と思います。
現状の使用箇所はANSI版でsnprintfだった箇所だと思いますし。
・auto_snprintfはvsnprintfベースにする
・必要ならvsnprintf_sベースのauto_snprintf_sを追加
とするのは、難しいのかな。。。
-----
個人的にはすなおに直接、標準Cライブラリ関数を叩きたいのだけど。
通常はsntprintfを使い、引数の型次第でsnprintf, snwprintfも使い分け。
"%ts"は無理に使わなくても"%s"と等価ですよね。
(^^;;;
ちなみにC99に準拠していると称するgccのsnprintfは
結果がバッファ長を超える場合、末尾に¥0を設定し、
戻り値は、バッファが十分だった場合の結果文字数です。
(VCの _snprintf だと、¥0を設定せず、-1を返す)
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/printf.3.html
どう倒しても紛らわしいので、
・VCの _snprintf に対応する auto関数は提供しない。
・今の auto_snprintf は auto_snprintf_s に変名。
挙動は末尾に¥0を設定し、-1を返す。
というのはどうでしょう?
末尾に¥0を付けたくない需要はめったに無いと思うし、
(あるならコメント付で_snprintfを使ってもらう)
不注意な人(=私)が¥0付け忘れる可能性のほうが
高いような気がするので。
#ifdef _UNICODE で書き分けるというのもありですが、
その前にANSIビルドの存在意義について小一時間(ry
auto_snprintf_s関数追加。auto_snprintfを読んでいた部分を修正。
末尾に\0を付ける auto_snprintf_s関数を作り、
auto_snprintfを呼んでいたところは _sを呼ぶように
修正しました。
Fix_auto_snprintf_U2.patch
フィールドの切れ目でバッファを使い切ると、フォーマット文字列が残っていても切り詰めと判定されないバグを修正
バグがあったので修正します。
内容:フィールドの切れ目でバッファをちょうど
使い切ると tchar_vsprintf_s_imp のwhileループを
抜けてしまい、まだ出力すべきものが残っていても
切り詰め(-1)と判断されなかった。
Fix_auto_snprintf_U3.patch
リビジョン1672でコミットしました。