void LocationTable::splitByAnchors(const PreprocessedContents& text, const Anchor& textStartPosition, QList<PreprocessedContents>& strings, QList<Anchor>& anchors) const { Anchor currentAnchor = Anchor(textStartPosition); size_t currentOffset = 0; QMapIterator<std::size_t, Anchor> it = m_offsetTable; while (currentOffset < (size_t)text.size()) { Anchor nextAnchor(KDevelop::CursorInRevision::invalid()); size_t nextOffset; if(it.hasNext()) { it.next(); nextOffset = it.key(); nextAnchor = it.value(); }else{ nextOffset = text.size(); nextAnchor = Anchor(KDevelop::CursorInRevision::invalid()); } if( nextOffset-currentOffset > 0 ) { strings.append(text.mid(currentOffset, nextOffset-currentOffset)); anchors.append(currentAnchor); } currentOffset = nextOffset; currentAnchor = nextAnchor; } }
QByteArray stringFromContents(const PreprocessedContents& contents, int offset, int count) { QByteArray ret; for(int a = offset; a < (count ? offset+count : contents.size()); ++a) { if(isCharacter(contents[a])) ret.append(characterFromIndex(contents[a])); else ret += KDevelop::IndexedString::fromIndex(contents[a]).byteArray(); } return ret; }
LocationTable::LocationTable(const PreprocessedContents& contents) : m_positionAtLastOffset(EMPTY_CACHE) { anchor(0, Anchor(0,0), 0); const unsigned int newline = indexFromCharacter('\n'); int line = 0; for (std::size_t i = 0; i < (std::size_t)contents.size(); ++i) if (contents.at(i) == newline) anchor(i + 1, Anchor(++line, 0), 0); }