10 #if !defined(BOOST_WAVE_ADVANCED_PREPROCESSING_HOOKS_INCLUDED)
11 #define BOOST_WAVE_ADVANCED_PREPROCESSING_HOOKS_INCLUDED
19 #include <boost/assert.hpp>
20 #include <boost/config.hpp>
22 #include <boost/wave/token_ids.hpp>
23 #include <boost/wave/util/macro_helpers.hpp>
24 #include <boost/wave/preprocessing_hooks.hpp>
28 #define ROSE_WAVE_PSEUDO_FILE "<rose wave fix>"
33 char const *get_directivename(boost::wave::token_id
id)
35 using namespace boost::wave;
36 switch (static_cast<unsigned int>(
id)) {
37 case T_PP_IFDEF:
return "#ifdef";
38 case T_PP_IFNDEF:
return "#ifndef";
39 case T_PP_IF:
return "#if";
40 case T_PP_ELSE:
return "#else";
41 case T_PP_ELIF:
return "#elif";
42 case T_PP_ENDIF:
return "#endif";
44 return "#unknown directive";
63 :
public boost::wave::context_policies::default_preprocessing_hooks
120 template <
typename ContextT,
typename TokenT,
typename ContainerT,
typename IteratorT>
122 TokenT
const& macrodef, std::vector<TokenT>
const& formal_args,
123 ContainerT
const& definition,
124 TokenT
const& macrocall, std::vector<ContainerT>
const& arguments,
125 IteratorT
const& seqstart, IteratorT
const& seqend)
155 template <
typename ContextT,
typename TokenT,
typename ContainerT>
157 ContainerT
const& definition, TokenT
const& macrocall)
172 template <
typename ContextT,
typename ContainerT>
187 template <
typename ContextT,
typename ContainerT>
211 template <
typename ContextT>
217 std::cout <<
"Found include directive: " << filename << std::endl;
239 template <
typename ContextT>
242 std::string
const& absname,
bool is_system_include)
246 std::cout <<
"openend include file relname: " << relname <<
" absname: " << absname << std::endl;
259 template <
typename ContextT>
290 template <
typename ContextT,
typename ContainerT>
320 template <
typename ContextT,
typename TokenT,
typename ParametersT,
321 typename DefinitionT>
324 bool is_functionlike, ParametersT
const& parameters,
325 DefinitionT
const& definition,
bool is_predefined)
339 if( macro_name.get_position().get_file().size()!=0 )
341 if( (macro_name.get_position().get_file()!=
"<built-in>") )
355 tokens.push_back(macro_name);
357 boost::wave::util::file_position_type filepos;
359 macro_name.get_position().get_file().find(
"<default>") == std::string::npos &&
360 macro_name.get_position().get_file().find(
"<built-in>") == std::string::npos &&
361 macro_name.get_position().get_file().find(
"<command line>") == std::string::npos &&
362 macro_name.get_position().get_file().find(
"rose_edg_required_macros_and_functions") == std::string::npos)
365 filepos = boost::wave::util::file_position_type(macro_name.get_position().get_file(), 0, 0);
372 for (
typename ParametersT::const_iterator i = parameters.begin(); i != parameters.end(); ++i)
387 for (
typename DefinitionT::const_iterator i = definition.begin(); i != definition.end(); ++i)
407 template <
typename ContextT,
typename TokenT>
412 std::cout <<
"found_directive!" << std::endl;
417 using namespace boost::wave;
418 token_id
id = token_id(directive);
456 case T_PP_DEFINE: std::cout <<
"Directive is: #define\n";
break;
457 case T_PP_IF: std::cout <<
"Directive is: #if\n";
break;
458 case T_PP_IFDEF: std::cout <<
"Directive is: #ifdef\n";
break;
459 case T_PP_IFNDEF: std::cout <<
"Directive is: #ifndef\n";
break;
460 case T_PP_ELSE: std::cout <<
"Directive is: #else\n";
break;
461 case T_PP_ELIF: std::cout <<
"Directive is: #elif\n";
break;
462 case T_PP_ENDIF: std::cout <<
"Directive is: #endif\n";
break;
463 case T_PP_ERROR: std::cout <<
"Directive is: #error\n";
break;
464 case T_PP_LINE: std::cout <<
"Directive is: #line\n";
break;
465 case T_PP_PRAGMA: std::cout <<
"Directive is: #pragma\n";
break;
466 case T_PP_UNDEF: std::cout <<
"Directive is: #undef\n";
break;
467 case T_PP_WARNING: std::cout <<
"Directive is: #warning\n";
break;
468 case T_PP_INCLUDE: std::cout <<
"Directive is: #include \"...\"\n";
break;
469 case T_PP_QHEADER: std::cout <<
"Directive is: #include <...>\n";
break;
470 case T_PP_HHEADER: std::cout <<
"Directive is: #include ...\n";
break;
471 default: std::cout <<
"Directive is: <something else>\n";
break;
476 tokens.push_back(directive);
486 template <
typename ContextT,
typename TokenT>
490 std::cout <<
"Generating token: ";
492 using namespace boost::wave;
493 token_id
id = token_id(token);
499 case T_PP_DEFINE: std::cout <<
"#define: ";
break;
500 case T_PP_IF: std::cout <<
"#if: ";
break;
501 case T_PP_IFDEF: std::cout <<
"#ifdef: ";
break;
502 case T_PP_IFNDEF: std::cout <<
"#ifndef: ";
break;
503 case T_PP_ELSE: std::cout <<
"#else: ";
break;
504 case T_PP_ELIF: std::cout <<
"#elif: ";
break;
505 case T_PP_ENDIF: std::cout <<
"#endif: ";
break;
506 case T_PP_ERROR: std::cout <<
"#error: ";
break;
507 case T_PP_LINE: std::cout <<
"#line: ";
break;
508 case T_PP_PRAGMA: std::cout <<
"#pragma: ";
break;
509 case T_PP_UNDEF: std::cout <<
"#undef: ";
break;
510 case T_PP_WARNING: std::cout <<
"#warning: ";
break;
511 case T_PP_INCLUDE: std::cout <<
"#include \"...\": ";
break;
512 case T_PP_QHEADER: std::cout <<
"#include <...>: ";
break;
513 case T_PP_HHEADER: std::cout <<
"#include ...: ";
break;
514 default: std::cout <<
"<something else (" <<
id <<
")>: ";
break;
518 std::cout << token.get_value().c_str() << std::endl;
536 template <
typename ContextT,
typename TokenT,
typename ContainerT>
540 using namespace boost::wave;
541 token_id
id = token_id(directive);
547 std::cout <<
"Conditional: ";
550 case T_PP_DEFINE: std::cout <<
"#define: ";
break;
551 case T_PP_IF: std::cout <<
"#if: ";
break;
552 case T_PP_IFDEF: std::cout <<
"#ifdef: ";
break;
553 case T_PP_IFNDEF: std::cout <<
"#ifndef: ";
break;
554 case T_PP_ELSE: std::cout <<
"#else: ";
break;
555 case T_PP_ELIF: std::cout <<
"#elif: ";
break;
556 case T_PP_ENDIF: std::cout <<
"#endif: ";
break;
557 case T_PP_ERROR: std::cout <<
"#error: ";
break;
558 case T_PP_LINE: std::cout <<
"#line: ";
break;
559 case T_PP_PRAGMA: std::cout <<
"#pragma: ";
break;
560 case T_PP_UNDEF: std::cout <<
"#undef: ";
break;
561 case T_PP_WARNING: std::cout <<
"#warning: ";
break;
562 case T_PP_INCLUDE: std::cout <<
"#include \"...\": ";
break;
563 case T_PP_QHEADER: std::cout <<
"#include <...>: ";
break;
564 case T_PP_HHEADER: std::cout <<
"#include ...: ";
break;
565 default: std::cout <<
"<something else (" <<
id <<
")>: ";
break;
568 std::cout << directive.get_value().c_str() << std::endl;
578 for (
typename ContainerT::const_iterator i = expression.begin(); i != expression.end(); ++i)
587 whitespace2.push_back(newline);
609 template <
typename ContextT,
typename TokenT>
613 using namespace boost::wave;
616 if (token.get_position().get_file().size() == 0)
621 token_id
id = token_id(token);
640 std::cout <<
"Updating previous token (" <<
lastPreprocDirective.get_value().c_str() <<
") with token " << token.get_value().c_str() << std::endl;
643 else if (
skipping || (lastid != T_PP_IF && lastid != T_PP_IFDEF && lastid != T_PP_IFNDEF && lastid != T_PP_ELIF))
676 case T_PP_DEFINE: std::cout <<
"Skipped: #define\n";
break;
677 case T_PP_IF: std::cout <<
"Skipped: #if\n";
break;
678 case T_PP_IFDEF: std::cout <<
"Skipped: #ifdef\n";
break;
679 case T_PP_IFNDEF: std::cout <<
"Skipped: #ifndef\n";
break;
680 case T_PP_ELSE: std::cout <<
"Skipped: #else\n";
break;
681 case T_PP_ELIF: std::cout <<
"Skipped: #elif\n";
break;
682 case T_PP_ENDIF: std::cout <<
"Skipped: #endif\n";
break;
683 case T_PP_ERROR: std::cout <<
"Skipped: #error\n";
break;
684 case T_PP_LINE: std::cout <<
"Skipped: #line\n";
break;
685 case T_PP_PRAGMA: std::cout <<
"Skipped: #pragma\n";
break;
686 case T_PP_UNDEF: std::cout <<
"Skipped: #undef\n";
break;
687 case T_PP_WARNING: std::cout <<
"Skipped: #warning\n";
break;
688 case T_PP_INCLUDE: std::cout <<
"Skipped: #include \"...\"\n";
break;
689 case T_PP_QHEADER: std::cout <<
"Skipped: #include <...>\n";
break;
690 case T_PP_HHEADER: std::cout <<
"Skipped: #include ...\n";
break;
691 default: std::cout <<
"Skipped: <something else (" << token.get_value().c_str() <<
")>\n";
break;
709 template <
typename ContextT,
typename TokenT>
714 tokListCont.push_back(macro_name);
719 tokens.push_back(macro_name);
723 template <
typename ContainerT>
725 on_warning(ContainerT
const& tokenStream)
729 std::cout <<
"ON TOKEN WARNING: " << boost::wave::util::impl::as_string(tokenStream) << std::endl;
745 template <
typename ContextT,
typename ContainerT>
752 std::cout <<
"ON TOKEN WARNING: " << boost::wave::util::impl::as_string(message) << std::endl;
777 template <
typename ContextT,
typename ContainerT>
779 found_line_directive(ContextT
const& ctx, ContainerT
const& arguments,
unsigned int line, std::string
const& filename)
781 std::string filenameString(filename.c_str());
784 std::cout <<
"On line found" << std::endl;
795 whitespace.push_back(space);
801 for (
typename ContainerT::const_iterator i = arguments.begin(); i != arguments.end(); ++i)
810 template <
typename ContextT,
typename TokenT>
819 if (token != TokenT())
820 std::cout <<
"MAX_SKIP_WHITESPACE: " << token.get_value().c_str() << std::endl;
822 using namespace boost::wave;
823 token_id
id = token_id(token);
824 if (
id != T_EOF &&
id != T_EOI)
826 if (
id != T_EOF &&
id != T_EOI &&
id != T_NEWLINE)
829 std::cout <<
"Normal reported" << std::endl;
835 std::cout <<
"Skip leads to flushing" << std::endl;
841 std::cout <<
"EOF or newline leads to flushing" << std::endl;
847 template <
typename ContextT,
typename ExceptionT>
851 std::cout <<
"THROW_EXCEPTION" << std::endl;
854 template <
typename ContextT>
858 std::cout <<
"DETECTED_INCLUDE_GUARD" << include_guard <<
" in file " << filename << std::endl;
861 template <
typename ContextT,
typename TokenT>
865 std::cout <<
"DETECTED_PRAGMA_ONCE " << pragma_token.get_value() <<
" in file " << filename << std::endl;
868 template <
typename ContextT,
typename ContainerT>
872 std::cout <<
"FOUND_ERROR_DIRECTIVE" << std::endl;
882 #endif // !defined(BOOST_WAVE_ADVANCED_PREPROCESSING_HOOKS_INCLUDED)