00001
00002
00003
00004
00005
00006
00007
00008 #include "StringUtil.hh"
00009 #include <iterator>
00010 #include <stdio.h>
00011
00012 #if defined(_MSC_VER)
00013 #define VSNPRINTF _vsnprintf
00014 #else
00015 #ifdef LOG4CPP_HAVE_SNPRINTF
00016 #define VSNPRINTF vsnprintf
00017 #else
00018
00019
00020 #define HAVE_SNPRINTF
00021 #define PREFER_PORTABLE_SNPRINTF
00022
00023 #include <stdlib.h>
00024 #include <stdarg.h>
00025
00026 extern "C" {
00027 #include "snprintf.c"
00028 }
00029
00030 #define VSNPRINTF portable_vsnprintf
00031
00032 #endif // LOG4CPP_HAVE_SNPRINTF
00033 #endif // _MSC_VER
00034
00035 namespace log4cpp {
00036
00037 std::string StringUtil::vform(const char* format, va_list args) {
00038 size_t size = 1024;
00039 char* buffer = new char[size];
00040
00041 while (1) {
00042 int n = VSNPRINTF(buffer, size, format, args);
00043
00044
00045 if ((n > -1) && (static_cast<size_t>(n) < size)) {
00046 std::string s(buffer);
00047 delete [] buffer;
00048 return s;
00049 }
00050
00051
00052 size = (n > -1) ?
00053 n + 1 :
00054 size * 2;
00055
00056 delete [] buffer;
00057 buffer = new char[size];
00058 }
00059 }
00060
00061 std::string StringUtil::trim(const std::string& s) {
00062 static const char* whiteSpace = " \t\r\n";
00063
00064
00065 if(s.empty())
00066 return s;
00067
00068
00069 std::string::size_type b = s.find_first_not_of(whiteSpace);
00070 if(b == std::string::npos)
00071 return "";
00072
00073
00074 std::string::size_type e = s.find_last_not_of(whiteSpace);
00075
00076
00077 return std::string(s, b, e - b + 1);
00078 }
00079
00080 unsigned int StringUtil::split(std::vector<std::string>& v,
00081 const std::string& s,
00082 char delimiter, unsigned int maxSegments) {
00083 v.clear();
00084 std::back_insert_iterator<std::vector<std::string> > it(v);
00085 return split(it, s, delimiter, maxSegments);
00086 }
00087
00088 }