yast2-core

stringutil.h

Go to the documentation of this file.
00001 /*---------------------------------------------------------------------\
00002 |                                                                      |
00003 |                      __   __    ____ _____ ____                      |
00004 |                      \ \ / /_ _/ ___|_   _|___ \                     |
00005 |                       \ V / _` \___ \ | |   __) |                    |
00006 |                        | | (_| |___) || |  / __/                     |
00007 |                        |_|\__,_|____/ |_| |_____|                    |
00008 |                                                                      |
00009 |                               core system                            |
00010 |                                                        (C) SuSE GmbH |
00011 \----------------------------------------------------------------------/
00012 
00013   File:       stringutil.h
00014 
00015   Author:     Michael Andres <ma@suse.de>
00016   Maintainer: Michael Andres <ma@suse.de>
00017 
00018   Purpose: Contains 'std::string form(const char * format, ...)' for
00019   printf style creation of strings and some more string utility
00020   functions.
00021 
00022 /-*/
00023 #ifndef stringutil_h
00024 #define stringutil_h
00025 
00026 #include <cstdio>
00027 #include <cstdarg>
00028 #include <cstdlib>
00029 
00030 #include <iosfwd>
00031 #include <vector>
00032 #include <string>
00033 #include <list>
00034 
00038 
00039 namespace stringutil {
00040 ;
00041 
00042 enum Trim {
00043   NO_TRIM = 0x00,
00044   L_TRIM  = 0x01,
00045   R_TRIM  = 0x02,
00046   TRIM    = (L_TRIM|R_TRIM)
00047 };
00048 
00049 inline std::string form( const char * format, ... )
00050     __attribute__ ((format (printf, 1, 2)));
00051 
00061 inline std::string form( const char * format, ... ) {
00062   char * buf = 0;
00063   std::string val;
00064 
00065   va_list ap;
00066   va_start( ap, format );
00067 
00068 #if 1
00069   int numprinted = vasprintf( &buf, format, ap );
00070   if ( numprinted >= 0 ) {
00071     val = buf;
00072     free( buf );
00073   }
00074 #else
00075   // Don't know wheter we actually nedd two va_lists, one to
00076   // evaluate the buffer size needed, and one to actually fill
00077   // the buffer. Maybe there's a save way to reuse a va_lists.
00078   va_list ap1;
00079   va_start( ap1, format );
00080   buf = new char[vsnprintf( NULL, 0, format, ap ) + 1];
00081   vsprintf( buf, format, ap1 );
00082   val = buf;
00083   delete [] buf;
00084   va_end( ap1 );
00085 #endif
00086 
00087   va_end( ap );
00088   return val;
00089 }
00090 
00101 inline std::string numstring( char n,               int w = 0 ) { return form( "%*hhd",  w, n ); }
00102 inline std::string numstring( unsigned char n,      int w = 0 ) { return form( "%*hhu",  w, n ); }
00103 inline std::string numstring( short n,              int w = 0 ) { return form( "%*hd",   w, n ); }
00104 inline std::string numstring( unsigned short n,     int w = 0 ) { return form( "%*hu",   w, n ); }
00105 inline std::string numstring( int n,                int w = 0 ) { return form( "%*d",    w, n ); }
00106 inline std::string numstring( unsigned n,           int w = 0 ) { return form( "%*u",    w, n ); }
00107 inline std::string numstring( long n,               int w = 0 ) { return form( "%*ld",   w, n ); }
00108 inline std::string numstring( unsigned long n,      int w = 0 ) { return form( "%*lu",   w, n ); }
00109 inline std::string numstring( long long n,          int w = 0 ) { return form( "%*lld",  w, n ); }
00110 inline std::string numstring( unsigned long long n, int w = 0 ) { return form( "%*llu",  w, n ); }
00111 
00122 inline std::string hexstring( char n,               int w = 4 ) { return form( "%#0*hhx", w, n ); }
00123 inline std::string hexstring( unsigned char n,      int w = 4 ) { return form( "%#0*hhx", w, n ); }
00124 inline std::string hexstring( short n,              int w = 10 ){ return form( "%#0*hx",  w, n ); }
00125 inline std::string hexstring( unsigned short n,     int w = 10 ){ return form( "%#0*hx",  w, n ); }
00126 inline std::string hexstring( int n,                int w = 10 ){ return form( "%#0*x",   w, n ); }
00127 inline std::string hexstring( unsigned n,           int w = 10 ){ return form( "%#0*x",   w, n ); }
00128 inline std::string hexstring( long n,               int w = 10 ){ return form( "%#0*lx",  w, n ); }
00129 inline std::string hexstring( unsigned long n,      int w = 10 ){ return form( "%#0*lx",  w, n ); }
00130 inline std::string hexstring( long long n,          int w = 0 ) { return form( "%#0*llx", w, n ); }
00131 inline std::string hexstring( unsigned long long n, int w = 0 ) { return form( "%#0*llx", w, n ); }
00132 
00143 inline std::string octstring( char n,               int w = 4 ) { return form( "%#0*hho",  w, n ); }
00144 inline std::string octstring( unsigned char n,      int w = 4 ) { return form( "%#0*hho",  w, n ); }
00145 inline std::string octstring( short n,              int w = 5 ) { return form( "%#0*ho",   w, n ); }
00146 inline std::string octstring( unsigned short n,     int w = 5 ) { return form( "%#0*ho",   w, n ); }
00147 inline std::string octstring( int n,                int w = 5 ) { return form( "%#0*o",    w, n ); }
00148 inline std::string octstring( unsigned n,           int w = 5 ) { return form( "%#0*o",    w, n ); }
00149 inline std::string octstring( long n,               int w = 5 ) { return form( "%#0*lo",   w, n ); }
00150 inline std::string octstring( unsigned long n,      int w = 5 ) { return form( "%#0*lo",   w, n ); }
00151 inline std::string octstring( long long n,          int w = 0 ) { return form( "%#0*llo",  w, n ); }
00152 inline std::string octstring( unsigned long long n, int w = 0 ) { return form( "%#0*llo",  w, n ); }
00153 
00157 template<typename _It>
00158   inline _It strtonum( const std::string & str );
00159 
00160 template<>
00161   inline short              strtonum( const std::string & str ) { return ::strtol  ( str.c_str(), NULL, 0 ); }
00162 template<>
00163   inline int                strtonum( const std::string & str ) { return ::strtol  ( str.c_str(), NULL, 0 ); }
00164 template<>
00165   inline long               strtonum( const std::string & str ) { return ::strtol  ( str.c_str(), NULL, 0 ); }
00166 template<>
00167   inline long long          strtonum( const std::string & str ) { return ::strtoll ( str.c_str(), NULL, 0 ); }
00168 
00169 template<>
00170   inline unsigned short     strtonum( const std::string & str ) { return ::strtoul ( str.c_str(), NULL, 0 ); }
00171 template<>
00172   inline unsigned           strtonum( const std::string & str ) { return ::strtoul ( str.c_str(), NULL, 0 ); }
00173 template<>
00174   inline unsigned long      strtonum( const std::string & str ) { return ::strtoul ( str.c_str(), NULL, 0 ); }
00175 template<>
00176   inline unsigned long long strtonum( const std::string & str ) { return ::strtoull( str.c_str(), NULL, 0 ); }
00177 
00181 template<typename _It>
00182   inline _It strtonum( const std::string & str, _It & i ) { return i = strtonum<_It>( str ); }
00183 
00208 extern std::string getline( std::istream & str, bool trim = false );
00209 
00214 extern std::string getline( std::istream & str, const Trim trim_r );
00215 
00246 extern unsigned split( const std::string          line_r,
00247                        std::vector<std::string> & words_r,
00248                        const std::string &        sep_t       = " \t",
00249                        const bool                 singlesep_r = false );
00250 
00254 extern std::string join( const std::vector<std::string> & words_r,
00255                          const std::string & sep_r = " " );
00256 
00257 
00266 inline std::list<std::string> splitToLines( const std::string text_r, const std::string & sep_r = "\n" )
00267 {
00268   std::vector<std::string> lines;
00269   stringutil::split( text_r, lines, sep_r, true );
00270   std::list<std::string> ret;
00271   for ( unsigned i = 0; i < lines.size(); ++i ) {
00272     ret.push_back( lines[i] );
00273   }
00274   return ret;
00275 }
00276 
00294 extern std::string stripFirstWord( std::string & value, const bool ltrim_first = false );
00295 
00299 extern std::string ltrim( const std::string & s );
00300 extern std::string rtrim( const std::string & s );
00301 inline std::string  trim( const std::string & s, const Trim trim_r = TRIM ) {
00302   switch ( trim_r ) {
00303   case L_TRIM:
00304     return ltrim( s );
00305   case R_TRIM:
00306     return rtrim( s );
00307   case TRIM:
00308     return ltrim( rtrim( s ) );
00309   case NO_TRIM:
00310     break;
00311   }
00312   return s;
00313 }
00314 
00318 extern std::string toLower( const std::string & s );
00319 extern std::string toUpper( const std::string & s );
00320 
00324 extern std::ostream & dumpOn( std::ostream & str, const std::list<std::string> & l, const bool numbered = false );
00325 extern std::ostream & dumpOn( std::ostream & str, const std::vector<std::string> & l, const bool numbered = false );
00326 
00328 }  // namespace stringutil
00330 
00331 #endif // stringutil_h

Generated on a sunny day for yast2-core by doxygen 1.7.3