/* * params.cpp * * Created on: Oct 3, 2010 * Author: Michael J. Fischer * for use in Yale course CPSC 427a, Fall 2010 */ #include "params.hpp" #include // Convert argument string to int and check for error conditions bool Params::parseToInt( const char* s, int& value ) { char* endptr; errno = 0; value = strtol(s, &endptr, 0); // Make sure all is okay return errno==0 && endptr!=s && *endptr=='\0'; } Params::Params(int argc, char* argv[]) : alg(fickleAlg), numPlayers(10), numTrials(100), seed(time(0)) { // Extract command name from full path name provided by some shells char* slash = strrchr(argv[0], '/'); char* prog = slash == NULL ? argv[0] : slash + 1; // Parse command arguments bool parseError = false; // Get algorithm name if (argc>1) { if (strcmp(argv[1],"fickle")==0) { alg = fickleAlg; } else if (strcmp(argv[1],"crowd")==0) { alg = crowdAlg; } else parseError = true; } // Get number of players if (argc>2) { parseError = parseError || !parseToInt(argv[2], numPlayers) || numPlayers <= 1; } // Get number of trials if (argc>3) { parseError = parseError || !parseToInt(argv[3], numTrials) || numTrials <= 0; } // Get starting seed for random number generator if (argc>4) { parseError = parseError || !parseToInt(argv[4], (int&)seed); } if (parseError || argc > 5) { cout << "usage: " << prog << " [algName [numPlayers [numTrials [seed]]]]]" << endl; exit(1); } } ostream& Params::print(ostream& out) const { out << "[Params:\n"; out << " algorithm=" << ((alg==fickleAlg) ? "fickle" : "crowd") << endl; out << " numPlayers=" << numPlayers << "\n"; out << " numTrials=" << numTrials << "\n"; out << " seed=" << seed << "\n"; out << "End Params]" << endl; return out; }