libzypp  10.5.0
Edition.cc
Go to the documentation of this file.
00001 /*---------------------------------------------------------------------\
00002 |                          ____ _   __ __ ___                          |
00003 |                         |__  / \ / / . \ . \                         |
00004 |                           / / \ V /|  _/  _/                         |
00005 |                          / /__ | | | | | |                           |
00006 |                         /_____||_| |_| |_|                           |
00007 |                                                                      |
00008 \---------------------------------------------------------------------*/
00012 extern "C"
00013 {
00014 #include <solv/evr.h>
00015 }
00016 #include "zypp/base/String.h"
00017 
00018 #include "zypp/Edition.h"
00019 #include "zypp/sat/detail/PoolImpl.h"
00020 
00022 namespace zypp
00023 { 
00024 
00026   namespace
00027   { 
00028 
00029     inline std::string makeevrstr( const std::string & version_r,
00030                                    const std::string & release_r,
00031                                    Edition::epoch_t epoch_r )
00032     {
00033       std::string ret( version_r );
00034       if ( ! release_r.empty() )
00035       {
00036         ret += "-";
00037         ret += release_r;
00038       }
00039       return ( epoch_r ? str::numstring( epoch_r ) + ":" + ret
00040                        : ret );
00041     }
00042 
00043     inline std::string makeevrstr( const char * version_r,
00044                                    const char * release_r,
00045                                    Edition::epoch_t epoch_r )
00046     { return makeevrstr( std::string(version_r?version_r:""),
00047                          std::string(release_r?release_r:""),
00048                          epoch_r );
00049     }
00051   } // namespace
00053 
00054   const Edition Edition::noedition;
00055 
00057 
00058   Edition::Edition( const std::string & version_r,
00059                     const std::string & release_r,
00060                     epoch_t epoch_r )
00061   : _str( makeevrstr( version_r, release_r, epoch_r ) )
00062   {}
00063 
00064   Edition::Edition( const char * version_r,
00065                     const char * release_r,
00066                     epoch_t epoch_r )
00067   : _str( makeevrstr( version_r, release_r, epoch_r ) )
00068   {}
00069 
00070   Edition::Edition( const std::string & version_r,
00071                     const std::string & release_r,
00072                     const std::string & epoch_r )
00073   : _str( makeevrstr( version_r, release_r, str::strtonum<epoch_t>( epoch_r ) ) )
00074   {}
00075 
00076   Edition::Edition( const char * version_r,
00077                     const char * release_r,
00078                     const char * epoch_r )
00079   : _str( makeevrstr( version_r, release_r, str::strtonum<epoch_t>( epoch_r ) ) )
00080   {}
00081 
00082   Edition::epoch_t Edition::epoch() const
00083   {
00084     const char * str( c_str() );
00085     const char * sep = str;
00086     // skip edition
00087     for ( ; *sep >= '0' && *sep <= '9'; ++sep )
00088       ; // NOOP
00089     if ( *sep == ':' )
00090       return str::strtonum<epoch_t>( std::string( str, sep-str ) );
00091     return 0;
00092   }
00093 
00094   std::string Edition::version() const
00095   {
00096     const char * str( c_str() );
00097     const char * sep = str;
00098     // skip edition
00099     for ( ; *sep >= '0' && *sep <= '9'; ++sep )
00100       ; // NOOP
00101     if ( *sep == ':' )
00102       str = sep+1;
00103     // strip release
00104     sep = ::strrchr( str, '-' );
00105     if ( sep )
00106       return std::string( str, sep-str );
00107     return str;
00108   }
00109 
00110   std::string Edition::release() const
00111   {
00112     const char * str( c_str() );
00113     const char * sep = ::strrchr( str, '-' );
00114     // get release
00115     if ( sep )
00116       return sep+1;
00117     return std::string();
00118   }
00119 
00120   int Edition::_doCompare( const char * lhs,  const char * rhs )
00121   {
00122     if ( lhs == rhs ) return 0;
00123     if ( lhs && rhs ) return ::pool_evrcmp_str( myPool().getPool(), lhs, rhs, EVRCMP_COMPARE );
00124     return( lhs ? 1 : -1 );
00125   }
00126 
00127   int Edition::_doMatch( const char * lhs,  const char * rhs )
00128   {
00129     if ( lhs == rhs ) return 0;
00130     if ( lhs && rhs ) return ::pool_evrcmp_str( myPool().getPool(), lhs, rhs, EVRCMP_MATCH );
00131     return( lhs ? 1 : -1 );
00132   }
00133 
00135 } // namespace zypp
00137 
00138