diff options
author | Marek Sokolowski <mnbvmar@gmail.com> | 2017-09-29 00:14:18 +0000 |
---|---|---|
committer | Marek Sokolowski <mnbvmar@gmail.com> | 2017-09-29 00:14:18 +0000 |
commit | b5f39a05a329534979572781b10326c60b0bdc9e (patch) | |
tree | 2aa8ae30a9e0fd36c1c4bcf0fa044298abeefd8a /llvm/tools/llvm-rc/ResourceScriptParser.cpp | |
parent | 7e89ee7fdc428900dd362703e80d4644b28058f7 (diff) | |
download | bcm5719-llvm-b5f39a05a329534979572781b10326c60b0bdc9e.tar.gz bcm5719-llvm-b5f39a05a329534979572781b10326c60b0bdc9e.zip |
[llvm-rc] Add user-defined resources parsing ability. [8/8]
This allows llvm-rc to parse user-defined resources (ref:
msdn.microsoft.com/en-us/library/windows/desktop/aa381054.aspx).
These statements either import files, or put the specified raw data in
the resulting resource file.
Thanks to Nico Weber for his original work in this area.
Differential Revision: https://reviews.llvm.org/D37033
llvm-svn: 314478
Diffstat (limited to 'llvm/tools/llvm-rc/ResourceScriptParser.cpp')
-rw-r--r-- | llvm/tools/llvm-rc/ResourceScriptParser.cpp | 27 |
1 files changed, 26 insertions, 1 deletions
diff --git a/llvm/tools/llvm-rc/ResourceScriptParser.cpp b/llvm/tools/llvm-rc/ResourceScriptParser.cpp index ee7de6b937a..211d9e7e954 100644 --- a/llvm/tools/llvm-rc/ResourceScriptParser.cpp +++ b/llvm/tools/llvm-rc/ResourceScriptParser.cpp @@ -80,7 +80,7 @@ RCParser::ParseType RCParser::parseSingleResource() { else if (TypeToken->equalsLower("VERSIONINFO")) Result = parseVersionInfoResource(); else - return getExpectedError("resource type", /* IsAlreadyRead = */ true); + Result = parseUserDefinedResource(*TypeToken); if (Result) (*Result)->setName(*NameToken); @@ -416,6 +416,31 @@ RCParser::ParseType RCParser::parseDialogResource(bool IsExtended) { return std::move(Dialog); } +RCParser::ParseType RCParser::parseUserDefinedResource(IntOrString Type) { + if (isEof()) + return getExpectedError("filename, '{' or BEGIN"); + + // Check if this is a file resource. + if (look().kind() == Kind::String) + return make_unique<UserDefinedResource>(Type, read().value()); + + RETURN_IF_ERROR(consumeType(Kind::BlockBegin)); + std::vector<IntOrString> Data; + + // Consume comma before each consecutive token except the first one. + bool ConsumeComma = false; + while (!consumeOptionalType(Kind::BlockEnd)) { + if (ConsumeComma) + RETURN_IF_ERROR(consumeType(Kind::Comma)); + ConsumeComma = true; + + ASSIGN_OR_RETURN(Item, readIntOrString()); + Data.push_back(*Item); + } + + return make_unique<UserDefinedResource>(Type, std::move(Data)); +} + RCParser::ParseType RCParser::parseVersionInfoResource() { ASSIGN_OR_RETURN(FixedResult, parseVersionInfoFixed()); ASSIGN_OR_RETURN(BlockResult, parseVersionInfoBlockContents(StringRef())); |