/* * StringUtil.cpp * * Copyright 2002, Log4cpp Project. All rights reserved. * * See the COPYING file for the terms of usage and distribution. */ #include "StringUtil.hh" #include #include #if defined(_MSC_VER) #define VSNPRINTF _vsnprintf #else #ifdef LOG4CPP_HAVE_SNPRINTF #define VSNPRINTF vsnprintf #else /* use alternative snprintf() from http://www.ijs.si/software/snprintf/ */ #define HAVE_SNPRINTF #define PREFER_PORTABLE_SNPRINTF #include #include extern "C" { #include "snprintf.c" } #define VSNPRINTF portable_vsnprintf #endif // LOG4CPP_HAVE_SNPRINTF #endif // _MSC_VER namespace log4cpp { std::string StringUtil::vform(const char* format, va_list args) { size_t size = 1024; char* buffer = new char[size]; while (1) { va_list args_copy; #if defined(_MSC_VER) || defined(__BORLANDC__) args_copy = args; #else va_copy(args_copy, args); #endif int n = VSNPRINTF(buffer, size, format, args_copy); va_end(args_copy); // If that worked, return a string. if ((n > -1) && (static_cast(n) < size)) { std::string s(buffer); delete [] buffer; return s; } // Else try again with more space. size = (n > -1) ? n + 1 : // ISO/IEC 9899:1999 size * 2; // twice the old size delete [] buffer; buffer = new char[size]; } } std::string StringUtil::trim(const std::string& s) { static const char* whiteSpace = " \t\r\n"; // test for null string if(s.empty()) return s; // find first non-space character std::string::size_type b = s.find_first_not_of(whiteSpace); if(b == std::string::npos) // No non-spaces return ""; // find last non-space character std::string::size_type e = s.find_last_not_of(whiteSpace); // return the remaining characters return std::string(s, b, e - b + 1); } unsigned int StringUtil::split(std::vector& v, const std::string& s, char delimiter, unsigned int maxSegments) { v.clear(); std::back_insert_iterator > it(v); return split(it, s, delimiter, maxSegments); } }