@@ -526,7 +526,7 @@ void pp::operator () (_InputIterator __first, _InputIterator __last, _OutputIter
526526}
527527
528528inline 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 {
0 commit comments