00001 #include "argument.h"
00002
00003 namespace n2nc {
00004 namespace utils {
00005 namespace args {
00006
00007 Argument::Argument(string name,string param) : m_validarg(NULL) {
00008 this->m_name = name ;
00009 this->m_param = param ;
00010 }
00011 Argument::~Argument(){}
00012
00013 bool Argument::validate(std::vector< ValidArgument >& validargs) throw( ){
00014 for(int i=0; i < validargs.size() ; i++){
00015
00016 if(this->m_name == validargs[i].name){
00017 this->m_validarg = &validargs[i] ;
00018
00019 if(this->m_validarg->paramlist.size() || this->m_validarg->paramlist_pattern.size()){
00020
00021 if(this->m_param.empty()){
00022
00023 if(this->m_validarg->paramrequired){ cerr << "param required" << endl ; return false ;}
00024
00025 cerr << "assuming default param: " << this->m_validarg->defaultparam << endl ;
00026 this->m_param = this->m_validarg->defaultparam ;
00027 return true ;
00028 }else{
00029 for(int p=0; p < this->m_validarg->paramlist.size() ; p++){
00030 if(this->m_param == this->m_validarg->paramlist[p] ){
00031
00032 return true ;
00033 }
00034 }
00035
00036 for(int p=0; p < this->m_validarg->paramlist_pattern.size() ; p++){
00037 switch (this->m_validarg->paramlist_pattern[p].c_str()[0]){
00038 case 'd' :
00039 if (::strtol(this->m_param.c_str(),NULL,10) && errno != EINVAL) return true ;
00040 break ;
00041
00042 case 's' :
00043 if (::strlen(this->m_param.c_str())) return true ;
00044 break ;
00045
00046 }
00047 }
00048
00049
00050 cerr << "param invalid" << endl ;
00051 return false ;
00052 }
00053 }else{
00054 if(this->m_param.size()){
00055
00056 cerr << "param unexpected here" << endl ;
00057 return false ;
00058 }
00059 return true ;
00060 }
00061 }
00062 }
00063
00064 cerr << "argument name: \"" << this->m_name << "\" unexpected here" << endl ;
00065 return false ;
00066 }
00067
00068 bool Argument::checkForDependecies(vector<Argument>& args){
00069 int checkeddep = 0;
00070
00071 if (!this->m_validarg->dependsof.size()){return true ;}
00072
00073 for(int d=0; d < this->m_validarg->dependsof.size() ; d++){
00074 for (int i=0; i < args.size(); i++){
00075 if ( this->m_validarg->dependsof[d] == args[i].m_name ){
00076 checkeddep++;
00077 }
00078 }
00079 }
00080
00081 if(this->m_validarg->dependsof.size() != checkeddep){
00082 if(this->m_validarg->dependsof.size() <= checkeddep){
00083 cerr << "Dependencies problem: maybe a duplicate argument?" << endl ;
00084 return false ;
00085
00086 }
00087 cerr << "Dependencies problem: following arguments must appears: {"
00088 << explode(this->m_validarg->dependsof,", ") << "}" << endl ;
00089 return false ;
00090
00091
00092 }
00093 return (this->m_validarg->dependsof.size() == checkeddep );
00094 }
00095
00096 bool Argument::checkForConflicts(vector<Argument>& args){
00097 int checkedconf = 0;
00098
00099 if (! this->m_validarg->conflictsto.size() ){return true ;}
00100
00101 for(int d=0; d < this->m_validarg->conflictsto.size() ; d++){
00102
00103 for (int i=0; i < args.size() ; i++){
00104 if ( this->m_validarg->conflictsto[d] == args[i].m_name ){
00105 checkedconf++;
00106 cerr << "Conflicts problem: \"" << args[i].m_name <<
00107 "\" conflicts with \"" << this->m_name << "\"" << endl ;
00108 return false ;
00109
00110
00111 }
00112 }
00113 }
00114 return true ;
00115 }
00116
00117 string Argument::toString(){
00118 return "name: " + this->m_name + " param:" + this->m_param ;
00119 }
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159 string n2nc::utils::args::Argument::param(){
00160 return this->m_param ;
00161 }
00162
00163
00164 }
00165 }
00166 }
00167
00168
00169
00170
00171
00172
00173
00174