migrate StringUtil.h to C++11
This commit is contained in:
		
							parent
							
								
									ea12c6fde6
								
							
						
					
					
						commit
						07e245eb02
					
				@ -25,104 +25,103 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifndef STRINGUTIL_H_
 | 
			
		||||
#define STRINGUTIL_H_
 | 
			
		||||
 | 
			
		||||
#include "../typedefs.h"
 | 
			
		||||
#ifndef STRINGUTIL_H
 | 
			
		||||
#define STRINGUTIL_H
 | 
			
		||||
 | 
			
		||||
#include <boost/algorithm/string.hpp>
 | 
			
		||||
 | 
			
		||||
#include <boost/spirit/include/karma.hpp>
 | 
			
		||||
#include <boost/spirit/include/qi.hpp>
 | 
			
		||||
 | 
			
		||||
#include <cstdio>
 | 
			
		||||
#include <cctype>
 | 
			
		||||
#include <string>
 | 
			
		||||
#include <vector>
 | 
			
		||||
 | 
			
		||||
// precision:  position after decimal point
 | 
			
		||||
// length: maximum number of digits including comma and decimals
 | 
			
		||||
template< int length, int precision >
 | 
			
		||||
static inline char* printInt( char* buffer, int value ) {
 | 
			
		||||
template <int length, int precision> static inline char *printInt(char *buffer, int value)
 | 
			
		||||
{
 | 
			
		||||
    bool minus = false;
 | 
			
		||||
    if ( value < 0 ) {
 | 
			
		||||
    if (value < 0)
 | 
			
		||||
    {
 | 
			
		||||
        minus = true;
 | 
			
		||||
        value = -value;
 | 
			
		||||
    }
 | 
			
		||||
    buffer += length - 1;
 | 
			
		||||
    for ( int i = 0; i < precision; i++ ) {
 | 
			
		||||
        *buffer = '0' + ( value % 10 );
 | 
			
		||||
    for (int i = 0; i < precision; i++)
 | 
			
		||||
    {
 | 
			
		||||
        *buffer = '0' + (value % 10);
 | 
			
		||||
        value /= 10;
 | 
			
		||||
        buffer--;
 | 
			
		||||
    }
 | 
			
		||||
    *buffer = '.';
 | 
			
		||||
    buffer--;
 | 
			
		||||
    for ( int i = precision + 1; i < length; i++ ) {
 | 
			
		||||
        *buffer = '0' + ( value % 10 );
 | 
			
		||||
    for (int i = precision + 1; i < length; i++)
 | 
			
		||||
    {
 | 
			
		||||
        *buffer = '0' + (value % 10);
 | 
			
		||||
        value /= 10;
 | 
			
		||||
        if ( value == 0 ) break;
 | 
			
		||||
        if (value == 0)
 | 
			
		||||
            break;
 | 
			
		||||
        buffer--;
 | 
			
		||||
    }
 | 
			
		||||
    if ( minus ) {
 | 
			
		||||
    if (minus)
 | 
			
		||||
    {
 | 
			
		||||
        buffer--;
 | 
			
		||||
        *buffer = '-';
 | 
			
		||||
    }
 | 
			
		||||
    return buffer;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline void intToString(const int value, std::string & output) {
 | 
			
		||||
static inline void intToString(const int value, std::string &output)
 | 
			
		||||
{
 | 
			
		||||
    output.clear();
 | 
			
		||||
    std::back_insert_iterator<std::string> sink(output);
 | 
			
		||||
    boost::spirit::karma::generate(sink, boost::spirit::karma::int_, value);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline void int64ToString(const int64_t value, std::string & output) {
 | 
			
		||||
static inline void int64ToString(const int64_t value, std::string &output)
 | 
			
		||||
{
 | 
			
		||||
    output.clear();
 | 
			
		||||
    std::back_insert_iterator<std::string> sink(output);
 | 
			
		||||
    boost::spirit::karma::generate(sink, boost::spirit::karma::long_long, value);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline int stringToInt(const std::string& input) {
 | 
			
		||||
    std::string::const_iterator first_digit = input.begin();
 | 
			
		||||
    //Delete any trailing white-spaces
 | 
			
		||||
    while(first_digit != input.end() && std::isspace(*first_digit)) {
 | 
			
		||||
static inline int stringToInt(const std::string &input)
 | 
			
		||||
{
 | 
			
		||||
    auto first_digit = input.begin();
 | 
			
		||||
    // Delete any trailing white-spaces
 | 
			
		||||
    while (first_digit != input.end() && std::isspace(*first_digit))
 | 
			
		||||
    {
 | 
			
		||||
        ++first_digit;
 | 
			
		||||
    }
 | 
			
		||||
    int value = 0;
 | 
			
		||||
    boost::spirit::qi::parse(
 | 
			
		||||
        first_digit,
 | 
			
		||||
        input.end(),
 | 
			
		||||
        boost::spirit::int_, value
 | 
			
		||||
    );
 | 
			
		||||
    boost::spirit::qi::parse(first_digit, input.end(), boost::spirit::int_, value);
 | 
			
		||||
    return value;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline unsigned stringToUint(const std::string& input) {
 | 
			
		||||
    std::string::const_iterator first_digit = input.begin();
 | 
			
		||||
    //Delete any trailing white-spaces
 | 
			
		||||
    while(first_digit != input.end() && std::isspace(*first_digit)) {
 | 
			
		||||
static inline unsigned stringToUint(const std::string &input)
 | 
			
		||||
{
 | 
			
		||||
    auto first_digit = input.begin();
 | 
			
		||||
    // Delete any trailing white-spaces
 | 
			
		||||
    while (first_digit != input.end() && std::isspace(*first_digit))
 | 
			
		||||
    {
 | 
			
		||||
        ++first_digit;
 | 
			
		||||
    }
 | 
			
		||||
    int value = 0;
 | 
			
		||||
    boost::spirit::qi::parse(
 | 
			
		||||
        first_digit,
 | 
			
		||||
        input.end(),
 | 
			
		||||
        boost::spirit::uint_, value
 | 
			
		||||
    );
 | 
			
		||||
    boost::spirit::qi::parse(first_digit, input.end(), boost::spirit::uint_, value);
 | 
			
		||||
    return value;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline uint64_t stringToInt64(const std::string& input) {
 | 
			
		||||
    std::string::const_iterator first_digit = input.begin();
 | 
			
		||||
    //Delete any trailing white-spaces
 | 
			
		||||
    while(first_digit != input.end() && std::isspace(*first_digit)) {
 | 
			
		||||
static inline uint64_t stringToInt64(const std::string &input)
 | 
			
		||||
{
 | 
			
		||||
    auto first_digit = input.begin();
 | 
			
		||||
    // Delete any trailing white-spaces
 | 
			
		||||
    while (first_digit != input.end() && std::isspace(*first_digit))
 | 
			
		||||
    {
 | 
			
		||||
        ++first_digit;
 | 
			
		||||
    }
 | 
			
		||||
    uint64_t value = 0;
 | 
			
		||||
    boost::spirit::qi::parse(
 | 
			
		||||
        first_digit,
 | 
			
		||||
        input.end(),
 | 
			
		||||
        boost::spirit::long_long, value
 | 
			
		||||
    );
 | 
			
		||||
    boost::spirit::qi::parse(first_digit, input.end(), boost::spirit::long_long, value);
 | 
			
		||||
    return value;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -138,7 +137,7 @@ static inline double StringToDouble(const char *p)
 | 
			
		||||
    }
 | 
			
		||||
    while (*p >= '0' && *p <= '9')
 | 
			
		||||
    {
 | 
			
		||||
        r = (r*10.0) + (*p - '0');
 | 
			
		||||
        r = (r * 10.0) + (*p - '0');
 | 
			
		||||
        ++p;
 | 
			
		||||
    }
 | 
			
		||||
    if (*p == '.')
 | 
			
		||||
@ -148,7 +147,7 @@ static inline double StringToDouble(const char *p)
 | 
			
		||||
        ++p;
 | 
			
		||||
        while (*p >= '0' && *p <= '9')
 | 
			
		||||
        {
 | 
			
		||||
            f = (f*10.0) + (*p - '0');
 | 
			
		||||
            f = (f * 10.0) + (*p - '0');
 | 
			
		||||
            ++p;
 | 
			
		||||
            ++n;
 | 
			
		||||
        }
 | 
			
		||||
@ -161,48 +160,35 @@ static inline double StringToDouble(const char *p)
 | 
			
		||||
    return r;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline void doubleToString(const double value, std::string & output){
 | 
			
		||||
static inline void doubleToString(const double value, std::string &output)
 | 
			
		||||
{
 | 
			
		||||
    output.clear();
 | 
			
		||||
    std::back_insert_iterator<std::string> sink(output);
 | 
			
		||||
    boost::spirit::karma::generate(sink, boost::spirit::karma::double_, value);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline void doubleToStringWithTwoDigitsBehindComma(
 | 
			
		||||
    const double value,
 | 
			
		||||
    std::string & output
 | 
			
		||||
){
 | 
			
		||||
static inline void doubleToStringWithTwoDigitsBehindComma(const double value, std::string &output)
 | 
			
		||||
{
 | 
			
		||||
    // The largest 32-bit integer is 4294967295, that is 10 chars
 | 
			
		||||
    // On the safe side, add 1 for sign, and 1 for trailing zero
 | 
			
		||||
    char buffer[12] ;
 | 
			
		||||
    sprintf(buffer, "%g", value) ;
 | 
			
		||||
    output = buffer ;
 | 
			
		||||
    char buffer[12];
 | 
			
		||||
    sprintf(buffer, "%g", value);
 | 
			
		||||
    output = buffer;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline void replaceAll(
 | 
			
		||||
    std::string & s,
 | 
			
		||||
    const std::string & sub,
 | 
			
		||||
    const std::string & other
 | 
			
		||||
) {
 | 
			
		||||
inline void replaceAll(std::string &s, const std::string &sub, const std::string &other)
 | 
			
		||||
{
 | 
			
		||||
    boost::replace_all(s, sub, other);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline void stringSplit(
 | 
			
		||||
    const std::string &s,
 | 
			
		||||
    const char delim,
 | 
			
		||||
    std::vector<std::string>& result
 | 
			
		||||
) {
 | 
			
		||||
	boost::split(result, s, boost::is_any_of(std::string(&delim)));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline std::string EscapeJSONString(const std::string& input) {
 | 
			
		||||
inline std::string EscapeJSONString(const std::string &input)
 | 
			
		||||
{
 | 
			
		||||
    std::string output;
 | 
			
		||||
    output.reserve(input.size());
 | 
			
		||||
    for(
 | 
			
		||||
        std::string::const_iterator iter = input.begin();
 | 
			
		||||
        iter != input.end();
 | 
			
		||||
        ++iter
 | 
			
		||||
    ) {
 | 
			
		||||
        switch (iter[0]) {
 | 
			
		||||
    for (auto iter = input.begin(); iter != input.end(); ++iter)
 | 
			
		||||
    {
 | 
			
		||||
        switch (iter[0])
 | 
			
		||||
        {
 | 
			
		||||
        case '\\':
 | 
			
		||||
            output += "\\\\";
 | 
			
		||||
            break;
 | 
			
		||||
@ -236,35 +222,19 @@ inline std::string EscapeJSONString(const std::string& input) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static std::string originals[] = {"&", "\"", "<", ">", "'", "[", "]", "\\"};
 | 
			
		||||
static std::string entities[] = {"&", """, "<", ">", "'", "&91;", "&93;", " \" };
 | 
			
		||||
static std::string entities[] = {"&", """, "<", ">",
 | 
			
		||||
                                 "'", "&91;",   "&93;", " \"};
 | 
			
		||||
 | 
			
		||||
inline std::string HTMLEntitize( const std::string & input) {
 | 
			
		||||
    std::string result(input);
 | 
			
		||||
    for(unsigned i = 0; i < sizeof(originals)/sizeof(std::string); ++i) {
 | 
			
		||||
        replaceAll(result, originals[i], entities[i]);
 | 
			
		||||
    }
 | 
			
		||||
    return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline std::string HTMLDeEntitize( std::string & result) {
 | 
			
		||||
    for(unsigned i = 0; i < sizeof(originals)/sizeof(std::string); ++i) {
 | 
			
		||||
        replaceAll(result, entities[i], originals[i]);
 | 
			
		||||
    }
 | 
			
		||||
    return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline std::size_t URIDecode(const std::string & input, std::string & output) {
 | 
			
		||||
    std::string::const_iterator src_iter = input.begin();
 | 
			
		||||
    output.resize(input.size()+1);
 | 
			
		||||
inline std::size_t URIDecode(const std::string &input, std::string &output)
 | 
			
		||||
{
 | 
			
		||||
    auto src_iter = input.begin();
 | 
			
		||||
    output.resize(input.size() + 1);
 | 
			
		||||
    std::size_t decoded_length = 0;
 | 
			
		||||
    for( decoded_length = 0; src_iter != input.end(); ++decoded_length ) {
 | 
			
		||||
        if(
 | 
			
		||||
            src_iter[0] == '%'    &&
 | 
			
		||||
            src_iter[1]           &&
 | 
			
		||||
            src_iter[2]           &&
 | 
			
		||||
            isxdigit(src_iter[1]) &&
 | 
			
		||||
            isxdigit(src_iter[2])
 | 
			
		||||
        ) {
 | 
			
		||||
    for (decoded_length = 0; src_iter != input.end(); ++decoded_length)
 | 
			
		||||
    {
 | 
			
		||||
        if (src_iter[0] == '%' && src_iter[1] && src_iter[2] && isxdigit(src_iter[1]) &&
 | 
			
		||||
            isxdigit(src_iter[2]))
 | 
			
		||||
        {
 | 
			
		||||
            std::string::value_type a = src_iter[1];
 | 
			
		||||
            std::string::value_type b = src_iter[2];
 | 
			
		||||
            a -= src_iter[1] < 58 ? 48 : src_iter[1] < 71 ? 55 : 87;
 | 
			
		||||
@ -279,29 +249,27 @@ inline std::size_t URIDecode(const std::string & input, std::string & output) {
 | 
			
		||||
    return decoded_length;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline std::size_t URIDecodeInPlace(std::string & URI) {
 | 
			
		||||
    return URIDecode(URI, URI);
 | 
			
		||||
}
 | 
			
		||||
inline std::size_t URIDecodeInPlace(std::string &URI) { return URIDecode(URI, URI); }
 | 
			
		||||
 | 
			
		||||
inline bool StringStartsWith(
 | 
			
		||||
    const std::string & input,
 | 
			
		||||
    const std::string & prefix
 | 
			
		||||
) {
 | 
			
		||||
inline bool StringStartsWith(const std::string &input, const std::string &prefix)
 | 
			
		||||
{
 | 
			
		||||
    return boost::starts_with(input, prefix);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline std::string GetRandomString() {
 | 
			
		||||
    char s[128];
 | 
			
		||||
    static const char alphanum[] =
 | 
			
		||||
            "0123456789"
 | 
			
		||||
inline std::string GetRandomString()
 | 
			
		||||
{
 | 
			
		||||
    std::string s;
 | 
			
		||||
    s.resize(128);
 | 
			
		||||
    static const char alphanum[] = "0123456789"
 | 
			
		||||
                                   "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
 | 
			
		||||
                                   "abcdefghijklmnopqrstuvwxyz";
 | 
			
		||||
 | 
			
		||||
    for (int i = 0; i < 127; ++i) {
 | 
			
		||||
    for (int i = 0; i < 127; ++i)
 | 
			
		||||
    {
 | 
			
		||||
        s[i] = alphanum[rand() % (sizeof(alphanum) - 1)];
 | 
			
		||||
    }
 | 
			
		||||
    s[127] = 0;
 | 
			
		||||
    return std::string(s);
 | 
			
		||||
    return s;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif /* STRINGUTIL_H_ */
 | 
			
		||||
#endif // STRINGUTIL_H
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user