swi_config_sample.xml 54 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!--
  3. Software Index, Copyright 2010, Software Index Project Team
  4. Link: http://swi.sourceforge.net
  5. This file is part of Software Index Tool.
  6. Software Index is free software: you can redistribute it and/or modify
  7. it under the terms of the GNU General Public License as published by
  8. the Free Software Foundation, version 3 of the License.
  9. Software Index is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. GNU General Public License for more details.
  13. You should have received a copy of the GNU General Public License
  14. along with Software Index. If not, see <http://www.gnu.org/licenses/>.
  15. -->
  16. <!--
  17. Configuration file is formed in XML format.
  18. Use this file as a 'configuration file description' and
  19. create new configurations using this file as a baseline.
  20. Comments below provides with the description for all options.
  21. Commented XML sections make patterns for your specific extensions.
  22. Some of them demonstrates usage examples.
  23. -->
  24. <!-- Root node 'swi:configuration' is mandatory. It's name is hardcoded. -->
  25. <swi:configuration>
  26. <!-- Section 'swi:info' is used for descriptive purposes. -->
  27. <swi:info>
  28. <!--
  29. Option 'swi:version' should be equal to 1.
  30. It is reserved for further extensions.
  31. -->
  32. <swi:version>1</swi:version>
  33. <!--
  34. Option 'swi:project/swi:name' is used in the final report.
  35. All objects are references in the following format:
  36. YOUR_PROJECT_NAME/YOUR_MODULE_NAME/FILE/FUNCTION_NAME
  37. Changes in this sections automatically reflected in the report.
  38. -->
  39. <swi:project>
  40. <!-- Modify this option in order to refer to the actual name of your solution -->
  41. <swi:name>YOUR_PROJECT_NAME</swi:name>
  42. </swi:project>
  43. <!--
  44. This section for tracing purposes.
  45. If you workflow assumes history records in project files,
  46. this is the place to keep your records
  47. The section is optional.
  48. -->
  49. <swi:history>
  50. <!-- Section 'swi:revision' can be repeated several times -->
  51. <swi:revision>
  52. <swi:name>ALFA</swi:name>
  53. <swi:user>USER</swi:user>
  54. <swi:comment>Sample configuration with the description created</swi:comment>
  55. </swi:revision>
  56. <!--
  57. Add here the next 'swi:revision' section, for example:
  58. <swi:revision>
  59. <swi:name>BETA</swi:name>
  60. <swi:user>USER</swi:user>
  61. <swi:comment>Description of the next update</swi:comment>
  62. </swi:revision>
  63. -->
  64. </swi:history>
  65. </swi:info>
  66. <!--
  67. The 'swi:general' section configures global settings for the tool.
  68. The section is optional.
  69. -->
  70. <swi:general>
  71. <!--
  72. Filtering of the debug information
  73. The section is optional.
  74. -->
  75. <swi:debug>
  76. <!--
  77. The 'swi:enabled' option activates/deativates the tracing:
  78. Possible values are 'on' and 'off'
  79. By default, the debug is not enabled.
  80. -->
  81. <swi:enabled>off</swi:enabled>
  82. </swi:debug>
  83. </swi:general>
  84. <!-- Section 'swi:modules' define where to get sources and how to process them. -->
  85. <swi:modules>
  86. <!-- Section 'swi:module' can be repeated several times -->
  87. <swi:module>
  88. <!--
  89. Option 'swi:name' is used in the final report.
  90. All objects are references in the following format:
  91. YOUR_PROJECT_NAME/YOUR_MODULE_NAME/FILE/FUNCTION_NAME
  92. Changes in this sections automatically reflected in the report.
  93. Modify this option in order to refer to the actual name of your module
  94. -->
  95. <swi:name>YOUR_MODULE_NAME</swi:name>
  96. <!--
  97. This is a full path to the directory where module's source files are stored
  98. It can be relative or full path (recommended).
  99. If it is relative path, you need to run Software Index tool from the relatively correct folder.
  100. Directory is processed recursively. I.e. files in sub-directories are scanned as well.
  101. In the report and in 'swi:files' section below,
  102. files are referenced relatively to directory configured in 'swi:location'.
  103. -->
  104. <swi:location>/path/to/my/module</swi:location>
  105. <!--
  106. Section 'swi:files' which files to process and which to miss.
  107. The section is optional.
  108. -->
  109. <swi:files>
  110. <!--
  111. This option is a regular expression.
  112. If file name (in module's location) is mathced by this expression,
  113. it is included to the list for processing.
  114. Otherwise, it is missed and not touched by Software Index tool.
  115. The example below matches files with the following extensions:
  116. .c, .h, .cpp, .hpp
  117. By default, all files are included.
  118. If it is a file in sub-directory, it's name
  119. -->
  120. <swi:include>^.*[.][chCH]([pP][pP])?$</swi:include>
  121. <!--
  122. This option is a regular expression.
  123. If file name (in module's location) is mathced by this expression,
  124. it is excluded from the list for processing
  125. (even if it was previously mathced by the previous option).
  126. The example below matches files with the following extensions:
  127. .gz.c, .gz.h, .gz.cpp, .gz.hpp
  128. By default, no files are excluded.
  129. -->
  130. <swi:exclude>^.*[.][gG][zZ][.][chCH]([pP][pP])?$</swi:exclude>
  131. </swi:files>
  132. <!--
  133. The Software Index does not parse 'preprocessor' statements, like a C/C++ compiler.
  134. It just removes lines with preprocessor defines, includes, conditions and so on.
  135. As a result a code may include unfolded preprocessor strings
  136. which are normally replaced/removed by a compiler.
  137. For example, the initial code
  138. line 1: #define MAXIMUM_NUMBER (100)
  139. line 2: #ifdef DEBUG
  140. line 3: if (currentNumber < MAXIMUM_NUMBER) {
  141. line 4: printf("New overflow detected: %d\n", currentNumber);
  142. line 5: count++;
  143. line 6: }
  144. line 7: #else
  145. line 8: if (currentNumber < MAXIMUM_NUMBER) {
  146. line 9: count++;
  147. line 10: }
  148. line 11: #endif
  149. is converted to:
  150. line 1:
  151. line 2:
  152. line 3: if (currentNumber < MAXIMUM_NUMBER) {
  153. line 4: printf("New overflow detected: %d\n", currentNumber);
  154. line 5: count++;
  155. line 6: }
  156. line 7:
  157. line 8: if (currentNumber < MAXIMUM_NUMBER) {
  158. line 9: count++;
  159. line 10: }
  160. line 11:
  161. In the last example, the final code is parsable.
  162. If all your preprocessor statements are in the similar style and does not
  163. corrupt the structure of block start/end delimeters as in the example above,
  164. you do not need to bother about preprocessor stuff.
  165. However, if the initial code includes lines like these:
  166. line 1: #define MAXIMUM_NUMBER (100)
  167. line 2: if (currentNumber < MAXIMUM_NUMBER) {
  168. line 3: #ifdef DEBUG
  169. line 4: printf("New overflow detected: %d\n", currentNumber);
  170. line 5: count++;
  171. line 6: }
  172. line 7: #else
  173. line 8: count++;
  174. line 9: }
  175. line 10: #endif
  176. it is not parsable, because brackets mismatch is detected after preprocessing
  177. (see lines 6 and 9 below):
  178. line 1:
  179. line 2: if (currentNumber < MAXIMUM_NUMBER) {
  180. line 3:
  181. line 4: printf("New overflow detected: %d\n", currentNumber);
  182. line 5: count++;
  183. line 6: }
  184. line 7:
  185. line 8: count++;
  186. line 9: }
  187. line 10:
  188. Thus, in order to use Software Index tool it is necessary to refactor places,
  189. like in the example above.
  190. The section 'swi:preprocessor' is useful in other cases.
  191. For example, if the initial code includes the following lines:
  192. line 1: #define DECLARE_HANDLER(handlerName) \
  193. line 2: int handlerName(unsigned int stateId, \
  194. line 3: unsigned int eventId, \
  195. line 4: struct EVENT_DATA_TYPE eventData)
  196. line 5:
  197. line 6: DECLARE_HANDLER(leftButtonClick);
  198. line 7: DECLARE_HANDLER(rightButtonClick);
  199. line 8:
  200. line 9: DECLARE_HANDLER(leftButtonClick)
  201. line 10: {
  202. line 11: /* This function is called when left mouse button is clicked */
  203. line 12: ...
  204. line 13: }
  205. line 14:
  206. line 15: DECLARE_HANDLER(rightButtonClick)
  207. line 16: {
  208. line 17: /* This function is called when right mouse button is clicked */
  209. line 18: ...
  210. line 19: }
  211. line 20:
  212. Software Index tool detects function DECLARE_HANDLER twice. As a result, they will be named:
  213. 'DECLARE_HANDLER' and 'DECLARE_HANDLER (2)' accordingly.
  214. The better solution is to preprocess these strings using the preprocessor feature.
  215. For this particular example, it is recommended to define the rule which replaces the string:
  216. lines 6,7,9,15: DECLARE_HANDLER(_xxx_)
  217. by
  218. lines 6,7,9,15: int _xxx_(unsigned int stateId, unsigned int eventId, struct EVENT_DATA_TYPE eventData)
  219. where
  220. _xxx_ is the actual function name.
  221. In other words, the 'swi:preprocessor' section should include the following XML tags:
  222. <swi:rule>
  223. <swi:filepattern>your_regexp_file_pattern</swi:filepattern>
  224. <swi:searchpattern>([^_a-zA-Z0-9])DECLARE_HANDLER\(([^_a-zA-Z0-9])\)</swi:searchpattern>
  225. <swi:replacepattern>${1}int ${2}(unsigned int stateId, unsigned int eventId, struct EVENT_DATA_TYPE eventData)</swi:replacepattern>
  226. </swi:rule>
  227. As a result, the functions will be detected with the correct names:
  228. 'leftButtonClick' and 'rightButtonClick' accordingly.
  229. 'swi:preprocessor' section is optional.
  230. -->
  231. <swi:preprocessor>
  232. <!-- Section 'swi:rule' is optional or can be repeated several times -->
  233. <swi:rule>
  234. <!--
  235. This option is a regular expression.
  236. If name of file which is under processing is mathced by this expression,
  237. it is preprocessed according to the rule definitions.
  238. Otherwise, it is missed and not touched by the internal preprocessor tool.
  239. The example below matches files with the following extensions:
  240. .h, .hpp
  241. -->
  242. <swi:filepattern>^.*[.][hH]([pP][pP])?$</swi:filepattern>
  243. <!--
  244. Options 'swi:searchpattern' and 'swi:replacepattern' are regular expressions.
  245. Preprocessor searches the code by the 'swi:searchpattern' pattern.
  246. If it is found it is replaced by 'swi:replacepattern' string,
  247. which is interpolated before: variables ${1}, ${2}, ... are replaced by actual strings
  248. from 'swi:searchpattern' regexp hooks.
  249. -->
  250. <swi:searchpattern>([^_a-zA-Z0-9])DECLARE_HANDLER\(([_a-zA-Z0-9]+)\)</swi:searchpattern>
  251. <swi:replacepattern>${1}int ${2}(unsigned int stateId, unsigned int eventId, struct EVENT_DATA_TYPE eventData)</swi:replacepattern>
  252. </swi:rule>
  253. <!--
  254. Add here the next 'swi:rule' section, for example:
  255. <swi:rule>
  256. <swi:filepattern>.*</swi:filepattern>
  257. <swi:searchpattern>(\s+)(union\s*)({)</swi:searchpattern>
  258. <swi:replacepattern>$1$2 _noname_ $3</swi:replacepattern>
  259. </swi:rule>
  260. -->
  261. </swi:preprocessor>
  262. <!--
  263. Scaner tool is used for global searching and violation reporting.
  264. If the scaner finds something, it reports the message which is also configured
  265. and increases the exit code from the Software Index Tool.
  266. For example, if you codding style requires to open the block begging from the new line:
  267. line 1:
  268. line 2: if (currentNumber < MAXIMUM_NUMBER)
  269. line 3: {
  270. line 4: count++;
  271. line 5: }
  272. line 6:
  273. it is possible to check it by scaner defining the 'swi:searchpattern' in the following way:
  274. [\n][^{][{]
  275. This regular expression matches the code which is 'badly' formated:
  276. line 1:
  277. line 2: if (currentNumber < MAXIMUM_NUMBER) {
  278. line 3: count++;
  279. line 4: }
  280. line 5:
  281. More examples. If you codding style does not allow to have noname structures, enums or unions:
  282. line 1:
  283. line 2: typedef struct _NAME_HERE_IS_MANDATORY_
  284. line 3: {
  285. line 4: int a;
  286. line 5: } my_type;
  287. line 6:
  288. it is possible to check it by scaner defining the 'swi:searchpattern' in the following way:
  289. (\s+)((union)|(enum)|(struct))(\s*{)
  290. This regular expression matches the code which is 'wrongly' written:
  291. line 1:
  292. line 2: typedef struct // noname here
  293. line 3: {
  294. line 4: int a;
  295. line 5: } my_type;
  296. line 6:
  297. And if the 'swi:messagepattern' equals to:
  298. Noname '$2' detected.
  299. the error report looks like this:
  300. file.c:2: warning: Noname 'struct' detected.
  301. 'swi:scaner' section is optional.
  302. -->
  303. <swi:scanner>
  304. <!-- Section 'swi:rule' can be missed or repeated several times -->
  305. <swi:rule>
  306. <!--
  307. This option is a regular expression.
  308. If name of file which is under processing is mathced by this expression,
  309. it is scaned according to the rule definitions.
  310. Otherwise, it is missed and not touched by the internal scaner tool.
  311. The example below matches all files.
  312. -->
  313. <swi:filepattern>.*</swi:filepattern>
  314. <!--
  315. Options 'swi:searchpattern' and 'swi:messagepattern' are regular expressions.
  316. Scaner searches the code by the 'swi:searchpattern' pattern.
  317. If it is found the 'swi:messagepattern' string is printed to STDERR,
  318. 'swi:messagepattern' string is interpolated: variables ${1}, ${2}, ... are replaced by actual strings
  319. from 'swi:searchpattern' regexp hooks.
  320. -->
  321. <swi:searchpattern>(\s+)((union)|(enum)|(struct))(\s*{)</swi:searchpattern>
  322. <swi:messagepattern>Noname '$2' detected.</swi:messagepattern>
  323. <!--
  324. The 'swi:codecontent' option defines the content for scanner, it can be:
  325. initial - the initial source content
  326. code - the initial code (without comments)
  327. comments - comments only (no code)
  328. nopreprocessor - preprocessor strings excluded (without comments and preprocessor)
  329. nostrings - strings excluded (without comments and strings)
  330. purified - strings and preprocessor excluded (without comments, strings and preprocessor)
  331. commentheader - comments before function's header
  332. functionname - name of a function
  333. functionhead - purified function's header, no body
  334. functionbody - purified function's body, no header
  335. By default, the 'purified' code is scanned
  336. -->
  337. <swi:codecontent>purified</swi:codecontent>
  338. </swi:rule>
  339. <!--
  340. Add here the next 'swi:rule' section, for example:
  341. <swi:rule>
  342. <swi:filepattern>.*</swi:filepattern>
  343. <swi:searchpattern>#define\s*([_a-zA-Z0-9]+)\s*[\(]?([0-9]+)[\)]?</swi:searchpattern>
  344. <swi:messagepattern>Define '${1}' of the number '${2}'
  345. should be replaced by 'static const int ${1} = ${2};'</swi:messagepattern>
  346. <swi:codecontent>nostrings</swi:codecontent>
  347. </swi:rule>
  348. -->
  349. <!--
  350. If some finding is acceptable and should not be considered as a violation
  351. it is possible to define the exception and suppress the notification
  352. in the 'swi:suppress' section below.
  353. -->
  354. <swi:suppress>
  355. <!--
  356. The exception should be defined in combination with 'swi:message' option.
  357. If a scanner's message is matched by the regular expression 'swi:message'
  358. and the object is matched by the regular expression in 'swi:pattern' tag,
  359. the finding is ignored and not printed to the log and stderr streams.
  360. For example, the following pattern blocks the notification:
  361. 'Noname 'enum' detected.'
  362. for the object:
  363. YOUR_PROJECT_NAME/YOUR_MODULE_NAME/your_file.c/yourFunction
  364. -->
  365. <swi:pattern swi:message="Noname 'enum' detected.">^YOUR_PROJECT_NAME/YOUR_MODULE_NAME/your_file.c/yourFunction$</swi:pattern>
  366. <!--
  367. Add here the next 'swi:pattern' section, for example:
  368. <swi:pattern swi:message="Noname 'struct' detected.">^.*/.*/file2.c/function2$</swi:pattern>
  369. -->
  370. </swi:suppress>
  371. </swi:scanner>
  372. <!--
  373. Indexer measures common software statistics per functions, files, modules and project.
  374. They are:
  375. STATICTIC-GROUP / STATISTIC-NAME - DESCRIPTION
  376. =============== / ================== - ============================
  377. swi:length / swi:source - total number of symbols
  378. swi:length / swi:blank - number of space symbols
  379. swi:length / swi:executable - number of executable symbols
  380. swi:length / swi:comment - number of symbols inside comments
  381. swi:length / swi:function:name - number of symbols in name of a function
  382. swi:lines / swi:comment:header - number of lines in a comment before a function/file
  383. swi:lines / swi:source - total number of lines
  384. swi:lines / swi:blank - number of empty lines
  385. swi:lines / swi:executable - number of executable lines
  386. swi:lines / swi:comment - number of lines with comments
  387. swi:complexity / swi:blocks - number of blocks
  388. swi:complexity / swi:cyclomatic - McCabe's (Myer's) Cyclomatic complexity metric
  389. swi:complexity / swi:maxdepth - Maximum indent level
  390. swi:count / swi:functions - Number of functions
  391. swi:count / swi:files - Number of files
  392. swi:count / swi:modules - Number of modules
  393. swi:checksum / swi:source - Checksum for the source code (compare purposes)
  394. Every statistic is reported incombination with the following types:
  395. STATICTIC-TYPE - DESCRIPTION
  396. =============== - ============================
  397. swi:exact - exact value
  398. swi:average - average value within a distribution
  399. swi:min - minimum value within a distribution
  400. swi:max - maximum value within a distribution
  401. swi:total - sum of values within a distribution
  402. Cumulative types (swi:average, swi:min, swi:max and swi:total) are reported if they are applicable.
  403. 'swi:indexer:common' section is optional.
  404. -->
  405. <swi:indexer:common>
  406. <!-- No settings currently available -->
  407. </swi:indexer:common>
  408. <!--
  409. Duplication indexer searches for identical code fragments, calculates total number of symbols
  410. in continues duplicated fragments per function, file, module and project.
  411. Note: blank symbols (spaces, tabulations, newlines) are ignored when strings are compared.
  412. The duplciation statistic is reported by reference 'swi:duplication/swi:symbols':
  413. STATICTIC-GROUP / STATISTIC-NAME - DESCRIPTION
  414. =============== / ================== - ============================
  415. swi:duplication / swi:symbols - Number of duplicated symbols
  416. The statistic is reported incombination with the following types:
  417. STATICTIC-TYPE - DESCRIPTION
  418. =============== - ============================
  419. swi:exact - exact value
  420. swi:average - average value within a distribution
  421. swi:min - minimum value within a distribution
  422. swi:max - maximum value within a distribution
  423. swi:total - sum of values within a distribution
  424. Cumulative types (swi:average, swi:min, swi:max and swi:total) are reported if they are applicable.
  425. This internal tool also collects pointers to duplicated fragments and prints them.
  426. Also, they can be easily extracted from the final report for other needs.
  427. 'swi:indexer:dup' section is optional.
  428. -->
  429. <swi:indexer:dup>
  430. <!--
  431. The 'swi:codecontent' option defines the content for the duplicatiion searcher, it can be:
  432. initial - the initial source content
  433. code - the initial code (without comments)
  434. comments - comments only (no code)
  435. nopreprocessor - preprocessor strings excluded (without comments and preprocessor)
  436. nostrings - strings excluded (without comments and strings)
  437. purified - strings and preprocessor excluded (without comments, strings and preprocessor)
  438. commentheader - comments before function's header
  439. functionname - name of a function
  440. functionhead - purified function's header, no body
  441. functionbody - purified function's body, no header
  442. By default, the 'purified' content is used.
  443. Recomendation: if Software Index tool detects a log of duplicated fragments
  444. which are within function's header (declarations), usually it is the case when
  445. where are overloaded functions with a huge list of arguments, it is recommended
  446. to set 'swi:codecontent' option to 'functionbody' value.
  447. -->
  448. <swi:codecontent>purified</swi:codecontent>
  449. <!--
  450. The 'swi:enabled' option activates/deativates the calculation of the duplication index:
  451. on - the search tool is launched and the statistic is calculated
  452. off - the search tool is not started, the statistic is reported by zeros
  453. By default, the this feature is enabled
  454. -->
  455. <swi:enabled>on</swi:enabled>
  456. <!--
  457. The 'swi:minlength' option defines the minimal length of the duplicated fragment.
  458. In other words, if the duplicated fragment is found it is at least 'swi:minlength' in length
  459. Too small value, for example 10, results in excessive growth of the total duplication index
  460. Too large value may cause the empty search result.
  461. By default, it is equal to 100.
  462. -->
  463. <swi:minlength>100</swi:minlength>
  464. <!--
  465. The 'swi:proximity' option allows to report two code fragments as duplicated
  466. even if they are not matched exactly till the end.
  467. It helps to search 'almost' duplicated code fragments instead of 'exactly' duplicated.
  468. This option is a value from 1 till 100.
  469. For example, if there is found group of duplicated code fragments
  470. which are 100 symbols in length and 'swi:proximity' is equal to 80,
  471. this group will be extended by other found code fragments
  472. which have 80 or more the same symbols.
  473. By default, it is equal to 100.
  474. -->
  475. <swi:proximity>100</swi:proximity>
  476. <!--
  477. All code fragments are related to some function.
  478. Except global defines, declarations, class definitions and so on.
  479. Software Index attaches global code to the 'dummy' function with name '>>>GLOBAL<<<'.
  480. The 'swi:globalcode' configures whether the global code should be included
  481. to the scope of search for duplication.
  482. on - global code is scaned for duplication
  483. off - global code is missed
  484. By default, the this option is 'off'.
  485. -->
  486. <swi:globalcode>on</swi:globalcode>
  487. </swi:indexer:dup>
  488. <!--
  489. gcc/g++ compilers in combination with gcov tool are able to report
  490. statement and branch coverage information and statistics.
  491. Software Index has a bridge to this information which is configured
  492. in the 'swi:indexer:gcov' section below.
  493. Note: the feature works only if 'gcov' is visible in PATH environment.
  494. The short summary about possible coverage metrics:
  495. * Function coverage
  496. Has each function in the program been executed?
  497. * Statement coverage
  498. Has each line of the source code been executed?
  499. If at least one statement is executed, 'Function coverage' metric
  500. is equal to 100% (i.e. a function is executed at least once)
  501. * Decision coverage
  502. Has each control structure (such as an if statement) evaluated both to true
  503. and false?
  504. * Condition coverage
  505. Has each boolean sub-expression evaluated both to true and false?
  506. More 'strict' metric than 'Decision coverage'.
  507. * Modified Condition/Decision Coverage (MC/DC)
  508. Has every condition in a decision taken on all possible outcomes at least
  509. once? Has each condition been shown to affect that decision outcome
  510. independently?
  511. * Path coverage
  512. Has every possible route through a given part of the code been executed?
  513. * Entry/exit coverage
  514. Has every possible call and return of the function been executed?
  515. The coverage statistic is reported by the following indexes:
  516. STATICTIC-GROUP / STATISTIC-NAME - DESCRIPTION (*)
  517. =============== / ================== - ============================
  518. swi:coverage / swi:gsum:lines - Total number of executable lines/statements
  519. (from point of compiler view)
  520. swi:coverage / swi:gsum:branches - Total number of branches
  521. swi:coverage / swi:gsum:calls - Total number of calls
  522. swi:coverage / swi:gcov:lines - Number of executed lines
  523. (the same as 'Statement coverage' metric in the list above)
  524. swi:coverage / swi:gcov:branches - Number of exected branches
  525. (no analogue in the list of coverage metrics above;
  526. incremented by 2 for a boolean condition (2 branches)
  527. if a condition is evaluated at least once
  528. and resulted either in true OR in false)
  529. swi:coverage / swi:gcov:takenonce - Number of branches executed at least once
  530. (the same as 'Condition coverage' metric in the list above;
  531. a boolean condition (2 branches) is totaly covered
  532. if a boolean sub-expression evaluated both
  533. to true and false at least once)
  534. swi:coverage / swi:gcov:calls - Number of exectuted calls
  535. (the same as 'Entry/exit coverage' metric in the list above)
  536. (*) For more details about reported numbers see the documentation for 'gcov' tool.
  537. The statistic is reported incombination with the following types:
  538. STATICTIC-TYPE - DESCRIPTION
  539. =============== - ============================
  540. swi:exact - exact value
  541. swi:average - average value within a distribution
  542. swi:min - minimum value within a distribution
  543. swi:max - maximum value within a distribution
  544. swi:total - sum of values within a distribution
  545. Cumulative types (swi:average, swi:min, swi:max and swi:total) are reported if they are applicable.
  546. 'swi:indexer:gcov' section is optional.
  547. If it is missed coverage statistic is not collected.
  548. -->
  549. <swi:indexer:gcov>
  550. <!--
  551. The 'swi:enabled' option activates/deativates the collection of coverage statistic:
  552. on - active
  553. off - inactive, coverage statistic is not collected and not reported
  554. By default, the this is not enabled
  555. -->
  556. <swi:enabled>on</swi:enabled>
  557. <!--
  558. This option is a regular expression.
  559. If name of file which is under processing is mathced by this expression,
  560. coverage statistic is retrieved for this file.
  561. Otherwise, coverage statistic is not reported.
  562. By default, all files are affected.
  563. -->
  564. <swi:filepattern>^.*[.][cC][pP]?[pP]?$</swi:filepattern>
  565. <!--
  566. The coverage statistic is avaialble in 'gcda' files.
  567. gcov tool reads these files and reports the information.
  568. Every source file, if it is touched by gcov, has
  569. corresponding gcda file.
  570. For example, if the initial source file is 'file.c' and
  571. the compiled binary file is 'file.o', the
  572. corresponding 'gcda' file with coverage data is 'file.gcda'
  573. Two options below define how to map
  574. the initial source file to the file with coverage data.
  575. 'swi:sourcefile' is a regular expression. It is applied to name of a file.
  576. This operation gives variables ${1}, ${2}, ... according
  577. to regexp hooks.
  578. 'swi:gcdafile' constructs the corresponding 'gcda' file.
  579. The example below demostrates the case of mapping:
  580. from 'file.c' to 'file.gcda'
  581. from 'otehrfile.c' to 'otherfile.gcda'
  582. and so on...
  583. If the 'gcda' file is not found, coverage statistic is not collected and not reported.
  584. The example below demonstrates the default mapping scheme if options are missed.
  585. -->
  586. <swi:sourcefile>(.*)[.][cC][pP]?[pP]?</swi:sourcefile>
  587. <swi:gcdafile>${1}.gcda</swi:gcdafile>
  588. </swi:indexer:gcov>
  589. </swi:module>
  590. <!--
  591. Add here the next 'swi:module' section.
  592. -->
  593. </swi:modules>
  594. <!--
  595. The 'swi:report' section defines the location for reports and output settings.
  596. -->
  597. <swi:report>
  598. <!--
  599. This is a full path to the directory where report files should be stored
  600. It can be relative or full path (recommended).
  601. If it is relative path, you need to run Software Index tool from the relatively correct folder.
  602. -->
  603. <swi:destination>/path/to/the/destination/folder</swi:destination>
  604. <!--
  605. The main report is generated to XML format.
  606. Other files are created from the XML file by converters.
  607. -->
  608. <swi:xml>
  609. <!-- Name of final XML file in 'swi:destination' directory. -->
  610. <swi:name>swi_report_sample.xml</swi:name>
  611. <!--
  612. Software Index process software modules independantly from their versions.
  613. However, if it is executed with a reference to a report generated by
  614. Software Index tool for the baseline versions of your modules
  615. (baseline version - previous version of the product, the state of product
  616. before the time when changes and updates and/or additions applied)
  617. it has additional information and can report the modification status
  618. for every statistic (increased/decreased) and for every
  619. function, file and module (added, removed, modified, cloned or unmodified).
  620. Description of modification statuses:
  621. added - there was no object in the baseline version
  622. and it was added to the current version
  623. removed - there was object in the baseline version
  624. and it was removed from the current version
  625. modified - there was object in the baseline version
  626. and it was changed/updated
  627. cloned - there was object in the baseline version,
  628. it was not changed/updated in the new version,
  629. but duplication index (swi:duplication/swi:executable)
  630. was decreased or increased
  631. unmodified - the object was now touched
  632. In addition to the extra info, it helps to filter the output information.
  633. For example, it is possible to print limit overheads for added and
  634. modified functions only (missing analogues messages for untouched objects).
  635. As a result, Software Index tool can be deployed to the software development
  636. process without extra work and remakes in your old sources.
  637. You can always start to measure/control the characteristics of
  638. objectes (functions) which are affected by your recent updates only,
  639. improving the total quality step-by-step (version-by-version).
  640. See 'Example 1' in the next section for examples.
  641. The 'swi:baseline' option points out to the report for the baseline version.
  642. It should be stored in 'swi:destination' directory.
  643. If it is not defined,
  644. it is considered that all objects (functions, files and so on) were added.
  645. -->
  646. <swi:baseline>swi_report_sample.xml</swi:baseline>
  647. </swi:xml>
  648. <!--
  649. Notifications are prinited to file and to stderr stream.
  650. They highlight exceeded limitations of indexes/statistics
  651. and other notices, warnings and errors.
  652. -->
  653. <swi:notifications>
  654. <!-- Name of log file in 'swi:destination' directory. -->
  655. <swi:name>swi_report_sample.log</swi:name>
  656. <!--
  657. Flags in XML sub-tags in 'swi:error' section
  658. activate/deactivate counter of errors/notifications.
  659. If the object with the corresponding modification status
  660. has some notification (exceeded limit, for example),
  661. the error counter is increased.
  662. The final value of the error counter is returned
  663. to the operation system as exit code.
  664. Thus, if there are no notifications/errors, exit code is zero.
  665. Options should be equal to some value from the list below:
  666. on - counter is increased (selected by default for all)
  667. off - counter is not increased
  668. Example 1: 'easy deployment of the tool'
  669. added - 'on'
  670. removed - 'on' or 'off'
  671. modified - 'on'
  672. cloned - 'on' or 'off'
  673. unmodified - 'off'
  674. Example 2: 'global control'
  675. added - 'on'
  676. removed - 'on'
  677. modified - 'on'
  678. cloned - 'on'
  679. unmodified - 'on'
  680. Example 3: 'always success (zero exit code)'
  681. added - 'off'
  682. removed - 'off'
  683. modified - 'off'
  684. cloned - 'off'
  685. unmodified - 'off'
  686. 'swi:error' section is optional.
  687. -->
  688. <swi:error>
  689. <swi:added>on</swi:added>
  690. <swi:removed>on</swi:removed>
  691. <swi:modified>on</swi:modified>
  692. <swi:cloned>on</swi:cloned>
  693. <swi:unmodified>on</swi:unmodified>
  694. </swi:error>
  695. <!--
  696. The 'swi:print' section defines which messages should be printed
  697. to the log and to stderr stream. By analogy with the previous
  698. configuration section, the flags are defined per modification status.
  699. There are 4 types of messages which are configred by
  700. 'swi:failures', 'swi:modifications', 'swi:duplications' and 'swi:scanmessages' options.
  701. (*) 'swi:failures' - notifications about broken limits
  702. (see 'swi:limits' section below)
  703. By default, these messages are activated
  704. 'swi:modifications' - notes about added/modified/cloned/removed objects
  705. (see 'swi:xml/swi:baseline' option above
  706. By default, these messages are activated
  707. (**) 'swi:duplications' - pointers to the duplicated regions in files
  708. (see 'swi:indexer:dup' sections above)
  709. (!) By default, these messages are NOT activated
  710. (*) 'swi:scanmessages' - messages collected by the internal scaner tool
  711. (see 'swi:scaner' sections above)
  712. By default, these messages are activated
  713. (*) marks types of messages which affect the exit code (see 'swi:error' section above).
  714. (**) these messages are always printed for an object if there failures for the index:
  715. 'swi:duplication/swi:symbols/swi:exact'
  716. 'swi:print' section can be missed or empty. In this case default values are applied.
  717. -->
  718. <swi:print>
  719. <swi:added>
  720. <swi:failures>on</swi:failures>
  721. <swi:modifications>off</swi:modifications>
  722. <swi:duplications>off</swi:duplications>
  723. <swi:scanmessages>on</swi:scanmessages>
  724. </swi:added>
  725. <swi:removed>
  726. <swi:failures>on</swi:failures>
  727. <swi:modifications>off</swi:modifications>
  728. <swi:duplications>off</swi:duplications>
  729. <swi:scanmessages>on</swi:scanmessages>
  730. </swi:removed>
  731. <swi:modified>
  732. <swi:failures>on</swi:failures>
  733. <swi:modifications>off</swi:modifications>
  734. <swi:duplications>off</swi:duplications>
  735. <swi:scanmessages>on</swi:scanmessages>
  736. </swi:modified>
  737. <swi:cloned>
  738. <swi:failures>on</swi:failures>
  739. <swi:modifications>off</swi:modifications>
  740. <swi:duplications>off</swi:duplications>
  741. <swi:scanmessages>on</swi:scanmessages>
  742. </swi:cloned>
  743. <swi:unmodified>
  744. <swi:failures>on</swi:failures>
  745. <swi:modifications>off</swi:modifications>
  746. <swi:duplications>off</swi:duplications>
  747. <swi:scanmessages>on</swi:scanmessages>
  748. </swi:unmodified>
  749. </swi:print>
  750. </swi:notifications>
  751. </swi:report>
  752. <!--
  753. Software Index tool is able to validate
  754. that the particular statistic is in the acceptable range.
  755. Limits should be defined per:
  756. STATISTIC-GROUP / STATISTIC-NAME / STATISTIC-TYPE
  757. (See sections 'swi:indexer:common' and 'swi:indexer:dup' above)
  758. 'swi:limits' section is optional.
  759. -->
  760. <swi:limits>
  761. <!--
  762. For example, if it is required to have proper (not too short)
  763. comment header, it is necessary to limit the statistic:
  764. 'swi:lines/swi:comment:header/swi:exact'
  765. It is demonstarted in the following section:
  766. -->
  767. <!-- STATISTIC-GROUP -->
  768. <swi:lines>
  769. <!-- STATISTIC-NAME -->
  770. <swi:comment:header>
  771. <!-- STATISTIC-TYPE -->
  772. <swi:exact>
  773. <!--
  774. After that, actual limits should be defined for three levels:
  775. info, notice, warning
  776. The common rule is that options should be in order:
  777. 'swi:info' < 'swi:notice' < 'swi:warning'
  778. OR:
  779. 'swi:info' > 'swi:notice' > 'swi:warning'
  780. Note: limits can be negative, in this case they do not have any sense.
  781. In the example below, no messages are printed for a function
  782. if comment header before includes 5 lines at least.
  783. If it is so, the 'regular' level is attached to this function.
  784. If comment has 3-4 lines, level 'info' is assigned.
  785. If comment has 1-2 lines, level 'notice' is assigned.
  786. If there are no comments at all (0 lines), level 'warning' is assigned.
  787. -->
  788. <swi:info>5</swi:info>
  789. <swi:notice>3</swi:notice>
  790. <swi:warning>1</swi:warning>
  791. <!--
  792. The next option is a regular expression.
  793. If name of object which is under processing is mathced by this expression,
  794. the limit is applied to this object.
  795. Otherwise, the object is missed and the level becomes 'undefined' for the object.
  796. For example, value '^MY_PROJECT/MY_MODULE$' requires to apply the limit
  797. to the module only, missing statistics for the project, files and functions.
  798. By default, statistics are validated for all objects.
  799. -->
  800. <swi:objectpattern>.*</swi:objectpattern>
  801. <!--
  802. If some object is evaluated in non-regular level (info/notice/warning)
  803. and you consider that it is too excessive to fix it
  804. (or just there are no needs/benefits to do it),
  805. it is possible to define the exception and suppress the notification
  806. in the 'swi:suppress' section below.
  807. The exception should be defined in combination with 'swi:level' option.
  808. If there is notification for the object:
  809. MY_PROJECT/MY_MODULE/my_file.c/myFunction
  810. with 'notice' level, the 'swi:level' should be equal to 'notice'.
  811. Otherwise, the notification will be still printed.
  812. In other words, severity of the message and suppress level should be equal.
  813. Also, one rule can suppress several objects. An object is considered as
  814. suppressed if it is matched by regular expression in 'swi:pattern' option.
  815. For example, the regexp pattern
  816. MY_PROJECT/MY_MODULE/my_file.c/.*
  817. suppresses all functions in my_file.c in scope of
  818. MY_MODULE module in MY_PROJECT project.
  819. However, it it NOT recommended to use multiple suppressing,
  820. due to possible missmatch in severity of messages:
  821. For example, if there are two functions:
  822. MY_PROJECT/MY_MODULE/my_file.c/myFunction1
  823. MY_PROJECT/MY_MODULE/my_file.c/myFunction2
  824. and one of them is reported by the message with 'notice' level
  825. but the second is evaluated in 'regular' level,
  826. the 'swi:pattern' rule:
  827. MY_PROJECT/MY_MODULE/my_file.c/.*
  828. will always result in the unsuppressable message,
  829. either for the first or for the second function.
  830. It is better to suppress all objects by their full reference.
  831. For example (see the previous example for prehistory)
  832. <swi:pattern swi:level="notice">^MY_PROJECT/MY_MODULE/my_file.c/myFunction1$</swi:pattern>
  833. Symbols '^' and '$' are special regexp modifiers. They require immidiate borders in the name.
  834. -->
  835. <swi:suppress>
  836. <!-- Section 'swi:pattern' can be repeated several times -->
  837. <swi:pattern swi:level="notice">^MY_PROJECT/MY_MODULE/my_file.c/myFunction1$</swi:pattern>
  838. <!--
  839. Add here the next 'swi:pattern' section, for example:
  840. <swi:pattern swi:level="warning">^.*/.*/file2.c/operator new[]$</swi:pattern>
  841. -->
  842. </swi:suppress>
  843. </swi:exact>
  844. </swi:comment:header>
  845. <!-- STATISTIC-NAME -->
  846. <swi:comment>
  847. <!--
  848. This is the next example of a limit for statistic.
  849. It demonstrates how to limit the relative values.
  850. For example, it is required to have at least 30% of comments per every function.
  851. This is defined by the relation:
  852. 'swi:lines/swi:comment/swi:exact' / 'swi:lines/swi:executable/swi:exact' * 100%.
  853. In this case it is necessary to limit 'swi:lines/swi:comment/swi:exact'
  854. (what we do here) in the relation with 'swi:lines/swi:executable/swi:exact'.
  855. Note: if statistic in the relation ('swi:lines/swi:executable/swi:exact'
  856. in this example) is not defined OR equal to zero,
  857. result depends on the sign of the limited statistic
  858. ('swi:lines/swi:comment/swi:exact' in this example):
  859. if statistic > 0 than relative statistic becomes 'Infinity'
  860. if statistic < 0 than relative statistic becomes '-Infinity'
  861. if statistic = 0 than relative statistic becomes equals to '1.00'
  862. -->
  863. <swi:exact swi:relation="swi:lines/swi:executable/swi:exact">
  864. <!-- 0.3 is 30% -->
  865. <swi:info>0.3</swi:info>
  866. <!-- 0.25 is 25% -->
  867. <swi:notice>0.25</swi:notice>
  868. <!-- 0.2 is 20% -->
  869. <swi:warning>0.2</swi:warning>
  870. <!--
  871. Add here suppress section, if it is needed. For example:
  872. <swi:suppress>
  873. <swi:pattern swi:level="notice">^MY_PROJECT/MY_MODULE/my_file.c/myFunction1$</swi:pattern>
  874. <swi:pattern swi:level="info">^MY_PROJECT/MY_MODULE/my_file.c/myFunction2$</swi:pattern>
  875. </swi:suppress>
  876. -->
  877. </swi:exact>
  878. </swi:comment>
  879. <!-- STATISTIC-NAME -->
  880. <swi:executable>
  881. <!--
  882. The previous examples require to limit the low bound of exact value.
  883. This sample demonstrates the limitation for total upper value.
  884. For example, sometimes it is useful to require to have short files,
  885. because they are easily maintainable in most cases.
  886. The settings in this sections allows to do it:
  887. no messages are printed for a file
  888. if total number of executable lines less than or equal to 1000.
  889. -->
  890. <swi:total>
  891. <swi:info>1000</swi:info>
  892. <swi:notice>1500</swi:notice>
  893. <swi:warning>2000</swi:warning>
  894. <!--
  895. Most likely that you will need to suppress messages for modules,
  896. because total value of lines in a module is a sum of lines in all files.
  897. -->
  898. <swi:suppress>
  899. <!-- Section 'swi:pattern' can be repeated several times -->
  900. <swi:pattern swi:level="warning">^MY_PROJECT/MY_MODULE$</swi:pattern>
  901. <!--
  902. Add here the next 'swi:pattern' section, for example:
  903. <swi:pattern swi:level="warning">^MY_PROJECT/MY_MODULE$</swi:pattern>
  904. -->
  905. </swi:suppress>
  906. </swi:total>
  907. </swi:executable>
  908. <!-- STATISTIC-NAME -->
  909. <swi:source>
  910. <!--
  911. This example is an extension for the previous.
  912. Here the limitation is applied for total values of files, modules and project
  913. at the same time.
  914. The settings in this sections allows to do it:
  915. a) no messages (info) are printed for a file
  916. if total number of source lines less than or equal to 1000.
  917. b) no messages (notices) are printed for a module
  918. if total number of source lines less than or equal to 10000.
  919. c) no messages (notices) are printed for a project
  920. if total number of source lines less than or equal to 100000.
  921. -->
  922. <swi:total>
  923. <!-- Limit for files -->
  924. <swi:info>1000</swi:info>
  925. <!-- Limit for modules -->
  926. <swi:notice>10000</swi:notice>
  927. <!-- Limit for the project -->
  928. <swi:warning>100000</swi:warning>
  929. <!--
  930. Most likely that you will need to suppress info messages for modules and
  931. notice messages for the project,
  932. because total value of lines in a module is a sum of lines in all files,
  933. and total value of lines in project is a sum of lines in all modules.
  934. -->
  935. <swi:suppress>
  936. <!-- Section 'swi:pattern' can be repeated several times -->
  937. <swi:pattern swi:level="info">^MY_PROJECT/MY_MODULE$</swi:pattern>
  938. <swi:pattern swi:level="notice">^MY_PROJECT$</swi:pattern>
  939. <!--
  940. Add here the next 'swi:pattern' section, for example:
  941. <swi:pattern swi:level="info">^MY_PROJECT/MY_MODULE$</swi:pattern>
  942. -->
  943. </swi:suppress>
  944. </swi:total>
  945. </swi:source>
  946. </swi:lines>
  947. <!-- STATISTIC-GROUP -->
  948. <swi:complexity>
  949. <!-- STATISTIC-NAME -->
  950. <swi:cyclomatic>
  951. <!-- STATISTIC-TYPE -->
  952. <swi:exact>
  953. <!--
  954. In the example below, no messages are printed for a function
  955. if cyclomatic complexity index less than or equal to 7.
  956. It indicates about proper (low) level of logical
  957. branching in a subroutine. Low level of this index
  958. more or less grants decreased costs for mainteinability
  959. and further development, minimal probability of bad fixes,
  960. better and easier understanding of a logical part of SW.
  961. -->
  962. <swi:info>7</swi:info>
  963. <swi:notice>10</swi:notice>
  964. <swi:warning>15</swi:warning>
  965. <!--
  966. Add here suppress section, if it is needed. For example:
  967. <swi:suppress>
  968. <swi:pattern swi:level="notice">^MY_PROJECT/MY_MODULE/my_file.c/myFunction1$</swi:pattern>
  969. <swi:pattern swi:level="info">^MY_PROJECT/MY_MODULE/my_file.c/myFunction2$</swi:pattern>
  970. </swi:suppress>
  971. -->
  972. </swi:exact>
  973. </swi:cyclomatic>
  974. </swi:complexity>
  975. <!--
  976. The following section defines the limitation for duplication index.
  977. In the example, it is required to control exact relative
  978. duplication index for functions and total relative
  979. duplication index for the whole project.
  980. -->
  981. <!-- STATISTIC-GROUP -->
  982. <swi:duplication>
  983. <!-- STATISTIC-NAME -->
  984. <swi:symbols>
  985. <!-- STATISTIC-TYPE -->
  986. <swi:exact swi:relation="swi:length/swi:executable/swi:exact">
  987. <swi:info>0.30</swi:info>
  988. <swi:notice>0.40</swi:notice>
  989. <swi:warning>0.60</swi:warning>
  990. <!--
  991. Add here suppress section, if it is needed. For example:
  992. <swi:suppress>
  993. <swi:pattern swi:level="notice">^MY_PROJECT/MY_MODULE/my_file.c/myFunction1$</swi:pattern>
  994. <swi:pattern swi:level="info">^MY_PROJECT/MY_MODULE/my_file.c/myFunction2$</swi:pattern>
  995. </swi:suppress>
  996. -->
  997. </swi:exact>
  998. <!-- STATISTIC-TYPE -->
  999. <swi:total swi:relation="swi:length/swi:executable/swi:total">
  1000. <swi:info>0.30</swi:info>
  1001. <swi:notice>0.40</swi:notice>
  1002. <swi:warning>0.60</swi:warning>
  1003. <!--
  1004. This option explicitly defines the content for validation.
  1005. It requires to apply the limit to the project and
  1006. miss modules, files and functions.
  1007. -->
  1008. <swi:objectpattern>^MY_PROJECT$</swi:objectpattern>
  1009. <!--
  1010. Add here suppress section, if it is needed. For example:
  1011. <swi:suppress>
  1012. <swi:pattern swi:level="warning">^MY_PROJECT/MY_MODULE/my_file.c$</swi:pattern>
  1013. <swi:pattern swi:level="notice">^MY_PROJECT/MY_MODULE$</swi:pattern>
  1014. <swi:pattern swi:level="info">^MY_PROJECT$</swi:pattern>
  1015. </swi:suppress>
  1016. -->
  1017. </swi:total>
  1018. </swi:symbols>
  1019. </swi:duplication>
  1020. <!--
  1021. Add here more sections with definition of limits if it is needed.
  1022. -->
  1023. </swi:limits>
  1024. </swi:configuration>