15cd3d5c8SMarek Sokolowski //
22946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
32946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
42946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
55cd3d5c8SMarek Sokolowski //
65cd3d5c8SMarek Sokolowski //===---------------------------------------------------------------------===//
75cd3d5c8SMarek Sokolowski //
85cd3d5c8SMarek Sokolowski // This implements methods defined in ResourceScriptStmt.h.
95cd3d5c8SMarek Sokolowski //
105cd3d5c8SMarek Sokolowski // Ref: msdn.microsoft.com/en-us/library/windows/desktop/aa380599(v=vs.85).aspx
115cd3d5c8SMarek Sokolowski //
125cd3d5c8SMarek Sokolowski //===---------------------------------------------------------------------===//
135cd3d5c8SMarek Sokolowski
145cd3d5c8SMarek Sokolowski #include "ResourceScriptStmt.h"
155cd3d5c8SMarek Sokolowski
165cd3d5c8SMarek Sokolowski namespace llvm {
175cd3d5c8SMarek Sokolowski namespace rc {
185cd3d5c8SMarek Sokolowski
operator <<(raw_ostream & OS,const IntOrString & Item)195cd3d5c8SMarek Sokolowski raw_ostream &operator<<(raw_ostream &OS, const IntOrString &Item) {
205cd3d5c8SMarek Sokolowski if (Item.IsInt)
215cd3d5c8SMarek Sokolowski return OS << Item.Data.Int;
225cd3d5c8SMarek Sokolowski else
235cd3d5c8SMarek Sokolowski return OS << Item.Data.String;
245cd3d5c8SMarek Sokolowski }
255cd3d5c8SMarek Sokolowski
log(raw_ostream & OS) const265cd3d5c8SMarek Sokolowski raw_ostream &OptionalStmtList::log(raw_ostream &OS) const {
275cd3d5c8SMarek Sokolowski for (const auto &Stmt : Statements) {
285cd3d5c8SMarek Sokolowski OS << " Option: ";
295cd3d5c8SMarek Sokolowski Stmt->log(OS);
305cd3d5c8SMarek Sokolowski }
315cd3d5c8SMarek Sokolowski return OS;
325cd3d5c8SMarek Sokolowski }
335cd3d5c8SMarek Sokolowski
log(raw_ostream & OS) const345cd3d5c8SMarek Sokolowski raw_ostream &LanguageResource::log(raw_ostream &OS) const {
355cd3d5c8SMarek Sokolowski return OS << "Language: " << Lang << ", Sublanguage: " << SubLang << "\n";
365cd3d5c8SMarek Sokolowski }
375cd3d5c8SMarek Sokolowski
387f110527SMarek Sokolowski StringRef AcceleratorsResource::Accelerator::OptionsStr
397f110527SMarek Sokolowski [AcceleratorsResource::Accelerator::NumFlags] = {
407f110527SMarek Sokolowski "ASCII", "VIRTKEY", "NOINVERT", "ALT", "SHIFT", "CONTROL"};
417f110527SMarek Sokolowski
42c75a087cSMarek Sokolowski uint32_t AcceleratorsResource::Accelerator::OptionsFlags
43c75a087cSMarek Sokolowski [AcceleratorsResource::Accelerator::NumFlags] = {ASCII, VIRTKEY, NOINVERT,
44c75a087cSMarek Sokolowski ALT, SHIFT, CONTROL};
45c75a087cSMarek Sokolowski
log(raw_ostream & OS) const467f110527SMarek Sokolowski raw_ostream &AcceleratorsResource::log(raw_ostream &OS) const {
477f110527SMarek Sokolowski OS << "Accelerators (" << ResName << "): \n";
48c75a087cSMarek Sokolowski OptStatements->log(OS);
497f110527SMarek Sokolowski for (const auto &Acc : Accelerators) {
507f110527SMarek Sokolowski OS << " Accelerator: " << Acc.Event << " " << Acc.Id;
517f110527SMarek Sokolowski for (size_t i = 0; i < Accelerator::NumFlags; ++i)
52c75a087cSMarek Sokolowski if (Acc.Flags & Accelerator::OptionsFlags[i])
537f110527SMarek Sokolowski OS << " " << Accelerator::OptionsStr[i];
547f110527SMarek Sokolowski OS << "\n";
557f110527SMarek Sokolowski }
567f110527SMarek Sokolowski return OS;
577f110527SMarek Sokolowski }
587f110527SMarek Sokolowski
log(raw_ostream & OS) const59577b9817SMartin Storsjo raw_ostream &BitmapResource::log(raw_ostream &OS) const {
60577b9817SMartin Storsjo return OS << "Bitmap (" << ResName << "): " << BitmapLoc << "\n";
61577b9817SMartin Storsjo }
62577b9817SMartin Storsjo
log(raw_ostream & OS) const6372aa937eSMarek Sokolowski raw_ostream &CursorResource::log(raw_ostream &OS) const {
6472aa937eSMarek Sokolowski return OS << "Cursor (" << ResName << "): " << CursorLoc << "\n";
6572aa937eSMarek Sokolowski }
6672aa937eSMarek Sokolowski
log(raw_ostream & OS) const675cd3d5c8SMarek Sokolowski raw_ostream &IconResource::log(raw_ostream &OS) const {
685cd3d5c8SMarek Sokolowski return OS << "Icon (" << ResName << "): " << IconLoc << "\n";
695cd3d5c8SMarek Sokolowski }
705cd3d5c8SMarek Sokolowski
log(raw_ostream & OS) const7172aa937eSMarek Sokolowski raw_ostream &HTMLResource::log(raw_ostream &OS) const {
7272aa937eSMarek Sokolowski return OS << "HTML (" << ResName << "): " << HTMLLoc << "\n";
7372aa937eSMarek Sokolowski }
7472aa937eSMarek Sokolowski
7599ecb0ebSMarek Sokolowski StringRef MenuDefinition::OptionsStr[MenuDefinition::NumFlags] = {
7699ecb0ebSMarek Sokolowski "CHECKED", "GRAYED", "HELP", "INACTIVE", "MENUBARBREAK", "MENUBREAK"};
7799ecb0ebSMarek Sokolowski
78c75a087cSMarek Sokolowski uint32_t MenuDefinition::OptionsFlags[MenuDefinition::NumFlags] = {
79c75a087cSMarek Sokolowski CHECKED, GRAYED, HELP, INACTIVE, MENUBARBREAK, MENUBREAK};
80c75a087cSMarek Sokolowski
logFlags(raw_ostream & OS,uint16_t Flags)81c75a087cSMarek Sokolowski raw_ostream &MenuDefinition::logFlags(raw_ostream &OS, uint16_t Flags) {
8299ecb0ebSMarek Sokolowski for (size_t i = 0; i < NumFlags; ++i)
83c75a087cSMarek Sokolowski if (Flags & OptionsFlags[i])
8499ecb0ebSMarek Sokolowski OS << " " << OptionsStr[i];
8599ecb0ebSMarek Sokolowski return OS;
8699ecb0ebSMarek Sokolowski }
8799ecb0ebSMarek Sokolowski
log(raw_ostream & OS) const8899ecb0ebSMarek Sokolowski raw_ostream &MenuDefinitionList::log(raw_ostream &OS) const {
8999ecb0ebSMarek Sokolowski OS << " Menu list starts\n";
9099ecb0ebSMarek Sokolowski for (auto &Item : Definitions)
9199ecb0ebSMarek Sokolowski Item->log(OS);
9299ecb0ebSMarek Sokolowski return OS << " Menu list ends\n";
9399ecb0ebSMarek Sokolowski }
9499ecb0ebSMarek Sokolowski
log(raw_ostream & OS) const9599ecb0ebSMarek Sokolowski raw_ostream &MenuItem::log(raw_ostream &OS) const {
9699ecb0ebSMarek Sokolowski OS << " MenuItem (" << Name << "), ID = " << Id;
9799ecb0ebSMarek Sokolowski logFlags(OS, Flags);
9899ecb0ebSMarek Sokolowski return OS << "\n";
9999ecb0ebSMarek Sokolowski }
10099ecb0ebSMarek Sokolowski
log(raw_ostream & OS) const10199ecb0ebSMarek Sokolowski raw_ostream &MenuSeparator::log(raw_ostream &OS) const {
10299ecb0ebSMarek Sokolowski return OS << " Menu separator\n";
10399ecb0ebSMarek Sokolowski }
10499ecb0ebSMarek Sokolowski
log(raw_ostream & OS) const10599ecb0ebSMarek Sokolowski raw_ostream &PopupItem::log(raw_ostream &OS) const {
10699ecb0ebSMarek Sokolowski OS << " Popup (" << Name << ")";
10799ecb0ebSMarek Sokolowski logFlags(OS, Flags);
10899ecb0ebSMarek Sokolowski OS << ":\n";
10999ecb0ebSMarek Sokolowski return SubItems.log(OS);
11099ecb0ebSMarek Sokolowski }
11199ecb0ebSMarek Sokolowski
log(raw_ostream & OS) const11299ecb0ebSMarek Sokolowski raw_ostream &MenuResource::log(raw_ostream &OS) const {
11399ecb0ebSMarek Sokolowski OS << "Menu (" << ResName << "):\n";
114c75a087cSMarek Sokolowski OptStatements->log(OS);
11599ecb0ebSMarek Sokolowski return Elements.log(OS);
11699ecb0ebSMarek Sokolowski }
11799ecb0ebSMarek Sokolowski
log(raw_ostream & OS) const1185cd3d5c8SMarek Sokolowski raw_ostream &StringTableResource::log(raw_ostream &OS) const {
1195cd3d5c8SMarek Sokolowski OS << "StringTable:\n";
120c75a087cSMarek Sokolowski OptStatements->log(OS);
121*b989fcbaSMartin Storsjö for (const auto &String : Table) {
122*b989fcbaSMartin Storsjö OS << " " << String.first << " =>";
123*b989fcbaSMartin Storsjö for (const auto &S : String.second)
124*b989fcbaSMartin Storsjö OS << " " << S;
125*b989fcbaSMartin Storsjö OS << "\n";
126*b989fcbaSMartin Storsjö }
1275cd3d5c8SMarek Sokolowski return OS;
1285cd3d5c8SMarek Sokolowski }
1295cd3d5c8SMarek Sokolowski
1307f7745c0SMarek Sokolowski const StringMap<Control::CtlInfo> Control::SupportedCtls = {
1317f7745c0SMarek Sokolowski {"LTEXT", CtlInfo{0x50020000, ClsStatic, true}},
1327f7745c0SMarek Sokolowski {"CTEXT", CtlInfo{0x50020001, ClsStatic, true}},
1337f7745c0SMarek Sokolowski {"RTEXT", CtlInfo{0x50020002, ClsStatic, true}},
134818bd568SMartin Storsjo {"ICON", CtlInfo{0x50000003, ClsStatic, true}},
1357f7745c0SMarek Sokolowski {"PUSHBUTTON", CtlInfo{0x50010000, ClsButton, true}},
1367f7745c0SMarek Sokolowski {"DEFPUSHBUTTON", CtlInfo{0x50010001, ClsButton, true}},
137818bd568SMartin Storsjo {"AUTO3STATE", CtlInfo{0x50010006, ClsButton, true}},
138818bd568SMartin Storsjo {"AUTOCHECKBOX", CtlInfo{0x50010003, ClsButton, true}},
139818bd568SMartin Storsjo {"AUTORADIOBUTTON", CtlInfo{0x50000009, ClsButton, true}},
140818bd568SMartin Storsjo {"CHECKBOX", CtlInfo{0x50010002, ClsButton, true}},
141818bd568SMartin Storsjo {"GROUPBOX", CtlInfo{0x50000007, ClsButton, true}},
142818bd568SMartin Storsjo {"RADIOBUTTON", CtlInfo{0x50000004, ClsButton, true}},
143818bd568SMartin Storsjo {"STATE3", CtlInfo{0x50010005, ClsButton, true}},
144818bd568SMartin Storsjo {"PUSHBOX", CtlInfo{0x5001000A, ClsButton, true}},
1457f7745c0SMarek Sokolowski {"EDITTEXT", CtlInfo{0x50810000, ClsEdit, false}},
146818bd568SMartin Storsjo {"COMBOBOX", CtlInfo{0x50000000, ClsComboBox, false}},
147818bd568SMartin Storsjo {"LISTBOX", CtlInfo{0x50800001, ClsListBox, false}},
148818bd568SMartin Storsjo {"SCROLLBAR", CtlInfo{0x50000000, ClsScrollBar, false}},
149818bd568SMartin Storsjo {"CONTROL", CtlInfo{0x50000000, 0, true}},
1507f7745c0SMarek Sokolowski };
1514ac54d93SMarek Sokolowski
log(raw_ostream & OS) const1524ac54d93SMarek Sokolowski raw_ostream &Control::log(raw_ostream &OS) const {
1534ac54d93SMarek Sokolowski OS << " Control (" << ID << "): " << Type << ", title: " << Title
1544ac54d93SMarek Sokolowski << ", loc: (" << X << ", " << Y << "), size: [" << Width << ", " << Height
1554ac54d93SMarek Sokolowski << "]";
1564ac54d93SMarek Sokolowski if (Style)
157d0afe724SMartin Storsjo OS << ", style: " << (*Style).getValue();
1584ac54d93SMarek Sokolowski if (ExtStyle)
1594ac54d93SMarek Sokolowski OS << ", ext. style: " << *ExtStyle;
1604ac54d93SMarek Sokolowski if (HelpID)
1614ac54d93SMarek Sokolowski OS << ", help ID: " << *HelpID;
1624ac54d93SMarek Sokolowski return OS << "\n";
1634ac54d93SMarek Sokolowski }
1644ac54d93SMarek Sokolowski
log(raw_ostream & OS) const1654ac54d93SMarek Sokolowski raw_ostream &DialogResource::log(raw_ostream &OS) const {
1664ac54d93SMarek Sokolowski OS << "Dialog" << (IsExtended ? "Ex" : "") << " (" << ResName << "): loc: ("
1674ac54d93SMarek Sokolowski << X << ", " << Y << "), size: [" << Width << ", " << Height
1684ac54d93SMarek Sokolowski << "], help ID: " << HelpID << "\n";
169c75a087cSMarek Sokolowski OptStatements->log(OS);
1704ac54d93SMarek Sokolowski for (auto &Ctl : Controls)
1714ac54d93SMarek Sokolowski Ctl.log(OS);
1724ac54d93SMarek Sokolowski return OS;
1734ac54d93SMarek Sokolowski }
1744ac54d93SMarek Sokolowski
log(raw_ostream & OS) const175fb74cb1eSMarek Sokolowski raw_ostream &VersionInfoBlock::log(raw_ostream &OS) const {
176fb74cb1eSMarek Sokolowski OS << " Start of block (name: " << Name << ")\n";
177fb74cb1eSMarek Sokolowski for (auto &Stmt : Stmts)
178fb74cb1eSMarek Sokolowski Stmt->log(OS);
179fb74cb1eSMarek Sokolowski return OS << " End of block\n";
180fb74cb1eSMarek Sokolowski }
181fb74cb1eSMarek Sokolowski
log(raw_ostream & OS) const182fb74cb1eSMarek Sokolowski raw_ostream &VersionInfoValue::log(raw_ostream &OS) const {
183fb74cb1eSMarek Sokolowski OS << " " << Key << " =>";
18407bc04ffSZachary Turner size_t NumValues = Values.size();
18507bc04ffSZachary Turner for (size_t Id = 0; Id < NumValues; ++Id) {
18607bc04ffSZachary Turner if (Id > 0 && HasPrecedingComma[Id])
18707bc04ffSZachary Turner OS << ",";
18807bc04ffSZachary Turner OS << " " << Values[Id];
18907bc04ffSZachary Turner }
190fb74cb1eSMarek Sokolowski return OS << "\n";
191fb74cb1eSMarek Sokolowski }
192fb74cb1eSMarek Sokolowski
193fb74cb1eSMarek Sokolowski using VersionInfoFixed = VersionInfoResource::VersionInfoFixed;
194fb74cb1eSMarek Sokolowski using VersionInfoFixedType = VersionInfoFixed::VersionInfoFixedType;
195fb74cb1eSMarek Sokolowski
196fb74cb1eSMarek Sokolowski const StringRef
197fb74cb1eSMarek Sokolowski VersionInfoFixed::FixedFieldsNames[VersionInfoFixed::FtNumTypes] = {
198fb74cb1eSMarek Sokolowski "", "FILEVERSION", "PRODUCTVERSION", "FILEFLAGSMASK",
199fb74cb1eSMarek Sokolowski "FILEFLAGS", "FILEOS", "FILETYPE", "FILESUBTYPE"};
200fb74cb1eSMarek Sokolowski
201fb74cb1eSMarek Sokolowski const StringMap<VersionInfoFixedType> VersionInfoFixed::FixedFieldsInfoMap = {
202fb74cb1eSMarek Sokolowski {FixedFieldsNames[FtFileVersion], FtFileVersion},
203fb74cb1eSMarek Sokolowski {FixedFieldsNames[FtProductVersion], FtProductVersion},
204fb74cb1eSMarek Sokolowski {FixedFieldsNames[FtFileFlagsMask], FtFileFlagsMask},
205fb74cb1eSMarek Sokolowski {FixedFieldsNames[FtFileFlags], FtFileFlags},
206fb74cb1eSMarek Sokolowski {FixedFieldsNames[FtFileOS], FtFileOS},
207fb74cb1eSMarek Sokolowski {FixedFieldsNames[FtFileType], FtFileType},
208fb74cb1eSMarek Sokolowski {FixedFieldsNames[FtFileSubtype], FtFileSubtype}};
209fb74cb1eSMarek Sokolowski
getFixedType(StringRef Type)210fb74cb1eSMarek Sokolowski VersionInfoFixedType VersionInfoFixed::getFixedType(StringRef Type) {
211fb74cb1eSMarek Sokolowski auto UpperType = Type.upper();
212fb74cb1eSMarek Sokolowski auto Iter = FixedFieldsInfoMap.find(UpperType);
213fb74cb1eSMarek Sokolowski if (Iter != FixedFieldsInfoMap.end())
214fb74cb1eSMarek Sokolowski return Iter->getValue();
215fb74cb1eSMarek Sokolowski return FtUnknown;
216fb74cb1eSMarek Sokolowski }
217fb74cb1eSMarek Sokolowski
isTypeSupported(VersionInfoFixedType Type)218fb74cb1eSMarek Sokolowski bool VersionInfoFixed::isTypeSupported(VersionInfoFixedType Type) {
219fb74cb1eSMarek Sokolowski return FtUnknown < Type && Type < FtNumTypes;
220fb74cb1eSMarek Sokolowski }
221fb74cb1eSMarek Sokolowski
isVersionType(VersionInfoFixedType Type)222fb74cb1eSMarek Sokolowski bool VersionInfoFixed::isVersionType(VersionInfoFixedType Type) {
223fb74cb1eSMarek Sokolowski switch (Type) {
224fb74cb1eSMarek Sokolowski case FtFileVersion:
225fb74cb1eSMarek Sokolowski case FtProductVersion:
226fb74cb1eSMarek Sokolowski return true;
227fb74cb1eSMarek Sokolowski
228fb74cb1eSMarek Sokolowski default:
229fb74cb1eSMarek Sokolowski return false;
230fb74cb1eSMarek Sokolowski }
231fb74cb1eSMarek Sokolowski }
232fb74cb1eSMarek Sokolowski
log(raw_ostream & OS) const233fb74cb1eSMarek Sokolowski raw_ostream &VersionInfoFixed::log(raw_ostream &OS) const {
234fb74cb1eSMarek Sokolowski for (int Type = FtUnknown; Type < FtNumTypes; ++Type) {
235fb74cb1eSMarek Sokolowski if (!isTypeSupported((VersionInfoFixedType)Type))
236fb74cb1eSMarek Sokolowski continue;
237fb74cb1eSMarek Sokolowski OS << " Fixed: " << FixedFieldsNames[Type] << ":";
238fb74cb1eSMarek Sokolowski for (uint32_t Val : FixedInfo[Type])
239fb74cb1eSMarek Sokolowski OS << " " << Val;
240fb74cb1eSMarek Sokolowski OS << "\n";
241fb74cb1eSMarek Sokolowski }
242fb74cb1eSMarek Sokolowski return OS;
243fb74cb1eSMarek Sokolowski }
244fb74cb1eSMarek Sokolowski
log(raw_ostream & OS) const245fb74cb1eSMarek Sokolowski raw_ostream &VersionInfoResource::log(raw_ostream &OS) const {
246fb74cb1eSMarek Sokolowski OS << "VersionInfo (" << ResName << "):\n";
247fb74cb1eSMarek Sokolowski FixedData.log(OS);
248fb74cb1eSMarek Sokolowski return MainBlock.log(OS);
249fb74cb1eSMarek Sokolowski }
250fb74cb1eSMarek Sokolowski
log(raw_ostream & OS) const251b5f39a05SMarek Sokolowski raw_ostream &UserDefinedResource::log(raw_ostream &OS) const {
252b5f39a05SMarek Sokolowski OS << "User-defined (type: " << Type << ", name: " << ResName << "): ";
253b5f39a05SMarek Sokolowski if (IsFileResource)
254b5f39a05SMarek Sokolowski return OS << FileLoc << "\n";
255b5f39a05SMarek Sokolowski OS << "data = ";
256b5f39a05SMarek Sokolowski for (auto &Item : Contents)
257b5f39a05SMarek Sokolowski OS << Item << " ";
258b5f39a05SMarek Sokolowski return OS << "\n";
259b5f39a05SMarek Sokolowski }
260b5f39a05SMarek Sokolowski
log(raw_ostream & OS) const2615cd3d5c8SMarek Sokolowski raw_ostream &CharacteristicsStmt::log(raw_ostream &OS) const {
2625cd3d5c8SMarek Sokolowski return OS << "Characteristics: " << Value << "\n";
2635cd3d5c8SMarek Sokolowski }
2645cd3d5c8SMarek Sokolowski
log(raw_ostream & OS) const2655cd3d5c8SMarek Sokolowski raw_ostream &VersionStmt::log(raw_ostream &OS) const {
2665cd3d5c8SMarek Sokolowski return OS << "Version: " << Value << "\n";
2675cd3d5c8SMarek Sokolowski }
2685cd3d5c8SMarek Sokolowski
log(raw_ostream & OS) const2694ac54d93SMarek Sokolowski raw_ostream &CaptionStmt::log(raw_ostream &OS) const {
2704ac54d93SMarek Sokolowski return OS << "Caption: " << Value << "\n";
2714ac54d93SMarek Sokolowski }
2724ac54d93SMarek Sokolowski
log(raw_ostream & OS) const273e241ce6fSMartin Storsjo raw_ostream &ClassStmt::log(raw_ostream &OS) const {
274e241ce6fSMartin Storsjo return OS << "Class: " << Value << "\n";
275e241ce6fSMartin Storsjo }
276e241ce6fSMartin Storsjo
log(raw_ostream & OS) const2774ac54d93SMarek Sokolowski raw_ostream &FontStmt::log(raw_ostream &OS) const {
278420090afSZachary Turner OS << "Font: size = " << Size << ", face = " << Name
279420090afSZachary Turner << ", weight = " << Weight;
280420090afSZachary Turner if (Italic)
281420090afSZachary Turner OS << ", italic";
282420090afSZachary Turner return OS << ", charset = " << Charset << "\n";
2834ac54d93SMarek Sokolowski }
2844ac54d93SMarek Sokolowski
log(raw_ostream & OS) const2854ac54d93SMarek Sokolowski raw_ostream &StyleStmt::log(raw_ostream &OS) const {
2864ac54d93SMarek Sokolowski return OS << "Style: " << Value << "\n";
2874ac54d93SMarek Sokolowski }
2884ac54d93SMarek Sokolowski
log(raw_ostream & OS) const289a876b5c0SMartin Storsjo raw_ostream &ExStyleStmt::log(raw_ostream &OS) const {
290a876b5c0SMartin Storsjo return OS << "ExStyle: " << Value << "\n";
291a876b5c0SMartin Storsjo }
292a876b5c0SMartin Storsjo
2935cd3d5c8SMarek Sokolowski } // namespace rc
2945cd3d5c8SMarek Sokolowski } // namespace llvm
295