109467b48Spatrick //
209467b48Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
309467b48Spatrick // See https://llvm.org/LICENSE.txt for license information.
409467b48Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
509467b48Spatrick //
609467b48Spatrick //===---------------------------------------------------------------------===//
709467b48Spatrick //
809467b48Spatrick // This implements methods defined in ResourceScriptStmt.h.
909467b48Spatrick //
1009467b48Spatrick // Ref: msdn.microsoft.com/en-us/library/windows/desktop/aa380599(v=vs.85).aspx
1109467b48Spatrick //
1209467b48Spatrick //===---------------------------------------------------------------------===//
1309467b48Spatrick
1409467b48Spatrick #include "ResourceScriptStmt.h"
1509467b48Spatrick
1609467b48Spatrick namespace llvm {
1709467b48Spatrick namespace rc {
1809467b48Spatrick
operator <<(raw_ostream & OS,const IntOrString & Item)1909467b48Spatrick raw_ostream &operator<<(raw_ostream &OS, const IntOrString &Item) {
2009467b48Spatrick if (Item.IsInt)
2109467b48Spatrick return OS << Item.Data.Int;
2209467b48Spatrick else
2309467b48Spatrick return OS << Item.Data.String;
2409467b48Spatrick }
2509467b48Spatrick
log(raw_ostream & OS) const2609467b48Spatrick raw_ostream &OptionalStmtList::log(raw_ostream &OS) const {
2709467b48Spatrick for (const auto &Stmt : Statements) {
2809467b48Spatrick OS << " Option: ";
2909467b48Spatrick Stmt->log(OS);
3009467b48Spatrick }
3109467b48Spatrick return OS;
3209467b48Spatrick }
3309467b48Spatrick
log(raw_ostream & OS) const3409467b48Spatrick raw_ostream &LanguageResource::log(raw_ostream &OS) const {
3509467b48Spatrick return OS << "Language: " << Lang << ", Sublanguage: " << SubLang << "\n";
3609467b48Spatrick }
3709467b48Spatrick
3809467b48Spatrick StringRef AcceleratorsResource::Accelerator::OptionsStr
3909467b48Spatrick [AcceleratorsResource::Accelerator::NumFlags] = {
4009467b48Spatrick "ASCII", "VIRTKEY", "NOINVERT", "ALT", "SHIFT", "CONTROL"};
4109467b48Spatrick
4209467b48Spatrick uint32_t AcceleratorsResource::Accelerator::OptionsFlags
4309467b48Spatrick [AcceleratorsResource::Accelerator::NumFlags] = {ASCII, VIRTKEY, NOINVERT,
4409467b48Spatrick ALT, SHIFT, CONTROL};
4509467b48Spatrick
log(raw_ostream & OS) const4609467b48Spatrick raw_ostream &AcceleratorsResource::log(raw_ostream &OS) const {
4709467b48Spatrick OS << "Accelerators (" << ResName << "): \n";
4809467b48Spatrick OptStatements->log(OS);
4909467b48Spatrick for (const auto &Acc : Accelerators) {
5009467b48Spatrick OS << " Accelerator: " << Acc.Event << " " << Acc.Id;
5109467b48Spatrick for (size_t i = 0; i < Accelerator::NumFlags; ++i)
5209467b48Spatrick if (Acc.Flags & Accelerator::OptionsFlags[i])
5309467b48Spatrick OS << " " << Accelerator::OptionsStr[i];
5409467b48Spatrick OS << "\n";
5509467b48Spatrick }
5609467b48Spatrick return OS;
5709467b48Spatrick }
5809467b48Spatrick
log(raw_ostream & OS) const5909467b48Spatrick raw_ostream &BitmapResource::log(raw_ostream &OS) const {
6009467b48Spatrick return OS << "Bitmap (" << ResName << "): " << BitmapLoc << "\n";
6109467b48Spatrick }
6209467b48Spatrick
log(raw_ostream & OS) const6309467b48Spatrick raw_ostream &CursorResource::log(raw_ostream &OS) const {
6409467b48Spatrick return OS << "Cursor (" << ResName << "): " << CursorLoc << "\n";
6509467b48Spatrick }
6609467b48Spatrick
log(raw_ostream & OS) const6709467b48Spatrick raw_ostream &IconResource::log(raw_ostream &OS) const {
6809467b48Spatrick return OS << "Icon (" << ResName << "): " << IconLoc << "\n";
6909467b48Spatrick }
7009467b48Spatrick
log(raw_ostream & OS) const7109467b48Spatrick raw_ostream &HTMLResource::log(raw_ostream &OS) const {
7209467b48Spatrick return OS << "HTML (" << ResName << "): " << HTMLLoc << "\n";
7309467b48Spatrick }
7409467b48Spatrick
7509467b48Spatrick StringRef MenuDefinition::OptionsStr[MenuDefinition::NumFlags] = {
7609467b48Spatrick "CHECKED", "GRAYED", "HELP", "INACTIVE", "MENUBARBREAK", "MENUBREAK"};
7709467b48Spatrick
7809467b48Spatrick uint32_t MenuDefinition::OptionsFlags[MenuDefinition::NumFlags] = {
7909467b48Spatrick CHECKED, GRAYED, HELP, INACTIVE, MENUBARBREAK, MENUBREAK};
8009467b48Spatrick
logFlags(raw_ostream & OS,uint16_t Flags)8109467b48Spatrick raw_ostream &MenuDefinition::logFlags(raw_ostream &OS, uint16_t Flags) {
8209467b48Spatrick for (size_t i = 0; i < NumFlags; ++i)
8309467b48Spatrick if (Flags & OptionsFlags[i])
8409467b48Spatrick OS << " " << OptionsStr[i];
8509467b48Spatrick return OS;
8609467b48Spatrick }
8709467b48Spatrick
log(raw_ostream & OS) const8809467b48Spatrick raw_ostream &MenuDefinitionList::log(raw_ostream &OS) const {
8909467b48Spatrick OS << " Menu list starts\n";
9009467b48Spatrick for (auto &Item : Definitions)
9109467b48Spatrick Item->log(OS);
9209467b48Spatrick return OS << " Menu list ends\n";
9309467b48Spatrick }
9409467b48Spatrick
log(raw_ostream & OS) const9509467b48Spatrick raw_ostream &MenuItem::log(raw_ostream &OS) const {
9609467b48Spatrick OS << " MenuItem (" << Name << "), ID = " << Id;
9709467b48Spatrick logFlags(OS, Flags);
9809467b48Spatrick return OS << "\n";
9909467b48Spatrick }
10009467b48Spatrick
log(raw_ostream & OS) const10109467b48Spatrick raw_ostream &MenuSeparator::log(raw_ostream &OS) const {
10209467b48Spatrick return OS << " Menu separator\n";
10309467b48Spatrick }
10409467b48Spatrick
log(raw_ostream & OS) const10509467b48Spatrick raw_ostream &PopupItem::log(raw_ostream &OS) const {
10609467b48Spatrick OS << " Popup (" << Name << ")";
10709467b48Spatrick logFlags(OS, Flags);
10809467b48Spatrick OS << ":\n";
10909467b48Spatrick return SubItems.log(OS);
11009467b48Spatrick }
11109467b48Spatrick
log(raw_ostream & OS) const11209467b48Spatrick raw_ostream &MenuResource::log(raw_ostream &OS) const {
11309467b48Spatrick OS << "Menu (" << ResName << "):\n";
11409467b48Spatrick OptStatements->log(OS);
11509467b48Spatrick return Elements.log(OS);
11609467b48Spatrick }
11709467b48Spatrick
log(raw_ostream & OS) const11809467b48Spatrick raw_ostream &StringTableResource::log(raw_ostream &OS) const {
11909467b48Spatrick OS << "StringTable:\n";
12009467b48Spatrick OptStatements->log(OS);
121*097a140dSpatrick for (const auto &String : Table) {
122*097a140dSpatrick OS << " " << String.first << " =>";
123*097a140dSpatrick for (const auto &S : String.second)
124*097a140dSpatrick OS << " " << S;
125*097a140dSpatrick OS << "\n";
126*097a140dSpatrick }
12709467b48Spatrick return OS;
12809467b48Spatrick }
12909467b48Spatrick
13009467b48Spatrick const StringMap<Control::CtlInfo> Control::SupportedCtls = {
13109467b48Spatrick {"LTEXT", CtlInfo{0x50020000, ClsStatic, true}},
13209467b48Spatrick {"CTEXT", CtlInfo{0x50020001, ClsStatic, true}},
13309467b48Spatrick {"RTEXT", CtlInfo{0x50020002, ClsStatic, true}},
13409467b48Spatrick {"ICON", CtlInfo{0x50000003, ClsStatic, true}},
13509467b48Spatrick {"PUSHBUTTON", CtlInfo{0x50010000, ClsButton, true}},
13609467b48Spatrick {"DEFPUSHBUTTON", CtlInfo{0x50010001, ClsButton, true}},
13709467b48Spatrick {"AUTO3STATE", CtlInfo{0x50010006, ClsButton, true}},
13809467b48Spatrick {"AUTOCHECKBOX", CtlInfo{0x50010003, ClsButton, true}},
13909467b48Spatrick {"AUTORADIOBUTTON", CtlInfo{0x50000009, ClsButton, true}},
14009467b48Spatrick {"CHECKBOX", CtlInfo{0x50010002, ClsButton, true}},
14109467b48Spatrick {"GROUPBOX", CtlInfo{0x50000007, ClsButton, true}},
14209467b48Spatrick {"RADIOBUTTON", CtlInfo{0x50000004, ClsButton, true}},
14309467b48Spatrick {"STATE3", CtlInfo{0x50010005, ClsButton, true}},
14409467b48Spatrick {"PUSHBOX", CtlInfo{0x5001000A, ClsButton, true}},
14509467b48Spatrick {"EDITTEXT", CtlInfo{0x50810000, ClsEdit, false}},
14609467b48Spatrick {"COMBOBOX", CtlInfo{0x50000000, ClsComboBox, false}},
14709467b48Spatrick {"LISTBOX", CtlInfo{0x50800001, ClsListBox, false}},
14809467b48Spatrick {"SCROLLBAR", CtlInfo{0x50000000, ClsScrollBar, false}},
14909467b48Spatrick {"CONTROL", CtlInfo{0x50000000, 0, true}},
15009467b48Spatrick };
15109467b48Spatrick
log(raw_ostream & OS) const15209467b48Spatrick raw_ostream &Control::log(raw_ostream &OS) const {
15309467b48Spatrick OS << " Control (" << ID << "): " << Type << ", title: " << Title
15409467b48Spatrick << ", loc: (" << X << ", " << Y << "), size: [" << Width << ", " << Height
15509467b48Spatrick << "]";
15609467b48Spatrick if (Style)
15709467b48Spatrick OS << ", style: " << (*Style).getValue();
15809467b48Spatrick if (ExtStyle)
15909467b48Spatrick OS << ", ext. style: " << *ExtStyle;
16009467b48Spatrick if (HelpID)
16109467b48Spatrick OS << ", help ID: " << *HelpID;
16209467b48Spatrick return OS << "\n";
16309467b48Spatrick }
16409467b48Spatrick
log(raw_ostream & OS) const16509467b48Spatrick raw_ostream &DialogResource::log(raw_ostream &OS) const {
16609467b48Spatrick OS << "Dialog" << (IsExtended ? "Ex" : "") << " (" << ResName << "): loc: ("
16709467b48Spatrick << X << ", " << Y << "), size: [" << Width << ", " << Height
16809467b48Spatrick << "], help ID: " << HelpID << "\n";
16909467b48Spatrick OptStatements->log(OS);
17009467b48Spatrick for (auto &Ctl : Controls)
17109467b48Spatrick Ctl.log(OS);
17209467b48Spatrick return OS;
17309467b48Spatrick }
17409467b48Spatrick
log(raw_ostream & OS) const17509467b48Spatrick raw_ostream &VersionInfoBlock::log(raw_ostream &OS) const {
17609467b48Spatrick OS << " Start of block (name: " << Name << ")\n";
17709467b48Spatrick for (auto &Stmt : Stmts)
17809467b48Spatrick Stmt->log(OS);
17909467b48Spatrick return OS << " End of block\n";
18009467b48Spatrick }
18109467b48Spatrick
log(raw_ostream & OS) const18209467b48Spatrick raw_ostream &VersionInfoValue::log(raw_ostream &OS) const {
18309467b48Spatrick OS << " " << Key << " =>";
18409467b48Spatrick size_t NumValues = Values.size();
18509467b48Spatrick for (size_t Id = 0; Id < NumValues; ++Id) {
18609467b48Spatrick if (Id > 0 && HasPrecedingComma[Id])
18709467b48Spatrick OS << ",";
18809467b48Spatrick OS << " " << Values[Id];
18909467b48Spatrick }
19009467b48Spatrick return OS << "\n";
19109467b48Spatrick }
19209467b48Spatrick
19309467b48Spatrick using VersionInfoFixed = VersionInfoResource::VersionInfoFixed;
19409467b48Spatrick using VersionInfoFixedType = VersionInfoFixed::VersionInfoFixedType;
19509467b48Spatrick
19609467b48Spatrick const StringRef
19709467b48Spatrick VersionInfoFixed::FixedFieldsNames[VersionInfoFixed::FtNumTypes] = {
19809467b48Spatrick "", "FILEVERSION", "PRODUCTVERSION", "FILEFLAGSMASK",
19909467b48Spatrick "FILEFLAGS", "FILEOS", "FILETYPE", "FILESUBTYPE"};
20009467b48Spatrick
20109467b48Spatrick const StringMap<VersionInfoFixedType> VersionInfoFixed::FixedFieldsInfoMap = {
20209467b48Spatrick {FixedFieldsNames[FtFileVersion], FtFileVersion},
20309467b48Spatrick {FixedFieldsNames[FtProductVersion], FtProductVersion},
20409467b48Spatrick {FixedFieldsNames[FtFileFlagsMask], FtFileFlagsMask},
20509467b48Spatrick {FixedFieldsNames[FtFileFlags], FtFileFlags},
20609467b48Spatrick {FixedFieldsNames[FtFileOS], FtFileOS},
20709467b48Spatrick {FixedFieldsNames[FtFileType], FtFileType},
20809467b48Spatrick {FixedFieldsNames[FtFileSubtype], FtFileSubtype}};
20909467b48Spatrick
getFixedType(StringRef Type)21009467b48Spatrick VersionInfoFixedType VersionInfoFixed::getFixedType(StringRef Type) {
21109467b48Spatrick auto UpperType = Type.upper();
21209467b48Spatrick auto Iter = FixedFieldsInfoMap.find(UpperType);
21309467b48Spatrick if (Iter != FixedFieldsInfoMap.end())
21409467b48Spatrick return Iter->getValue();
21509467b48Spatrick return FtUnknown;
21609467b48Spatrick }
21709467b48Spatrick
isTypeSupported(VersionInfoFixedType Type)21809467b48Spatrick bool VersionInfoFixed::isTypeSupported(VersionInfoFixedType Type) {
21909467b48Spatrick return FtUnknown < Type && Type < FtNumTypes;
22009467b48Spatrick }
22109467b48Spatrick
isVersionType(VersionInfoFixedType Type)22209467b48Spatrick bool VersionInfoFixed::isVersionType(VersionInfoFixedType Type) {
22309467b48Spatrick switch (Type) {
22409467b48Spatrick case FtFileVersion:
22509467b48Spatrick case FtProductVersion:
22609467b48Spatrick return true;
22709467b48Spatrick
22809467b48Spatrick default:
22909467b48Spatrick return false;
23009467b48Spatrick }
23109467b48Spatrick }
23209467b48Spatrick
log(raw_ostream & OS) const23309467b48Spatrick raw_ostream &VersionInfoFixed::log(raw_ostream &OS) const {
23409467b48Spatrick for (int Type = FtUnknown; Type < FtNumTypes; ++Type) {
23509467b48Spatrick if (!isTypeSupported((VersionInfoFixedType)Type))
23609467b48Spatrick continue;
23709467b48Spatrick OS << " Fixed: " << FixedFieldsNames[Type] << ":";
23809467b48Spatrick for (uint32_t Val : FixedInfo[Type])
23909467b48Spatrick OS << " " << Val;
24009467b48Spatrick OS << "\n";
24109467b48Spatrick }
24209467b48Spatrick return OS;
24309467b48Spatrick }
24409467b48Spatrick
log(raw_ostream & OS) const24509467b48Spatrick raw_ostream &VersionInfoResource::log(raw_ostream &OS) const {
24609467b48Spatrick OS << "VersionInfo (" << ResName << "):\n";
24709467b48Spatrick FixedData.log(OS);
24809467b48Spatrick return MainBlock.log(OS);
24909467b48Spatrick }
25009467b48Spatrick
log(raw_ostream & OS) const25109467b48Spatrick raw_ostream &UserDefinedResource::log(raw_ostream &OS) const {
25209467b48Spatrick OS << "User-defined (type: " << Type << ", name: " << ResName << "): ";
25309467b48Spatrick if (IsFileResource)
25409467b48Spatrick return OS << FileLoc << "\n";
25509467b48Spatrick OS << "data = ";
25609467b48Spatrick for (auto &Item : Contents)
25709467b48Spatrick OS << Item << " ";
25809467b48Spatrick return OS << "\n";
25909467b48Spatrick }
26009467b48Spatrick
log(raw_ostream & OS) const26109467b48Spatrick raw_ostream &CharacteristicsStmt::log(raw_ostream &OS) const {
26209467b48Spatrick return OS << "Characteristics: " << Value << "\n";
26309467b48Spatrick }
26409467b48Spatrick
log(raw_ostream & OS) const26509467b48Spatrick raw_ostream &VersionStmt::log(raw_ostream &OS) const {
26609467b48Spatrick return OS << "Version: " << Value << "\n";
26709467b48Spatrick }
26809467b48Spatrick
log(raw_ostream & OS) const26909467b48Spatrick raw_ostream &CaptionStmt::log(raw_ostream &OS) const {
27009467b48Spatrick return OS << "Caption: " << Value << "\n";
27109467b48Spatrick }
27209467b48Spatrick
log(raw_ostream & OS) const27309467b48Spatrick raw_ostream &ClassStmt::log(raw_ostream &OS) const {
27409467b48Spatrick return OS << "Class: " << Value << "\n";
27509467b48Spatrick }
27609467b48Spatrick
log(raw_ostream & OS) const27709467b48Spatrick raw_ostream &FontStmt::log(raw_ostream &OS) const {
27809467b48Spatrick OS << "Font: size = " << Size << ", face = " << Name
27909467b48Spatrick << ", weight = " << Weight;
28009467b48Spatrick if (Italic)
28109467b48Spatrick OS << ", italic";
28209467b48Spatrick return OS << ", charset = " << Charset << "\n";
28309467b48Spatrick }
28409467b48Spatrick
log(raw_ostream & OS) const28509467b48Spatrick raw_ostream &StyleStmt::log(raw_ostream &OS) const {
28609467b48Spatrick return OS << "Style: " << Value << "\n";
28709467b48Spatrick }
28809467b48Spatrick
log(raw_ostream & OS) const28909467b48Spatrick raw_ostream &ExStyleStmt::log(raw_ostream &OS) const {
29009467b48Spatrick return OS << "ExStyle: " << Value << "\n";
29109467b48Spatrick }
29209467b48Spatrick
29309467b48Spatrick } // namespace rc
29409467b48Spatrick } // namespace llvm
295