summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/configparser.h39
-rw-r--r--src/configparser.cpp84
2 files changed, 79 insertions, 44 deletions
diff --git a/include/configparser.h b/include/configparser.h
index c9790c59f..680f11a61 100644
--- a/include/configparser.h
+++ b/include/configparser.h
@@ -19,25 +19,6 @@
#pragma once
-struct fpos
-{
- std::string filename;
- int line;
- int col;
- fpos(const std::string& name, int l = 1, int c = 1) : filename(name), line(l), col(c) {}
- std::string str()
- {
- return filename + ":" + ConvToStr(line) + ":" + ConvToStr(col);
- }
-};
-
-enum ParseFlags
-{
- FLAG_USE_COMPAT = 1,
- FLAG_NO_EXEC = 2,
- FLAG_NO_INC = 4
-};
-
struct ParseStack
{
std::vector<std::string> reading;
@@ -57,23 +38,3 @@ struct ParseStack
void DoInclude(ConfigTag* includeTag, int flags);
void DoReadFile(const std::string& key, const std::string& file, int flags, bool exec);
};
-
-/** RAII wrapper on FILE* to close files on exceptions */
-struct FileWrapper
-{
- FILE* const f;
- bool close_with_pclose;
- FileWrapper(FILE* file, bool use_pclose = false) : f(file), close_with_pclose(use_pclose) {}
- operator bool() { return (f != NULL); }
- operator FILE*() { return f; }
- ~FileWrapper()
- {
- if (f)
- {
- if (close_with_pclose)
- pclose(f);
- else
- fclose(f);
- }
- }
-};
diff --git a/src/configparser.cpp b/src/configparser.cpp
index efcc6c68b..e4bf4bd71 100644
--- a/src/configparser.cpp
+++ b/src/configparser.cpp
@@ -21,13 +21,87 @@
#include <fstream>
#include "configparser.h"
+enum ParseFlags
+{
+ // Legacy config parsing should be used.
+ FLAG_USE_COMPAT = 1,
+
+ // Executable includes are disabled.
+ FLAG_NO_EXEC = 2,
+
+ // All includes are disabled.
+ FLAG_NO_INC = 4
+};
+
+// Represents the position within a config file.
+struct FilePosition
+{
+ // The name of the file which is being read.
+ std::string name;
+
+ // The line of the file that this position points to.
+ unsigned int line;
+
+ // The column of the file that this position points to.
+ unsigned int column;
+
+ FilePosition(const std::string& Name)
+ : name(Name)
+ , line(1)
+ , column(1)
+ {
+ }
+
+ /** Returns a string that represents this file position. */
+ std::string str()
+ {
+ return name + ":" + ConvToStr(line) + ":" + ConvToStr(column);
+ }
+};
+
+// RAII wrapper for FILE* which closes the file when it goes out of scope.
+class FileWrapper
+{
+ private:
+ // Whether this file handle should be closed with pclose.
+ bool close_with_pclose;
+
+ // The file handle which is being wrapped.
+ FILE* const file;
+
+ public:
+ FileWrapper(FILE* File, bool CloseWithPClose = false)
+ : close_with_pclose(CloseWithPClose)
+ , file(File)
+ {
+ }
+
+ // Operator which determines whether the file is open.
+ operator bool() { return (file != NULL); }
+
+ // Operator which retrieves the underlying FILE pointer.
+ operator FILE*() { return file; }
+
+ ~FileWrapper()
+ {
+ if (!file)
+ return;
+
+ if (close_with_pclose)
+ pclose(file);
+ else
+ fclose(file);
+ }
+};
+
+
struct Parser
{
ParseStack& stack;
int flags;
FILE* const file;
- fpos current;
- fpos last_tag;
+ FilePosition current;
+ FilePosition last_tag;
reference<ConfigTag> tag;
int ungot;
std::string mandatory_tag;
@@ -52,11 +126,11 @@ struct Parser
else if (ch == '\n')
{
current.line++;
- current.col = 0;
+ current.column = 0;
}
else
{
- current.col++;
+ current.column++;
}
return ch;
}
@@ -200,7 +274,7 @@ struct Parser
throw CoreException("Empty tag name");
ConfigItems* items;
- tag = ConfigTag::create(name, current.filename, current.line, items);
+ tag = ConfigTag::create(name, current.name, current.line, items);
while (kv(items))
{