Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
parser.cpp
Go to the documentation of this file.
1// Copyright (C) 2022 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
3
4#include "tracepointgen.h"
5#include "parser.h"
6#include <qtextstream.h>
8#include <qfileinfo.h>
9
10static void removeOffsetRange(qsizetype begin, qsizetype end, QList<LineNumber> &offsets)
11{
13 qsizetype i = 0;
14 DEBUGPRINTF2(printf("tracepointgen: removeOffsetRange: %llu %llu\n", begin, end));
15 while (i < offsets.size()) {
16 LineNumber &cur = offsets[i];
17 if (begin > cur.end) {
18 i++;
19 } else if (begin >= cur.begin && begin <= cur.end) {
20 cur.end = begin;
21 i++;
22 } else if (begin < cur.begin && end > cur.end) {
23 offsets.remove(i);
24 DEBUGPRINTF2(printf("tracepointgen: removeOffsetRange: %llu, %llu, %d\n", cur.begin, cur.end, cur.line));
25 } else if (end >= cur.begin && end <= cur.end) {
26 cur.begin = begin;
27 cur.end -= count;
28 i++;
29 } else if (end < cur.begin) {
30 cur.begin -= count;
31 cur.end -= count;
32 i++;
33 }
34 }
35}
36
38 qsizetype cur = data.indexOf(QLatin1Char(' '), offset);
39 if (cur >= 0) {
40 qsizetype i = cur + 1;
41 while (data.constData()[i] == QLatin1Char(' ')) i++;
42 if (i - cur > 1) {
43 offset = cur;
44 end = i - 1;
45 return true;
46 }
47 cur = data.indexOf(QLatin1Char(' '), cur + 1);
48 }
49 return false;
50}
51
52static void simplifyData(QString &data, QList<LineNumber> &offsets)
53{
54 qsizetype offset = data.indexOf(QStringLiteral("//"));
55 while (offset >= 0) {
56 qsizetype endOfLine = data.indexOf(QLatin1Char('\n'), offset);
57 if (endOfLine == -1)
58 endOfLine = data.length();
59 removeOffsetRange(offset, endOfLine, offsets);
60 data.remove(offset, endOfLine - offset);
61 offset = data.indexOf(QStringLiteral("//"), offset);
62 }
63 offset = data.indexOf(QStringLiteral("/*"));
64 while (offset >= 0) {
65 qsizetype endOfComment = data.indexOf(QStringLiteral("*/"), offset);
66 if (endOfComment == -1)
67 break;
68 removeOffsetRange(offset, endOfComment + 2, offsets);
69 data.remove(offset, endOfComment - offset + 2);
70 offset = data.indexOf(QStringLiteral("/*"), offset);
71 }
72 offset = 0;
73 qsizetype end = 0;
74 data.replace(QLatin1Char('\n'), QLatin1Char(' '));
75 while (findSpaceRange(data, offset, end)) {
77 data.remove(offset, end - offset);
78 }
79}
80
82{
83 qsizetype offset = data.indexOf(QStringLiteral("//"));
84 while (offset >= 0) {
85 qsizetype endOfLine = data.indexOf(QLatin1Char('\n'), offset);
86 if (endOfLine == -1)
87 endOfLine = data.length();
88 data.remove(offset, endOfLine - offset);
89 offset = data.indexOf(QStringLiteral("//"), offset);
90 }
91 offset = data.indexOf(QStringLiteral("/*"));
92 while (offset >= 0) {
93 qsizetype endOfComment = data.indexOf(QStringLiteral("*/"), offset);
94 if (endOfComment == -1)
95 break;
96 data.remove(offset, endOfComment - offset + 2);
97 offset = data.indexOf(QStringLiteral("/*"), offset);
98 }
99 offset = 0;
100 qsizetype end = 0;
101 while (findSpaceRange(data, offset, end))
102 data.remove(offset, end - offset);
103}
104
106{
107 DEBUGPRINTF(printf("in: %s\n", qPrintable(in)));
108 QList<QString> lines = in.split(QLatin1Char('\\'));
109 QString out;
110 for (int i = 0; i < lines.size(); i++) {
111 QString l = lines.at(i).simplified();
112 DEBUGPRINTF(printf("line: %s\n", qPrintable(l)));
113 if (l.length() < 2)
114 continue;
115 if (l.startsWith(QStringLiteral("\"")))
116 l = l.right(l.length() - 1);
117 if (l.endsWith(QStringLiteral("\"")))
118 l = l.left(l.length() - 1);
119 l = l.simplified();
120
121 if (l.length() > 1) {
122 if (out.size() > 0)
123 out.append(QLatin1Char('\n'));
124 out.append(l);
125 }
126 }
127 DEBUGPRINTF(printf("out: %s\n", qPrintable(out)));
128 return out;
129}
130
132{
133 DEBUGPRINTF(printf("tracepointgen: lineNumber: offset %llu, line count: %llu\n", offset , m_offsets.size()));
134 for (const auto line : m_offsets) {
135 DEBUGPRINTF(printf("tracepointgen: lineNumber: %llu %llu %d\n", line.begin, line.end, line.line));
136 if (offset >= line.begin && offset <= line.end)
137 return line.line;
138 }
139 return 0;
140}
141
143{
144 Replace rep;
145 qsizetype beginBrace = data.indexOf(QLatin1Char('('), offset);
146 qsizetype endBrace = data.indexOf(QLatin1Char(')'), beginBrace);
147 QString params = data.mid(beginBrace + 1, endBrace - beginBrace -1);
148 int punc = params.indexOf(QLatin1Char(','));
149 if (punc < 0)
150 panic("Syntax error in Q_TRACE_PARAM_REPLACE at file %s, line %llu", qPrintable(name), lineNumber(offset));
151 rep.in = params.left(punc).simplified();
152 rep.out = params.right(params.length() - punc - 1).simplified();
153 if (rep.in.endsWith(QLatin1Char('*')) || rep.out.endsWith(QLatin1Char(']')))
154 rep.out.append(QLatin1Char(' '));
155 DEBUGPRINTF(printf("tracepointgen: replace: %s with %s\n", qPrintable(rep.in), qPrintable(rep.out)));
157}
158
160{
161 qsizetype beginOfProvider = data.indexOf(QLatin1Char('('), offset);
162 qsizetype endOfProvider = data.indexOf(QLatin1Char(')'), beginOfProvider);
164 QString provider = data.mid(beginOfProvider + 1, endOfProvider - beginOfProvider - 1).simplified();
165 if (provider != m_provider)
166 return;
167
168 qsizetype classMarker = data.indexOf(QStringLiteral("::"), endOfProvider);
169 qsizetype beginOfFunctionMarker = data.indexOf(QLatin1Char('{'), classMarker);
170 QString begin = data.mid(endOfProvider + 1, classMarker - endOfProvider - 1);
171 QString end = data.mid(classMarker + 2, beginOfFunctionMarker - classMarker - 2);
172 int spaceIndex = begin.lastIndexOf(QLatin1Char(' '));
173 if (spaceIndex == -1)
174 func.className = begin;
175 else
176 func.className = begin.mid(spaceIndex + 1, begin.length() - spaceIndex - 1);
177 qsizetype braceIndex = end.indexOf(QLatin1Char('('));
178 spaceIndex = end.indexOf(QLatin1Char(' '));
179 if (spaceIndex < braceIndex)
180 func.functionName = end.left(spaceIndex).simplified();
181 else
182 func.functionName = end.left(braceIndex).simplified();
183
184 qsizetype lastBraceIndex = end.lastIndexOf(QLatin1Char(')'));
185 func.functionParameters = end.mid(braceIndex + 1, lastBraceIndex - braceIndex - 1).simplified();
186
187 DEBUGPRINTF(printf("tracepointgen: %s(%s)\n", qPrintable(func.functionName), qPrintable(func.functionParameters)));
188
190}
191
193{
194 qsizetype beginOfProvider = data.indexOf(QLatin1Char('('), offset);
195 qsizetype endOfProvider = data.indexOf(QLatin1Char(','), beginOfProvider);
196 Point point;
197 QString provider = data.mid(beginOfProvider + 1, endOfProvider - beginOfProvider - 1).simplified();
198 if (provider != m_provider)
199 return;
200
201 qsizetype endOfPoint = data.indexOf(QLatin1Char(','), endOfProvider + 1);
202 qsizetype endOfPoint2 = data.indexOf(QLatin1Char(')'), endOfProvider + 1);
203 bool params = true;
204 if (endOfPoint == -1 || endOfPoint2 < endOfPoint) {
205 endOfPoint = endOfPoint2;
206 params = false;
207 }
208 point.name = data.mid(endOfProvider + 1, endOfPoint - endOfProvider - 1).simplified();
209 if (params) {
210 int endOfParams = data.indexOf(QLatin1Char(')'), endOfPoint);
211 point.parameters = data.mid(endOfPoint + 1, endOfParams - endOfPoint - 1).simplified();
212 }
213
214 DEBUGPRINTF(printf("tracepointgen: %s(%s)\n", qPrintable(point.name), qPrintable(point.parameters)));
215
216 m_points.push_back(point);
217}
218
220{
221 qsizetype beginOfProvider = data.indexOf(QLatin1Char('('), offset);
222 qsizetype endOfProvider = data.indexOf(QLatin1Char(','), beginOfProvider);
223 QString prefix;
224 QString provider = data.mid(beginOfProvider + 1, endOfProvider - beginOfProvider - 1).simplified();
225 if (provider != m_provider)
226 return;
227
228 qsizetype endOfPoint = data.indexOf(QLatin1Char(')'), endOfProvider + 1);
229 prefix = data.mid(endOfProvider + 1, endOfPoint - endOfProvider - 1).simplified();
230
231 DEBUGPRINTF(printf("tracepointgen: prefix: %s\n", qPrintable(prefix)));
232
233 if (!m_prefixes.contains(prefix))
235}
236
238{
239 QStringList split = name.split(QStringLiteral("::"));
240 QString enumName = split.last();
241 DEBUGPRINTF(printf("searching for %s\n", qPrintable(name)));
243 for (const QString &filename : includes) {
244 QFile input(filename);
246 DEBUGPRINTF(printf("Cannot open '%s' for reading: %s\n",
247 qPrintable(filename), qPrintable(input.errorString())));
248 return ret;
249 }
252 while (!stream.atEnd()) {
253 QString line = stream.readLine().trimmed();
254 data += line + QLatin1Char('\n');
255 }
257
258 int pos = 0;
259 bool valid = true;
260 for (int i = 0; i < split.size() - 1; i++) {
261 QRegularExpression macro(QStringLiteral("(struct|class|namespace) +([A-Za-z0-9_]*)? +([A-Za-z0-9]*;?)"));
262 QRegularExpressionMatchIterator m = macro.globalMatch(data);
263 bool found = false;
264 while (m.hasNext() && !found) {
266 QString n = match.captured(2);
267 if (!n.endsWith(QLatin1Char(';')) && n == split[i] && match.capturedStart(2) > pos) {
268 pos = match.capturedStart(2);
269 found = true;
270 break;
271 }
272 if (match.hasCaptured(3)) {
273 n = match.captured(3);
274 if (!n.endsWith(QLatin1Char(';')) && n == split[i] && match.capturedStart(3) > pos) {
275 pos = match.capturedStart(3);
276 found = true;
277 break;
278 }
279 }
280 }
281 if (!found) {
282 valid = false;
283 break;
284 }
285 }
286
287 if (valid) {
288 QRegularExpression macro(QStringLiteral("enum +([A-Za-z0-9_]*)"));
289 QRegularExpressionMatchIterator m = macro.globalMatch(data);
290 while (m.hasNext()) {
292
293 if (match.capturedStart() < pos)
294 continue;
295
296 QString n = match.captured(1);
297
298 if (n == enumName) {
299 DEBUGPRINTF(printf("Found enum: %s\n", qPrintable(n)));
300 int begin = data.indexOf(QLatin1Char('{'), match.capturedEnd());
301 int end = data.indexOf(QLatin1Char('}'), begin);
302 QString block = data.mid(begin + 1, end - begin - 1);
303 const QStringList enums = block.split(QLatin1Char('\n'));
304 for (const auto &e : enums) {
305 const auto trimmed = e.trimmed();
306 if (!trimmed.isEmpty() && !trimmed.startsWith(QLatin1Char('#')))
307 ret << trimmed;
308 }
309
310 return ret;
311 }
312 }
313 }
314 }
315 return ret;
316}
317
324
325static QList<EnumNameValue> enumsToValues(const QStringList &values)
326{
327 int cur = 0;
328 QList<EnumNameValue> ret;
329 for (const QString &value : values) {
331 if (value.contains(QLatin1Char('='))) {
332 size_t offset = value.indexOf(QLatin1Char('='));
334 QString val = value.right(value.length() - offset - 1).trimmed();
335 if (val.endsWith(QLatin1Char(',')))
336 val = val.left(val.length() - 1);
337 bool valid = false;
338 int integer = val.toInt(&valid);
339 if (!valid)
340 integer = val.toInt(&valid, 16);
341 if (valid) {
342 cur = r.value = integer;
343 ret << r;
344 } else {
345 auto iter = std::find_if(ret.begin(), ret.end(), [&val](const EnumNameValue &elem){
346 return elem.name == val;
347 });
348 if (iter != ret.end()) {
349 cur = r.value = iter->value;
350 ret << r;
351 } else {
352 DEBUGPRINTF(printf("Invalid value: %s %s\n", qPrintable(r.name), qPrintable(value)));
353 }
354 }
355 } else {
356 if (value.endsWith(QLatin1Char(',')))
357 r.name = value.left(value.length() - 1);
358 else
359 r.name = value;
360 r.value = ++cur;
361 ret << r;
362 }
363 }
364 return ret;
365}
366
368{
369 qsizetype beginOfProvider = data.indexOf(QLatin1Char('('), offset);
370 qsizetype endOfProvider = data.indexOf(QLatin1Char(','), beginOfProvider);
371 QString metadata;
372 QString provider = data.mid(beginOfProvider + 1, endOfProvider - beginOfProvider - 1).simplified();
373 if (provider != m_provider)
374 return;
375
376 qsizetype endOfPoint = data.indexOf(QLatin1Char(')'), endOfProvider + 1);
377 metadata = data.mid(endOfProvider + 1, endOfPoint - endOfProvider - 1).simplified();
378
379 DEBUGPRINTF(printf("tracepointgen: metadata: %s", qPrintable(metadata)));
380
381 QString preprocessed = preprocessMetadata(metadata);
382
383 DEBUGPRINTF2(printf("preprocessed %s\n", qPrintable(preprocessed)));
384
385 QRegularExpression macro(QStringLiteral("([A-Z]*) ?{ ?([A-Za-z0-9=_,. ]*) ?} ?([A-Za-z0-9_:]*) ?;"));
386 QRegularExpressionMatchIterator i = macro.globalMatch(preprocessed);
387 qsizetype prev = 0;
388 while (i.hasNext()) {
390 QString values = match.captured(2).trimmed();
391 int cur = match.capturedStart();
392 if (cur > prev)
393 m_metadata.append(preprocessed.mid(prev, cur - prev));
394
395 prev = match.capturedEnd() + 1;
396 DEBUGPRINTF2(printf("values: %s\n", qPrintable(values)));
397 if (values.isEmpty() || values.startsWith(QStringLiteral("AUTO"))) {
398 values.replace(QLatin1Char('\n'), QLatin1Char(' '));
399 QStringList ranges;
400 if (values.contains(QStringLiteral("RANGE"))) {
401 QRegularExpression rangeMacro(QStringLiteral("RANGE +([A-Za-z0-9_]*) +... +([A-Za-z0-9_]*)"));
402 QRegularExpressionMatchIterator r = rangeMacro.globalMatch(values);
403 while (r.hasNext()) {
404 QRegularExpressionMatch rm = r.next();
405 ranges << rm.captured(1);
406 ranges << rm.captured(2);
407 DEBUGPRINTF2(printf("range: %s ... %s\n", qPrintable(rm.captured(1)), qPrintable(rm.captured(2))));
408 }
409 }
410
411 const auto enumOrFlag = match.captured(1);
412 const auto name = match.captured(3);
413 const bool flags = enumOrFlag == QStringLiteral("FLAGS");
414
416 if (values.isEmpty()) {
417 if (flags && name.endsWith(QLatin1Char('s')))
418 values = findEnumValues(name.left(name.length() - 1), includes);
419 if (values.isEmpty()) {
420 DEBUGPRINTF(printf("Unable to find values for %s\n", qPrintable(name)));
421 }
422 }
423 if (!values.isEmpty()) {
424 auto moreValues = enumsToValues(values);
425 if (ranges.size()) {
426 for (int i = 0; i < ranges.size() / 2; i++) {
427 bool rangeFound = false;
428 for (auto &v : moreValues) {
429 if (v.name == ranges[2 * i]) {
430 rangeFound = true;
431 QString rangeEnd = ranges[2 * i + 1];
432 auto iter = std::find_if(moreValues.begin(), moreValues.end(), [&rangeEnd](const EnumNameValue &elem){
433 return elem.name == rangeEnd;
434 });
435 if (iter != moreValues.end())
436 v.valueStr = QStringLiteral("RANGE(%1, %2 ... %3)").arg(v.name).arg(v.value).arg(iter->value);
437 else
438 panic("Unable to find range end: %s\n", qPrintable(rangeEnd));
439 break;
440 }
441 }
442 if (rangeFound == false)
443 panic("Unable to find range begin: %s\n", qPrintable(ranges[2 * i]));
444 }
445 }
446 std::sort(moreValues.begin(), moreValues.end(), [](const EnumNameValue &a, const EnumNameValue &b) {
447 return a.value < b.value;
448 });
449 values.clear();
450 int prevValue = std::as_const(moreValues).front().value;
451 for (const auto &v : std::as_const(moreValues)) {
452 QString a;
453 if (v.valueStr.isNull()) {
454 if (v.value == prevValue + 1 && !flags)
455 a = v.name;
456 else
457 a = QStringLiteral("%1 = %2").arg(v.name).arg(v.value);
458 prevValue = v.value;
459 } else {
460 a = v.valueStr;
461 }
462 values << a;
463 }
464
465 metadata = QStringLiteral("%1 {\n %2 \n} %3;").arg(enumOrFlag).arg(values.join(QStringLiteral(",\n"))).arg(name);
466 if (!m_metadata.contains(metadata))
467 m_metadata.append(metadata);
468 }
469 } else {
470 if (!m_metadata.contains(match.captured()))
471 m_metadata.append(match.captured());
472 }
473 }
474 if (prev < preprocessed.length())
475 m_metadata.append(preprocessed.mid(prev, preprocessed.length() - prev));
476}
477
479{
480 QFileInfo info(filename);
481 if (info.exists())
482 return info.absoluteFilePath();
483 for (const QString &sp : std::as_const(m_includeDirs)) {
484 info = QFileInfo(sp + QLatin1Char('/') + filename);
485 if (info.exists())
486 return info.absoluteFilePath();
487 }
488 return {};
489}
490
491void Parser::addIncludesRecursive(const QString &filename, QList<QString> &includes)
492{
493 QFileInfo info(filename);
494 DEBUGPRINTF(printf("check include: %s\n", qPrintable(filename)));
495 QFile input(filename);
497 DEBUGPRINTF(printf("Cannot open '%s' for reading: %s\n",
498 qPrintable(filename), qPrintable(input.errorString())));
499 return;
500 }
503 while (!stream.atEnd()) {
504 QString line = stream.readLine().trimmed();
505 data += line + QLatin1Char(QLatin1Char('\n'));
506 }
507
508 QRegularExpression includeMacro(QStringLiteral("#include [\"<]([A-Za-z0-9_./]*.h)[\">]"));
509 QRegularExpressionMatchIterator i = includeMacro.globalMatch(data);
510 while (i.hasNext()) {
512 QString filename = match.captured(1);
513
514 QString rinc = filename;
515 if (filename.startsWith(QStringLiteral("../"))) {
516 QFileInfo info2(info.absolutePath() + QLatin1Char('/') + filename);
517 if (!info2.exists()) {
518 DEBUGPRINTF(printf("unable to find %s\n", qPrintable(filename)));
519 continue;
520 }
521 rinc = info2.absoluteFilePath();
522 filename = info2.fileName();
523 }
524
525 // only search possible qt headers
526 if (filename.startsWith(QLatin1Char('q'), Qt::CaseInsensitive)) {
527 QString resolved = resolveInclude(rinc);
528 if (!resolved.isEmpty() && !includes.contains(resolved)) {
529 includes.push_back(resolved);
531 }
532 }
533 }
534}
535
537{
540 int lineNumber = 1;
541 qsizetype prev = 0;
542 while (!stream.atEnd()) {
543 QString line = stream.readLine().trimmed();
545 prev += line.length() + 1;
546 data += line + QLatin1Char(QLatin1Char('\n'));
547 }
548
550
552
553 QRegularExpression includeMacro(QStringLiteral("#include [\"<]([A-Za-z0-9_./]*.h)[\">]"));
554 QRegularExpressionMatchIterator i = includeMacro.globalMatch(data);
555 while (i.hasNext()) {
557 const QString filename = match.captured(1);
558 // only search possible qt headers
559 if (filename.startsWith(QLatin1Char('q'), Qt::CaseInsensitive)) {
560 const QString resolved = resolveInclude(filename);
561 if (!resolved.isEmpty() && !includes.contains(resolved)) {
562 includes.push_back(resolved);
564 }
565 }
566 }
567
568 QRegularExpression traceMacro(QStringLiteral("Q_TRACE_([A-Z_]*)"));
569 i = traceMacro.globalMatch(data);
570 while (i.hasNext()) {
572
573 QString macroType = match.captured(1);
574 if (macroType == QStringLiteral("PARAM_REPLACE"))
575 parseParamReplace(data, match.capturedEnd(), name);
576 else if (macroType == QStringLiteral("INSTRUMENT"))
577 parseInstrument(data, match.capturedEnd());
578 else if (macroType == QStringLiteral("POINT"))
579 parsePoint(data, match.capturedEnd());
580 else if (macroType == QStringLiteral("PREFIX"))
581 parsePrefix(data, match.capturedEnd());
582 else if (macroType == QStringLiteral("METADATA"))
583 parseMetadata(data, match.capturedEnd(), includes);
584 }
585
586 for (auto &func : m_functions) {
587 for (auto &rep : m_replaces)
588 func.functionParameters.replace(rep.in, rep.out);
589 }
590}
591
593{
595 if (m_prefixes.size() > 0) {
596 out << QStringLiteral("{\n");
597 for (const auto &prefix : m_prefixes)
598 out << prefix << "\n";
599 out << QStringLiteral("}\n");
600 }
601 for (const auto &m : m_metadata)
602 out << m << "\n";
603 for (const auto &func : m_functions) {
604 out << func.className << "_" << func.functionName << "_entry(" << func.functionParameters << ")\n";
605 out << func.className << "_" << func.functionName << "_exit()\n";
606 }
607 for (const auto &point : m_points)
608 out << point.name << "(" << point.parameters << ")\n";
609}
QList< IncludePath > includes
Definition parser.h:30
QList< QString > m_metadata
Definition parser.h:71
int lineNumber(qsizetype offset) const
Definition parser.cpp:131
void addIncludesRecursive(const QString &filename, QStringList &includes)
Definition parser.cpp:491
void parseParamReplace(const QString &data, qsizetype offset, const QString &name)
Definition parser.cpp:142
void parse(QIODevice &input, const QString &name)
Definition parser.cpp:536
QList< QString > m_includeDirs
Definition parser.h:73
void parseMetadata(const QString &data, qsizetype offset, const QStringList &includes)
Definition parser.cpp:367
QList< Replace > m_replaces
Definition parser.h:69
void parsePrefix(const QString &data, qsizetype offset)
Definition parser.cpp:219
void write(QIODevice &input) const
Definition parser.cpp:592
QList< QString > m_prefixes
Definition parser.h:70
void prev()
Definition parser.h:40
QString m_provider
Definition parser.h:74
QString resolveInclude(const QString &filename)
Definition parser.cpp:478
QStringList findEnumValues(const QString &name, const QStringList &includes)
Definition parser.cpp:237
void parseInstrument(const QString &data, qsizetype offset)
Definition parser.cpp:159
QList< Point > m_points
Definition parser.h:68
void parsePoint(const QString &data, qsizetype offset)
Definition parser.cpp:192
QList< Function > m_functions
Definition parser.h:67
QList< LineNumber > m_offsets
Definition parser.h:72
\inmodule QtCore
Definition qfile.h:93
\inmodule QtCore \reentrant
Definition qiodevice.h:34
qsizetype size() const noexcept
Definition qlist.h:397
void push_back(parameter_type t)
Definition qlist.h:675
void append(parameter_type t)
Definition qlist.h:458
\inmodule QtCore \reentrant
\inmodule QtCore \reentrant
\inmodule QtCore \reentrant
\inmodule QtCore
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:129
QString left(qsizetype n) const &
Definition qstring.h:363
iterator begin()
Returns an \l{STL-style iterators}{STL-style iterator} pointing to the first character in the string.
Definition qstring.h:1349
qsizetype indexOf(QLatin1StringView s, qsizetype from=0, Qt::CaseSensitivity cs=Qt::CaseSensitive) const
Definition qstring.cpp:4517
bool startsWith(const QString &s, Qt::CaseSensitivity cs=Qt::CaseSensitive) const
Returns true if the string starts with s; otherwise returns false.
Definition qstring.cpp:5455
QStringList split(const QString &sep, Qt::SplitBehavior behavior=Qt::KeepEmptyParts, Qt::CaseSensitivity cs=Qt::CaseSensitive) const
Splits the string into substrings wherever sep occurs, and returns the list of those strings.
Definition qstring.cpp:8218
QString mid(qsizetype position, qsizetype n=-1) const &
Definition qstring.cpp:5300
bool isEmpty() const noexcept
Returns true if the string has no characters; otherwise returns false.
Definition qstring.h:192
QString simplified() const &
Definition qstring.h:451
iterator end()
Returns an \l{STL-style iterators}{STL-style iterator} pointing just after the last character in the ...
Definition qstring.h:1357
QString right(qsizetype n) const &
Definition qstring.h:375
bool endsWith(const QString &s, Qt::CaseSensitivity cs=Qt::CaseSensitive) const
Returns true if the string ends with s; otherwise returns false.
Definition qstring.cpp:5506
QString trimmed() const &
Definition qstring.h:447
qsizetype length() const noexcept
Returns the number of characters in this string.
Definition qstring.h:191
\inmodule QtCore
@ CaseInsensitive
void panic(const char *fmt,...)
Definition panic.cpp:10
DBusConnection const char DBusError DBusBusType DBusError return DBusConnection DBusHandleMessageFunction void DBusFreeFunction return DBusConnection return DBusConnection return const char DBusError return DBusConnection DBusMessage dbus_uint32_t return DBusConnection dbus_bool_t DBusConnection DBusAddWatchFunction DBusRemoveWatchFunction DBusWatchToggledFunction void DBusFreeFunction return DBusConnection DBusDispatchStatusFunction void DBusFreeFunction DBusTimeout return DBusTimeout return DBusWatch return DBusWatch unsigned int return DBusError const DBusError return const DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessageIter * iter
EGLStreamKHR stream
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
return ret
GLenum GLsizei GLsizei GLint * values
[15]
GLboolean GLboolean GLboolean b
GLsizei const GLfloat * v
[13]
const GLfloat * m
GLboolean GLboolean GLboolean GLboolean a
[7]
GLboolean r
[2]
GLuint GLuint end
GLenum GLenum GLsizei count
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLbitfield flags
GLenum GLuint GLintptr offset
GLuint name
GLfloat n
void ** params
GLenum func
Definition qopenglext.h:663
GLuint GLfloat * val
GLuint GLsizei const GLuint const GLintptr * offsets
GLuint in
GLenum GLenum GLenum input
static void split(QT_FT_Vector *b)
QtPrivate::QRegularExpressionMatchIteratorRangeBasedForIterator begin(const QRegularExpressionMatchIterator &iterator)
#define qPrintable(string)
Definition qstring.h:1531
#define QStringLiteral(str)
#define sp
static bool match(const uchar *found, uint foundLen, const char *target, uint targetLen)
ptrdiff_t qsizetype
Definition qtypes.h:165
QTextStream out(stdout)
[7]
QHostInfo info
[0]
QString valueStr
Definition parser.cpp:321
QString name
Definition parser.cpp:320
qsizetype end
Definition parser.h:33
Definition parser.h:19
QString name
Definition parser.h:20
QString parameters
Definition parser.h:21
\inmodule QtCore \reentrant
Definition qchar.h:18
bool contains(const AT &t) const noexcept
Definition qlist.h:45
static void removeOffsetRange(qsizetype begin, qsizetype end, QList< LineNumber > &offsets)
Definition parser.cpp:10
static void simplifyData(QString &data, QList< LineNumber > &offsets)
Definition parser.cpp:52
static QList< EnumNameValue > enumsToValues(const QStringList &values)
Definition parser.cpp:325
static bool findSpaceRange(const QString &data, qsizetype &offset, qsizetype &end)
Definition parser.cpp:37
static QString preprocessMetadata(const QString &in)
Definition parser.cpp:105
#define DEBUGPRINTF2(x)
#define DEBUGPRINTF(x)