Config files are now specified with -c, rather than via filename

arguments, because otherwise you get really unhelpful error messages
when you get things wrong.
This commit is contained in:
David Given
2025-08-20 21:19:34 +02:00
parent 51fa7c9371
commit 0ec0ca7495
4 changed files with 46 additions and 26 deletions

View File

@@ -28,7 +28,7 @@ else:
("acorndfs", "", "--200"), ("acorndfs", "", "--200"),
("agat", "", ""), ("agat", "", ""),
("amiga", "", ""), ("amiga", "", ""),
("apple2", "", "--140 40track_drive"), ("apple2", "", "--140 -c 40track_drive"),
("atarist", "", "--360"), ("atarist", "", "--360"),
("atarist", "", "--370"), ("atarist", "", "--370"),
("atarist", "", "--400"), ("atarist", "", "--400"),
@@ -38,17 +38,17 @@ else:
("atarist", "", "--800"), ("atarist", "", "--800"),
("atarist", "", "--820"), ("atarist", "", "--820"),
("bk", "", ""), ("bk", "", ""),
("brother", "", "--120 40track_drive"), ("brother", "", "--120 -c 40track_drive"),
("brother", "", "--240"), ("brother", "", "--240"),
( (
"commodore", "commodore",
"scripts/commodore1541_test.textpb", "scripts/commodore1541_test.textpb",
"--171 40track_drive", "--171 -c 40track_drive",
), ),
( (
"commodore", "commodore",
"scripts/commodore1541_test.textpb", "scripts/commodore1541_test.textpb",
"--192 40track_drive", "--192 -c 40track_drive",
), ),
("commodore", "", "--800"), ("commodore", "", "--800"),
("commodore", "", "--1620"), ("commodore", "", "--1620"),
@@ -60,17 +60,17 @@ else:
("ibm", "", "--1232"), ("ibm", "", "--1232"),
("ibm", "", "--1440"), ("ibm", "", "--1440"),
("ibm", "", "--1680"), ("ibm", "", "--1680"),
("ibm", "", "--180 40track_drive"), ("ibm", "", "--180 -c 40track_drive"),
("ibm", "", "--160 40track_drive"), ("ibm", "", "--160 -c 40track_drive"),
("ibm", "", "--320 40track_drive"), ("ibm", "", "--320 -c 40track_drive"),
("ibm", "", "--360 40track_drive"), ("ibm", "", "--360 -c 40track_drive"),
("ibm", "", "--720_96"), ("ibm", "", "--720_96"),
("ibm", "", "--720_135"), ("ibm", "", "--720_135"),
("mac", "scripts/mac400_test.textpb", "--400"), ("mac", "scripts/mac400_test.textpb", "--400"),
("mac", "scripts/mac800_test.textpb", "--800"), ("mac", "scripts/mac800_test.textpb", "--800"),
("n88basic", "", ""), ("n88basic", "", ""),
("rx50", "", ""), ("rx50", "", ""),
("tartu", "", "--390 40track_drive"), ("tartu", "", "--390 -c 40track_drive"),
("tartu", "", "--780"), ("tartu", "", "--780"),
("tids990", "", ""), ("tids990", "", ""),
("victor9k", "", "--612"), ("victor9k", "", "--612"),

View File

