Files
salmanoff/hcore/opts.cpp
T

111 lines
3.1 KiB
C++
Raw Normal View History

#include <opts.h>
#include <iostream>
#include <stdexcept>
#include <getopt.h>
#include <string>
#include <vector>
#include <sys/stat.h>
struct option OptionParser::longOptions[] = {
2025-01-07 14:05:23 -04:00
{"devicespec", required_argument, 0, 's'},
{"spec", required_argument, 0, 's'},
{"devspec", required_argument, 0, 's'},
{"devfile", required_argument, 0, 'd'},
{"devicefile", required_argument, 0, 'd'},
{"sense-api-lib", required_argument, 0, 'a'},
{"senseapi", required_argument, 0, 'a'},
{"sense-api-path", required_argument, 0, 'p'},
{"verbose", no_argument, 0, 'v'},
2025-01-05 13:35:14 -04:00
{"help", no_argument, 0, '?'},
{0, 0, 0, 0}
};
void OptionParser::parseArguments(int argc, char *argv[])
{
int opt;
int optionIndex = 0;
optind = 1; // Reset optind to 1 before parsing
while ((opt = getopt_long(
argc, argv, "s:d:a:p:v?", longOptions, &optionIndex)) != -1)
{
switch (opt)
{
2025-01-07 14:05:23 -04:00
case 's':
if (!deviceSpecs.empty()) {
deviceSpecs += "||";
}
deviceSpecs += std::string(optarg);
break;
case 'd':
2025-01-05 14:04:31 -04:00
deviceSpecFiles.push_back(optarg);
break;
case 'a':
senseApiLibs.push_back(optarg);
break;
case 'p':
{
struct stat info;
if (!senseApiLibPath.empty())
{
std::cerr << std::string(__func__)
+ " - Overwriting previous sense-api-path with: " << optarg
<< '\n';
}
if (stat(optarg, &info) != 0 || !(info.st_mode & S_IFDIR))
{
throw std::invalid_argument(
std::string(__func__) + " - The specified path is not a "
"directory: " + optarg);
}
senseApiLibPath = optarg;
break;
}
case 'v':
verbose = true;
break;
2025-01-05 13:35:14 -04:00
case '?':
printUsage = true;
return;
default:
throw std::invalid_argument(
std::string(__func__) + " - Invalid argument encountered: "
+ std::string(argv[optind - 1]));
}
}
}
std::string OptionParser::getUsage() const
{
2025-01-07 14:05:23 -04:00
return "Usage: program [-s|--devicespec|--spec|--devspec <device_spec>] "
"[-d|--devfile|--devicefile <filename>] "
"[-a|--sense-api-lib|--senseapi <filename>] "
"[-p|--sense-api-path <directory>] "
2025-01-05 13:35:14 -04:00
"[-v|--verbose] "
"[-?|--help]";
}
void OptionParser::dumpOptions() const
{
if (verbose) {
std::cout << "Verbose mode is on" << std::endl;
}
2025-01-07 14:05:23 -04:00
std::cout << "Device Specs: " << deviceSpecs << std::endl;
2025-01-05 14:04:31 -04:00
std::cout << "Device Spec Files: ";
for (const auto& file : deviceSpecFiles) {
std::cout << file << " ";
}
std::cout << std::endl;
std::cout << "Sense API Library Path: " << senseApiLibPath << std::endl;
std::cout << "Sense API Libraries: ";
for (const auto& lib : senseApiLibs) {
std::cout << lib << " ";
}
std::cout << std::endl;
}