diff options
Diffstat (limited to 'llvm/tools/llvm-rc')
-rw-r--r-- | llvm/tools/llvm-rc/ResourceScriptParser.cpp | 21 | ||||
-rw-r--r-- | llvm/tools/llvm-rc/ResourceScriptParser.h | 1 | ||||
-rw-r--r-- | llvm/tools/llvm-rc/ResourceScriptToken.cpp | 5 |
3 files changed, 20 insertions, 7 deletions
diff --git a/llvm/tools/llvm-rc/ResourceScriptParser.cpp b/llvm/tools/llvm-rc/ResourceScriptParser.cpp index ffa18bdf198..7123df9029a 100644 --- a/llvm/tools/llvm-rc/ResourceScriptParser.cpp +++ b/llvm/tools/llvm-rc/ResourceScriptParser.cpp @@ -214,6 +214,12 @@ Expected<StringRef> RCParser::readString() { return read().value(); } +Expected<StringRef> RCParser::readFilename() { + if (!isNextTokenKind(Kind::String) && !isNextTokenKind(Kind::Identifier)) + return getExpectedError("string"); + return read().value(); +} + Expected<StringRef> RCParser::readIdentifier() { if (!isNextTokenKind(Kind::Identifier)) return getExpectedError("identifier"); @@ -385,7 +391,7 @@ RCParser::ParseType RCParser::parseAcceleratorsResource() { } RCParser::ParseType RCParser::parseCursorResource() { - ASSIGN_OR_RETURN(Arg, readString()); + ASSIGN_OR_RETURN(Arg, readFilename()); return llvm::make_unique<CursorResource>(*Arg); } @@ -427,8 +433,13 @@ RCParser::ParseType RCParser::parseUserDefinedResource(IntOrString Type) { return getExpectedError("filename, '{' or BEGIN"); // Check if this is a file resource. - if (look().kind() == Kind::String) + switch (look().kind()) { + case Kind::String: + case Kind::Identifier: return llvm::make_unique<UserDefinedResource>(Type, read().value()); + default: + break; + } RETURN_IF_ERROR(consumeType(Kind::BlockBegin)); std::vector<IntOrString> Data; @@ -487,17 +498,17 @@ Expected<Control> RCParser::parseControl() { } RCParser::ParseType RCParser::parseBitmapResource() { - ASSIGN_OR_RETURN(Arg, readString()); + ASSIGN_OR_RETURN(Arg, readFilename()); return llvm::make_unique<BitmapResource>(*Arg); } RCParser::ParseType RCParser::parseIconResource() { - ASSIGN_OR_RETURN(Arg, readString()); + ASSIGN_OR_RETURN(Arg, readFilename()); return llvm::make_unique<IconResource>(*Arg); } RCParser::ParseType RCParser::parseHTMLResource() { - ASSIGN_OR_RETURN(Arg, readString()); + ASSIGN_OR_RETURN(Arg, readFilename()); return llvm::make_unique<HTMLResource>(*Arg); } diff --git a/llvm/tools/llvm-rc/ResourceScriptParser.h b/llvm/tools/llvm-rc/ResourceScriptParser.h index e22619a5834..639ef63863c 100644 --- a/llvm/tools/llvm-rc/ResourceScriptParser.h +++ b/llvm/tools/llvm-rc/ResourceScriptParser.h @@ -84,6 +84,7 @@ private: Expected<RCInt> readInt(); // Parse an integer. Expected<StringRef> readString(); // Parse a string. Expected<StringRef> readIdentifier(); // Parse an identifier. + Expected<StringRef> readFilename(); // Parse a filename. Expected<IntOrString> readIntOrString(); // Parse an integer or a string. Expected<IntOrString> readTypeOrName(); // Parse an integer or an identifier. diff --git a/llvm/tools/llvm-rc/ResourceScriptToken.cpp b/llvm/tools/llvm-rc/ResourceScriptToken.cpp index 7bbf0d16f04..fc0a0e91845 100644 --- a/llvm/tools/llvm-rc/ResourceScriptToken.cpp +++ b/llvm/tools/llvm-rc/ResourceScriptToken.cpp @@ -281,13 +281,14 @@ bool Tokenizer::canStartIdentifier() const { assert(!streamEof()); const char CurChar = Data[Pos]; - return std::isalpha(CurChar) || CurChar == '_'; + return std::isalpha(CurChar) || CurChar == '_' || CurChar == '.'; } bool Tokenizer::canContinueIdentifier() const { assert(!streamEof()); const char CurChar = Data[Pos]; - return std::isalnum(CurChar) || CurChar == '_'; + return std::isalnum(CurChar) || CurChar == '_' || CurChar == '.' || + CurChar == '/' || CurChar == '\\'; } bool Tokenizer::canStartInt() const { |