Exemple #1
0
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;
	}
}
Exemple #2
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();
}
Exemple #3
0
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;
    }
}
Exemple #4
0
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);
}