forked from eranif/codelite
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcscopedbbuilderthread.cpp
102 lines (84 loc) · 2.7 KB
/
cscopedbbuilderthread.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#include "procutils.h"
#include "dirsaver.h"
#include "wx/filefn.h"
#include "cscopedbbuilderthread.h"
#include "cscope.h"
int wxEVT_CSCOPE_THREAD_DONE = wxNewId();
int wxEVT_CSCOPE_THREAD_UPDATE_STATUS = wxNewId();
CscopeDbBuilderThread::CscopeDbBuilderThread()
{
}
CscopeDbBuilderThread::~CscopeDbBuilderThread()
{
}
void CscopeDbBuilderThread::ProcessRequest(ThreadRequest *request)
{
CscopeRequest *req = (CscopeRequest*)request;
//change dir to the workspace directory
DirSaver ds;
wxSetWorkingDirectory(req->GetWorkingDir());
SendStatusEvent( wxT("Executing cscope..."), 10, req->GetOwner() );
//notify the database creation process as completed
wxArrayString output;
//set environment variables required by cscope
wxSetEnv(wxT("TMPDIR"), wxT("."));
ProcUtils::SafeExecuteCommand(req->GetCmd(), output);
SendStatusEvent( wxT("Parsing results..."), 50, req->GetOwner() );
CscopeResultTable *result = ParseResults( output );
SendStatusEvent( wxT("Done"), 100, req->GetOwner() );
wxCommandEvent e(wxEVT_CSCOPE_THREAD_DONE);
e.SetClientData(result);
e.SetString(req->GetEndMsg());
req->GetOwner()->AddPendingEvent(e);
}
CscopeResultTable* CscopeDbBuilderThread::ParseResults(const wxArrayString &output)
{
CscopeResultTable *results = new CscopeResultTable();
for (size_t i=0; i< output.GetCount(); i++) {
//parse each line
wxString line = output.Item(i);
CscopeEntryData data;
//first is the file name
line = line.Trim().Trim(false);
//skip errors
if(line.StartsWith(wxT("cscope:"))){continue;}
wxString file = line.BeforeFirst(wxT(' '));
data.SetFile(file);
line = line.AfterFirst(wxT(' '));
//next is the scope
line = line.Trim().Trim(false);
wxString scope = line.BeforeFirst(wxT(' '));
line = line.AfterFirst(wxT(' '));
data.SetScope( scope );
//next is the line number
line = line.Trim().Trim(false);
long nn;
wxString line_number = line.BeforeFirst(wxT(' '));
line_number.ToLong( &nn );
data.SetLine( nn );
line = line.AfterFirst(wxT(' '));
//the rest is the pattern
wxString pattern = line;
data.SetPattern(pattern);
//insert the result
CscopeResultTable::const_iterator iter = results->find(data.GetFile());
std::vector< CscopeEntryData > *vec(NULL);
if (iter != results->end()) {
//this file already exist, append the result
vec = iter->second;
} else {
vec = new std::vector< CscopeEntryData >();
//add it to the map
(*results)[data.GetFile()] = vec;
}
vec->push_back( data );
}
return results;
}
void CscopeDbBuilderThread::SendStatusEvent(const wxString &msg, int percent, wxEvtHandler *owner)
{
wxCommandEvent e(wxEVT_CSCOPE_THREAD_UPDATE_STATUS);
e.SetString(msg);
e.SetInt(percent);
owner->AddPendingEvent(e);
}