X-Git-Url: http://git.tdb.fi/?p=libs%2Fcore.git;a=blobdiff_plain;f=source%2Fstrings%2Futils.cpp;h=1b4cad080dee85950740b58de822484be2c2214e;hp=5728332d595c1bba62d126f9ddbee776c6164004;hb=20c897ece781e18ba54c41fd68e232ce566a938d;hpb=b56eb5ec1da675da0c66abc53c1e4f6c4e4cccbd diff --git a/source/strings/utils.cpp b/source/strings/utils.cpp index 5728332..1b4cad0 100644 --- a/source/strings/utils.cpp +++ b/source/strings/utils.cpp @@ -1,13 +1,7 @@ -/* $Id$ - -This file is part of libmspstrings -Copyright © 2006-2008 Mikko Rasa -Distributed under the LGPL -*/ - #include #include -#include +#include +#include #include "utils.h" using namespace std; @@ -46,7 +40,7 @@ vector do_split(const string &str, const string &sep, int max_split) return result; } -bool check_str(const std::string &str, int (*pred)(int)) +bool check_str(const string &str, int (*pred)(int)) { for(string::const_iterator i=str.begin(); i!=str.end(); ++i) if(!pred(*i)) @@ -136,7 +130,21 @@ string strip(const string &s) return result; } -string c_unescape(const std::string &str) +string &append(string &str, const string &sep, const string &other) +{ + if(!str.empty() && !other.empty()) + str += sep; + str += other; + return str; +} + +string join(const string &str1, const string &sep, const string &str2) +{ + string result = str1; + return append(result, sep, str2); +} + +string c_unescape(const string &str) { bool escape = false; unsigned numeric_type = 0; @@ -155,7 +163,7 @@ string c_unescape(const std::string &str) else if(*i>='A' && *i<='F') digit = *i-'A'+10; else - throw InvalidParameterValue("Invalid hexadecimal digit"); + throw invalid_argument("c_unescape"); numeric_value = (numeric_value<<4 | digit); ++numeric_pos; @@ -171,7 +179,7 @@ string c_unescape(const std::string &str) if(*i>='0' && *i<='7') digit = *i-'0'; else - throw InvalidParameterValue("Invalid octal digit"); + throw invalid_argument("c_unescape"); numeric_value = (numeric_value<<3 | digit); ++numeric_pos; @@ -216,7 +224,7 @@ string c_unescape(const std::string &str) else if(*i=='\\') result += '\\'; else - throw InvalidParameterValue("Invalid escape sequence"); + throw invalid_argument("c_unescape"); escape = false; } @@ -227,7 +235,7 @@ string c_unescape(const std::string &str) } if(escape) - throw InvalidParameterValue("Stray backslash at end of string"); + throw invalid_argument("c_unescape"); return result; } @@ -260,7 +268,9 @@ string c_escape(const string &str, bool escape_8bit) result += "\\\\"; else if(static_cast(*i)<' ' || (escape_8bit && (*i&0x80))) { - char buf[4] = {'\\', '0'+((*i>>6)&3), '0'+((*i>>3)&7), '0'+(*i&7)}; + char buf[4] = { '\\', 0 }; + for(unsigned j=0; j<3; ++j) + buf[1+j] = '0'+((static_cast(*i)>>(6-j*3))&7); result.append(buf, 4); } else