#include "antlrplugin.h"
#include "cserror.h"
#include "RequirementLexer.hpp"
#include "RequirementParser.hpp"
#include <antlr/TokenStreamException.hpp>
namespace Security {
namespace CodeSigning {
namespace Parser = Security_CodeSigning;
class StdioInputStream : public antlr::InputBuffer {
public:
StdioInputStream(FILE *fp) : mFile(fp) { }
int getChar() { return fgetc(mFile); }
private:
FILE *mFile;
};
class StringInputStream : public antlr::InputBuffer {
public:
StringInputStream(const string &s) : mInput(s), mPos(mInput.begin()) { }
int getChar() { return (mPos == mInput.end()) ? EOF : *mPos++; }
private:
string mInput;
string::const_iterator mPos;
};
template <class Input, class Source, class Result>
const Result *parse(Source source, Result *(Parser::RequirementParser::*rule)(), std::string &errors)
{
Input input(source);
Parser::RequirementLexer lexer(input);
Parser::RequirementParser parser(lexer);
try {
const Result *result = (parser.*rule)();
errors = parser.errors;
if (errors.empty())
return result;
else
::free((void *)result);
} catch (const antlr::TokenStreamException &ex) {
errors = ex.toString() + "\n";
}
return NULL; }
static
const Requirement *fileRequirement(FILE *source, string &errors)
{ return parse<StdioInputStream>(source, &Parser::RequirementParser::requirement, errors); }
static
const Requirement *stringRequirement(string source, string &errors)
{ return parse<StringInputStream>(source, &Parser::RequirementParser::requirement, errors); }
static
const Requirements *fileRequirements(FILE *source, string &errors)
{ return parse<StdioInputStream>(source, &Parser::RequirementParser::requirementSet, errors); }
static
const Requirements *stringRequirements(string source, string &errors)
{ return parse<StringInputStream>(source, &Parser::RequirementParser::requirementSet, errors); }
static
const BlobCore *fileGeneric(FILE *source, string &errors)
{ return parse<StdioInputStream>(source, &Parser::RequirementParser::autosense, errors); }
static
const BlobCore *stringGeneric(string source, string &errors)
{ return parse<StringInputStream>(source, &Parser::RequirementParser::autosense, errors); }
static AntlrPlugin plugin = {
fileRequirement,
fileRequirements,
fileGeneric,
stringRequirement,
stringRequirements,
stringGeneric
};
AntlrPlugin *findAntlrPlugin()
{
return &plugin;
}
} }