Skip to content

Commit 7c907b9

Browse files
committed
applied patch provided by Uwe Siems
1 parent 0ca1323 commit 7c907b9

3 files changed

Lines changed: 28 additions & 16 deletions

File tree

generator/parser/rpp/pp-engine-bits.h

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -526,7 +526,7 @@ void pp::operator () (_InputIterator __first, _InputIterator __last, _OutputIter
526526
}
527527

528528
inline pp::pp (pp_environment &__env):
529-
env (__env), expand (env)
529+
env (__env), expand (env), skip_comment(false)
530530
{
531531
iflevel = 0;
532532
_M_skipping[iflevel] = 0;
@@ -620,10 +620,10 @@ _InputIterator pp::handle_define (_InputIterator __first, _InputIterator __last)
620620

621621
while (__first != __last && *__first != '\n')
622622
{
623-
if (*__first == '/') {
624-
__first = skip_comment_or_divop(__first, __last);
625-
env.current_line += skip_comment_or_divop.lines;
626-
}
623+
if (*__first == '/') {
624+
__first = skip_comment(__first, __last);
625+
env.current_line += skip_comment.lines;
626+
}
627627

628628
if (*__first == '\\')
629629
{
@@ -728,7 +728,7 @@ _InputIterator pp::eval_primary(_InputIterator __first, _InputIterator __last, V
728728

729729
if (token != TOKEN_IDENTIFIER)
730730
{
731-
std::cerr << "** WARNING expected ``identifier'' found:" << char(token) << std::endl;
731+
std::cerr << "** WARNING expected ``identifier'' found:" << char(token) << " at " << env.current_file << ":" << env.current_line << std::endl;
732732
result->set_long (0);
733733
break;
734734
}
@@ -741,7 +741,7 @@ _InputIterator pp::eval_primary(_InputIterator __first, _InputIterator __last, V
741741
{
742742
_InputIterator next = next_token (__first, __last, &token);
743743
if (token != ')')
744-
std::cerr << "** WARNING expected ``)''" << std::endl;
744+
std::cerr << "** WARNING expected ``)'' at " << env.current_file << ":" << env.current_line << std::endl;
745745
else
746746
__first = next;
747747
}
@@ -770,7 +770,7 @@ _InputIterator pp::eval_primary(_InputIterator __first, _InputIterator __last, V
770770
next_token (__first, __last, &token);
771771

772772
if (token != ')')
773-
std::cerr << "** WARNING expected ``)'' = " << token << std::endl;
773+
std::cerr << "** WARNING expected ``)'' = " << token << " at " << env.current_file << ":" << env.current_line << std::endl;
774774
else
775775
__first = next_token(__first, __last, &token);
776776
break;
@@ -801,7 +801,7 @@ _InputIterator pp::eval_multiplicative(_InputIterator __first, _InputIterator __
801801
{
802802
if (value.is_zero ())
803803
{
804-
std::cerr << "** WARNING division by zero" << std::endl;
804+
std::cerr << "** WARNING division by zero at " << env.current_file << ":" << env.current_line << std::endl;
805805
result->set_long (0);
806806
}
807807
else
@@ -811,7 +811,7 @@ _InputIterator pp::eval_multiplicative(_InputIterator __first, _InputIterator __
811811
{
812812
if (value.is_zero ())
813813
{
814-
std::cerr << "** WARNING division by zero" << std::endl;
814+
std::cerr << "** WARNING division by zero at " << env.current_file << ":" << env.current_line << std::endl;
815815
result->set_long (0);
816816
}
817817
else
@@ -1055,7 +1055,7 @@ _InputIterator pp::eval_constant_expression(_InputIterator __first, _InputIterat
10551055
}
10561056
else
10571057
{
1058-
std::cerr << "** WARNING expected ``:'' = " << int (token) << std::endl;
1058+
std::cerr << "** WARNING expected ``:'' = " << int (token) << " at " << env.current_file << ":" << env.current_line << std::endl;
10591059
*result = left_value;
10601060
}
10611061
}
@@ -1078,10 +1078,15 @@ _InputIterator pp::handle_if (_InputIterator __first, _InputIterator __last)
10781078
std::string condition;
10791079
condition.reserve (255);
10801080
expand_condition (skip_blanks (__first, __last), __last, std::back_inserter (condition));
1081+
std::string condition2ndpass;
1082+
condition2ndpass.reserve (255);
1083+
const char* first = condition.c_str ();
1084+
const char* last = first + condition.size ();
1085+
expand_condition (skip_blanks (first, last), last, std::back_inserter (condition2ndpass));
10811086

10821087
Value result;
10831088
result.set_long (0);
1084-
eval_expression(condition.c_str (), condition.c_str () + condition.size (), &result);
1089+
eval_expression(condition2ndpass.c_str (), condition2ndpass.c_str () + condition2ndpass.size (), &result);
10851090

10861091
_M_true_test[iflevel] = !result.is_zero ();
10871092
_M_skipping[iflevel] = result.is_zero ();
@@ -1095,7 +1100,7 @@ _InputIterator pp::handle_else (_InputIterator __first, _InputIterator /*__last*
10951100
{
10961101
if (iflevel == 0 && !skipping ())
10971102
{
1098-
std::cerr << "** WARNING #else without #if" << std::endl;
1103+
std::cerr << "** WARNING #else without #if" << " at " << env.current_file << ":" << env.current_line << std::endl;
10991104
}
11001105
else if (iflevel > 0 && _M_skipping[iflevel - 1])
11011106
{
@@ -1116,7 +1121,7 @@ _InputIterator pp::handle_elif (_InputIterator __first, _InputIterator __last)
11161121

11171122
if (iflevel == 0 && !skipping())
11181123
{
1119-
std::cerr << "** WARNING #else without #if" << std::endl;
1124+
std::cerr << "** WARNING #else without #if" << " at " << env.current_file << ":" << env.current_line << std::endl;
11201125
}
11211126
else if (!_M_true_test[iflevel] && !_M_skipping[iflevel - 1])
11221127
{
@@ -1138,7 +1143,7 @@ _InputIterator pp::handle_endif (_InputIterator __first, _InputIterator /*__last
11381143
{
11391144
if (iflevel == 0 && !skipping())
11401145
{
1141-
std::cerr << "** WARNING #endif without #if" << std::endl;
1146+
std::cerr << "** WARNING #endif without #if" << " at " << env.current_file << ":" << env.current_line << std::endl;
11421147
}
11431148
else
11441149
{

generator/parser/rpp/pp-engine.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ class pp
112112
pp_macro_expander expand;
113113
pp_skip_identifier skip_identifier;
114114
pp_skip_comment_or_divop skip_comment_or_divop;
115+
pp_skip_comment_or_divop skip_comment;
115116
pp_skip_blanks skip_blanks;
116117
pp_skip_number skip_number;
117118
std::vector<std::string> include_paths;

generator/parser/rpp/pp-scanner.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,8 @@ struct pp_skip_whitespaces
9494

9595
struct pp_skip_comment_or_divop
9696
{
97+
pp_skip_comment_or_divop(bool skipDiv = true) { _skipDiv = skipDiv; }
98+
9799
int lines;
98100

99101
template <typename _InputIterator>
@@ -130,8 +132,10 @@ struct pp_skip_comment_or_divop
130132
state = IN_COMMENT;
131133
else if (*__first == '/')
132134
state = IN_CXX_COMMENT;
133-
else
135+
else if (_skipDiv)
134136
return __first;
137+
else
138+
return __first-1;
135139
break;
136140

137141
case IN_COMMENT:
@@ -158,6 +162,8 @@ struct pp_skip_comment_or_divop
158162

159163
return __first;
160164
}
165+
private:
166+
bool _skipDiv;
161167
};
162168

163169
struct pp_skip_identifier

0 commit comments

Comments
 (0)