1 /******************************************************************************
2 * Copyright (c) 2000-2016 Ericsson Telecom AB
3 * All rights reserved. This program and the accompanying materials
4 * are made available under the terms of the Eclipse Public License v1.0
5 * which accompanies this distribution, and is available at
6 * http://www.eclipse.org/legal/epl-v10.html
13 ******************************************************************************/
16 #include "Component.hh"
23 expstring_t
TCov::comp(boolean withname
)
25 enum { SINGLE
, HC
, MTC
, PTC
} whoami
;
26 if (TTCN_Runtime::is_single()) whoami
= SINGLE
;
27 else if (TTCN_Runtime::is_hc()) whoami
= HC
;
28 else if (TTCN_Runtime::is_mtc()) whoami
= MTC
;
30 expstring_t ret_val
= NULL
;
32 case SINGLE
: ret_val
= mcopystr("single"); break;
33 case HC
: ret_val
= mcopystr("hc"); break;
34 case MTC
: ret_val
= mcopystr("mtc"); break;
37 const char *compname
= TTCN_Runtime::get_component_name();
38 if (withname
&& compname
!= NULL
) ret_val
= mcopystr(compname
);
39 else ret_val
= mprintf("%d", self
.is_bound() ? (component
)self
: (component
)0);
46 int TCov::ver_major
= 1;
47 int TCov::ver_minor
= 0;
48 Vector
<FileData
*> TCov::m_file_data
;
49 pid_t
TCov::mypid
= getpid();
50 expstring_t
TCov::mycomp
= TCov::comp();
51 expstring_t
TCov::mycomp_name
= TCov::comp(TRUE
);
53 size_t TCov::has_file_name(const char *file_name
)
56 for (; i
< m_file_data
.size(); ++i
)
57 if (!strcmp(file_name
, m_file_data
[i
]->get_file_name()))
58 return static_cast<int>(i
);
62 void TCov::close_file()
64 if (m_file_data
.empty()) {
67 mycomp
= mycomp_name
= NULL
;
70 expstring_t file_name
= mputprintf(NULL
, "tcov-%s.tcd", mycomp
);
71 FILE *fp
= fopen((const char *)file_name
, "w");
72 expstring_t output
= mputprintf(NULL
,
73 "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" \
74 "<?xml-stylesheet type=\"text/xsl\" href=\"tcov.xsl\"?>\n" \
75 "<titan_coverage xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" " \
76 "xsi:schemaLocation=\"tcov.xsd\">\n" \
77 "\t<version major=\"%d\" minor=\"%d\" />\n" \
78 "\t<component id=\"%s\" name=\"%s\" />\n" \
80 ver_major
, ver_minor
, mycomp
, mycomp_name
);
81 for (size_t i
= 0; i
< m_file_data
.size(); ++i
) {
82 const FileData
*file_data
= m_file_data
[i
];
83 output
= mputprintf(output
, "\t\t<file path=\"%s\">\n", file_data
->get_file_name());
84 const Vector
<FunctionData
*>& function_data
= file_data
->get_function_data();
85 const Vector
<LineData
*>& line_data
= file_data
->get_line_data();
86 output
= mputstr(output
, "\t\t\t<functions>\n");
87 for (size_t j
= 0; j
< function_data
.size(); ++j
) {
88 output
= mputprintf(output
, "\t\t\t\t<function name=\"%s\" count=\"%d\" />\n",
89 function_data
[j
]->get_name(), function_data
[j
]->get_count());
91 output
= mputstr(output
, "\t\t\t</functions>\n");
92 output
= mputstr(output
, "\t\t\t<lines>\n");
93 for (size_t j
= 0; j
< line_data
.size(); ++j
) {
94 output
= mputprintf(output
, "\t\t\t\t<line no=\"%d\" count=\"%d\" />\n",
95 line_data
[j
]->get_no(), line_data
[j
]->get_count());
97 output
= mputstr(output
,
101 output
= mputstr(output
,
103 "</titan_coverage>\n");
108 for (size_t i
= 0; i
< m_file_data
.size(); ++i
)
109 delete m_file_data
[i
];
113 mycomp
= mycomp_name
= NULL
;
116 FileData::FileData(const char *file_name
)
118 m_file_name
= mcopystr(file_name
);
121 FileData::~FileData()
125 for (size_t i
= 0; i
< m_function_data
.size(); ++i
)
126 delete m_function_data
[i
];
127 for (size_t i
= 0; i
< m_line_data
.size(); ++i
)
128 delete m_line_data
[i
];
129 m_function_data
.clear();
133 void FileData::reset()
135 for (size_t i
= 0; i
< m_function_data
.size(); ++i
)
136 m_function_data
[i
]->reset();
137 for (size_t i
= 0; i
< m_line_data
.size(); ++i
)
138 m_line_data
[i
]->reset();
141 size_t FileData::has_function_name(const char *function_name
)
144 for (; i
< m_function_data
.size(); ++i
)
145 if (!strcmp(function_name
, m_function_data
[i
]->get_name()))
146 return static_cast<int>(i
);
150 size_t FileData::has_line_no(int line_no
)
153 for (; i
< m_line_data
.size(); ++i
)
154 if (line_no
== m_line_data
[i
]->get_no())
155 return static_cast<int>(i
);
159 void FileData::inc_function(const char *function_name
, int /*line_no*/)
161 size_t i
= has_function_name(function_name
);
162 if (i
== m_function_data
.size())
163 m_function_data
.push_back(new FunctionData(function_name
));
164 ++(*m_function_data
[i
]);
167 void FileData::inc_line(int line_no
)
169 size_t i
= has_line_no(line_no
);
170 if (i
== m_line_data
.size())
171 m_line_data
.push_back(new LineData(line_no
));
175 void FileData::init_function(const char *function_name
)
177 size_t i
= has_function_name(function_name
);
178 if (i
== m_function_data
.size()) m_function_data
.push_back(new FunctionData(function_name
));
181 void FileData::init_line(int line_no
)
183 size_t i
= has_line_no(line_no
);
184 if (i
== m_line_data
.size()) m_line_data
.push_back(new LineData(line_no
));
187 void TCov::pid_check()
197 mycomp_name
= comp(TRUE
);
198 for (size_t i
= 0; i
< m_file_data
.size(); ++i
)
199 m_file_data
[i
]->reset();
203 void TCov::hit(const char *file_name
, int line_no
, const char *function_name
)
206 size_t i
= has_file_name(file_name
);
207 if (i
== m_file_data
.size())
208 m_file_data
.push_back(new FileData(file_name
));
210 m_file_data
[i
]->inc_function(function_name
, line_no
);
211 m_file_data
[i
]->inc_line(line_no
);
214 void TCov::init_file_lines(const char *file_name
, const int line_nos
[], size_t line_nos_len
)
217 size_t i
= has_file_name(file_name
);
218 if (i
== m_file_data
.size())
219 m_file_data
.push_back(new FileData(file_name
));
220 for (size_t j
= 0; j
< line_nos_len
; ++j
)
221 m_file_data
[i
]->init_line(line_nos
[j
]);
224 void TCov::init_file_functions(const char *file_name
, const char *function_names
[], size_t function_names_len
)
227 size_t i
= has_file_name(file_name
);
228 if (i
== m_file_data
.size())
229 m_file_data
.push_back(new FileData(file_name
));
230 for (size_t j
= 0; j
< function_names_len
; ++j
)
231 m_file_data
[i
]->init_function(function_names
[j
]);
This page took 0.037221 seconds and 5 git commands to generate.