//===-- ResourceScriptStmt.h ------------------------------------*- C++-*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===---------------------------------------------------------------------===// // // This lists all the resource and statement types occurring in RC scripts. // //===---------------------------------------------------------------------===// #ifndef LLVM_TOOLS_LLVMRC_RESOURCESCRIPTSTMT_H #define LLVM_TOOLS_LLVMRC_RESOURCESCRIPTSTMT_H #include "ResourceScriptToken.h" #include "ResourceVisitor.h" #include "llvm/ADT/BitVector.h" #include "llvm/ADT/StringMap.h" namespace llvm { namespace rc { // Integer wrapper that also holds information whether the user declared // the integer to be long (by appending L to the end of the integer) or not. // It allows to be implicitly cast from and to uint32_t in order // to be compatible with the parts of code that don't care about the integers // being marked long. class RCInt { … }; class IntWithNotMask { … }; // A class holding a name - either an integer or a reference to the string. class IntOrString { … }; enum ResourceKind { … }; // Non-zero memory flags. // Ref: msdn.microsoft.com/en-us/library/windows/desktop/ms648027(v=vs.85).aspx enum MemoryFlags { … }; // Base resource. All the resources should derive from this base. class RCResource { … }; // An empty resource. It has no content, type 0, ID 0 and all of its // characteristics are equal to 0. class NullResource : public RCResource { … }; // Optional statement base. All such statements should derive from this base. class OptionalStmt : public RCResource { … }; class OptionalStmtList : public OptionalStmt { … }; class OptStatementsRCResource : public RCResource { … }; // LANGUAGE statement. It can occur both as a top-level statement (in such // a situation, it changes the default language until the end of the file) // and as an optional resource statement (then it changes the language // of a single resource). // // Ref: msdn.microsoft.com/en-us/library/windows/desktop/aa381019(v=vs.85).aspx class LanguageResource : public OptionalStmt { … }; // ACCELERATORS resource. Defines a named table of accelerators for the app. // // Ref: msdn.microsoft.com/en-us/library/windows/desktop/aa380610(v=vs.85).aspx class AcceleratorsResource : public OptStatementsRCResource { … }; // BITMAP resource. Represents a bitmap (".bmp") file. // // Ref: msdn.microsoft.com/en-us/library/windows/desktop/aa380680(v=vs.85).aspx class BitmapResource : public RCResource { … }; // CURSOR resource. Represents a single cursor (".cur") file. // // Ref: msdn.microsoft.com/en-us/library/windows/desktop/aa380920(v=vs.85).aspx class CursorResource : public RCResource { … }; // ICON resource. Represents a single ".ico" file containing a group of icons. // // Ref: msdn.microsoft.com/en-us/library/windows/desktop/aa381018(v=vs.85).aspx class IconResource : public RCResource { … }; // HTML resource. Represents a local webpage that is to be embedded into the // resulting resource file. It embeds a file only - no additional resources // (images etc.) are included with this resource. // // Ref: msdn.microsoft.com/en-us/library/windows/desktop/aa966018(v=vs.85).aspx class HTMLResource : public RCResource { … }; // -- MENU resource and its helper classes -- // This resource describes the contents of an application menu // (usually located in the upper part of the dialog.) // // Ref: msdn.microsoft.com/en-us/library/windows/desktop/aa381025(v=vs.85).aspx // Description of a single submenu item. class MenuDefinition { … }; // Recursive description of a whole submenu. class MenuDefinitionList : public MenuDefinition { … }; // Separator in MENU definition (MENUITEM SEPARATOR). // // Ref: msdn.microsoft.com/en-us/library/windows/desktop/aa381024(v=vs.85).aspx class MenuSeparator : public MenuDefinition { … }; // MENUITEM statement definition. // // Ref: msdn.microsoft.com/en-us/library/windows/desktop/aa381024(v=vs.85).aspx class MenuItem : public MenuDefinition { … }; class MenuExItem : public MenuDefinition { … }; // POPUP statement definition. // // Ref: msdn.microsoft.com/en-us/library/windows/desktop/aa381030(v=vs.85).aspx class PopupItem : public MenuDefinition { … }; class PopupExItem : public MenuDefinition { … }; // Menu resource definition. class MenuResource : public OptStatementsRCResource { … }; class MenuExResource : public OptStatementsRCResource { … }; // STRINGTABLE resource. Contains a list of strings, each having its unique ID. // // Ref: msdn.microsoft.com/en-us/library/windows/desktop/aa381050(v=vs.85).aspx class StringTableResource : public OptStatementsRCResource { … }; // -- DIALOG(EX) resource and its helper classes -- // // This resource describes dialog boxes and controls residing inside them. // // Ref: msdn.microsoft.com/en-us/library/windows/desktop/aa381003(v=vs.85).aspx // Ref: msdn.microsoft.com/en-us/library/windows/desktop/aa381002(v=vs.85).aspx // Single control definition. class Control { … }; // Single dialog definition. We don't create distinct classes for DIALOG and // DIALOGEX because of their being too similar to each other. We only have a // flag determining the type of the dialog box. class DialogResource : public OptStatementsRCResource { … }; // User-defined resource. It is either: // * a link to the file, e.g. NAME TYPE "filename", // * or contains a list of integers and strings, e.g. NAME TYPE {1, "a", 2}. class UserDefinedResource : public RCResource { … }; // -- VERSIONINFO resource and its helper classes -- // // This resource lists the version information on the executable/library. // The declaration consists of the following items: // * A number of fixed optional version statements (e.g. FILEVERSION, FILEOS) // * BEGIN // * A number of BLOCK and/or VALUE statements. BLOCK recursively defines // another block of version information, whereas VALUE defines a // key -> value correspondence. There might be more than one value // corresponding to the single key. // * END // // Ref: msdn.microsoft.com/en-us/library/windows/desktop/aa381058(v=vs.85).aspx // A single VERSIONINFO statement; class VersionInfoStmt { … }; // BLOCK definition; also the main VERSIONINFO declaration is considered a // BLOCK, although it has no name. // The correct top-level blocks are "VarFileInfo" and "StringFileInfo". We don't // care about them at the parsing phase. class VersionInfoBlock : public VersionInfoStmt { … }; class VersionInfoValue : public VersionInfoStmt { … }; class VersionInfoResource : public RCResource { … }; // CHARACTERISTICS optional statement. // // Ref: msdn.microsoft.com/en-us/library/windows/desktop/aa380872(v=vs.85).aspx class CharacteristicsStmt : public OptionalStmt { … }; // VERSION optional statement. // // Ref: msdn.microsoft.com/en-us/library/windows/desktop/aa381059(v=vs.85).aspx class VersionStmt : public OptionalStmt { … }; // CAPTION optional statement. // // Ref: msdn.microsoft.com/en-us/library/windows/desktop/aa380778(v=vs.85).aspx class CaptionStmt : public OptionalStmt { … }; // FONT optional statement. // Note that the documentation is inaccurate: it expects five arguments to be // given, however the example provides only two. In fact, the original tool // expects two arguments - point size and name of the typeface. // // Ref: msdn.microsoft.com/en-us/library/windows/desktop/aa381013(v=vs.85).aspx class FontStmt : public OptionalStmt { … }; // STYLE optional statement. // // Ref: msdn.microsoft.com/en-us/library/windows/desktop/aa381051(v=vs.85).aspx class StyleStmt : public OptionalStmt { … }; // EXSTYLE optional statement. // // Ref: docs.microsoft.com/en-us/windows/desktop/menurc/exstyle-statement class ExStyleStmt : public OptionalStmt { … }; // MENU optional statement. // // Ref: https://learn.microsoft.com/en-us/windows/win32/menurc/menu-statement class MenuStmt : public OptionalStmt { … }; // CLASS optional statement. // // Ref: msdn.microsoft.com/en-us/library/windows/desktop/aa380883(v=vs.85).aspx class ClassStmt : public OptionalStmt { … }; } // namespace rc } // namespace llvm #endif