/usr/include/ui-utilcpp/Text.hpp is in libui-utilcpp-dev 1.8.5-1+b2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 | /**
* @file
* @brief Text, descriptors and sockets.
*/
#ifndef UI_UTIL_TEXT_HPP
#define UI_UTIL_TEXT_HPP
// STDC++
#include <string>
#include <vector>
#include <map>
#include <list>
#include <sstream>
#include <memory>
#include <cassert>
#include <iomanip>
#include <cerrno>
// C++ libraries
#include <ui-utilcpp/auto_ptr_compat.hpp>
#include <ui-utilcpp/Exception.hpp>
#include <boost/random.hpp>
#ifdef WIN32
#if !defined( PATH_MAX )
#include <Windows.h>
#define PATH_MAX MAX_PATH
#endif
#endif
namespace UI {
namespace Util {
/** @name Shortcuts for often used types and convenience stream operators.
* @{ */
typedef std::vector<std::string> StrVec;
typedef std::list<std::string> StrList;
typedef std::map<std::string, std::string> StrMap;
/** @} */
}}
namespace UI {
namespace Util {
std::string strVec2Str(StrVec const & strVec, std::string const & sep=" ");
/** @brief You may use on as return value for an existing, but empty, string. */
static std::string const EmptyString_("");
/** @brief Save wrapper for ::strerror. Always use this instead of ::strerror directly. */
std::string strerror(int const & errNo=errno);
/** @brief Like std::getline, but also rips of trailing "CR" when line break was CRLF. */
std::string getlineCRLF(std::istream & s);
/** @brief ASCII CAPS converter for strings (using std::tolower|upper). */
std::string asciiCAPS(std::string const & in, bool const upper=true);
/** @brief Replace all non-ASCII characters to '?' in string. */
std::string & str2Ascii(std::string & s);
/** @brief Defaults values for some types via template specialization. */
template<typename T>
inline T Default() { return T(); }
/** @brief Default-Specialising. */
template<> inline int Default<int>() { return 0; }
/** @brief Default-Specialising. */
template<> inline float Default<float>() { return 0.0; }
/** @brief Default-Specialising. */
template<> inline double Default<double>() { return 0.0; }
/** @brief Default-Specialising. */
template<> inline long int Default<long int>() { return 0; }
/** @brief Default-Specialising. */
template<> inline bool Default<bool>() { return false; }
/** @brief Default-Specialising. */
template<> inline std::string Default<std::string>() { return ""; }
/** @brief Stream modifier function (is there a std:: type??). */
typedef std::ios_base & (* StreamModifier) (std::ios_base &);
/** @brief String-to-anything converter with error handling.
*
* @param t String to convert.
* @param m Optional stream modifier like std::hex.
* @returns Pair with conversion result and success; if false, result's value is undefinded.
*/
template <typename out_type>
std::pair<out_type, bool> eato(std::string const & t, StreamModifier const m=0)
{
// Prepare converter stream
std::stringstream s(t);
if (m) { s << m; };
// Convert with error handling
std::pair<out_type, bool> result;
s >> result.first;
result.second = !s.fail();
return result;
}
/** @brief String-to-anything converter with default values on error. @see eato. */
template <typename out_type>
out_type ato(std::string const & t, StreamModifier const m=0)
{
std::pair<out_type, bool> const result(eato<out_type>(t, m));
return result.second ? result.first : Default<out_type>();
}
/** @brief Anything-to-string converter with error handling.
*
* @param t Value to convert.
* @param m Optional stream modifier like std::hex.
* @param w Argument for std::setw() modifier.
* @param f Argument for std::setfill() modifier.
* @returns Pair with conversion result and success; if false, result's value is undefinded.
*/
template <typename in_type>
std::pair<std::string, bool> etos(in_type const & t, StreamModifier const m=0, int w=0, char f=' ')
{
// Prepare converter stream
std::stringstream s;
if (m) { s << m; }
if (w) { s << std::setw(w); }
if (f != ' ') { s << std::setfill(f); }
// Convert with error handling
std::pair<std::string, bool> result;
s << t;
result.first = s.str();
result.second = !s.fail();
return result;
}
/** @name Anything-to-string converter with empty string on error. @see etos.
* @{ */
template <typename in_type>
std::string tos(in_type const & t, StreamModifier const m=0, int w=0, char f=' ')
{
std::pair<std::string, bool> const result(etos<in_type>(t, m, w, f));
return result.second ? result.first : std::string("");
}
template <typename in_type>
std::string tos(in_type const & t, int w, char f=' ')
{
std::pair<std::string, bool> const result(etos<in_type>(t, 0, w, f));
return result.second ? result.first : std::string("");
}
/** @} */
/** @name Generate arbitrary length pseudo random keys with alphanumeric ASCII characters.
* @{ */
/** @brief Class using boost::mt19937 as random engine. */
class AlphaNumericKey
{
public:
/** @brief Construct; seed will be automatically set (once) via timestamp (for linux/unix: microseconds). */
AlphaNumericKey();
std::string get(int len=8);
private:
std::string const keyChars_;
boost::mt19937 engine_;
boost::uniform_int<> distribution_;
boost::variate_generator<boost::mt19937&, boost::uniform_int<> > generator_;
};
/** @brief You may just use this global generator for convenience.
* @note A singleton would be nicer, but imho not worth the effort, considering multi threading protection. */
static AlphaNumericKey GlobalAlphaNumericKey_;
/** @brief For compatibility only. */
std::string genAlphaNumericKey(int len=8);
/** @} */
/** @brief BSD style "strdup" implementation (is not C standard). See strdup(3). */
char * strdup(char const * s);
/** @brief Helper to construct/use C-String arrays ("char **"), occasionally needed by some c functions. */
class CStrArray
{
public:
/** @brief Add string to array. */
CStrArray & add(std::string const & str);
CStrArray();
~CStrArray();
/** @brief Get C string array. */
char const ** get() const;
private:
std::vector<char const *> arr_;
};
/** @brief Generate any STL container of strings from a token string.
*
* @note There is a <tt>StrVec</tt> shortcut for
* this template. Doxygen seems to show only its syntax. @see
* Text.hpp source header for the template syntax.
*/
template <typename C>
C strtok(std::string const & s, std::string const & delim=",", std::string const & prefix="", std::string const & postfix="")
{
C tokens;
std::string::size_type pos(0);
while (pos != std::string::npos)
{
std::string::size_type delimPos(s.find(delim, pos));
std::string::size_type tokLen(delimPos == std::string::npos ? std::string::npos : delimPos-pos);
std::string token(s.substr(pos, tokLen));
if (!token.empty())
{
tokens.push_back(prefix + token + postfix);
}
pos = delimPos == std::string::npos ? std::string::npos : delimPos+delim.size();
}
return tokens;
}
StrVec strtok(std::string const & s, std::string const & delim=",", std::string const & prefix="", std::string const & postfix="");
/** @brief Like strtok, but you can use a list of one-char delimiters
* (delims in strtoks) instead of a fixed delimiter string (delim in strtok). */
template <typename C>
C strtoks(std::string const & s, std::string const & delims=",", std::string const & prefix="", std::string const & postfix="")
{
C tokens;
std::string::size_type p0(0);
while (p0 != std::string::npos)
{
std::string::size_type const p1(s.find_first_of(delims, p0));
std::string const token(s.substr(p0, p1-p0));
if (!token.empty())
{
tokens.push_back(prefix + token + postfix);
}
p0 = s.find_first_not_of(delims, p1);
}
return tokens;
}
StrVec strtoks(std::string const & s, std::string const & delims=" \t\n\r", std::string const & prefix="", std::string const & postfix="");
/**
* @brief join a list,vector,set, ... with the connector string
*
* e.g. the string list 'a', 'b', 'c', 'd' joined with ',' will return 'a,b,c,d'
*
* As C needs to supply a C::const_iterator C.begin() C.end() and ++opertator
* e.g. std::vector<std::string>
*/
template <typename C>
std::string join( std::string const & expr, C const & list )
{
std::string res;
typename C::const_iterator it( list.begin() );
if ( it != list.end() )
{
res = *it;
++it;
for ( ; it != list.end(); ++it )
{
res += expr + *it;
}
}
return res;
}
/** @name Check whether token is in tokens. */
/** @{ */
bool isToken(std::string const & token, StrVec const & tokensVec, int const match=0);
bool isToken(std::string const & token, std::string const & tokens, std::string const & delim=",", int const match=0);
/** @} */
/** @name Mass string replace.
* @{ */
std::string & strrpl(std::string & source, std::string const & token, std::string const & reptoken);
std::string strrpl(std::string const & source, std::string const & token, std::string const & reptoken);
/** @} */
/** @brief Read any stream into any byte vector.
*
* @note std::istream::read() is not const, so the stream reference can't be const.
*/
template <typename Byte>
std::vector<Byte> istream2Vector(std::istream & f, int const blockSize=1024)
{
// We rely on byte size
assert(sizeof(Byte) == 1);
// Pre: Set vector to size zero, no bytes read
std::vector<Byte> result(0);
long int bytesRead(0);
while (!f.eof())
{
// Prepare to read blockSize bytes from stream into vector
result.resize(bytesRead + blockSize);
// Read a block directly to vector memory (we cast here, but this should really work for any byte-sized type)
f.read((char *) &result[bytesRead], blockSize);
bytesRead += f.gcount();
}
// Resize down to readBytes size
result.resize(bytesRead);
return result;
}
/** @brief Istream-to-string converter.
*
* @note Works for "binary"-files as well, but istream2Vector might be a better choice.
*/
std::string istream2String(std::istream & f, int const blockSize=1024);
/** @brief a class to convert between different systems.
*
* @deprecated All different conversions here should rather get a
* XXXConverter class in Recoder.?pp (and an appropriate switch in the
* Recoder class if needed).
*/
class XConversion {
private:
/* lookup table for base64 characters */
static const unsigned char alphabet[];
/* lookup table for values 0..63 */
static unsigned char codes[];
static void codesFill();
static const int bMin = 2;
static const int bMax = 16;
static int getInt( unsigned char hex );
static std::string out;
public:
/**
* Convert a dezimal (10) represented number in a number<br>
* represented by any basis between 2 (Bin) and 16 (Hex)
*
* @param number the number to convert
* @param basis the basis to use
*
* @returns a number represented by the wanted basis<br>
* or an empty string
*/
static std::string dec2Basis( int number, int basis );
/**
* Convert a number represented by any basis between<br>
* 2 (bin) and 16 (hex) to a dezimal number (10)
*
* @param number the numbet to convert
* @param basis the basis to use
*
* @returns a number represented in decimal (basis 10)
*/
static int basis2Dec( std::string number, int basis );
/**
* encrypt a message using xor and the given key
*
* @param message the mesaage to encrypt
* @param key the key used to encrypt the message
* @param length number of encrypted chars (return)
*
* @returns the encrypted message (binary)
*/
static UI::Util::auto_ptr<unsigned char> xorEncrypt(std::string const& message, std::string const& key, int* length);
/**
* decrypt a message using xor and the given key
*
* @param message the message to decrypt
* @param length the length of the message
* @param key the key used to decrypt the message
*
* @returns the decrypted message (ASCII)
*/
static std::string xorDecrypt( const unsigned char* message, const int length, std::string const& key );
/**
* returns an array of base64-encoded characters to represent the
* passed data array.
*
* @param message the array of bytes to encode
* @param length length of the byte array
*
* @returns result base64 encoded message (ASCII)
*/
static std::string base64Encode( const unsigned char* message, const int length );
/**
* returns an array of bytes which were encoded in the passed
* character array.
*
* @param message a base64 encoded message
* @param length used to store the result (Binary)
*
* @returns number decoded chars
*/
static UI::Util::auto_ptr<unsigned char> base64Decode(std::string const& message, int* length);
};
std::string md5sum(std::string const & data);
}}
/** @name Some convenience stream operators.
* @{ */
std::ostream & operator <<(std::ostream & os, UI::Util::StrVec const & sv);
std::ostream & operator <<(std::ostream & os, UI::Util::StrList const & sl);
/** @} */
#endif
|