xref: /openbsd-src/gnu/llvm/llvm/tools/llvm-rc/ResourceScriptStmt.cpp (revision 09467b48e8bc8b4905716062da846024139afbf2)
1*09467b48Spatrick //
2*09467b48Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
3*09467b48Spatrick // See https://llvm.org/LICENSE.txt for license information.
4*09467b48Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
5*09467b48Spatrick //
6*09467b48Spatrick //===---------------------------------------------------------------------===//
7*09467b48Spatrick //
8*09467b48Spatrick // This implements methods defined in ResourceScriptStmt.h.
9*09467b48Spatrick //
10*09467b48Spatrick // Ref: msdn.microsoft.com/en-us/library/windows/desktop/aa380599(v=vs.85).aspx
11*09467b48Spatrick //
12*09467b48Spatrick //===---------------------------------------------------------------------===//
13*09467b48Spatrick 
14*09467b48Spatrick #include "ResourceScriptStmt.h"
15*09467b48Spatrick 
16*09467b48Spatrick namespace llvm {
17*09467b48Spatrick namespace rc {
18*09467b48Spatrick 
19*09467b48Spatrick raw_ostream &operator<<(raw_ostream &OS, const IntOrString &Item) {
20*09467b48Spatrick   if (Item.IsInt)
21*09467b48Spatrick     return OS << Item.Data.Int;
22*09467b48Spatrick   else
23*09467b48Spatrick     return OS << Item.Data.String;
24*09467b48Spatrick }
25*09467b48Spatrick 
26*09467b48Spatrick raw_ostream &OptionalStmtList::log(raw_ostream &OS) const {
27*09467b48Spatrick   for (const auto &Stmt : Statements) {
28*09467b48Spatrick     OS << "  Option: ";
29*09467b48Spatrick     Stmt->log(OS);
30*09467b48Spatrick   }
31*09467b48Spatrick   return OS;
32*09467b48Spatrick }
33*09467b48Spatrick 
34*09467b48Spatrick raw_ostream &LanguageResource::log(raw_ostream &OS) const {
35*09467b48Spatrick   return OS << "Language: " << Lang << ", Sublanguage: " << SubLang << "\n";
36*09467b48Spatrick }
37*09467b48Spatrick 
38*09467b48Spatrick StringRef AcceleratorsResource::Accelerator::OptionsStr
39*09467b48Spatrick     [AcceleratorsResource::Accelerator::NumFlags] = {
40*09467b48Spatrick         "ASCII", "VIRTKEY", "NOINVERT", "ALT", "SHIFT", "CONTROL"};
41*09467b48Spatrick 
42*09467b48Spatrick uint32_t AcceleratorsResource::Accelerator::OptionsFlags
43*09467b48Spatrick     [AcceleratorsResource::Accelerator::NumFlags] = {ASCII, VIRTKEY, NOINVERT,
44*09467b48Spatrick                                                      ALT,   SHIFT,   CONTROL};
45*09467b48Spatrick 
46*09467b48Spatrick raw_ostream &AcceleratorsResource::log(raw_ostream &OS) const {
47*09467b48Spatrick   OS << "Accelerators (" << ResName << "): \n";
48*09467b48Spatrick   OptStatements->log(OS);
49*09467b48Spatrick   for (const auto &Acc : Accelerators) {
50*09467b48Spatrick     OS << "  Accelerator: " << Acc.Event << " " << Acc.Id;
51*09467b48Spatrick     for (size_t i = 0; i < Accelerator::NumFlags; ++i)
52*09467b48Spatrick       if (Acc.Flags & Accelerator::OptionsFlags[i])
53*09467b48Spatrick         OS << " " << Accelerator::OptionsStr[i];
54*09467b48Spatrick     OS << "\n";
55*09467b48Spatrick   }
56*09467b48Spatrick   return OS;
57*09467b48Spatrick }
58*09467b48Spatrick 
59*09467b48Spatrick raw_ostream &BitmapResource::log(raw_ostream &OS) const {
60*09467b48Spatrick   return OS << "Bitmap (" << ResName << "): " << BitmapLoc << "\n";
61*09467b48Spatrick }
62*09467b48Spatrick 
63*09467b48Spatrick raw_ostream &CursorResource::log(raw_ostream &OS) const {
64*09467b48Spatrick   return OS << "Cursor (" << ResName << "): " << CursorLoc << "\n";
65*09467b48Spatrick }
66*09467b48Spatrick 
67*09467b48Spatrick raw_ostream &IconResource::log(raw_ostream &OS) const {
68*09467b48Spatrick   return OS << "Icon (" << ResName << "): " << IconLoc << "\n";
69*09467b48Spatrick }
70*09467b48Spatrick 
71*09467b48Spatrick raw_ostream &HTMLResource::log(raw_ostream &OS) const {
72*09467b48Spatrick   return OS << "HTML (" << ResName << "): " << HTMLLoc << "\n";
73*09467b48Spatrick }
74*09467b48Spatrick 
75*09467b48Spatrick StringRef MenuDefinition::OptionsStr[MenuDefinition::NumFlags] = {
76*09467b48Spatrick     "CHECKED", "GRAYED", "HELP", "INACTIVE", "MENUBARBREAK", "MENUBREAK"};
77*09467b48Spatrick 
78*09467b48Spatrick uint32_t MenuDefinition::OptionsFlags[MenuDefinition::NumFlags] = {
79*09467b48Spatrick     CHECKED, GRAYED, HELP, INACTIVE, MENUBARBREAK, MENUBREAK};
80*09467b48Spatrick 
81*09467b48Spatrick raw_ostream &MenuDefinition::logFlags(raw_ostream &OS, uint16_t Flags) {
82*09467b48Spatrick   for (size_t i = 0; i < NumFlags; ++i)
83*09467b48Spatrick     if (Flags & OptionsFlags[i])
84*09467b48Spatrick       OS << " " << OptionsStr[i];
85*09467b48Spatrick   return OS;
86*09467b48Spatrick }
87*09467b48Spatrick 
88*09467b48Spatrick raw_ostream &MenuDefinitionList::log(raw_ostream &OS) const {
89*09467b48Spatrick   OS << "  Menu list starts\n";
90*09467b48Spatrick   for (auto &Item : Definitions)
91*09467b48Spatrick     Item->log(OS);
92*09467b48Spatrick   return OS << "  Menu list ends\n";
93*09467b48Spatrick }
94*09467b48Spatrick 
95*09467b48Spatrick raw_ostream &MenuItem::log(raw_ostream &OS) const {
96*09467b48Spatrick   OS << "  MenuItem (" << Name << "), ID = " << Id;
97*09467b48Spatrick   logFlags(OS, Flags);
98*09467b48Spatrick   return OS << "\n";
99*09467b48Spatrick }
100*09467b48Spatrick 
101*09467b48Spatrick raw_ostream &MenuSeparator::log(raw_ostream &OS) const {
102*09467b48Spatrick   return OS << "  Menu separator\n";
103*09467b48Spatrick }
104*09467b48Spatrick 
105*09467b48Spatrick raw_ostream &PopupItem::log(raw_ostream &OS) const {
106*09467b48Spatrick   OS << "  Popup (" << Name << ")";
107*09467b48Spatrick   logFlags(OS, Flags);
108*09467b48Spatrick   OS << ":\n";
109*09467b48Spatrick   return SubItems.log(OS);
110*09467b48Spatrick }
111*09467b48Spatrick 
112*09467b48Spatrick raw_ostream &MenuResource::log(raw_ostream &OS) const {
113*09467b48Spatrick   OS << "Menu (" << ResName << "):\n";
114*09467b48Spatrick   OptStatements->log(OS);
115*09467b48Spatrick   return Elements.log(OS);
116*09467b48Spatrick }
117*09467b48Spatrick 
118*09467b48Spatrick raw_ostream &StringTableResource::log(raw_ostream &OS) const {
119*09467b48Spatrick   OS << "StringTable:\n";
120*09467b48Spatrick   OptStatements->log(OS);
121*09467b48Spatrick   for (const auto &String : Table)
122*09467b48Spatrick     OS << "  " << String.first << " => " << String.second << "\n";
123*09467b48Spatrick   return OS;
124*09467b48Spatrick }
125*09467b48Spatrick 
126*09467b48Spatrick const StringMap<Control::CtlInfo> Control::SupportedCtls = {
127*09467b48Spatrick     {"LTEXT", CtlInfo{0x50020000, ClsStatic, true}},
128*09467b48Spatrick     {"CTEXT", CtlInfo{0x50020001, ClsStatic, true}},
129*09467b48Spatrick     {"RTEXT", CtlInfo{0x50020002, ClsStatic, true}},
130*09467b48Spatrick     {"ICON", CtlInfo{0x50000003, ClsStatic, true}},
131*09467b48Spatrick     {"PUSHBUTTON", CtlInfo{0x50010000, ClsButton, true}},
132*09467b48Spatrick     {"DEFPUSHBUTTON", CtlInfo{0x50010001, ClsButton, true}},
133*09467b48Spatrick     {"AUTO3STATE", CtlInfo{0x50010006, ClsButton, true}},
134*09467b48Spatrick     {"AUTOCHECKBOX", CtlInfo{0x50010003, ClsButton, true}},
135*09467b48Spatrick     {"AUTORADIOBUTTON", CtlInfo{0x50000009, ClsButton, true}},
136*09467b48Spatrick     {"CHECKBOX", CtlInfo{0x50010002, ClsButton, true}},
137*09467b48Spatrick     {"GROUPBOX", CtlInfo{0x50000007, ClsButton, true}},
138*09467b48Spatrick     {"RADIOBUTTON", CtlInfo{0x50000004, ClsButton, true}},
139*09467b48Spatrick     {"STATE3", CtlInfo{0x50010005, ClsButton, true}},
140*09467b48Spatrick     {"PUSHBOX", CtlInfo{0x5001000A, ClsButton, true}},
141*09467b48Spatrick     {"EDITTEXT", CtlInfo{0x50810000, ClsEdit, false}},
142*09467b48Spatrick     {"COMBOBOX", CtlInfo{0x50000000, ClsComboBox, false}},
143*09467b48Spatrick     {"LISTBOX", CtlInfo{0x50800001, ClsListBox, false}},
144*09467b48Spatrick     {"SCROLLBAR", CtlInfo{0x50000000, ClsScrollBar, false}},
145*09467b48Spatrick     {"CONTROL", CtlInfo{0x50000000, 0, true}},
146*09467b48Spatrick };
147*09467b48Spatrick 
148*09467b48Spatrick raw_ostream &Control::log(raw_ostream &OS) const {
149*09467b48Spatrick   OS << "  Control (" << ID << "): " << Type << ", title: " << Title
150*09467b48Spatrick      << ", loc: (" << X << ", " << Y << "), size: [" << Width << ", " << Height
151*09467b48Spatrick      << "]";
152*09467b48Spatrick   if (Style)
153*09467b48Spatrick     OS << ", style: " << (*Style).getValue();
154*09467b48Spatrick   if (ExtStyle)
155*09467b48Spatrick     OS << ", ext. style: " << *ExtStyle;
156*09467b48Spatrick   if (HelpID)
157*09467b48Spatrick     OS << ", help ID: " << *HelpID;
158*09467b48Spatrick   return OS << "\n";
159*09467b48Spatrick }
160*09467b48Spatrick 
161*09467b48Spatrick raw_ostream &DialogResource::log(raw_ostream &OS) const {
162*09467b48Spatrick   OS << "Dialog" << (IsExtended ? "Ex" : "") << " (" << ResName << "): loc: ("
163*09467b48Spatrick      << X << ", " << Y << "), size: [" << Width << ", " << Height
164*09467b48Spatrick      << "], help ID: " << HelpID << "\n";
165*09467b48Spatrick   OptStatements->log(OS);
166*09467b48Spatrick   for (auto &Ctl : Controls)
167*09467b48Spatrick     Ctl.log(OS);
168*09467b48Spatrick   return OS;
169*09467b48Spatrick }
170*09467b48Spatrick 
171*09467b48Spatrick raw_ostream &VersionInfoBlock::log(raw_ostream &OS) const {
172*09467b48Spatrick   OS << "  Start of block (name: " << Name << ")\n";
173*09467b48Spatrick   for (auto &Stmt : Stmts)
174*09467b48Spatrick     Stmt->log(OS);
175*09467b48Spatrick   return OS << "  End of block\n";
176*09467b48Spatrick }
177*09467b48Spatrick 
178*09467b48Spatrick raw_ostream &VersionInfoValue::log(raw_ostream &OS) const {
179*09467b48Spatrick   OS << "  " << Key << " =>";
180*09467b48Spatrick   size_t NumValues = Values.size();
181*09467b48Spatrick   for (size_t Id = 0; Id < NumValues; ++Id) {
182*09467b48Spatrick     if (Id > 0 && HasPrecedingComma[Id])
183*09467b48Spatrick       OS << ",";
184*09467b48Spatrick     OS << " " << Values[Id];
185*09467b48Spatrick   }
186*09467b48Spatrick   return OS << "\n";
187*09467b48Spatrick }
188*09467b48Spatrick 
189*09467b48Spatrick using VersionInfoFixed = VersionInfoResource::VersionInfoFixed;
190*09467b48Spatrick using VersionInfoFixedType = VersionInfoFixed::VersionInfoFixedType;
191*09467b48Spatrick 
192*09467b48Spatrick const StringRef
193*09467b48Spatrick     VersionInfoFixed::FixedFieldsNames[VersionInfoFixed::FtNumTypes] = {
194*09467b48Spatrick         "",          "FILEVERSION", "PRODUCTVERSION", "FILEFLAGSMASK",
195*09467b48Spatrick         "FILEFLAGS", "FILEOS",      "FILETYPE",       "FILESUBTYPE"};
196*09467b48Spatrick 
197*09467b48Spatrick const StringMap<VersionInfoFixedType> VersionInfoFixed::FixedFieldsInfoMap = {
198*09467b48Spatrick     {FixedFieldsNames[FtFileVersion], FtFileVersion},
199*09467b48Spatrick     {FixedFieldsNames[FtProductVersion], FtProductVersion},
200*09467b48Spatrick     {FixedFieldsNames[FtFileFlagsMask], FtFileFlagsMask},
201*09467b48Spatrick     {FixedFieldsNames[FtFileFlags], FtFileFlags},
202*09467b48Spatrick     {FixedFieldsNames[FtFileOS], FtFileOS},
203*09467b48Spatrick     {FixedFieldsNames[FtFileType], FtFileType},
204*09467b48Spatrick     {FixedFieldsNames[FtFileSubtype], FtFileSubtype}};
205*09467b48Spatrick 
206*09467b48Spatrick VersionInfoFixedType VersionInfoFixed::getFixedType(StringRef Type) {
207*09467b48Spatrick   auto UpperType = Type.upper();
208*09467b48Spatrick   auto Iter = FixedFieldsInfoMap.find(UpperType);
209*09467b48Spatrick   if (Iter != FixedFieldsInfoMap.end())
210*09467b48Spatrick     return Iter->getValue();
211*09467b48Spatrick   return FtUnknown;
212*09467b48Spatrick }
213*09467b48Spatrick 
214*09467b48Spatrick bool VersionInfoFixed::isTypeSupported(VersionInfoFixedType Type) {
215*09467b48Spatrick   return FtUnknown < Type && Type < FtNumTypes;
216*09467b48Spatrick }
217*09467b48Spatrick 
218*09467b48Spatrick bool VersionInfoFixed::isVersionType(VersionInfoFixedType Type) {
219*09467b48Spatrick   switch (Type) {
220*09467b48Spatrick   case FtFileVersion:
221*09467b48Spatrick   case FtProductVersion:
222*09467b48Spatrick     return true;
223*09467b48Spatrick 
224*09467b48Spatrick   default:
225*09467b48Spatrick     return false;
226*09467b48Spatrick   }
227*09467b48Spatrick }
228*09467b48Spatrick 
229*09467b48Spatrick raw_ostream &VersionInfoFixed::log(raw_ostream &OS) const {
230*09467b48Spatrick   for (int Type = FtUnknown; Type < FtNumTypes; ++Type) {
231*09467b48Spatrick     if (!isTypeSupported((VersionInfoFixedType)Type))
232*09467b48Spatrick       continue;
233*09467b48Spatrick     OS << "  Fixed: " << FixedFieldsNames[Type] << ":";
234*09467b48Spatrick     for (uint32_t Val : FixedInfo[Type])
235*09467b48Spatrick       OS << " " << Val;
236*09467b48Spatrick     OS << "\n";
237*09467b48Spatrick   }
238*09467b48Spatrick   return OS;
239*09467b48Spatrick }
240*09467b48Spatrick 
241*09467b48Spatrick raw_ostream &VersionInfoResource::log(raw_ostream &OS) const {
242*09467b48Spatrick   OS << "VersionInfo (" << ResName << "):\n";
243*09467b48Spatrick   FixedData.log(OS);
244*09467b48Spatrick   return MainBlock.log(OS);
245*09467b48Spatrick }
246*09467b48Spatrick 
247*09467b48Spatrick raw_ostream &UserDefinedResource::log(raw_ostream &OS) const {
248*09467b48Spatrick   OS << "User-defined (type: " << Type << ", name: " << ResName << "): ";
249*09467b48Spatrick   if (IsFileResource)
250*09467b48Spatrick     return OS << FileLoc << "\n";
251*09467b48Spatrick   OS << "data = ";
252*09467b48Spatrick   for (auto &Item : Contents)
253*09467b48Spatrick     OS << Item << " ";
254*09467b48Spatrick   return OS << "\n";
255*09467b48Spatrick }
256*09467b48Spatrick 
257*09467b48Spatrick raw_ostream &CharacteristicsStmt::log(raw_ostream &OS) const {
258*09467b48Spatrick   return OS << "Characteristics: " << Value << "\n";
259*09467b48Spatrick }
260*09467b48Spatrick 
261*09467b48Spatrick raw_ostream &VersionStmt::log(raw_ostream &OS) const {
262*09467b48Spatrick   return OS << "Version: " << Value << "\n";
263*09467b48Spatrick }
264*09467b48Spatrick 
265*09467b48Spatrick raw_ostream &CaptionStmt::log(raw_ostream &OS) const {
266*09467b48Spatrick   return OS << "Caption: " << Value << "\n";
267*09467b48Spatrick }
268*09467b48Spatrick 
269*09467b48Spatrick raw_ostream &ClassStmt::log(raw_ostream &OS) const {
270*09467b48Spatrick   return OS << "Class: " << Value << "\n";
271*09467b48Spatrick }
272*09467b48Spatrick 
273*09467b48Spatrick raw_ostream &FontStmt::log(raw_ostream &OS) const {
274*09467b48Spatrick   OS << "Font: size = " << Size << ", face = " << Name
275*09467b48Spatrick      << ", weight = " << Weight;
276*09467b48Spatrick   if (Italic)
277*09467b48Spatrick     OS << ", italic";
278*09467b48Spatrick   return OS << ", charset = " << Charset << "\n";
279*09467b48Spatrick }
280*09467b48Spatrick 
281*09467b48Spatrick raw_ostream &StyleStmt::log(raw_ostream &OS) const {
282*09467b48Spatrick   return OS << "Style: " << Value << "\n";
283*09467b48Spatrick }
284*09467b48Spatrick 
285*09467b48Spatrick raw_ostream &ExStyleStmt::log(raw_ostream &OS) const {
286*09467b48Spatrick   return OS << "ExStyle: " << Value << "\n";
287*09467b48Spatrick }
288*09467b48Spatrick 
289*09467b48Spatrick } // namespace rc
290*09467b48Spatrick } // namespace llvm
291