diff --git a/R-package/src/Makevars b/R-package/src/Makevars index ae1e3def5..44dce490e 100644 --- a/R-package/src/Makevars +++ b/R-package/src/Makevars @@ -1,9 +1,9 @@ # package root PKGROOT=../../ # _*_ mode: Makefile; _*_ -PKG_CPPFLAGS= -DXGBOOST_CUSTOMIZE_MSG_ -DXGBOOST_CUSTOMIZE_PRNG_ -I$(PKGROOT) +PKG_CPPFLAGS= -DXGBOOST_CUSTOMIZE_MSG_ -DXGBOOST_CUSTOMIZE_PRNG_ -DXGBOOST_STRICT_CXX98_ -I$(PKGROOT) PKG_CXXFLAGS= $(SHLIB_OPENMP_CFLAGS) PKG_LIBS = $(SHLIB_OPENMP_CFLAGS) -OBJECTS= xgboost_R.o $(PKGROOT)/wrapper/xgboost_wrapper.o $(PKGROOT)/src/io/io.o $(PKGROOT)/src/gbm/gbm.o $(PKGROOT)/src/tree/updater.o +OBJECTS= xgboost_R.o xgboost_assert.o $(PKGROOT)/wrapper/xgboost_wrapper.o $(PKGROOT)/src/io/io.o $(PKGROOT)/src/gbm/gbm.o $(PKGROOT)/src/tree/updater.o diff --git a/R-package/src/Makevars.win b/R-package/src/Makevars.win index aec0d2c89..289f1a15a 100644 --- a/R-package/src/Makevars.win +++ b/R-package/src/Makevars.win @@ -1,7 +1,7 @@ # package root PKGROOT=../../ # _*_ mode: Makefile; _*_ -PKG_CPPFLAGS= -DXGBOOST_CUSTOMIZE_MSG_ -DXGBOOST_CUSTOMIZE_PRNG_ -I$(PKGROOT) +PKG_CPPFLAGS= -DXGBOOST_CUSTOMIZE_MSG_ -DXGBOOST_CUSTOMIZE_PRNG_ -DXGBOOST_STRICT_CXX98_ -I$(PKGROOT) PKG_CXXFLAGS= $(SHLIB_OPENMP_CFLAGS) PKG_LIBS = $(SHLIB_OPENMP_CFLAGS) -OBJECTS= xgboost_R.o $(PKGROOT)/wrapper/xgboost_wrapper.o $(PKGROOT)/src/io/io.o $(PKGROOT)/src/gbm/gbm.o $(PKGROOT)/src/tree/updater.o +OBJECTS= xgboost_R.o xgboost_assert.o $(PKGROOT)/wrapper/xgboost_wrapper.o $(PKGROOT)/src/io/io.o $(PKGROOT)/src/gbm/gbm.o $(PKGROOT)/src/tree/updater.o diff --git a/R-package/src/xgboost_R.cpp b/R-package/src/xgboost_R.cpp index 38cce98b4..2f1a8b772 100644 --- a/R-package/src/xgboost_R.cpp +++ b/R-package/src/xgboost_R.cpp @@ -8,21 +8,22 @@ #include "src/utils/utils.h" #include "src/utils/omp.h" #include "src/utils/matrix_csr.h" - using namespace xgboost; + +extern "C" { + void XGBoostAssert_R(int exp, const char *fmt, ...); + void XGBoostCheck_R(int exp, const char *fmt, ...); +} + // implements error handling namespace xgboost { namespace utils { -void HandleAssertError(const char *msg) { - error("%s", msg); -} -void HandleCheckError(const char *msg) { - error("%s", msg); -} -void HandlePrint(const char *msg) { - Rprintf("%s", msg); -} +void (*Printf)(const char *fmt, ...) = Rprintf; +void (*Assert)(int exp, const char *fmt, ...) = XGBoostAssert_R; +void (*Check)(int exp, const char *fmt, ...) = XGBoostCheck_R; +void (*Error)(const char *fmt, ...) = error; } // namespace utils + namespace random { void Seed(unsigned seed) { warning("parameter seed is ignored, please set random seed using set.seed"); diff --git a/R-package/src/xgboost_assert.c b/R-package/src/xgboost_assert.c new file mode 100644 index 000000000..a2539c3b9 --- /dev/null +++ b/R-package/src/xgboost_assert.c @@ -0,0 +1,25 @@ +#include +#include +#include + +// implements error handling +void XGBoostAssert_R(int exp, const char *fmt, ...) { + char buf[1024]; + if (exp == 0) { + va_list args; + va_start(args, fmt); + vsprintf(buf, fmt, args); + va_end(args); + error("AssertError:%s\n", buf); + } +} +void XGBoostCheck_R(int exp, const char *fmt, ...) { + char buf[1024]; + if (exp == 0) { + va_list args; + va_start(args, fmt); + vsprintf(buf, fmt, args); + va_end(args); + error("%s\n", buf); + } +} diff --git a/src/utils/utils.h b/src/utils/utils.h index 7fc966c97..1214be861 100644 --- a/src/utils/utils.h +++ b/src/utils/utils.h @@ -70,14 +70,23 @@ inline void HandlePrint(const char *msg) { printf("%s", msg); } #else +#ifndef XGBOOST_STRICT_CXX98__ // include declarations, some one must implement this void HandleAssertError(const char *msg); void HandleCheckError(const char *msg); void HandlePrint(const char *msg); #endif +#endif +#ifdef XGBOOST_STRICT_CXX98_ +// these function pointers are to be assigned +extern void (*Printf)(const char *fmt, ...); +extern void (*Assert)(int exp, const char *fmt, ...); +extern void (*Check)(int exp, const char *fmt, ...); +extern void (*Error)(const char *fmt, ...); +#else /*! \brief printf, print message to the console */ -inline void Printf(const char *fmt, ...) { +inline void Printf(const char *fmt, ...) { std::string msg(kPrintBuffer, '\0'); va_list args; va_start(args, fmt); @@ -121,6 +130,7 @@ inline void Error(const char *fmt, ...) { HandleCheckError(msg.c_str()); } } +#endif /*! \brief replace fopen, report error when the file open fails */ inline FILE *FopenCheck(const char *fname, const char *flag) {