Merge pull request #563 from davidgiven/includes

Allow including config files from other config files.
This commit is contained in:
David Given
2022-08-27 01:09:04 +02:00
committed by GitHub
9 changed files with 76 additions and 117 deletions

View File

@@ -12,10 +12,11 @@ import "lib/mapper.proto";
import "lib/common.proto";
import "lib/layout.proto";
// NEXT_TAG: 18
// NEXT_TAG: 19
message ConfigProto {
optional string comment = 8;
optional bool is_extension = 13;
repeated string include = 19;
optional LayoutProto layout = 17;

View File

@@ -188,17 +188,17 @@ void FlagGroup::parseFlagsWithConfigFiles(int argc, const char* argv[],
);
}
void FlagGroup::parseConfigFile(
ConfigProto FlagGroup::parseSingleConfigFile(
const std::string& filename,
const std::map<std::string, std::string>& configFiles)
{
const auto& it = configFiles.find(filename);
if (it != configFiles.end())
{
ConfigProto newConfig;
if (!newConfig.ParseFromString(it->second))
ConfigProto config;
if (!config.ParseFromString(it->second))
Error() << "couldn't load built-in config proto";
config.MergeFrom(newConfig);
return config;
}
else
{
@@ -209,11 +209,33 @@ void FlagGroup::parseConfigFile(
std::ostringstream ss;
ss << f.rdbuf();
ConfigProto config;
if (!google::protobuf::TextFormat::MergeFromString(ss.str(), &config))
Error() << "couldn't load external config proto";
return config;
}
}
void FlagGroup::parseConfigFile(
const std::string& filename,
const std::map<std::string, std::string>& configFiles)
{
auto newConfig = parseSingleConfigFile(filename, configFiles);
/* The includes need to be merged _first_. */
for (const auto& include : newConfig.include())
{
auto included = parseSingleConfigFile(include, configFiles);
if (included.include_size() != 0)
Error() << "only one level of config file includes are supported (so far, if you need this, complain)";
config.MergeFrom(included);
}
config.MergeFrom(newConfig);
}
void FlagGroup::checkInitialised() const
{
if (!_initialised)

View File

@@ -3,6 +3,7 @@
class DataSpec;
class Flag;
class ConfigProto;
class FlagGroup
{
@@ -21,6 +22,9 @@ public:
[](const auto&){ return false; });
void parseFlagsWithConfigFiles(int argc, const char* argv[],
const std::map<std::string, std::string>& configFiles);
static ConfigProto parseSingleConfigFile(
const std::string& filename,
const std::map<std::string, std::string>& configFiles);
static void parseConfigFile(
const std::string& filename,
const std::map<std::string, std::string>& configFiles);

View File

@@ -0,0 +1,35 @@
comment: 'Common Micropolis definitions'
is_extension: true
drive {
hard_sector_count: 16
}
image_reader {
filename: "micropolis.img"
img {}
}
image_writer {
filename: "micropolis.img"
img {}
}
layout {
trackdata {
sector_size: 256
sector_range {
start_sector: 0
sector_count: 16
}
}
}
encoder {
micropolis {}
}
decoder {
micropolis {}
}

View File

@@ -1,4 +1,5 @@
FORMATS = \
_micropolis \
40track_drive \
acornadfs \
acorndfs \

View File

@@ -1,36 +1,10 @@
comment: 'Micropolis MetaFloppy Mod I 143kB 5.25" SSDD hard-sectored'
drive {
hard_sector_count: 16
}
image_reader {
filename: "micropolis.img"
img {}
}
image_writer {
filename: "micropolis.img"
img {}
}
include: '_micropolis'
layout {
tracks: 35
trackdata {
sector_size: 256
sector_range {
start_sector: 0
sector_count: 16
}
}
}
encoder {
micropolis {}
}
decoder {
micropolis {}
sides: 1
}
tracks {

View File

@@ -1,36 +1,10 @@
comment: 'Micropolis MetaFloppy Mod I 287kB 5.25" DSDD hard-sectored'
drive {
hard_sector_count: 16
}
image_reader {
filename: "micropolis.img"
img {}
}
image_writer {
filename: "micropolis.img"
img {}
}
include: '_micropolis'
layout {
tracks: 35
trackdata {
sector_size: 256
sector_range {
start_sector: 0
sector_count: 16
}
}
}
encoder {
micropolis {}
}
decoder {
micropolis {}
sides: 2
}
tracks {

View File

@@ -1,36 +1,10 @@
comment: 'Micropolis MetaFloppy Mod II 315kB 5.25" SSDD hard-sectored'
drive {
hard_sector_count: 16
}
image_reader {
filename: "micropolis.img"
img {}
}
image_writer {
filename: "micropolis.img"
img {}
}
include: '_micropolis'
layout {
tracks: 77
trackdata {
sector_size: 256
sector_range {
start_sector: 0
sector_count: 16
}
}
}
encoder {
micropolis {}
}
decoder {
micropolis {}
sides: 1
}
tracks {

View File

@@ -1,36 +1,10 @@
comment: 'Micropolis MetaFloppy Mod II 630kB 5.25" DSDD hard-sectored'
drive {
hard_sector_count: 16
}
image_reader {
filename: "micropolis.img"
img {}
}
image_writer {
filename: "micropolis.img"
img {}
}
include: '_micropolis'
layout {
tracks: 77
trackdata {
sector_size: 256
sector_range {
start_sector: 0
sector_count: 16
}
}
}
encoder {
micropolis {}
}
decoder {
micropolis {}
sides: 2
}
tracks {