bb8400f06cc34df364c931a593ad872c10643d5c
[scilab.git] / scilab / modules / coverage / includes / CovHTMLCodePrinter.hxx
1 /*
2  *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  *  Copyright (C) 2015 - Scilab Enterprises - Calixte DENIZET
4  *
5  *  This file must be used under the terms of the CeCILL.
6  *  This source file is licensed as described in the file COPYING, which
7  *  you should have received as part of this distribution.  The terms
8  *  are also available at
9  *  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
10  *
11  */
12
13 #ifndef __COV_HTML_CODE_PRINTER_HXX__
14 #define __COV_HTML_CODE_PRINTER_HXX__
15
16 #include <iostream>
17 #include <map>
18 #include <sstream>
19 #include <stack>
20 #include <unordered_map>
21 #include <unordered_set>
22 #include <vector>
23
24 #include "CodePrinter.hxx"
25 #include "CoverResult.hxx"
26 #include "URLEncoder.hxx"
27 #include "MacroLoc.hxx"
28
29 namespace coverage
30 {
31 class CovHTMLCodePrinter : public CodePrinter
32 {
33
34     std::ostringstream & out;
35     unsigned int indentLevel;
36     unsigned int counter;
37     unsigned lineCount;
38     bool isNewLine;
39     const ast::Exp * current;
40     const ast::Exp * last;
41     std::map<MacroLoc, CoverResult> & results;
42     std::unordered_set<std::string> locals;
43     std::stack<std::pair<MacroLoc, CoverResult *>> fnStack;
44     unsigned int fnId;
45
46 public:
47
48     CovHTMLCodePrinter(std::ostringstream & _out, std::map<MacroLoc, CoverResult> & _results) : out(_out), indentLevel(0), counter(0), lineCount(0), isNewLine(true), current(nullptr), last(nullptr), results(_results), fnId(0)
49     {
50     }
51
52     void handleDefault(const std::string& seq) override;
53     void handleOperator(const std::string& seq) override;
54     void handleOpenClose(const std::string& seq) override;
55     void handleFunctionKwds(const std::string& seq) override;
56     void handleStructureKwds(const std::string& seq) override;
57     void handleControlKwds(const std::string& seq) override;
58     void handleConstants(const std::string& seq) override;
59     void handleCommands(const std::string& seq) override;
60     void handleMacros(const std::string& seq) override;
61     void handleFunctionName(const std::string& seq) override;
62     void handleFunctionNameDec(const std::string& seq) override;
63     void handleName(const std::string& seq) override;
64     void handleInOutArgsDec(const std::string& seq) override;
65     void handleInOutArgs(const std::string& seq) override;
66     void handleNumber(const std::string& seq) override;
67     void handleSpecial(const std::string& seq) override;
68     void handleString(const std::string& seq) override;
69     void handleNothing(const std::string& seq) override;
70     void handleField(const std::string& seq) override;
71     void handleComment(const std::string& seq) override;
72     void handleNewLine() override;
73     void handleExpStart(const ast::Exp * e) override;
74     void handleExpEnd(const ast::Exp * e) override;
75
76     inline std::size_t getIndentSize() const
77     {
78         return indentLevel * 4;
79     }
80
81     inline void incIndent()
82     {
83         ++indentLevel;
84     }
85
86     inline void decIndent()
87     {
88         --indentLevel;
89     }
90
91     inline unsigned int getLineCharCount() const
92     {
93         return counter;
94     }
95
96     inline void close()
97     {
98         if (lineCount)
99         {
100             out << L"</pre></td><td></td><td></td><td></td>\n</tr>\n";
101             out.flush();
102         }
103     }
104
105     static std::string replaceByEntities(const std::string& seq);
106     static void getDivPercent(std::ostringstream & out, const unsigned int percent);
107     static std::string getOrderButton(const unsigned int tableid, const unsigned int id, const unsigned int col, const bool enabled);
108     static void getFunctionStats(std::ostringstream & out, const MacroLoc & ml, const CoverResult & result);
109
110 private:
111
112     void addNewLineHeader();
113
114     inline const std::string& getCurrentFunctionName() const
115     {
116         return fnStack.top().first.name;
117     }
118
119     inline const MacroLoc & getCurrentMacro() const
120     {
121         return fnStack.top().first;
122     }
123
124     inline CoverResult & getCurrentResult() const
125     {
126         return *fnStack.top().second;
127     }
128
129     inline bool isInsideKnownFunction() const
130     {
131         return !fnStack.empty() && fnStack.top().second != nullptr;
132     }
133
134     inline void count(const std::string& seq)
135     {
136         counter += (unsigned int)seq.length();
137     }
138
139     inline static void pushEntity(std::vector<char> & buf, const char* str, const unsigned char len)
140     {
141         for (unsigned int i = 0; i < len; ++i)
142         {
143             buf.push_back(str[i]);
144         }
145     }
146
147 };
148
149 } // namespace coverage
150
151
152 #endif // __COV_HTML_CODE_PRINTER_HXX__