Introduced one more safeguard against trys to hand over run numbers outside the range of an unsigned integer to msr2data
This commit is contained in:
parent
2e49d42cfb
commit
d586158967
@ -5,10 +5,12 @@
|
|||||||
#---------------------------------------------------------------------
|
#---------------------------------------------------------------------
|
||||||
|
|
||||||
musrfit 0.8.0 - changes since 0.7.0
|
musrfit 0.8.0 - changes since 0.7.0
|
||||||
|
==================================
|
||||||
NEW added the option to split a user function into a global and run-block related part (see MUSR-134). If the
|
NEW added the option to split a user function into a global and run-block related part (see MUSR-134). If the
|
||||||
global option is used, this can potentially increase the efficiency up to the number of run-blocks since
|
global option is used, this can potentially increase the efficiency up to the number of run-blocks since
|
||||||
the time consuming calculations are done only once per changed parameter set. Examples where this approach
|
the time consuming calculations are done only once per changed parameter set. Examples where this approach
|
||||||
is profitable are: Abrikosov vortex lattice fits, Nonlocal Meissner screening.
|
is profitable are: Abrikosov vortex lattice fits, Nonlocal Meissner screening.
|
||||||
|
CHANGED maximum possible run number for the use in msr2data to numeric_limits<unsigned int>::max() (MUSR-155)
|
||||||
|
|
||||||
musrfit 0.7.0 - changes since 0.6.0
|
musrfit 0.7.0 - changes since 0.6.0
|
||||||
===================================
|
===================================
|
||||||
|
143
src/msr2data.cpp
143
src/msr2data.cpp
@ -301,93 +301,102 @@ int main(int argc, char *argv[])
|
|||||||
string run_list;
|
string run_list;
|
||||||
string msrExtension;
|
string msrExtension;
|
||||||
|
|
||||||
if (arg[0].at(0) == '[') { // In case a list of runs is given by [...]
|
try {
|
||||||
runTAG = 1;
|
if (arg[0].at(0) == '[') { // In case a list of runs is given by [...]
|
||||||
|
runTAG = 1;
|
||||||
|
|
||||||
unsigned int firstRunNumberInArg(0), lastRunNumberInArg(0);
|
unsigned int firstRunNumberInArg(0), lastRunNumberInArg(0);
|
||||||
unsigned int rightbracket(numeric_limits<unsigned int>::max());
|
unsigned int rightbracket(numeric_limits<unsigned int>::max());
|
||||||
|
|
||||||
if (!arg[0].compare("["))
|
if (!arg[0].compare("["))
|
||||||
firstRunNumberInArg = 1;
|
firstRunNumberInArg = 1;
|
||||||
else
|
else
|
||||||
arg[0]=arg[0].substr(1);
|
arg[0]=arg[0].substr(1);
|
||||||
|
|
||||||
for (unsigned int i(firstRunNumberInArg); i<arg.size(); i++) {
|
for (unsigned int i(firstRunNumberInArg); i<arg.size(); i++) {
|
||||||
string::size_type loc = arg[i].rfind(']');
|
string::size_type loc = arg[i].rfind(']');
|
||||||
if ( loc != string::npos ) {
|
if ( loc != string::npos ) {
|
||||||
rightbracket = i;
|
rightbracket = i;
|
||||||
if (!arg[i].compare("]") && i > 0)
|
if (!arg[i].compare("]") && i > 0)
|
||||||
lastRunNumberInArg = i-1;
|
lastRunNumberInArg = i-1;
|
||||||
else {
|
else {
|
||||||
arg[i]=arg[i].substr(0,loc);
|
arg[i]=arg[i].substr(0,loc);
|
||||||
lastRunNumberInArg = i;
|
lastRunNumberInArg = i;
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
if (rightbracket == numeric_limits<unsigned int>::max()) {
|
||||||
if (rightbracket == numeric_limits<unsigned int>::max()) {
|
|
||||||
cout << endl;
|
|
||||||
cout << ">> msr2data: **ERROR** You used the list specification without closing bracket (])! Quitting now." << endl;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (unsigned int i(firstRunNumberInArg); i<=lastRunNumberInArg; ++i)
|
|
||||||
run_vec.push_back(boost::lexical_cast<unsigned int>(arg[i]));
|
|
||||||
|
|
||||||
msrExtension = arg[rightbracket + 1];
|
|
||||||
|
|
||||||
vector<string>::iterator iter(arg.begin());
|
|
||||||
for (unsigned int i(0); i<rightbracket + 2; i++) {
|
|
||||||
arg.erase(iter);
|
|
||||||
iter = arg.begin();
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
|
||||||
bool argOneIsNumber(isNumber(arg[0])), argTwoIsNumber(isNumber(arg[1]));
|
|
||||||
|
|
||||||
if (argOneIsNumber && argTwoIsNumber) { // the first two arguments are numbers: an interval of numbers is given
|
|
||||||
runTAG = 2;
|
|
||||||
|
|
||||||
if (arg.size() < 3) {
|
|
||||||
cout << endl;
|
cout << endl;
|
||||||
cout << ">> msr2data: **ERROR** No msr-file extension specified! Quitting now..." << endl;
|
cout << ">> msr2data: **ERROR** You used the list specification without closing bracket (])! Quitting now." << endl;
|
||||||
run_vec.clear();
|
|
||||||
arg.clear();
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
run_vec.push_back(boost::lexical_cast<unsigned int>(arg[0]));
|
for (unsigned int i(firstRunNumberInArg); i<=lastRunNumberInArg; ++i)
|
||||||
run_vec.push_back(boost::lexical_cast<unsigned int>(arg[1]));
|
run_vec.push_back(boost::lexical_cast<unsigned int>(arg[i]));
|
||||||
|
|
||||||
msrExtension = arg[2];
|
msrExtension = arg[rightbracket + 1];
|
||||||
|
|
||||||
vector<string>::iterator iter(arg.begin());
|
vector<string>::iterator iter(arg.begin());
|
||||||
for (unsigned int i(0); i < 3; i++) {
|
for (unsigned int i(0); i<rightbracket + 2; i++) {
|
||||||
arg.erase(iter);
|
arg.erase(iter);
|
||||||
iter = arg.begin();
|
iter = arg.begin();
|
||||||
}
|
}
|
||||||
} else if (argOneIsNumber && !argTwoIsNumber) { // only one run number is given
|
|
||||||
runTAG = 3;
|
|
||||||
run_vec.push_back(boost::lexical_cast<unsigned int>(arg[0]));
|
|
||||||
msrExtension = arg[1];
|
|
||||||
|
|
||||||
vector<string>::iterator iter(arg.begin());
|
} else {
|
||||||
for (unsigned int i(0); i < 2; i++) {
|
bool argOneIsNumber(isNumber(arg[0])), argTwoIsNumber(isNumber(arg[1]));
|
||||||
arg.erase(iter);
|
|
||||||
iter = arg.begin();
|
|
||||||
}
|
|
||||||
} else { // assume a runlist-file with "independent variables" is given
|
|
||||||
runTAG = 4;
|
|
||||||
run_list = arg[0];
|
|
||||||
msrExtension = arg[1];
|
|
||||||
|
|
||||||
vector<string>::iterator iter(arg.begin());
|
if (argOneIsNumber && argTwoIsNumber) { // the first two arguments are numbers: an interval of numbers is given
|
||||||
for (unsigned int i(0); i < 2; i++) {
|
runTAG = 2;
|
||||||
arg.erase(iter);
|
|
||||||
iter = arg.begin();
|
if (arg.size() < 3) {
|
||||||
|
cout << endl;
|
||||||
|
cout << ">> msr2data: **ERROR** No msr-file extension specified! Quitting now..." << endl;
|
||||||
|
run_vec.clear();
|
||||||
|
arg.clear();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
run_vec.push_back(boost::lexical_cast<unsigned int>(arg[0]));
|
||||||
|
run_vec.push_back(boost::lexical_cast<unsigned int>(arg[1]));
|
||||||
|
|
||||||
|
msrExtension = arg[2];
|
||||||
|
|
||||||
|
vector<string>::iterator iter(arg.begin());
|
||||||
|
for (unsigned int i(0); i < 3; i++) {
|
||||||
|
arg.erase(iter);
|
||||||
|
iter = arg.begin();
|
||||||
|
}
|
||||||
|
} else if (argOneIsNumber && !argTwoIsNumber) { // only one run number is given
|
||||||
|
runTAG = 3;
|
||||||
|
run_vec.push_back(boost::lexical_cast<unsigned int>(arg[0]));
|
||||||
|
msrExtension = arg[1];
|
||||||
|
|
||||||
|
vector<string>::iterator iter(arg.begin());
|
||||||
|
for (unsigned int i(0); i < 2; i++) {
|
||||||
|
arg.erase(iter);
|
||||||
|
iter = arg.begin();
|
||||||
|
}
|
||||||
|
} else { // assume a runlist-file with "independent variables" is given
|
||||||
|
runTAG = 4;
|
||||||
|
run_list = arg[0];
|
||||||
|
msrExtension = arg[1];
|
||||||
|
|
||||||
|
vector<string>::iterator iter(arg.begin());
|
||||||
|
for (unsigned int i(0); i < 2; i++) {
|
||||||
|
arg.erase(iter);
|
||||||
|
iter = arg.begin();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
catch(boost::bad_lexical_cast &) {
|
||||||
|
cout << endl;
|
||||||
|
cout << ">> msr2data: **ERROR** At least one given run number is out of range! Quitting..." << endl;
|
||||||
|
run_vec.clear();
|
||||||
|
arg.clear();
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
// check if the output format is DB or data
|
// check if the output format is DB or data
|
||||||
bool db(msr2data_useOption(arg, "data"));
|
bool db(msr2data_useOption(arg, "data"));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user