libzypp
10.5.0
|
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