1 //
2 //                     The LLVM Compiler Infrastructure
3 //
4 // This file is distributed under the University of Illinois Open Source
5 // License. See LICENSE.TXT for details.
6 //
7 //===---------------------------------------------------------------------===//
8 //
9 // This implements methods defined in ResourceScriptStmt.h.
10 //
11 // Ref: msdn.microsoft.com/en-us/library/windows/desktop/aa380599(v=vs.85).aspx
12 //
13 //===---------------------------------------------------------------------===//
14 
15 #include "ResourceScriptStmt.h"
16 
17 namespace llvm {
18 namespace rc {
19 
20 raw_ostream &operator<<(raw_ostream &OS, const IntOrString &Item) {
21   if (Item.IsInt)
22     return OS << Item.Data.Int;
23   else
24     return OS << Item.Data.String;
25 }
26 
27 raw_ostream &OptionalStmtList::log(raw_ostream &OS) const {
28   for (const auto &Stmt : Statements) {
29     OS << "  Option: ";
30     Stmt->log(OS);
31   }
32   return OS;
33 }
34 
35 raw_ostream &LanguageResource::log(raw_ostream &OS) const {
36   return OS << "Language: " << Lang << ", Sublanguage: " << SubLang << "\n";
37 }
38 
39 StringRef AcceleratorsResource::Accelerator::OptionsStr
40     [AcceleratorsResource::Accelerator::NumFlags] = {
41         "ASCII", "VIRTKEY", "NOINVERT", "ALT", "SHIFT", "CONTROL"};
42 
43 raw_ostream &AcceleratorsResource::log(raw_ostream &OS) const {
44   OS << "Accelerators (" << ResName << "): \n";
45   OptStatements.log(OS);
46   for (const auto &Acc : Accelerators) {
47     OS << "  Accelerator: " << Acc.Event << " " << Acc.Id;
48     for (size_t i = 0; i < Accelerator::NumFlags; ++i)
49       if (Acc.Flags & (1U << i))
50         OS << " " << Accelerator::OptionsStr[i];
51     OS << "\n";
52   }
53   return OS;
54 }
55 
56 raw_ostream &CursorResource::log(raw_ostream &OS) const {
57   return OS << "Cursor (" << ResName << "): " << CursorLoc << "\n";
58 }
59 
60 raw_ostream &IconResource::log(raw_ostream &OS) const {
61   return OS << "Icon (" << ResName << "): " << IconLoc << "\n";
62 }
63 
64 raw_ostream &HTMLResource::log(raw_ostream &OS) const {
65   return OS << "HTML (" << ResName << "): " << HTMLLoc << "\n";
66 }
67 
68 StringRef MenuDefinition::OptionsStr[MenuDefinition::NumFlags] = {
69     "CHECKED", "GRAYED", "HELP", "INACTIVE", "MENUBARBREAK", "MENUBREAK"};
70 
71 raw_ostream &MenuDefinition::logFlags(raw_ostream &OS, uint8_t Flags) {
72   for (size_t i = 0; i < NumFlags; ++i)
73     if (Flags & (1U << i))
74       OS << " " << OptionsStr[i];
75   return OS;
76 }
77 
78 raw_ostream &MenuDefinitionList::log(raw_ostream &OS) const {
79   OS << "  Menu list starts\n";
80   for (auto &Item : Definitions)
81     Item->log(OS);
82   return OS << "  Menu list ends\n";
83 }
84 
85 raw_ostream &MenuItem::log(raw_ostream &OS) const {
86   OS << "  MenuItem (" << Name << "), ID = " << Id;
87   logFlags(OS, Flags);
88   return OS << "\n";
89 }
90 
91 raw_ostream &MenuSeparator::log(raw_ostream &OS) const {
92   return OS << "  Menu separator\n";
93 }
94 
95 raw_ostream &PopupItem::log(raw_ostream &OS) const {
96   OS << "  Popup (" << Name << ")";
97   logFlags(OS, Flags);
98   OS << ":\n";
99   return SubItems.log(OS);
100 }
101 
102 raw_ostream &MenuResource::log(raw_ostream &OS) const {
103   OS << "Menu (" << ResName << "):\n";
104   OptStatements.log(OS);
105   return Elements.log(OS);
106 }
107 
108 raw_ostream &StringTableResource::log(raw_ostream &OS) const {
109   OS << "StringTable:\n";
110   OptStatements.log(OS);
111   for (const auto &String : Table)
112     OS << "  " << String.first << " => " << String.second << "\n";
113   return OS;
114 }
115 
116 raw_ostream &CharacteristicsStmt::log(raw_ostream &OS) const {
117   return OS << "Characteristics: " << Value << "\n";
118 }
119 
120 raw_ostream &VersionStmt::log(raw_ostream &OS) const {
121   return OS << "Version: " << Value << "\n";
122 }
123 
124 } // namespace rc
125 } // namespace llvm
126