Edition.cc
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00012 extern "C"
00013 {
00014 #include <satsolver/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 }
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
00087 for ( ; *sep >= '0' && *sep <= '9'; ++sep )
00088 ;
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
00099 for ( ; *sep >= '0' && *sep <= '9'; ++sep )
00100 ;
00101 if ( *sep == ':' )
00102 str = sep+1;
00103
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
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 ::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 ::evrcmp_str( myPool().getPool(), lhs, rhs, EVRCMP_MATCH );
00131 return( lhs ? 1 : -1 );
00132 }
00133
00135 }
00137
00138