File: cscopedbbuilderthread.cpp

package info (click to toggle)
codelite 14.0+dfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: bullseye, sid
  • size: 112,816 kB
  • sloc: cpp: 483,662; ansic: 150,144; php: 9,569; lex: 4,186; python: 3,417; yacc: 2,820; sh: 1,147; makefile: 52; xml: 13
file content (133 lines) | stat: -rw-r--r-- 4,908 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
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
//
// 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 "cscope.h"
#include "cscopedbbuilderthread.h"
#include "cscopestatusmessage.h"
#include "dirsaver.h"
#include "file_logger.h"
#include "procutils.h"
#include "wx/filefn.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());
    clDEBUG() << "CScope:" << req->GetCmd() << clEndl;
    ProcUtils::SafeExecuteCommand(req->GetCmd(), output);
    SendStatusEvent(_("Parsing results..."), 50, wxEmptyString, req->GetOwner());
    clDEBUG1() << "CScope:\n" << output << clEndl;
    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);
}