@@ -13,17 +13,23 @@ static std::vector<Flag*> all_flags;
static std::map<const std::string, Flag*> flags_by_name; static std::map<const std::string, Flag*> flags_by_name;
static void doHelp(); static void doHelp();
static void doLoadConfig(const std::string& filename);
static void doShowConfig(); static void doShowConfig();
static void doDoc(); static void doDoc();
static FlagGroup helpGroup; static FlagGroup helpGroup;
static ActionFlag helpFlag = ActionFlag({"--help"}, "Shows the help.", doHelp); static ActionFlag helpFlag = ActionFlag({"--help"}, "Shows the help.", doHelp);
static ActionFlag showConfigFlag = ActionFlag({"--config", "-C"}, static FlagGroup configGroup;
static ActionFlag loadConfigFlag({"--config", "-c"},
"Reads an internal or external configuration file.",
doLoadConfig);
static ActionFlag showConfigFlag({"--show-config", "-C"},
"Shows the currently set configuration and halts.", "Shows the currently set configuration and halts.",
doShowConfig); doShowConfig);
static ActionFlag docFlag = ActionFlag( static ActionFlag docFlag(
{"--doc"}, "Shows the available configuration options and halts.", doDoc); {"--doc"}, "Shows the available configuration options and halts.", doDoc);
FlagGroup::FlagGroup() FlagGroup::FlagGroup()
@@ -182,17 +188,16 @@ void FlagGroup::parseFlags(int argc,
"non-option parameter '{}' seen (try --help)", *filenames.begin()); "non-option parameter '{}' seen (try --help)", *filenames.begin());
} }
static void doLoadConfig(const std::string& filename)
{
globalConfig().readBaseConfigFile(filename);
}
void FlagGroup::parseFlagsWithConfigFiles(int argc, void FlagGroup::parseFlagsWithConfigFiles(int argc,
const char* argv[], const char* argv[],
const std::map<std::string, const ConfigProto*>& configFiles) const std::map<std::string, const ConfigProto*>& configFiles)
{ {
parseFlags(argc, FlagGroup({this, &configGroup}).parseFlags(argc, argv);
argv,
[&](const auto& filename)
{
globalConfig().readBaseConfigFile(filename);
return true;
});
} }
void FlagGroup::checkInitialised() const void FlagGroup::checkInitialised() const

View File

@@ -83,13 +83,23 @@ public:
const std::string helptext, const std::string helptext,
std::function<void(void)> callback): std::function<void(void)> callback):
Flag(names, helptext), Flag(names, helptext),
_callback(callback) _voidCallback(callback),
_hasArgument(false)
{
}
ActionFlag(const std::vector<std::string>& names,
const std::string helptext,
std::function<void(const std::string&)> callback):
Flag(names, helptext),
_callback(callback),
_hasArgument(true)
{ {
} }
bool hasArgument() const override bool hasArgument() const override
{ {
return false; return _hasArgument;
} }
const std::string defaultValueAsString() const override const std::string defaultValueAsString() const override
@@ -99,11 +109,16 @@ public:
void set(const std::string& value) override void set(const std::string& value) override
{ {
_callback(); if (_hasArgument)
_callback(value);
else
_voidCallback();
} }
private: private:
const std::function<void(void)> _callback; const std::function<void(const std::string&)> _callback;
const std::function<void(void)> _voidCallback;
bool _hasArgument;
}; };
class SettableFlag : public Flag class SettableFlag : public Flag

View File

@@ -14,10 +14,10 @@ destfile=$dir/dest.img
dd if=/dev/urandom of=$srcfile bs=1048576 count=2 2>&1 dd if=/dev/urandom of=$srcfile bs=1048576 count=2 2>&1
echo $fluxengine write $format -i $srcfile -d $fluxfile --drive.rotational_period_ms=200 $flags echo $fluxengine write -c $format -i $srcfile -d $fluxfile --drive.rotational_period_ms=200 $flags
$fluxengine write $format -i $srcfile -d $fluxfile --drive.rotational_period_ms=200 $flags $fluxengine write -c $format -i $srcfile -d $fluxfile --drive.rotational_period_ms=200 $flags
echo $fluxengine read $format -s $fluxfile -o $destfile --drive.rotational_period_ms=200 $flags echo $fluxengine read -c $format -s $fluxfile -o $destfile --drive.rotational_period_ms=200 $flags
$fluxengine read $format -s $fluxfile -o $destfile --drive.rotational_period_ms=200 $flags $fluxengine read -c $format -s $fluxfile -o $destfile --drive.rotational_period_ms=200 $flags
if [ ! -s $destfile ]; then if [ ! -s $destfile ]; then
echo "Zero length output file!" >&2 echo "Zero length output file!" >&2
exit 1 exit 1