QByteArray gdbQuoteTypes(const QByteArray &type) { // gdb does not understand sizeof(Core::IDocument*). // "sizeof('Core::IDocument*')" is also not acceptable, // it needs to be "sizeof('Core::IDocument'*)" // // We never will have a perfect solution here (even if we had a full blown // C++ parser as we do not have information on what is a type and what is // a variable name. So "a<b>::c" could either be two comparisons of values // 'a', 'b' and '::c', or a nested type 'c' in a template 'a<b>'. We // assume here it is the latter. //return type; // (*('myns::QPointer<myns::QObject>*'*)0x684060)" is not acceptable // (*('myns::QPointer<myns::QObject>'**)0x684060)" is acceptable if (isPointerType(type)) return gdbQuoteTypes(stripPointerType(type)) + '*'; QByteArray accu; QByteArray result; int templateLevel = 0; const char colon = ':'; const char singleQuote = '\''; const char lessThan = '<'; const char greaterThan = '>'; for (int i = 0; i != type.size(); ++i) { const char c = type.at(i); if (isLetterOrNumber(c) || c == '_' || c == colon || c == ' ') { accu += c; } else if (c == lessThan) { ++templateLevel; accu += c; } else if (c == greaterThan) { --templateLevel; accu += c; } else if (templateLevel > 0) { accu += c; } else { if (accu.contains(colon) || accu.contains(lessThan)) result += singleQuote + accu + singleQuote; else result += accu; accu.clear(); result += c; } } if (accu.contains(colon) || accu.contains(lessThan)) result += singleQuote + accu + singleQuote; else result += accu; //qDebug() << "GDB_QUOTING" << type << " TO " << result; return result; }
PreprocessedContents tokenizeFromByteArray(const QByteArray& array) { PreprocessedContents to; const char* data = array.constData(); const char* dataEnd = data + array.size(); //unsigned int* target = to.data(); KDevVarLengthArray<char, 100> identifier; KDevelop::IndexedString::RunningHash hash; bool tokenizing = false; while(data < dataEnd) { if(!tokenizing) { if(isLetter(*data) || *data == '_') tokenizing = true; } if(tokenizing) { if(isLetterOrNumber(*data) || *data == '_') { hash.append(*data); identifier.append(*data); }else{ //End of token to.append( KDevelop::IndexedString(identifier.constData(), identifier.size(), hash.hash).index() ); //kDebug() << "word" << "\"" + KDevelop::IndexedString(to.back()).str() + "\""; hash.clear(); identifier.clear(); tokenizing = false; } } if(!tokenizing) to.append( indexFromCharacter(*data) ); ++data; } if(tokenizing) to.append( KDevelop::IndexedString(identifier.constData(), identifier.size(), hash.hash).index() ); /* kDebug() << QString::fromUtf8(stringFromContents(to)); kDebug() << QString::fromUtf8(array); Q_ASSERT(stringFromContents(to) == array);*/ return to; }
inline const char * ArduinoJson::Internals::JsonParser<TReader, TWriter>::parseString() { typename TypeTraits::RemoveReference<TWriter>::type::String str = _writer.startString(); skipSpacesAndComments(_reader); char c = _reader.current(); if (isQuote(c)) { // quotes _reader.move(); char stopChar = c; for (;;) { c = _reader.current(); if (c == '\0') break; _reader.move(); if (c == stopChar) break; if (c == '\\') { // replace char c = Encoding::unescapeChar(_reader.current()); if (c == '\0') break; _reader.move(); } str.append(c); } } else { // no quotes for (;;) { if (!isLetterOrNumber(c)) break; _reader.move(); str.append(c); c = _reader.current(); } } return str.c_str(); }
InlineBotQuery ParseInlineBotQuery(not_null<const Ui::InputField*> field) { auto result = InlineBotQuery(); const auto &text = field->getTextWithTags().text; const auto textLength = text.size(); auto inlineUsernameStart = 1; auto inlineUsernameLength = 0; if (textLength > 2 && text[0] == '@' && text[1].isLetter()) { inlineUsernameLength = 1; for (auto i = inlineUsernameStart + 1; i != textLength; ++i) { const auto ch = text[i]; if (ch.isLetterOrNumber() || ch.unicode() == '_') { ++inlineUsernameLength; continue; } else if (!ch.isSpace()) { inlineUsernameLength = 0; } break; } auto inlineUsernameEnd = inlineUsernameStart + inlineUsernameLength; auto inlineUsernameEqualsText = (inlineUsernameEnd == textLength); auto validInlineUsername = false; if (inlineUsernameEqualsText) { validInlineUsername = text.endsWith(qstr("bot")); } else if (inlineUsernameEnd < textLength && inlineUsernameLength) { validInlineUsername = text[inlineUsernameEnd].isSpace(); } if (validInlineUsername) { auto username = text.midRef(inlineUsernameStart, inlineUsernameLength); if (username != result.username) { result.username = username.toString(); if (const auto peer = App::peerByName(result.username)) { if (const auto user = peer->asUser()) { result.bot = peer->asUser(); } else { result.bot = nullptr; } result.lookingUpBot = false; } else { result.bot = nullptr; result.lookingUpBot = true; } } if (result.lookingUpBot) { result.query = QString(); return result; } else if (result.bot && (!result.bot->botInfo || result.bot->botInfo->inlinePlaceholder.isEmpty())) { result.bot = nullptr; } else { result.query = inlineUsernameEqualsText ? QString() : text.mid(inlineUsernameEnd + 1); return result; } } else { inlineUsernameLength = 0; } } if (inlineUsernameLength < 3) { result.bot = nullptr; result.username = QString(); } result.query = QString(); return result; }