summaryrefslogtreecommitdiff
path: root/src/plugins
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins')
-rw-r--r--src/plugins/css/CSSParser.cpp8
-rw-r--r--src/plugins/css/CSSParser.hpp20
-rw-r--r--src/plugins/filesystem/FileLocator.cpp9
-rw-r--r--src/plugins/xml/XmlParser.cpp52
-rw-r--r--src/plugins/xml/XmlParser.hpp18
5 files changed, 42 insertions, 65 deletions
diff --git a/src/plugins/css/CSSParser.cpp b/src/plugins/css/CSSParser.cpp
index 40486cc..8cb41ea 100644
--- a/src/plugins/css/CSSParser.cpp
+++ b/src/plugins/css/CSSParser.cpp
@@ -19,10 +19,9 @@
#include "CSSParser.hpp"
#include <core/common/VariantReader.hpp>
+#include <core/parser/ParserContext.hpp>
namespace ousia {
-namespace parser {
-namespace css {
// CSS code tokens
static const int CURLY_OPEN = 1;
@@ -75,7 +74,7 @@ static const std::map<int, CodeTokenDescriptor> CSS_DESCRIPTORS = {
{ESCAPE, {CodeTokenMode::ESCAPE, ESCAPE}},
{LINEBREAK, {CodeTokenMode::LINEBREAK, LINEBREAK}}};
-Rooted<Node> CSSParser::parse(CharReader &reader, ParserContext &ctx)
+Rooted<Node> CSSParser::doParse(CharReader &reader, ParserContext &ctx)
{
CodeTokenizer tokenizer{reader, CSS_ROOT, CSS_DESCRIPTORS};
tokenizer.ignoreComments = true;
@@ -362,5 +361,4 @@ bool CSSParser::expect(int expectedType, CodeTokenizer &tokenizer, Token &t,
return true;
}
}
-}
-}
+
diff --git a/src/plugins/css/CSSParser.hpp b/src/plugins/css/CSSParser.hpp
index 1ec54f5..c6594f6 100644
--- a/src/plugins/css/CSSParser.hpp
+++ b/src/plugins/css/CSSParser.hpp
@@ -24,6 +24,7 @@
*
* @author Benjamin Paassen - bpaassen@techfak.uni-bielefeld.de
*/
+
#ifndef _OUSIA_CSS_PARSER_HPP_
#define _OUSIA_CSS_PARSER_HPP_
@@ -36,8 +37,6 @@
#include <core/parser/Parser.hpp>
namespace ousia {
-namespace parser {
-namespace css {
/**
* This is a context free, recursive parser for a subset of the CSS3 language
@@ -139,7 +138,7 @@ private:
bool expect(int expectedType, CodeTokenizer &tokenizer, Token &t,
bool force, ParserContext &ctx);
-public:
+protected:
/**
* This parses the given input as CSS content as specified by the grammar
* seen above. The return value is a Rooted reference to the root of the
@@ -157,21 +156,8 @@ public:
* @return returns the root node of the resulting SelectorTree. For more
* information on the return conventions consult the Parser.hpp.
*/
- Rooted<Node> parse(CharReader &reader, ParserContext &ctx) override;
-
- using Parser::parse;
-
- /**
- * As befits a class called CSSParser, this Parser parses CSS.
- */
- std::set<std::string> mimetypes()
- {
- std::set<std::string> out{"text/css"};
- return out;
- }
+ Rooted<Node> doParse(CharReader &reader, ParserContext &ctx) override;
};
}
-}
-}
#endif
diff --git a/src/plugins/filesystem/FileLocator.cpp b/src/plugins/filesystem/FileLocator.cpp
index 467363b..356394e 100644
--- a/src/plugins/filesystem/FileLocator.cpp
+++ b/src/plugins/filesystem/FileLocator.cpp
@@ -131,7 +131,7 @@ bool FileLocator::doLocate(Resource &resource, const std::string &path,
base /= path;
// If we already found a fitting resource there, use that.
- if (fs::exists(base)) {
+ if (fs::exists(base) && fs::is_regular_file(base)) {
std::string location = fs::canonical(base).generic_string();
#ifdef FILELOCATOR_DEBUG_PRINT
std::cout << "FileLocator: Found \"" << path << "\" at "
@@ -143,6 +143,11 @@ bool FileLocator::doLocate(Resource &resource, const std::string &path,
}
}
+ // If the path starts with "./" or "../" only perform relative lookups!
+ if (path.substr(0, 2) == "./" || path.substr(0, 3) == "../") {
+ return false;
+ }
+
// Otherwise look in the search paths, search backwards, last defined search
// paths have a higher precedence
auto it = searchPaths.find(type);
@@ -154,7 +159,7 @@ bool FileLocator::doLocate(Resource &resource, const std::string &path,
#endif
fs::path p{*it};
p /= path;
- if (fs::exists(p)) {
+ if (fs::exists(p) && fs::is_regular_file(p)) {
std::string location = fs::canonical(p).generic_string();
#ifdef FILELOCATOR_DEBUG_PRINT
std::cout << "FileLocator: Found \"" << path << "\" in "
diff --git a/src/plugins/xml/XmlParser.cpp b/src/plugins/xml/XmlParser.cpp
index 434a72c..78d9df8 100644
--- a/src/plugins/xml/XmlParser.cpp
+++ b/src/plugins/xml/XmlParser.cpp
@@ -25,13 +25,12 @@
#include <core/common/Utils.hpp>
#include <core/common/VariantReader.hpp>
#include <core/parser/ParserStack.hpp>
+#include <core/parser/ParserScope.hpp>
#include <core/model/Typesystem.hpp>
#include "XmlParser.hpp"
namespace ousia {
-namespace parser {
-namespace xml {
using namespace ousia::model;
@@ -132,11 +131,12 @@ public:
!(defaultValue.isObject() && defaultValue.asObject() == nullptr);
Rooted<StructType> structType = scope().getLeaf().cast<StructType>();
- Rooted<Attribute> attribute = structType->createAttribute(
- name, defaultValue, optional, logger());
+ Rooted<Attribute> attribute =
+ structType->createAttribute(name, defaultValue, optional, logger());
// Try to resolve the type
- scope().resolve<Type>(type, logger(),
+ scope().resolve<Type>(
+ type, logger(),
[attribute](Handle<Type> type, Logger &logger) mutable {
attribute->setType(type, logger);
},
@@ -235,16 +235,23 @@ public:
/* Adapter Expat -> ParserStack */
+struct XMLParserUserData {
+ SourceId sourceId;
+};
+
static SourceLocation syncLoggerPosition(XML_Parser p)
{
+ // Fetch the parser stack and the associated user data
+ ParserStack *stack = static_cast<ParserStack *>(XML_GetUserData(p));
+ XMLParserUserData *ud =
+ static_cast<XMLParserUserData *>(stack->getUserData());
+
// Fetch the current location in the XML file
- int line = XML_GetCurrentLineNumber(p);
- int column = XML_GetCurrentColumnNumber(p);
size_t offs = XML_GetCurrentByteIndex(p);
- SourceLocation loc{line, column, offs};
- // Update the default location of the current logger instance
- ParserStack *stack = static_cast<ParserStack *>(XML_GetUserData(p));
+ // Build the source location and update the default location of the current
+ // logger instance
+ SourceLocation loc{ud->sourceId, offs};
stack->getContext().logger.setDefaultLocation(loc);
return loc;
}
@@ -271,9 +278,9 @@ static void xmlStartElementHandler(void *p, const XML_Char *name,
static void xmlEndElementHandler(void *p, const XML_Char *name)
{
XML_Parser parser = static_cast<XML_Parser>(p);
- syncLoggerPosition(parser);
-
ParserStack *stack = static_cast<ParserStack *>(XML_GetUserData(parser));
+
+ syncLoggerPosition(parser);
stack->end();
}
@@ -291,19 +298,17 @@ static void xmlCharacterDataHandler(void *p, const XML_Char *s, int len)
/* Class XmlParser */
-std::set<std::string> XmlParser::mimetypes()
-{
- return std::set<std::string>{{"text/vnd.ousia.oxm", "text/vnd.ousia.oxd"}};
-}
-
-Rooted<Node> XmlParser::parse(CharReader &reader, ParserContext &ctx)
+Rooted<Node> XmlParser::doParse(CharReader &reader, ParserContext &ctx)
{
// Create the parser object
ScopedExpatXmlParser p{"UTF-8"};
// Create the parser stack instance and pass the reference to the state
// machine descriptor
- ParserStack stack{ctx, XML_HANDLERS};
+ XMLParserUserData data;
+ data.sourceId = reader.getSourceId();
+
+ ParserStack stack{ctx, XML_HANDLERS, &data};
XML_SetUserData(&p, &stack);
XML_UseParserAsHandlerArg(&p);
@@ -327,15 +332,14 @@ Rooted<Node> XmlParser::parse(CharReader &reader, ParserContext &ctx)
// Parse the data and handle any XML error
if (!XML_ParseBuffer(&p, bytesRead, bytesRead == 0)) {
- // Fetch the current line number and column
- int line = XML_GetCurrentLineNumber(&p);
- int column = XML_GetCurrentColumnNumber(&p);
+ // Fetch the xml parser byte offset
size_t offs = XML_GetCurrentByteIndex(&p);
// Throw a corresponding exception
XML_Error code = XML_GetErrorCode(&p);
std::string msg = std::string{XML_ErrorString(code)};
- throw LoggableException{"XML: " + msg, line, column, offs};
+ throw LoggableException{"XML: " + msg,
+ SourceLocation{reader.getSourceId(), offs}};
}
// Abort once there are no more bytes in the stream
@@ -346,6 +350,4 @@ Rooted<Node> XmlParser::parse(CharReader &reader, ParserContext &ctx)
return nullptr;
}
}
-}
-}
diff --git a/src/plugins/xml/XmlParser.hpp b/src/plugins/xml/XmlParser.hpp
index 62f0128..3c0ffb7 100644
--- a/src/plugins/xml/XmlParser.hpp
+++ b/src/plugins/xml/XmlParser.hpp
@@ -31,23 +31,13 @@
#include <core/parser/Parser.hpp>
namespace ousia {
-namespace parser {
-namespace xml {
/**
* The XmlParser class implements parsing the various types of Ousía XML
* documents using the expat stream XML parser.
*/
class XmlParser : public Parser {
-public:
- /**
- * Returns the mimetype supported by the XmlParser which is
- * "text/vnd.ousia.oxm" and "text/vnd.ousia.oxd".
- *
- * @return a list containing the mimetype supported by Ousía.
- */
- std::set<std::string> mimetypes() override;
-
+protected:
/**
* Parses the given input stream as XML file and returns the parsed
* top-level node.
@@ -56,14 +46,10 @@ public:
* @param ctx is a reference to the ParserContext instance that should be
* used.
*/
- Rooted<Node> parse(CharReader &reader, ParserContext &ctx) override;
-
- using Parser::parse;
+ Rooted<Node> doParse(CharReader &reader, ParserContext &ctx) override;
};
}
-}
-}
#endif /* _OUSIA_XML_PARSER_HPP_ */