File: cscopedbbuilderthread.cpp

package info (click to toggle)
codelite 6.1.1%2Bdfsg-4
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 48,992 kB
  • ctags: 43,502
  • sloc: cpp: 334,263; ansic: 18,441; xml: 4,713; yacc: 2,653; lex: 2,449; python: 1,188; sh: 385; makefile: 40
file content (134 lines) | stat: -rw-r--r-- 4,427 bytes parent folder | download | duplicates (2)
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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
//
// copyright            : (C) 2008 by Eran Ifrah
// file name            : cscopedbbuilderthread.cpp
//
// -------------------------------------------------------------------------
// A
//              _____           _      _     _ _
//             /  __ \         | |    | |   (_) |
//             | /  \/ ___   __| | ___| |    _| |_ ___
//             | |    / _ \ / _  |/ _ \ |   | | __/ _ )
//             | \__/\ (_) | (_| |  __/ |___| | ||  __/
//              \____/\___/ \__,_|\___\_____/_|\__\___|
//
//                                                  F i l e
//
//    This program is free software; you can redistribute it and/or modify
//    it under the terms of the GNU General Public License as published by
//    the Free Software Foundation; either version 2 of the License, or
//    (at your option) any later version.
//
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
#include "cscopestatusmessage.h"
#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( _("Executing cscope..."), 10, req->GetFindWhat(), req->GetOwner() );

	//notify the database creation process as completed
	wxArrayString output;

	//set environment variables required by cscope
	wxSetEnv(wxT("TMPDIR"), wxFileName::GetTempDir());
	ProcUtils::SafeExecuteCommand(req->GetCmd(), output);
	SendStatusEvent( _("Parsing results..."), 50, wxEmptyString, req->GetOwner() );

	CScopeResultTable_t *result = ParseResults( output );
	SendStatusEvent( _("Done"), 100, wxEmptyString, req->GetOwner() );

	// send status message
	SendStatusEvent(req->GetEndMsg(), 100, wxEmptyString, req->GetOwner());

	// send the results
	wxCommandEvent e(wxEVT_CSCOPE_THREAD_DONE);
	e.SetClientData(result);
	req->GetOwner()->AddPendingEvent(e);
}

CScopeResultTable_t* CscopeDbBuilderThread::ParseResults(const wxArrayString &output)
{
	CScopeResultTable_t *results = new CScopeResultTable_t();
	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_t::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, const wxString &findWhat, wxEvtHandler *owner)
{
	wxCommandEvent e(wxEVT_CSCOPE_THREAD_UPDATE_STATUS);
	CScopeStatusMessage *statusMsg = new CScopeStatusMessage();
	statusMsg->SetMessage(msg);
	statusMsg->SetPercentage(percent);
	statusMsg->SetFindWhat(findWhat);
	e.SetClientData(statusMsg);

	owner->AddPendingEvent(e);
}