void DbContentCacher::Process(wxThread* thread) { wxStopWatch sw; sw.Start(); wxFFile dbFile(m_filename, wxT("rb")); if(dbFile.IsOpened()) { wxString fileContent; wxCSConv fontEncConv(wxFONTENCODING_ISO8859_1); dbFile.ReadAll(&fileContent, fontEncConv); dbFile.Close(); } if (m_parent) { wxCommandEvent e(wxEVT_CMD_DB_CONTENT_CACHE_COMPLETED); e.SetString(wxString::Format(_("Symbols file loaded into OS file system cache (%ld seconds)"), sw.Time()/1000).c_str()); m_parent->AddPendingEvent(e); } }
void SearchThread::DoSearchFile(const wxString& fileName, const SearchData* data) { // Process single lines int lineNumber = 1; if(!wxFileName::FileExists(fileName)) { return; } wxFFile thefile(fileName, wxT("rb")); if(!thefile.IsOpened()) { // failed to open the file, probably because of permissions m_summary.GetFailedFiles().Add(fileName); return; } wxFileOffset size = thefile.Length(); wxString fileData; fileData.Alloc(size); // support for other encoding wxFontEncoding enc = wxFontMapper::GetEncodingFromName(data->GetEncoding().c_str()); wxCSConv fontEncConv(enc); if(!thefile.ReadAll(&fileData, fontEncConv)) { m_summary.GetFailedFiles().Add(fileName); return; } // take a wild guess and see if we really need to construct // a TextStatesPtr object (it is quite an expensive operation) bool shouldCreateStates(true); if(data->IsMatchCase() && !data->IsRegularExpression()) { shouldCreateStates = (fileData.Find(data->GetFindString()) != wxNOT_FOUND); } else if(!data->IsMatchCase() && !data->IsRegularExpression()) { // !data->IsMatchCase() wxString tmpData = fileData; shouldCreateStates = (tmpData.MakeLower().Find(data->GetFindString()) != wxNOT_FOUND); } wxStringTokenizer tkz(fileData, wxT("\n"), wxTOKEN_RET_EMPTY_ALL); // Incase one of the C++ options is enabled, // create a text states object TextStatesPtr states(NULL); if(data->HasCppOptions() && shouldCreateStates && false) { CppWordScanner scanner("", fileData.mb_str().data(), 0); states = scanner.states(); } int lineOffset = 0; if(data->IsRegularExpression()) { // regular expression search while(tkz.HasMoreTokens()) { // Read the next line wxString line = tkz.NextToken(); DoSearchLineRE(line, lineNumber, lineOffset, fileName, data, states); lineOffset += line.Length() + 1; lineNumber++; } } else { // simple search wxString findString; wxArrayString filters; findString = data->GetFindString(); if(data->IsEnablePipeSupport()) { if(data->GetFindString().Find('|') != wxNOT_FOUND) { findString = data->GetFindString().BeforeFirst('|'); wxString filtersString = data->GetFindString().AfterFirst('|'); filters = ::wxStringTokenize(filtersString, "|", wxTOKEN_STRTOK); if(!data->IsMatchCase()) { for(size_t i = 0; i < filters.size(); ++i) { filters.Item(i).MakeLower(); } } } } if(!data->IsMatchCase()) { findString.MakeLower(); } while(tkz.HasMoreTokens()) { // Read the next line wxString line = tkz.NextToken(); DoSearchLine(line, lineNumber, lineOffset, fileName, data, findString, filters, states); lineOffset += line.Length() + 1; lineNumber++; } } if(m_results.empty() == false) SendEvent(wxEVT_SEARCH_THREAD_MATCHFOUND, data->GetOwner()); }
void FindUsageTab::ShowUsage(const std::list<CppToken>& matches, const wxString& searchWhat) { Clear(); int lineNumber(0); wxString text; wxString curfile; wxString curfileContent; wxArrayString lines; text = wxString::Format(_("===== Finding references of '%s' =====\n"), searchWhat.c_str()); lineNumber++; std::list<CppToken>::const_iterator iter = matches.begin(); for(; iter != matches.end(); iter++) { // Print the line number wxString file_name(iter->getFilename()); if(curfile != file_name) { curfile = file_name; wxFileName fn(file_name); fn.MakeRelativeTo(); text << fn.GetFullPath() << wxT("\n"); lineNumber++; // Load the file content wxLogNull nolog; wxFFile thefile(file_name, wxT("rb")); if(thefile.IsOpened()) { wxFileOffset size = thefile.Length(); wxString fileData; fileData.Alloc(size); curfileContent.Clear(); wxCSConv fontEncConv(wxFONTENCODING_ISO8859_1); thefile.ReadAll(&curfileContent, fontEncConv); // break the current file into lines, a line can be an empty string lines = wxStringTokenize(curfileContent, wxT("\n"), wxTOKEN_RET_EMPTY_ALL); } } // Keep the match m_matches[lineNumber] = *iter; // Format the message wxString linenum = wxString::Format(wxT(" %5u "), (unsigned int)iter->getLineNumber() + 1); wxString scopeName(wxT("<global>")); TagEntryPtr tag = TagsManagerST::Get()->FunctionFromFileLine(iter->getFilename(), iter->getLineNumber()); if(tag) { scopeName = tag->GetPath(); } text << linenum << wxT("[ ") << scopeName << wxT(" ] "); if(lines.GetCount() > iter->getLineNumber()) { text << lines.Item(iter->getLineNumber()).Trim().Trim(false); } text << wxT("\n"); lineNumber++; } text << wxString::Format(_("===== Found total of %u matches =====\n"), (unsigned int)m_matches.size()); AppendText(text); }