Parse args

This commit is contained in:
2026-03-29 21:45:52 -07:00
parent c3860f1950
commit 46e35a1ce4
4 changed files with 49 additions and 2 deletions

View File

@@ -1,6 +1,6 @@
CXX ?= g++ CXX ?= g++
VERSION := 0.0.1 VERSION := 0.0.2
TARGET_NOVERSION := liboptions.so TARGET_NOVERSION := liboptions.so
TARGET := $(TARGET_NOVERSION).$(VERSION) TARGET := $(TARGET_NOVERSION).$(VERSION)
@@ -37,9 +37,11 @@ clean:
install: install:
cp $(TARGET) /usr/lib/$(TARGET) cp $(TARGET) /usr/lib/$(TARGET)
cp options.h /usr/include/options.h cp options.h /usr/include/options.h
cp options_headeronly.h /usr/include/options_headeronly.h
ln -s /usr/lib/$(TARGET) /usr/lib/$(TARGET_NOVERSION) ln -s /usr/lib/$(TARGET) /usr/lib/$(TARGET_NOVERSION)
uninstall: uninstall:
unlink /usr/lib/$(TARGET_NOVERSION) unlink /usr/lib/$(TARGET_NOVERSION)
rm /usr/lib/$(TARGET) rm /usr/lib/$(TARGET)
rm /usr/include/options.h rm /usr/include/options.h
rm /usr/include/options_headeronly.h

View File

@@ -55,6 +55,28 @@ void OptionsBase::read(const std::string& filename) {
kv[key] = value; kv[key] = value;
} }
for (auto* opt : getOptions()) {
if (kv.count(opt->key)) {
opt->setFromString(kv[opt->key]);
}
}
}
void OptionsBase::parse(const int argc, const char ** argv) {
std::unordered_map<std::string, std::string> kv;
std::string key, value, line;
for(int i = 0; i < argc; i++) {
line = std::string(argv[i]);
if (line.size() < 1 || line[0] == '#') continue; // skip comment lines TODO make better
auto pos = line.find('=');
if (pos == std::string::npos) continue; // skip invalid lines
std::string key = line.substr(0, pos);
std::string value = line.substr(pos + 1);
kv[key] = value;
}
for (auto* opt : getOptions()) { for (auto* opt : getOptions()) {
if (kv.count(opt->key)) { if (kv.count(opt->key)) {
opt->setFromString(kv[opt->key]); opt->setFromString(kv[opt->key]);

View File

@@ -31,6 +31,7 @@ namespace OptionLib {
const std::vector<__OptionBase*>& getOptions() const; const std::vector<__OptionBase*>& getOptions() const;
void store(const std::string& filename, std::string comment=""); void store(const std::string& filename, std::string comment="");
void read(const std::string& filename); void read(const std::string& filename);
void parse(const int argc, const char ** argv);
}; };
template<typename T> template<typename T>

View File

@@ -85,6 +85,28 @@ namespace OptionLib {
} }
} }
} }
void parse(const int argc, const char ** argv) {
std::unordered_map<std::string, std::string> kv;
std::string key, value, line;
for(int i = 0; i < argc; i++) {
line = std::string(argv[i]);
if (line.size() < 1 || line[0] == '#') continue; // skip comment lines TODO make better
auto pos = line.find('=');
if (pos == std::string::npos) continue; // skip invalid lines
std::string key = line.substr(0, pos);
std::string value = line.substr(pos + 1);
kv[key] = value;
}
for (auto* opt : getOptions()) {
if (kv.count(opt->key)) {
opt->setFromString(kv[opt->key]);
}
}
}
}; };