summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMax Kellermann <max@musicpd.org>2018-07-17 20:12:42 +0200
committerMax Kellermann <max@musicpd.org>2018-07-18 11:27:41 +0200
commitd06ef76e58e1fed9d7ec037ee75fad4cba934ccd (patch)
treecdb45f59804e498fdef86c330a2f220a1f5726df /src
parent57729683b69033b2a611f6d2fcd3ae812d3d6f0a (diff)
config/File: implement the "include" directive
This is an experimental draft. More needs to be done.
Diffstat (limited to 'src')
-rw-r--r--src/config/File.cxx18
1 files changed, 16 insertions, 2 deletions
diff --git a/src/config/File.cxx b/src/config/File.cxx
index 29c073f3b..7b6838bf2 100644
--- a/src/config/File.cxx
+++ b/src/config/File.cxx
@@ -25,6 +25,7 @@
#include "Templates.hxx"
#include "util/Tokenizer.hxx"
#include "util/StringStrip.hxx"
+#include "util/StringAPI.hxx"
#include "util/Domain.hxx"
#include "util/RuntimeError.hxx"
#include "fs/Path.hxx"
@@ -152,8 +153,11 @@ ReadConfigParam(ConfigData &config_data, BufferedReader &reader,
reader.GetLineNumber()));
}
+/**
+ * @param directory the directory used to resolve relative paths
+ */
static void
-ReadConfigFile(ConfigData &config_data, BufferedReader &reader)
+ReadConfigFile(ConfigData &config_data, BufferedReader &reader, Path directory)
{
while (true) {
char *line = reader.ReadLine();
@@ -171,6 +175,16 @@ ReadConfigFile(ConfigData &config_data, BufferedReader &reader)
const char *name = tokenizer.NextWord();
assert(name != nullptr);
+ if (StringIsEqual(name, "include")) {
+ // TODO: allow absolute path specifications
+ // TODO: detect recusion
+ // TODO: Config{Block,Param} have only line number but no file name
+ // TODO: support wildcards (include "conf.d/*.conf")
+ // TODO: add "include_optional"
+ ReadConfigFile(config_data, directory / AllocatedPath::FromUTF8Throw(ExpectValueAndEnd(tokenizer)));
+ continue;
+ }
+
/* get the definition of that option, and check the
"repeatable" flag */
@@ -202,7 +216,7 @@ ReadConfigFile(ConfigData &config_data, Path path)
BufferedReader reader(file);
try {
- ReadConfigFile(config_data, reader);
+ ReadConfigFile(config_data, reader, path.GetDirectoryName());
} catch (...) {
std::throw_with_nested(FormatRuntimeError("Error in %s line %u",
path_utf8.c_str(),