Absolute File Name: | /home/qt/qt5_coco/qt5/qtbase/src/corelib/mimetypes/qmimetypeparser.cpp |
Switch to Source code | Preprocessed file |
Line | Source | Count | ||||||
---|---|---|---|---|---|---|---|---|
1 | - | |||||||
2 | - | |||||||
3 | - | |||||||
4 | - | |||||||
5 | - | |||||||
6 | - | |||||||
7 | - | |||||||
8 | - | |||||||
9 | - | |||||||
10 | static const char mimeInfoTagC[] = "mime-info"; | - | ||||||
11 | static const char mimeTypeTagC[] = "mime-type"; | - | ||||||
12 | static const char mimeTypeAttributeC[] = "type"; | - | ||||||
13 | static const char subClassTagC[] = "sub-class-of"; | - | ||||||
14 | static const char commentTagC[] = "comment"; | - | ||||||
15 | static const char genericIconTagC[] = "generic-icon"; | - | ||||||
16 | static const char iconTagC[] = "icon"; | - | ||||||
17 | static const char nameAttributeC[] = "name"; | - | ||||||
18 | static const char globTagC[] = "glob"; | - | ||||||
19 | static const char aliasTagC[] = "alias"; | - | ||||||
20 | static const char patternAttributeC[] = "pattern"; | - | ||||||
21 | static const char weightAttributeC[] = "weight"; | - | ||||||
22 | static const char caseSensitiveAttributeC[] = "case-sensitive"; | - | ||||||
23 | static const char localeAttributeC[] = "xml:lang"; | - | ||||||
24 | - | |||||||
25 | static const char magicTagC[] = "magic"; | - | ||||||
26 | static const char priorityAttributeC[] = "priority"; | - | ||||||
27 | - | |||||||
28 | static const char matchTagC[] = "match"; | - | ||||||
29 | static const char matchValueAttributeC[] = "value"; | - | ||||||
30 | static const char matchTypeAttributeC[] = "type"; | - | ||||||
31 | static const char matchOffsetAttributeC[] = "offset"; | - | ||||||
32 | static const char matchMaskAttributeC[] = "mask"; | - | ||||||
33 | QMimeTypeParserBase::ParseState QMimeTypeParserBase::nextState(ParseState currentState, const QStringRef &startElement) | - | ||||||
34 | { | - | ||||||
35 | switch (currentState) { | - | ||||||
36 | case executed 17 times by 1 test: ParseBeginning:case ParseBeginning: Executed by:
executed 17 times by 1 test: case ParseBeginning: Executed by:
| 17 | ||||||
37 | if (startElement == QLatin1String(mimeInfoTagC)
| 0-17 | ||||||
38 | return executed 17 times by 1 test: ParseMimeInfo;return ParseMimeInfo; Executed by:
executed 17 times by 1 test: return ParseMimeInfo; Executed by:
| 17 | ||||||
39 | if (startElement == QLatin1String(mimeTypeTagC)
| 0 | ||||||
40 | return never executed: ParseMimeType;return ParseMimeType; never executed: return ParseMimeType; | 0 | ||||||
41 | return never executed: ParseError;return ParseError; never executed: return ParseError; | 0 | ||||||
42 | case executed 17 times by 1 test: ParseMimeInfo:case ParseMimeInfo: Executed by:
executed 17 times by 1 test: case ParseMimeInfo: Executed by:
| 17 | ||||||
43 | return executed 17 times by 1 test: startElement == QLatin1String(mimeTypeTagC) ? ParseMimeType : ParseError;return startElement == QLatin1String(mimeTypeTagC) ? ParseMimeType : ParseError; Executed by:
executed 17 times by 1 test: return startElement == QLatin1String(mimeTypeTagC) ? ParseMimeType : ParseError; Executed by:
| 17 | ||||||
44 | case executed 3319 times by 1 test: ParseMimeType:case ParseMimeType: Executed by:
executed 3319 times by 1 test: case ParseMimeType: Executed by:
| 3319 | ||||||
45 | case executed 134104 times by 1 test: ParseComment:case ParseComment: Executed by:
executed 134104 times by 1 test: case ParseComment: Executed by:
| 134104 | ||||||
46 | case executed 1575 times by 1 test: ParseGenericIcon:case ParseGenericIcon: Executed by:
executed 1575 times by 1 test: case ParseGenericIcon: Executed by:
| 1575 | ||||||
47 | case never executed: ParseIcon:case ParseIcon: never executed: case ParseIcon: | 0 | ||||||
48 | case executed 4132 times by 1 test: ParseGlobPattern:case ParseGlobPattern: Executed by:
executed 4132 times by 1 test: case ParseGlobPattern: Executed by:
| 4132 | ||||||
49 | case executed 1560 times by 1 test: ParseSubClass:case ParseSubClass: Executed by:
executed 1560 times by 1 test: case ParseSubClass: Executed by:
| 1560 | ||||||
50 | case executed 975 times by 1 test: ParseAlias:case ParseAlias: Executed by:
executed 975 times by 1 test: case ParseAlias: Executed by:
| 975 | ||||||
51 | case executed 1825 times by 1 test: ParseOtherMimeTypeSubTag:case ParseOtherMimeTypeSubTag: Executed by:
executed 1825 times by 1 test: case ParseOtherMimeTypeSubTag: Executed by:
| 1825 | ||||||
52 | case executed 4052 times by 1 test: ParseMagicMatchRule:case ParseMagicMatchRule: Executed by:
executed 4052 times by 1 test: case ParseMagicMatchRule: Executed by:
| 4052 | ||||||
53 | if (startElement == QLatin1String(mimeTypeTagC)
| 3302-148240 | ||||||
54 | return executed 3302 times by 1 test: ParseMimeType;return ParseMimeType; Executed by:
executed 3302 times by 1 test: return ParseMimeType; Executed by:
| 3302 | ||||||
55 | if (startElement == QLatin1String(commentTagC )
| 14136-134104 | ||||||
56 | return executed 134104 times by 1 test: ParseComment;return ParseComment; Executed by:
executed 134104 times by 1 test: return ParseComment; Executed by:
| 134104 | ||||||
57 | if (startElement == QLatin1String(genericIconTagC)
| 1575-12561 | ||||||
58 | return executed 1575 times by 1 test: ParseGenericIcon;return ParseGenericIcon; Executed by:
executed 1575 times by 1 test: return ParseGenericIcon; Executed by:
| 1575 | ||||||
59 | if (startElement == QLatin1String(iconTagC)
| 0-12561 | ||||||
60 | return never executed: ParseIcon;return ParseIcon; never executed: return ParseIcon; | 0 | ||||||
61 | if (startElement == QLatin1String(globTagC)
| 4136-8425 | ||||||
62 | return executed 4136 times by 1 test: ParseGlobPattern;return ParseGlobPattern; Executed by:
executed 4136 times by 1 test: return ParseGlobPattern; Executed by:
| 4136 | ||||||
63 | if (startElement == QLatin1String(subClassTagC)
| 1560-6865 | ||||||
64 | return executed 1560 times by 1 test: ParseSubClass;return ParseSubClass; Executed by:
executed 1560 times by 1 test: return ParseSubClass; Executed by:
| 1560 | ||||||
65 | if (startElement == QLatin1String(aliasTagC)
| 975-5890 | ||||||
66 | return executed 975 times by 1 test: ParseAlias;return ParseAlias; Executed by:
executed 975 times by 1 test: return ParseAlias; Executed by:
| 975 | ||||||
67 | if (startElement == QLatin1String(magicTagC)
| 1733-4157 | ||||||
68 | return executed 1733 times by 1 test: ParseMagic;return ParseMagic; Executed by:
executed 1733 times by 1 test: return ParseMagic; Executed by:
| 1733 | ||||||
69 | if (startElement == QLatin1String(matchTagC)
| 1832-2325 | ||||||
70 | return executed 2325 times by 1 test: ParseMagicMatchRule;return ParseMagicMatchRule; Executed by:
executed 2325 times by 1 test: return ParseMagicMatchRule; Executed by:
| 2325 | ||||||
71 | return executed 1832 times by 1 test: ParseOtherMimeTypeSubTag;return ParseOtherMimeTypeSubTag; Executed by:
executed 1832 times by 1 test: return ParseOtherMimeTypeSubTag; Executed by:
| 1832 | ||||||
72 | case executed 1733 times by 1 test: ParseMagic:case ParseMagic: Executed by:
executed 1733 times by 1 test: case ParseMagic: Executed by:
| 1733 | ||||||
73 | if (startElement == QLatin1String(matchTagC)
| 0-1733 | ||||||
74 | return executed 1733 times by 1 test: ParseMagicMatchRule;return ParseMagicMatchRule; Executed by:
executed 1733 times by 1 test: return ParseMagicMatchRule; Executed by:
| 1733 | ||||||
75 | break; never executed: break; | 0 | ||||||
76 | case never executed: ParseError:case ParseError: never executed: case ParseError: | 0 | ||||||
77 | break; never executed: break; | 0 | ||||||
78 | } | - | ||||||
79 | return never executed: ParseError;return ParseError; never executed: return ParseError; | 0 | ||||||
80 | } | - | ||||||
81 | - | |||||||
82 | - | |||||||
83 | bool QMimeTypeParserBase::parseNumber(const QStringRef &n, int *target, QString *errorMessage) | - | ||||||
84 | { | - | ||||||
85 | bool ok; | - | ||||||
86 | *target = n.toInt(&ok); | - | ||||||
87 | if (__builtin_expect(!!(!ok), false)
| 0-9733 | ||||||
88 | *errorMessage = QLatin1String("Not a number '") + n + QLatin1String("'."); | - | ||||||
89 | return never executed: false;return false; never executed: return false; | 0 | ||||||
90 | } | - | ||||||
91 | return executed 9733 times by 1 test: true;return true; Executed by:
executed 9733 times by 1 test: return true; Executed by:
| 9733 | ||||||
92 | } | - | ||||||
93 | - | |||||||
94 | - | |||||||
95 | struct CreateMagicMatchRuleResult { | - | ||||||
96 | QString errorMessage; | - | ||||||
97 | QMimeMagicRule rule; | - | ||||||
98 | - | |||||||
99 | CreateMagicMatchRuleResult(const QStringRef &type, const QStringRef &value, const QStringRef &offsets, const QStringRef &mask) | - | ||||||
100 | : errorMessage(), rule(type.toString(), value.toUtf8(), offsets.toString(), mask.toLatin1(), &errorMessage) | - | ||||||
101 | { | - | ||||||
102 | - | |||||||
103 | } executed 4058 times by 1 test: end of block Executed by:
| 4058 | ||||||
104 | }; | - | ||||||
105 | - | |||||||
106 | static CreateMagicMatchRuleResult createMagicMatchRule(const QXmlStreamAttributes &atts) | - | ||||||
107 | { | - | ||||||
108 | const QStringRef type = atts.value(QLatin1String(matchTypeAttributeC)); | - | ||||||
109 | const QStringRef value = atts.value(QLatin1String(matchValueAttributeC)); | - | ||||||
110 | const QStringRef offsets = atts.value(QLatin1String(matchOffsetAttributeC)); | - | ||||||
111 | const QStringRef mask = atts.value(QLatin1String(matchMaskAttributeC)); | - | ||||||
112 | return executed 4058 times by 1 test: CreateMagicMatchRuleResult(type, value, offsets, mask);return CreateMagicMatchRuleResult(type, value, offsets, mask); Executed by:
executed 4058 times by 1 test: return CreateMagicMatchRuleResult(type, value, offsets, mask); Executed by:
| 4058 | ||||||
113 | } | - | ||||||
114 | - | |||||||
115 | - | |||||||
116 | bool QMimeTypeParserBase::parse(QIODevice *dev, const QString &fileName, QString *errorMessage) | - | ||||||
117 | { | - | ||||||
118 | - | |||||||
119 | - | |||||||
120 | - | |||||||
121 | - | |||||||
122 | - | |||||||
123 | QMimeTypePrivate data; | - | ||||||
124 | int priority = 50; | - | ||||||
125 | QStack<QMimeMagicRule *> currentRules; | - | ||||||
126 | QList<QMimeMagicRule> rules; | - | ||||||
127 | QXmlStreamReader reader(dev); | - | ||||||
128 | ParseState ps = ParseBeginning; | - | ||||||
129 | while (!reader.atEnd()
| 17-333413 | ||||||
130 | switch (reader.readNext()) { | - | ||||||
131 | case executed 153309 times by 1 test: QXmlStreamReader::StartElement:case QXmlStreamReader::StartElement: Executed by:
executed 153309 times by 1 test: {case QXmlStreamReader::StartElement: Executed by:
| 153309 | ||||||
132 | ps = nextState(ps, reader.name()); | - | ||||||
133 | const QXmlStreamAttributes atts = reader.attributes(); | - | ||||||
134 | switch (ps) { | - | ||||||
135 | case executed 3319 times by 1 test: ParseMimeType:case ParseMimeType: Executed by:
executed 3319 times by 1 test: {case ParseMimeType: Executed by:
| 3319 | ||||||
136 | const QString name = atts.value(QLatin1String(mimeTypeAttributeC)).toString(); | - | ||||||
137 | if (name.isEmpty()
| 0-3319 | ||||||
138 | reader.raiseError(([]() -> QString { enum { Size = sizeof(u"" "Missing 'type'-attribute")/2 - 1 }; static const QStaticStringData<Size> qstring_literal = { { { { -1 } }, Size, 0, 0, sizeof(QStringData) }, u"" "Missing 'type'-attribute" }; QStringDataPtr holder = { qstring_literal.data_ptr() }; const QString qstring_literal_temp(holder); return never executed: qstring_literal_temp;return qstring_literal_temp; never executed: }()));return qstring_literal_temp; | 0 | ||||||
139 | } never executed: else {end of block | 0 | ||||||
140 | data.name = name; | - | ||||||
141 | } executed 3319 times by 1 test: end of block Executed by:
| 3319 | ||||||
142 | } | - | ||||||
143 | break; executed 3319 times by 1 test: break; Executed by:
| 3319 | ||||||
144 | case executed 1575 times by 1 test: ParseGenericIcon:case ParseGenericIcon: Executed by:
executed 1575 times by 1 test: case ParseGenericIcon: Executed by:
| 1575 | ||||||
145 | data.genericIconName = atts.value(QLatin1String(nameAttributeC)).toString(); | - | ||||||
146 | break; executed 1575 times by 1 test: break; Executed by:
| 1575 | ||||||
147 | case never executed: ParseIcon:case ParseIcon: never executed: case ParseIcon: | 0 | ||||||
148 | data.iconName = atts.value(QLatin1String(nameAttributeC)).toString(); | - | ||||||
149 | break; never executed: break; | 0 | ||||||
150 | case executed 4136 times by 1 test: ParseGlobPattern:case ParseGlobPattern: Executed by:
executed 4136 times by 1 test: {case ParseGlobPattern: Executed by:
| 4136 | ||||||
151 | const QString pattern = atts.value(QLatin1String(patternAttributeC)).toString(); | - | ||||||
152 | unsigned weight = atts.value(QLatin1String(weightAttributeC)).toInt(); | - | ||||||
153 | const bool caseSensitive = atts.value(QLatin1String(caseSensitiveAttributeC)) == QLatin1String("true"); | - | ||||||
154 | - | |||||||
155 | if (weight == 0
| 10-4126 | ||||||
156 | weight = QMimeGlobPattern::DefaultWeight; executed 4126 times by 1 test: weight = QMimeGlobPattern::DefaultWeight; Executed by:
| 4126 | ||||||
157 | - | |||||||
158 | ((!(!data.name.isEmpty())) ? qt_assert("!data.name.isEmpty()",__FILE__,238) : qt_noop()); | - | ||||||
159 | const QMimeGlobPattern glob(pattern, data.name, weight, caseSensitive ? Qt::CaseSensitive : Qt::CaseInsensitive); | - | ||||||
160 | if (!process(glob, errorMessage)
| 0-4136 | ||||||
161 | return never executed: false;return false; never executed: return false; | 0 | ||||||
162 | data.addGlobPattern(pattern); | - | ||||||
163 | } | - | ||||||
164 | break; executed 4136 times by 1 test: break; Executed by:
| 4136 | ||||||
165 | case executed 1560 times by 1 test: ParseSubClass:case ParseSubClass: Executed by:
executed 1560 times by 1 test: {case ParseSubClass: Executed by:
| 1560 | ||||||
166 | const QString inheritsFrom = atts.value(QLatin1String(mimeTypeAttributeC)).toString(); | - | ||||||
167 | if (!inheritsFrom.isEmpty()
| 0-1560 | ||||||
168 | processParent(data.name, inheritsFrom); executed 1560 times by 1 test: processParent(data.name, inheritsFrom); Executed by:
| 1560 | ||||||
169 | } | - | ||||||
170 | break; executed 1560 times by 1 test: break; Executed by:
| 1560 | ||||||
171 | case executed 134104 times by 1 test: ParseComment:case ParseComment: Executed by:
executed 134104 times by 1 test: {case ParseComment: Executed by:
| 134104 | ||||||
172 | - | |||||||
173 | QString locale = atts.value(QLatin1String(localeAttributeC)).toString(); | - | ||||||
174 | const QString comment = reader.readElementText(); | - | ||||||
175 | if (locale.isEmpty()
| 3319-130785 | ||||||
176 | locale = QString::fromLatin1("en_US"); executed 3319 times by 1 test: locale = QString::fromLatin1("en_US"); Executed by:
| 3319 | ||||||
177 | data.localeComments.insert(locale, comment); | - | ||||||
178 | } | - | ||||||
179 | break; executed 134104 times by 1 test: break; Executed by:
| 134104 | ||||||
180 | case executed 975 times by 1 test: ParseAlias:case ParseAlias: Executed by:
executed 975 times by 1 test: {case ParseAlias: Executed by:
| 975 | ||||||
181 | const QString alias = atts.value(QLatin1String(mimeTypeAttributeC)).toString(); | - | ||||||
182 | if (!alias.isEmpty()
| 0-975 | ||||||
183 | processAlias(alias, data.name); executed 975 times by 1 test: processAlias(alias, data.name); Executed by:
| 975 | ||||||
184 | } | - | ||||||
185 | break; executed 975 times by 1 test: break; Executed by:
| 975 | ||||||
186 | case executed 1733 times by 1 test: ParseMagic:case ParseMagic: Executed by:
executed 1733 times by 1 test: {case ParseMagic: Executed by:
| 1733 | ||||||
187 | priority = 50; | - | ||||||
188 | const QStringRef priorityS = atts.value(QLatin1String(priorityAttributeC)); | - | ||||||
189 | if (!priorityS.isEmpty()
| 116-1617 | ||||||
190 | if (!parseNumber(priorityS, &priority, errorMessage)
| 0-1617 | ||||||
191 | return never executed: false;return false; never executed: return false; | 0 | ||||||
192 | - | |||||||
193 | } executed 1617 times by 1 test: end of block Executed by:
| 1617 | ||||||
194 | currentRules.clear(); | - | ||||||
195 | - | |||||||
196 | } | - | ||||||
197 | break; executed 1733 times by 1 test: break; Executed by:
| 1733 | ||||||
198 | case executed 4058 times by 1 test: ParseMagicMatchRule:case ParseMagicMatchRule: Executed by:
executed 4058 times by 1 test: {case ParseMagicMatchRule: Executed by:
| 4058 | ||||||
199 | auto result = createMagicMatchRule(atts); | - | ||||||
200 | if (__builtin_expect(!!(!result.rule.isValid()), false)
| 6-4052 | ||||||
201 | QMessageLogger(__FILE__, 281, __PRETTY_FUNCTION__).warning("QMimeDatabase: Error parsing %ls\n%ls", executed 6 times by 1 test: QMessageLogger(__FILE__, 281, __PRETTY_FUNCTION__).warning("QMimeDatabase: Error parsing %ls\n%ls", static_cast<const wchar_t*>(static_cast<const void*>(QString(fileName).utf16())), static_cast<const wchar_t*>(static_cast<const void*>(QString(result.errorMessage).utf16()))); Executed by:
| 6 | ||||||
202 | static_cast<const wchar_t*>(static_cast<const void*>(QString(fileName).utf16())), static_cast<const wchar_t*>(static_cast<const void*>(QString(result.errorMessage).utf16()))); executed 6 times by 1 test: QMessageLogger(__FILE__, 281, __PRETTY_FUNCTION__).warning("QMimeDatabase: Error parsing %ls\n%ls", static_cast<const wchar_t*>(static_cast<const void*>(QString(fileName).utf16())), static_cast<const wchar_t*>(static_cast<const void*>(QString(result.errorMessage).utf16()))); Executed by:
| 6 | ||||||
203 | QList<QMimeMagicRule> *ruleList; | - | ||||||
204 | if (currentRules.isEmpty()
| 1040-3018 | ||||||
205 | ruleList = &rules; executed 3018 times by 1 test: ruleList = &rules; Executed by:
| 3018 | ||||||
206 | else | - | ||||||
207 | ruleList = ¤tRules.top()->m_subMatches; executed 1040 times by 1 test: ruleList = ¤tRules.top()->m_subMatches; Executed by:
| 1040 | ||||||
208 | ruleList->append(std::move(result.rule)); | - | ||||||
209 | - | |||||||
210 | currentRules.push(&ruleList->last()); | - | ||||||
211 | break; executed 4058 times by 1 test: break; Executed by:
| 4058 | ||||||
212 | } | - | ||||||
213 | case never executed: ParseError:case ParseError: never executed: case ParseError: | 0 | ||||||
214 | reader.raiseError(QLatin1String("Unexpected element <") + reader.name() + QLatin1Char('>')); | - | ||||||
215 | break; never executed: break; | 0 | ||||||
216 | default executed 1849 times by 1 test: :default: Executed by:
executed 1849 times by 1 test: default: Executed by:
| 1849 | ||||||
217 | break; executed 1849 times by 1 test: break; Executed by:
| 1849 | ||||||
218 | } | - | ||||||
219 | } | - | ||||||
220 | break; executed 153309 times by 1 test: break; Executed by:
| 153309 | ||||||
221 | - | |||||||
222 | case executed 19205 times by 1 test: QXmlStreamReader::EndElement:case QXmlStreamReader::EndElement: Executed by:
executed 19205 times by 1 test: case QXmlStreamReader::EndElement: Executed by:
| 19205 | ||||||
223 | { | - | ||||||
224 | const QStringRef elementName = reader.name(); | - | ||||||
225 | if (elementName == QLatin1String(mimeTypeTagC)
| 3319-15886 | ||||||
226 | if (!process(QMimeType(data), errorMessage)
| 0-3319 | ||||||
227 | return never executed: false;return false; never executed: return false; | 0 | ||||||
228 | data.clear(); | - | ||||||
229 | } executed 3319 times by 1 test: else if (elementName == QLatin1String(matchTagC)end of block Executed by:
| 3319-11828 | ||||||
230 | - | |||||||
231 | currentRules.pop(); | - | ||||||
232 | - | |||||||
233 | } executed 4058 times by 1 test: else if (elementName == QLatin1String(magicTagC)end of block Executed by:
| 1733-10095 | ||||||
234 | - | |||||||
235 | - | |||||||
236 | QMimeMagicRuleMatcher ruleMatcher(data.name, priority); | - | ||||||
237 | ruleMatcher.addRules(rules); | - | ||||||
238 | processMagicMatcher(ruleMatcher); | - | ||||||
239 | rules.clear(); | - | ||||||
240 | } executed 1733 times by 1 test: end of block Executed by:
| 1733 | ||||||
241 | break; executed 19205 times by 1 test: break; Executed by:
| 19205 | ||||||
242 | } | - | ||||||
243 | default executed 160899 times by 1 test: :default: Executed by:
executed 160899 times by 1 test: default: Executed by:
| 160899 | ||||||
244 | break; executed 160899 times by 1 test: break; Executed by:
| 160899 | ||||||
245 | } | - | ||||||
246 | } | - | ||||||
247 | - | |||||||
248 | if (__builtin_expect(!!(reader.hasError()), false)
| 0-17 | ||||||
249 | if (errorMessage
| 0 | ||||||
250 | *errorMessage = QString::asprintf("An error has been encountered at line %lld of %ls: %ls:", | - | ||||||
251 | reader.lineNumber(), | - | ||||||
252 | static_cast<const wchar_t*>(static_cast<const void*>(QString(fileName).utf16())), | - | ||||||
253 | static_cast<const wchar_t*>(static_cast<const void*>(QString(reader.errorString()).utf16()))); | - | ||||||
254 | } never executed: end of block | 0 | ||||||
255 | return never executed: false;return false; never executed: return false; | 0 | ||||||
256 | } | - | ||||||
257 | - | |||||||
258 | return executed 17 times by 1 test: true;return true; Executed by:
executed 17 times by 1 test: return true; Executed by:
| 17 | ||||||
259 | - | |||||||
260 | } | - | ||||||
261 | - | |||||||
262 | - | |||||||
Switch to Source code | Preprocessed file |