Scilab debugger updates
[scilab.git] / scilab / modules / ast / src / cpp / ast / consoledebugger.cpp
1 /*
2  *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  *  Copyright (C) 2015 - Scilab Enterprises - Antoine ELIAS
4  *
5  * Copyright (C) 2012 - 2016 - Scilab Enterprises
6  *
7  * This file is hereby licensed under the terms of the GNU GPL v2.0,
8  * pursuant to article 5.3.4 of the CeCILL v.2.1.
9  * This file was originally licensed under the terms of the CeCILL v2.1,
10  * and continues to be available under such terms.
11  * For more information, see the COPYING file which you should have received
12  * along with this program.
13  *
14  */
15
16 #include "consoledebugger.hxx"
17 #include "debugmanager.hxx"
18 #include "printvisitor.hxx"
19 #include "configvariable.hxx"
20
21 extern "C"
22 {
23 #include "sciprint.h"
24 #include "prompt.h"
25 #include "storeCommand.h"
26 }
27
28 namespace debugger
29 {
30 void ConsoleDebugger::onStop(int index)
31 {
32     if (index >= 0)
33     {
34         debugger::DebuggerManager* manager = debugger::DebuggerManager::getInstance();
35         debugger::Breakpoint* bp = manager->getBreakPoint(index);
36         if (bp)
37         {
38             if(bp->hasMacro())
39             {
40                 sciprint(_("debugger stop on breakpoint(%d) in function %s at line %d\n"), index, bp->getFunctioName().data(), bp->getMacroLine());
41             }
42             else
43             {
44                 sciprint(_("debugger stop on breakpoint(%d) in file %s at line %d\n"), index, bp->getFileName().data(), bp->getFileLine());
45             }
46         }
47     }
48     printExp();
49 }
50
51 void ConsoleDebugger::onExecution()
52 {
53     // sciprint("ConsoleDebugger::onExecution.\n");
54 }
55
56 void ConsoleDebugger::onExecutionReleased()
57 {
58     // sciprint("ConsoleDebugger::onExecutionReleased.\n");
59     // debugger::DebuggerManager* manager = debugger::DebuggerManager::getInstance();
60     // if(manager->getCurrentBreakPoint())
61     // {
62     //     sciprint("execution stopped on breakpoint.\n");
63     // }
64     // else
65     // {
66     //     sciprint("execution finished.\n");
67     // }
68 }
69
70 void ConsoleDebugger::onPrint(const std::string& variable)
71 {
72     // sciprint("ConsoleDebugger::onPrint.\n");
73     StoreDebuggerCommand(std::string("disp("+variable+")").data());
74 }
75
76 void ConsoleDebugger::onShow(int bp)
77 {
78     // sciprint("ConsoleDebugger::onShow.\n");
79     debugger::DebuggerManager* manager = debugger::DebuggerManager::getInstance();
80     if(bp == -1)
81     {
82         debugger::Breakpoints& bps = manager->getAllBreakPoint();
83         printBreakPoints(bps);
84     }
85     else
86     {
87         debugger::Breakpoints bps;
88         bps.push_back(manager->getBreakPoint(bp));
89         printBreakPoints(bps);
90     }
91 }
92
93 void ConsoleDebugger::onResume()
94 {
95     // sciprint("ConsoleDebugger::onResume.\n");
96 }
97
98 void ConsoleDebugger::onAbort()
99 {
100     sciprint(_("Execution aborted.\n"));
101 }
102
103 void ConsoleDebugger::onErrorInFile(const std::wstring& filename)
104 {
105     debugger::DebuggerManager* manager = debugger::DebuggerManager::getInstance();
106     ast::Exp* exp = manager->getExp();
107     sciprint(_("debugger stop on error in file %ls line %d\n"), filename.data(), exp->getLocation().first_line);
108     printExp();
109 }
110
111 void ConsoleDebugger::onErrorInScript(const std::wstring& funcname)
112 {
113     debugger::DebuggerManager* manager = debugger::DebuggerManager::getInstance();
114     ast::Exp* exp = manager->getExp();
115     sciprint(_("debugger stop on error in function %ls line %d\n"), funcname.data(), exp->getLocation().first_line);
116     printExp();
117 }
118
119 void ConsoleDebugger::onQuit()
120 {
121     sciprint(_("Leave debugger.\n"));
122 }
123
124 void ConsoleDebugger::updateBreakpoints()
125 {
126     debugger::DebuggerManager* manager = debugger::DebuggerManager::getInstance();
127     debugger::Breakpoints& bps = manager->getAllBreakPoint();
128     printBreakPoints(bps);
129 }
130
131 void ConsoleDebugger::printExp()
132 {
133     debugger::DebuggerManager* manager = debugger::DebuggerManager::getInstance();
134     std::wostringstream ostr;
135     ast::PrintVisitor pp(ostr, true, true, true);
136     manager->getExp()->accept(pp);
137     sciprint("%s%ls\n", SCIPROMPT_PAUSE, ostr.str().data());
138 }
139
140 void ConsoleDebugger::printBreakPoints(debugger::Breakpoints& bps)
141 {
142     if (bps.size() == 0)
143     {
144         sciprint("No breakpoint\n");
145         return;
146     }
147
148     sciprint("% 3s % 7s % 24s % 24s  %s\n\n", "num", "enable", "function", "file", "condition");
149     int i = 0;
150     for (const auto& b : bps)
151     {
152         std::string condition = b->getCondition();
153         std::string macro = b->hasMacro() ? b->getFunctioName() + ":" + std::to_string(b->getMacroLine()) : "";
154         std::string file  = b->hasFile()  ? b->getFileName() +    ":" + std::to_string(b->getFileLine())  : "";
155
156         sciprint("% 3d % 7s % 24s % 24s  %s\n",
157                 i, b->isEnable() ? "true" : "false", macro.data(), file.data(),
158                 condition.size() < 30 ? condition.c_str() :
159                     (std::string(condition.begin(), condition.begin() + 27) + "...").c_str());
160         ++i;
161     }
162 }
163 }