unsigned int filter(Output* output_, const char* string, unsigned int options, unsigned int limit, const FilterEntries& entries, const FilterEntries* namesOpt) { assert(!namesOpt || namesOpt->entryCount == entries.entryCount); FilterEntries names = {}; std::unique_ptr<FilterEntry[]> nameEntries; std::unique_ptr<char[]> nameBuffer; FilterOutput output(output_, options, limit); if (*string == 0) return dumpEntries(entries, &output); else if (options & SO_FILE_NAMEREGEX) return filterRegex(entries, getNameBuffer(namesOpt, names, entries, nameEntries, nameBuffer), string, &output); else if (options & SO_FILE_PATHREGEX) return filterRegex(entries, entries, string, &output); else if (options & SO_FILE_VISUALASSIST) return filterVisualAssist(entries, getNameBuffer(namesOpt, names, entries, nameEntries, nameBuffer), string, &output); else if (options & SO_FILE_COMMANDT) return filterCommandT(entries, string, &output); else if (options & SO_FILE_COMMANDT_RANKED) return filterCommandTRanked(entries, string, &output); else { output_->error("Unknown file search type\n"); return 0; } }
static unsigned int filterVisualAssist(const FilterEntries& entries, const FilterEntries& names, const char* string, FilterOutput* output) { std::vector<VisualAssistFragment> fragments; for (auto& s: split(string, isspace)) { fragments.emplace_back(); VisualAssistFragment& f = fragments.back(); f.text = s; f.re.reset(createRegex(s.c_str(), getRegexOptions(output->options | SO_LITERAL))); f.ispath = s.find_first_of("/\\") != std::string::npos; } if (fragments.empty()) return dumpEntries(entries, output); // sort name components first, path components last, larger components first std::sort(fragments.begin(), fragments.end(), [](const VisualAssistFragment& lhs, const VisualAssistFragment& rhs) { return (lhs.ispath != rhs.ispath) ? lhs.ispath < rhs.ispath : lhs.text.length() > rhs.text.length(); }); // gather files by first component std::vector<unsigned int> results; filterRegex(fragments[0].ispath ? entries : names, fragments[0].re.get(), (fragments.size() == 1) ? output->limit : ~0u, [&](unsigned int i) { results.push_back(i); }); // filter results by subsequent components for (size_t i = 1; i < fragments.size(); ++i) { const VisualAssistFragment& f = fragments[i]; results.erase(std::remove_if(results.begin(), results.end(), [&](unsigned int i) -> bool { const FilterEntries& matchEntries = f.ispath ? entries : names; const FilterEntry& me = matchEntries.entries[i]; return f.re->search(matchEntries.buffer + me.offset, me.length).size == 0; }), results.end()); } // trim results according to limit if (results.size() > output->limit) results.resize(output->limit); // output results FilterHighlightBuffer hlbuf; for (auto& i: results) { const FilterEntry& e = entries.entries[i]; if (output->options & SO_HIGHLIGHT_MATCHES) processMatchHighlightVisualAssist(fragments, hlbuf, e, entries.buffer, names.entries[i], names.buffer, output); else processMatch(e, entries.buffer, output); } return results.size(); }
int CeeSectionString::dumpEntries(StringTableEntry *e) { if (!e) return 0; else { printf(" HashId: %d, value: %S\n", e->m_hashId, computOffset(e->m_offset)); return dumpEntries(e->m_next) + 1; } }
void CeeSectionString::dumpTable() { int sum = 0, count = 0; for (int i=0; i < MaxRealEntries; i++) { if (stringTable[i]) { printf("Bucket %d\n", i); printf("Total size: %d\n\n", count = dumpEntries(stringTable[i])); sum += count; } } printf("Total number strings: %d\n\n", sum); }