fp@1142: /***************************************************************************** fp@1142: * fp@1142: * $Id$ fp@1142: * fp@1142: ****************************************************************************/ fp@1142: fp@1142: #include "Command.h" fp@1142: fp@1142: /*****************************************************************************/ fp@1142: fp@1142: Command::Command(const string &name, const string &briefDesc): fp@1142: name(name), fp@1142: briefDesc(briefDesc), fp@1142: verbosity(Normal) fp@1142: { fp@1142: } fp@1142: fp@1142: /*****************************************************************************/ fp@1142: fp@1142: Command::~Command() fp@1142: { fp@1142: } fp@1142: fp@1142: /*****************************************************************************/ fp@1142: fp@1142: void Command::setVerbosity(Verbosity v) fp@1142: { fp@1142: verbosity = v; fp@1142: }; fp@1142: fp@1151: /*****************************************************************************/ fp@1151: fp@1151: void Command::setAlias(int a) fp@1151: { fp@1151: alias = a; fp@1151: }; fp@1151: fp@1151: /*****************************************************************************/ fp@1151: fp@1151: void Command::setPosition(int p) fp@1151: { fp@1151: position = p; fp@1151: }; fp@1151: fp@1166: /*****************************************************************************/ fp@1166: fp@1166: void Command::setDomain(int d) fp@1166: { fp@1166: domain = d; fp@1166: }; fp@1166: fp@1166: /*****************************************************************************/ fp@1166: fp@1166: void Command::setDataType(const string &t) fp@1166: { fp@1166: dataType = t; fp@1166: }; fp@1166: fp@1166: /*****************************************************************************/ fp@1166: fp@1166: void Command::setForce(bool f) fp@1166: { fp@1166: force = f; fp@1166: }; fp@1166: fp@1335: /*****************************************************************************/ fp@1335: fp@1335: void Command::setOutputFile(const string &f) fp@1335: { fp@1335: outputFile = f; fp@1335: }; fp@1335: fp@1142: /****************************************************************************/ fp@1142: fp@1142: bool Command::matchesSubstr(const string &cmd) const fp@1142: { fp@1142: return name.substr(0, cmd.length()) == cmd; fp@1142: } fp@1142: fp@1142: /****************************************************************************/ fp@1142: fp@1142: bool Command::matchesAbbrev(const string &abb) const fp@1142: { fp@1142: unsigned int i; fp@1142: size_t pos = 0; fp@1142: fp@1142: for (i = 0; i < abb.length(); i++) { fp@1142: pos = name.find(abb[i], pos); fp@1142: if (pos == string::npos) fp@1142: return false; fp@1142: } fp@1142: fp@1142: return true; fp@1142: } fp@1142: fp@1142: /*****************************************************************************/ fp@1142: fp@1144: string Command::numericInfo() fp@1144: { fp@1144: stringstream str; fp@1144: fp@1144: str << "Numerical values can be specified either with decimal (no" << endl fp@1144: << "prefix), octal (prefix '0') or hexadecimal (prefix '0x') base." fp@1144: << endl; fp@1144: fp@1144: return str.str(); fp@1144: } fp@1144: fp@1144: /*****************************************************************************/ fp@1144: fp@1155: void Command::throwInvalidUsageException(const stringstream &s) const fp@1142: { fp@1142: throw InvalidUsageException(s); fp@1142: } fp@1142: fp@1142: /*****************************************************************************/ fp@1142: fp@1155: void Command::throwCommandException(const stringstream &s) const fp@1142: { fp@1142: throw CommandException(s); fp@1142: } fp@1142: fp@1151: /*****************************************************************************/ fp@1151: fp@1155: void Command::throwSingleSlaveRequired(unsigned int size) const fp@1155: { fp@1155: stringstream err; fp@1155: fp@1199: err << "The slave selection matches " << size << " slaves. '" fp@1155: << name << "' requires a single slave."; fp@1155: fp@1155: throwInvalidUsageException(err); fp@1155: } fp@1155: fp@1155: /*****************************************************************************/ fp@1155: fp@1151: Command::SlaveList Command::selectedSlaves(MasterDevice &m) fp@1151: { fp@1160: ec_ioctl_master_t master; fp@1160: unsigned int i, aliasIndex; fp@1151: uint16_t lastAlias; fp@1151: ec_ioctl_slave_t slave; fp@1151: SlaveList list; fp@1151: fp@1160: m.getMaster(&master); fp@1160: fp@1151: if (alias == -1) { // no alias given fp@1151: if (position == -1) { // no alias and position given fp@1151: // all items fp@1160: for (i = 0; i < master.slave_count; i++) { fp@1151: m.getSlave(&slave, i); fp@1151: list.push_back(slave); fp@1151: } fp@1151: } else { // no alias, but position given fp@1151: // one item by position fp@1151: m.getSlave(&slave, position); fp@1151: list.push_back(slave); fp@1151: } fp@1151: } else { // alias given fp@1151: if (position == -1) { // alias, but no position given fp@1151: // take all items with a given alias fp@1151: lastAlias = 0; fp@1160: for (i = 0; i < master.slave_count; i++) { fp@1151: m.getSlave(&slave, i); fp@1151: if (slave.alias) { fp@1151: lastAlias = slave.alias; fp@1151: } fp@1151: if (lastAlias == (uint16_t) alias) { fp@1151: list.push_back(slave); fp@1151: } fp@1151: } fp@1151: } else { // alias and position given fp@1151: lastAlias = 0; fp@1151: aliasIndex = 0; fp@1160: for (i = 0; i < master.slave_count; i++) { fp@1151: m.getSlave(&slave, i); fp@1159: if (slave.alias && slave.alias == (uint16_t) alias) { fp@1151: lastAlias = slave.alias; fp@1151: aliasIndex = 0; fp@1151: } fp@1159: if (lastAlias && aliasIndex == (unsigned int) position) { fp@1151: list.push_back(slave); fp@1151: } fp@1151: aliasIndex++; fp@1151: } fp@1151: } fp@1151: } fp@1151: fp@1151: return list; fp@1151: } fp@1151: fp@1156: /*****************************************************************************/ fp@1156: fp@1156: bool operator<( fp@1156: const ec_ioctl_config_t &a, fp@1156: const ec_ioctl_config_t &b fp@1156: ) fp@1156: { fp@1156: return a.alias < b.alias fp@1156: || (a.alias == b.alias && a.position < b.position); fp@1156: } fp@1156: fp@1156: /*****************************************************************************/ fp@1156: fp@1156: Command::ConfigList Command::selectedConfigs(MasterDevice &m) fp@1156: { fp@1156: unsigned int i; fp@1156: ec_ioctl_master_t master; fp@1156: ec_ioctl_config_t config; fp@1156: ConfigList list; fp@1156: stringstream err; fp@1156: fp@1156: m.getMaster(&master); fp@1156: fp@1157: if (alias == -1) { // no alias given fp@1156: if (position == -1) { // no alias and position given fp@1156: // all items fp@1156: for (i = 0; i < master.config_count; i++) { fp@1156: m.getConfig(&config, i); fp@1156: list.push_back(config); fp@1156: } fp@1157: } else { // no alias, but position given fp@1157: for (i = 0; i < master.config_count; i++) { fp@1157: m.getConfig(&config, i); fp@1157: if (!config.alias && config.position == position) { fp@1157: list.push_back(config); fp@1157: break; // there can be at most one matching fp@1157: } fp@1157: } fp@1156: } fp@1156: } else { // alias given fp@1156: if (position == -1) { // alias, but no position given fp@1156: // take all items with a given alias fp@1156: for (i = 0; i < master.config_count; i++) { fp@1156: m.getConfig(&config, i); fp@1157: if (config.alias == alias) { fp@1156: list.push_back(config); fp@1156: } fp@1156: } fp@1156: } else { // alias and position given fp@1156: for (i = 0; i < master.config_count; i++) { fp@1156: m.getConfig(&config, i); fp@1157: if (config.alias == alias && config.position == position) { fp@1156: list.push_back(config); fp@1156: break; // there can be at most one matching fp@1156: } fp@1156: } fp@1156: } fp@1156: } fp@1156: fp@1156: list.sort(); fp@1156: return list; fp@1156: } fp@1156: fp@1142: /****************************************************************************/ fp@1146: fp@1166: Command::DomainList Command::selectedDomains(MasterDevice &m) fp@1166: { fp@1166: ec_ioctl_domain_t d; fp@1166: DomainList list; fp@1166: fp@1166: if (domain == -1) { fp@1166: ec_ioctl_master_t master; fp@1166: unsigned int i; fp@1166: fp@1166: m.getMaster(&master); fp@1166: fp@1166: for (i = 0; i < master.domain_count; i++) { fp@1166: m.getDomain(&d, i); fp@1166: list.push_back(d); fp@1166: } fp@1166: } else { fp@1166: m.getDomain(&d, domain); fp@1166: list.push_back(d); fp@1166: } fp@1166: fp@1166: return list; fp@1166: } fp@1166: fp@1166: /****************************************************************************/ fp@1166: fp@1146: string Command::alStateString(uint8_t state) fp@1146: { fp@1146: switch (state) { fp@1146: case 1: return "INIT"; fp@1146: case 2: return "PREOP"; fp@1146: case 4: return "SAFEOP"; fp@1146: case 8: return "OP"; fp@1146: default: return "???"; fp@1146: } fp@1146: } fp@1146: fp@1146: /****************************************************************************/