forked from Kitware/KWStyle
-
Notifications
You must be signed in to change notification settings - Fork 0
/
kwsCheckIfWhileForUntil.cxx
129 lines (114 loc) · 3.56 KB
/
kwsCheckIfWhileForUntil.cxx
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
/*=========================================================================
Program: KWStyle - Kitware Style Checker
Module: kwsCheckIfWhileForUntil.cxx
Copyright (c) Kitware, Inc. All rights reserved.
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notices for more information.
=========================================================================*/
#include "kwsParser.h"
#include <string.h> // strlen
namespace kws {
/** Check the number of spaces after the if keyword */
bool Parser::CheckIfWhileForUntil(unsigned int after)
{
m_TestsDone[IFWHILEFORUNTIL] = true;
m_TestsDescription[IFWHILEFORUNTIL] =
"Number of spaces after If/While/For should be";
char* val = new char[200];
sprintf(val," = %d",after);
m_TestsDescription[IFWHILEFORUNTIL] += val;
delete [] val;
bool hasErrors = false;
if(!this->FindIfWhileForUntil("if",after))
{
hasErrors = true;
}
if(!this->FindIfWhileForUntil("while",after))
{
hasErrors = true;
}
if(!this->FindIfWhileForUntil("for",after))
{
hasErrors = true;
}
if(!this->FindIfWhileForUntil("until",after))
{
hasErrors = true;
}
return !hasErrors;
}
/** Check the operator */
bool Parser::FindIfWhileForUntil(const char* op,
unsigned int after)
{
bool hasErrors = false;
long int prevOperatorPos = 0;
size_t operatorPos = m_BufferNoComment.find(op,prevOperatorPos);
while(operatorPos != std::string::npos)
{
bool checkError = true;
if( operatorPos > 0 && !isspace( m_BufferNoComment[operatorPos-1] ) )
{
checkError = false;
}
if( operatorPos+strlen(op) < m_BufferNoComment.size() &&
!isspace( m_BufferNoComment[operatorPos+strlen(op)] ) &&
m_BufferNoComment[operatorPos+strlen(op)] != '(' )
{
checkError = false;
}
if( checkError )
{
// Check number of space after
unsigned int aft = 0;
long int i = static_cast<long int>( operatorPos+strlen(op) );
while( (i<(long int)m_BufferNoComment.size())
&& m_BufferNoComment[i] == ' ' )
{
aft++;
i++;
}
if( i<(long int)m_BufferNoComment.size() &&
( m_BufferNoComment[i] == '\n' || m_BufferNoComment[i] == '\r' ) )
{
aft = after + 1;
}
if( aft != after )
{
if( !this->IsBetweenQuote(operatorPos,false) )
{
Error error;
error.line = this->GetLineNumber(operatorPos,true);
error.line2 = error.line;
error.number = IFWHILEFORUNTIL;
error.description = "Spaces after ";
error.description += op;
error.description += " = ";
char* errorVal = new char[200];
sprintf(errorVal,"%d",aft);
error.description += errorVal;
error.description += " v.s ";
sprintf(errorVal,"%d",after);
error.description += errorVal;
m_ErrorList.push_back(error);
delete [] errorVal;
hasErrors = true;
}
}
}
prevOperatorPos = static_cast<long int>( operatorPos ) + 1;
if( prevOperatorPos < static_cast<long int>( m_BufferNoComment.size() )
- 1 )
{
operatorPos = m_BufferNoComment.find(op,prevOperatorPos);
}
else
{
operatorPos = std::string::npos;
}
}
return !hasErrors;
}
} // end namespace kws