From bb5c151f574c6e2a9281af5af5bfb44da7bd8825 Mon Sep 17 00:00:00 2001 From: tqchen Date: Mon, 1 Sep 2014 23:12:50 -0700 Subject: [PATCH] move sprintf into std --- R-package/src/xgboost_R.cpp | 2 ++ R-package/src/xgboost_assert.c | 8 ++++++++ src/learner/evaluation.h | 2 +- src/learner/learner-inl.hpp | 6 +++--- src/utils/utils.h | 9 +++++++++ 5 files changed, 23 insertions(+), 4 deletions(-) diff --git a/R-package/src/xgboost_R.cpp b/R-package/src/xgboost_R.cpp index f255d233d..215328eda 100644 --- a/R-package/src/xgboost_R.cpp +++ b/R-package/src/xgboost_R.cpp @@ -14,6 +14,7 @@ using namespace xgboost; extern "C" { void XGBoostAssert_R(int exp, const char *fmt, ...); void XGBoostCheck_R(int exp, const char *fmt, ...); + int XGBoostSPrintf_R(char *buf, size_t size, const char *fmt, ...); } // implements error handling @@ -21,6 +22,7 @@ namespace xgboost { namespace utils { extern "C" { void (*Printf)(const char *fmt, ...) = Rprintf; + int (*SPrintf)(char *buf, size_t size, const char *fmt, ...) = XGBoostSPrintf_R; void (*Assert)(int exp, const char *fmt, ...) = XGBoostAssert_R; void (*Check)(int exp, const char *fmt, ...) = XGBoostCheck_R; void (*Error)(const char *fmt, ...) = error; diff --git a/R-package/src/xgboost_assert.c b/R-package/src/xgboost_assert.c index a2539c3b9..20b789492 100644 --- a/R-package/src/xgboost_assert.c +++ b/R-package/src/xgboost_assert.c @@ -23,3 +23,11 @@ void XGBoostCheck_R(int exp, const char *fmt, ...) { error("%s\n", buf); } } +int XGBoostSPrintf_R(char *buf, size_t size, const char *fmt, ...) { + int ret; + va_list args; + va_start(args, fmt); + ret = vsnprintf(buf, size, fmt, args); + va_end(args); + return ret; +} diff --git a/src/learner/evaluation.h b/src/learner/evaluation.h index 90f4a5839..ec37e1f4a 100644 --- a/src/learner/evaluation.h +++ b/src/learner/evaluation.h @@ -73,7 +73,7 @@ class EvalSet{ for (size_t i = 0; i < evals_.size(); ++i) { float res = evals_[i]->Eval(preds, info); char tmp[1024]; - snprintf(tmp, sizeof(tmp), "\t%s-%s:%f", evname, evals_[i]->Name(), res); + utils::SPrintf(tmp, sizeof(tmp), "\t%s-%s:%f", evname, evals_[i]->Name(), res); result += tmp; } return result; diff --git a/src/learner/learner-inl.hpp b/src/learner/learner-inl.hpp index 60e1fccf1..5d7c9d06a 100644 --- a/src/learner/learner-inl.hpp +++ b/src/learner/learner-inl.hpp @@ -63,10 +63,10 @@ class BoostLearner { } char str_temp[25]; if (num_feature > mparam.num_feature) { - snprintf(str_temp, sizeof(str_temp), "%u", num_feature); + utils::SPrintf(str_temp, sizeof(str_temp), "%u", num_feature); this->SetParam("bst:num_feature", str_temp); } - snprintf(str_temp, sizeof(str_temp), "%lu", + utils::SPrintf(str_temp, sizeof(str_temp), "%lu", static_cast(buffer_size)); this->SetParam("num_pbuffer", str_temp); if (!silent) { @@ -183,7 +183,7 @@ class BoostLearner { const std::vector &evname) { std::string res; char tmp[256]; - snprintf(tmp, sizeof(tmp), "[%d]", iter); + utils::SPrintf(tmp, sizeof(tmp), "[%d]", iter); res = tmp; for (size_t i = 0; i < evals.size(); ++i) { this->PredictRaw(*evals[i], &preds_); diff --git a/src/utils/utils.h b/src/utils/utils.h index 66e29185a..3798a579c 100644 --- a/src/utils/utils.h +++ b/src/utils/utils.h @@ -87,6 +87,7 @@ void HandlePrint(const char *msg); #ifdef XGBOOST_STRICT_CXX98_ // these function pointers are to be assigned extern "C" void (*Printf)(const char *fmt, ...); +extern "C" int (*SPrintf)(char *buf, size_t size, const char *fmt, ...); extern "C" void (*Assert)(int exp, const char *fmt, ...); extern "C" void (*Check)(int exp, const char *fmt, ...); extern "C" void (*Error)(const char *fmt, ...); @@ -100,6 +101,14 @@ inline void Printf(const char *fmt, ...) { va_end(args); HandlePrint(msg.c_str()); } +/*! \brief portable version of snprintf */ +inline int SPrintf(char *buf, size_t size, const char *fmt, ...) { + va_list args; + va_start(args, fmt); + int ret = vsnprintf(buf, size, fmt, args); + va_end(args); + return ret; +} /*! \brief assert an condition is true, use this to handle debug information */ inline void Assert(bool exp, const char *fmt, ...) {