From 420090af89bacc97ce9c9c28eb3d32d0c704ca53 Mon Sep 17 00:00:00 2001 From: Zachary Turner Date: Fri, 6 Oct 2017 20:51:20 +0000 Subject: [llvm-rc] Add optional serialization support for DIALOG(EX) resources. This is part 5 of llvm-rc serialization support. This allows DIALOG and DIALOGEX to serialize if dialog-specific optional statements are provided. These are (as of now): CAPTION, FONT, and STYLE. Notably, FONT statement can take more than two arguments when describing DIALOGEX resources (as in msdn.microsoft.com/en-us/library/windows/desktop/aa381013.aspx). I made some changes to the parser to reflect this fact. Patch by Marek Sokolowski Differential Revision: https://reviews.llvm.org/D37864 llvm-svn: 315104 --- llvm/tools/llvm-rc/ResourceScriptParser.cpp | 40 +++++++++++++++++++++-------- 1 file changed, 30 insertions(+), 10 deletions(-) (limited to 'llvm/tools/llvm-rc/ResourceScriptParser.cpp') diff --git a/llvm/tools/llvm-rc/ResourceScriptParser.cpp b/llvm/tools/llvm-rc/ResourceScriptParser.cpp index 1e32d4d1a9d..d8c081771cb 100644 --- a/llvm/tools/llvm-rc/ResourceScriptParser.cpp +++ b/llvm/tools/llvm-rc/ResourceScriptParser.cpp @@ -320,13 +320,13 @@ Expected RCParser::parseFlags(ArrayRef FlagDesc, return Result; } -// As for now, we ignore the extended set of statements. -Expected RCParser::parseOptionalStatements(bool IsExtended) { +Expected +RCParser::parseOptionalStatements(OptStmtType StmtsType) { OptionalStmtList Result; // The last statement is always followed by the start of the block. while (!isNextTokenKind(Kind::BlockBegin)) { - ASSIGN_OR_RETURN(SingleParse, parseSingleOptionalStatement(IsExtended)); + ASSIGN_OR_RETURN(SingleParse, parseSingleOptionalStatement(StmtsType)); Result.addStmt(std::move(*SingleParse)); } @@ -334,7 +334,7 @@ Expected RCParser::parseOptionalStatements(bool IsExtended) { } Expected> -RCParser::parseSingleOptionalStatement(bool IsExtended) { +RCParser::parseSingleOptionalStatement(OptStmtType StmtsType) { ASSIGN_OR_RETURN(TypeToken, readIdentifier()); if (TypeToken->equals_lower("CHARACTERISTICS")) return parseCharacteristicsStmt(); @@ -343,11 +343,11 @@ RCParser::parseSingleOptionalStatement(bool IsExtended) { if (TypeToken->equals_lower("VERSION")) return parseVersionStmt(); - if (IsExtended) { + if (StmtsType != OptStmtType::BasicStmt) { if (TypeToken->equals_lower("CAPTION")) return parseCaptionStmt(); if (TypeToken->equals_lower("FONT")) - return parseFontStmt(); + return parseFontStmt(StmtsType); if (TypeToken->equals_lower("STYLE")) return parseStyleStmt(); } @@ -401,8 +401,9 @@ RCParser::ParseType RCParser::parseDialogResource(bool IsExtended) { HelpID = *HelpIDResult; } - ASSIGN_OR_RETURN(OptStatements, - parseOptionalStatements(/*UseExtendedStmts = */ true)); + ASSIGN_OR_RETURN(OptStatements, parseOptionalStatements( + IsExtended ? OptStmtType::DialogExStmt + : OptStmtType::DialogStmt)); assert(isNextTokenKind(Kind::BlockBegin) && "parseOptionalStatements, when successful, halts on BlockBegin."); @@ -666,11 +667,30 @@ RCParser::ParseOptionType RCParser::parseCaptionStmt() { return llvm::make_unique(*Arg); } -RCParser::ParseOptionType RCParser::parseFontStmt() { +RCParser::ParseOptionType RCParser::parseFontStmt(OptStmtType DialogType) { + assert(DialogType != OptStmtType::BasicStmt); + ASSIGN_OR_RETURN(SizeResult, readInt()); RETURN_IF_ERROR(consumeType(Kind::Comma)); ASSIGN_OR_RETURN(NameResult, readString()); - return llvm::make_unique(*SizeResult, *NameResult); + + // Default values for the optional arguments. + uint32_t FontWeight = 0; + bool FontItalic = false; + uint32_t FontCharset = 1; + if (DialogType == OptStmtType::DialogExStmt) { + if (consumeOptionalType(Kind::Comma)) { + ASSIGN_OR_RETURN(Args, readIntsWithCommas(/* min = */ 0, /* max = */ 3)); + if (Args->size() >= 1) + FontWeight = (*Args)[0]; + if (Args->size() >= 2) + FontItalic = (*Args)[1] != 0; + if (Args->size() >= 3) + FontCharset = (*Args)[2]; + } + } + return llvm::make_unique(*SizeResult, *NameResult, FontWeight, + FontItalic, FontCharset); } RCParser::ParseOptionType RCParser::parseStyleStmt() { -- cgit v1.2.3