Skip to content

Commit

Permalink
レビュー指摘(strprintf/vstrprintfはテンプレートじゃないほうがいい)の対応
Browse files Browse the repository at this point in the history
  • Loading branch information
sanomari committed Oct 26, 2020
1 parent 7f34990 commit 3c0a2f4
Show file tree
Hide file tree
Showing 2 changed files with 61 additions and 44 deletions.
58 changes: 58 additions & 0 deletions sakura_core/util/string_ex.cpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
/*! @file */
#include "StdAfx.h"
#include "string_ex.h"

#include <stdarg.h>

#include "charset/charcode.h"
#include "util/std_macro.h"
#include <limits.h>
Expand Down Expand Up @@ -211,6 +214,61 @@ const char* stristr_j( const char* s1, const char* s2 )
return NULL;
}

/*!
@brief C-Styleのフォーマット文字列を使ってデータを文字列化する。
@param[out] strOut フォーマットされたテキストを受け取る変数
@param[in] pszFormat フォーマット文字列
@param[in] argList 引数リスト
@returns 出力された文字数。NUL終端を含まない。
@retval >= 0 正常終了
@retval < 0 異常終了
*/
int vstrprintf( std::wstring& strOut, const WCHAR* pszFormat, va_list& argList )
{
// バッファをクリアしておく
strOut.clear();

// _vscwprintf() はフォーマットに必要な文字数を返す。
const int cchOut = ::_vscwprintf( pszFormat, argList );
if( cchOut <= 0 ){
// 出力文字数が0なら後続処理は要らない。また、エラー時は-1が返る。
return cchOut;
}

// フォーマットに必要なバッファを確保する
strOut.resize( cchOut );

// vswprintf_s() はコピーした文字数を返す。
const int actualCopied = ::vswprintf_s( strOut.data(), strOut.capacity(), pszFormat, argList );
if( actualCopied < 0 ){
// データサイズを反映する
strOut.assign( strOut.data(), cchOut );
}

return actualCopied;
}

/*!
@brief C-Styleのフォーマット文字列を使ってデータを文字列化する。
@param[out] strOut フォーマットされたテキストを受け取る変数
@param[in] pszFormat フォーマット文字列
@param[in] ... 引数リスト
@returns 出力された文字数。NUL終端を含まない。
@retval >= 0 正常終了
@retval < 0 異常終了
*/
int strprintf( std::wstring& strOut, const WCHAR* pszFormat, ... )
{
va_list argList;
va_start( argList, pszFormat );

const int nRet = vstrprintf( strOut, pszFormat, argList );

va_end( argList );

return nRet;
}

// -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- //
// 文字コード変換 //
// -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- //
Expand Down
47 changes: 3 additions & 44 deletions sakura_core/util/string_ex.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
#define SAKURA_STRING_EX_87282FEB_4B23_4112_9C5A_419F43618705_H_
#pragma once

#include <vadefs.h>
#include <string>

// 2007.10.19 kobake
Expand Down Expand Up @@ -202,50 +203,8 @@ inline int auto_vsprintf(WCHAR* buf, const WCHAR* format, va_list& v){ return tc
inline int auto_vsprintf_s(ACHAR* buf, size_t nBufCount, const ACHAR* format, va_list& v){ return tchar_vsprintf_s(buf, nBufCount, format, v); }
inline int auto_vsprintf_s(WCHAR* buf, size_t nBufCount, const WCHAR* format, va_list& v){ return tchar_vsprintf_s(buf, nBufCount, format, v); }

template<typename ChType>
inline int vstrprintf( std::basic_string<ChType>& strOut, const ChType* pszFormat, va_list& argList )
{
static_assert( 0, "not implemented" );
return -1;
}

template<typename ChType>
inline int strprintf( std::basic_string<ChType>& strOut, const ChType* pszFormat, ... )
{
static_assert( 0, "not implemented" );
return -1;
}

template<>
inline int vstrprintf<WCHAR>( std::wstring& strOut, const WCHAR* pszFormat, va_list& argList )
{
strOut.clear();

const int cchOut = _vscwprintf( pszFormat, argList );
if( cchOut > 0 ){

strOut.reserve( cchOut );

::vswprintf_s( strOut.data(), strOut.capacity(), pszFormat, argList );

strOut.assign( strOut.data(), cchOut );
}

return cchOut;
}

template<>
inline int strprintf<WCHAR>( std::wstring& strOut, const WCHAR* pszFormat, ... )
{
va_list argList;
va_start( argList, pszFormat );

const int nRet = vstrprintf( strOut, pszFormat, argList );

va_end( argList );

return nRet;
}
int vstrprintf( std::wstring& strOut, const WCHAR* pszFormat, va_list& argList );
int strprintf( std::wstring& strOut, const WCHAR* pszFormat, ... );

// -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- //
// 文字コード変換 //
Expand Down

0 comments on commit 3c0a2f4

Please sign in to comment.