idl.cpp
来自「Boost provides free peer-reviewed portab」· C++ 代码 · 共 538 行 · 第 1/2 页
CPP
538 行
vector<string>::const_iterator end = syspaths.end(); for (vector<string>::const_iterator cit = syspaths.begin(); cit != end; ++cit) { ctx.add_sysinclude_path((*cit).c_str()); } } // add include directories to the include search paths if (vm.count("include")) { cmd_line_util::include_paths const &ip = vm["include"].as<cmd_line_util::include_paths>(); vector<string>::const_iterator end = ip.paths.end(); for (vector<string>::const_iterator cit = ip.paths.begin(); cit != end; ++cit) { ctx.add_include_path((*cit).c_str()); } // if on the command line was given -I- , this has to be propagated if (ip.seen_separator) ctx.set_sysinclude_delimiter(); // add system include directories to the include path vector<string>::const_iterator sysend = ip.syspaths.end(); for (vector<string>::const_iterator syscit = ip.syspaths.begin(); syscit != sysend; ++syscit) { ctx.add_sysinclude_path((*syscit).c_str()); } } // add additional defined macros if (vm.count("define")) { vector<string> const ¯os = vm["define"].as<vector<string> >(); vector<string>::const_iterator end = macros.end(); for (vector<string>::const_iterator cit = macros.begin(); cit != end; ++cit) { ctx.add_macro_definition(*cit); } } // add additional predefined macros if (vm.count("predefine")) { vector<string> const &predefmacros = vm["predefine"].as<vector<string> >(); vector<string>::const_iterator end = predefmacros.end(); for (vector<string>::const_iterator cit = predefmacros.begin(); cit != end; ++cit) { ctx.add_macro_definition(*cit, true); } } // undefine specified macros if (vm.count("undefine")) { vector<string> const &undefmacros = vm["undefine"].as<vector<string> >(); vector<string>::const_iterator end = undefmacros.end(); for (vector<string>::const_iterator cit = undefmacros.begin(); cit != end; ++cit) { ctx.remove_macro_definition((*cit).c_str(), true); } } // open the output file std::ofstream output; if (vm.count("output")) { // try to open the file, where to put the preprocessed output string out_file (vm["output"].as<string>()); output.open(out_file.c_str()); if (!output.is_open()) { cerr << "waveidl: could not open output file: " << out_file << endl; return -1; } } else { // output the preprocessed result to std::cout output.copyfmt(cout); output.clear(cout.rdstate()); static_cast<std::basic_ios<char> &>(output).rdbuf(cout.rdbuf()); } // analyze the input file context_type::iterator_type first = ctx.begin(); context_type::iterator_type last = ctx.end(); // loop over all generated tokens outputing the generated text while (first != last) { // print out the string representation of this token (skip comments) using namespace boost::wave; // store the last known good token position current_position = (*first).get_position(); token_id id = token_id(*first); if (T_CPPCOMMENT == id || T_NEWLINE == id) { // C++ comment tokens contain the trailing newline output << endl; } else if (id != T_CCOMMENT) { // print out the current token value output << (*first).get_value(); } ++first; // advance to the next token } } catch (boost::wave::cpp_exception const& e) { // some preprocessing error cerr << e.file_name() << "(" << e.line_no() << "): " << e.description() << endl; return 1; } catch (boost::wave::cpplexer::lexing_exception const& e) { // some lexing error cerr << e.file_name() << "(" << e.line_no() << "): " << e.description() << endl; return 2; } catch (std::exception const& e) { // use last recognized token to retrieve the error position cerr << current_position.get_file() << "(" << current_position.get_line() << "): " << "exception caught: " << e.what() << endl; return 3; } catch (...) { // use last recognized token to retrieve the error position cerr << current_position.get_file() << "(" << current_position.get_line() << "): " << "unexpected exception caught." << endl; return 4; } return 0;}///////////////////////////////////////////////////////////////////////////////// main entry pointintmain (int argc, char *argv[]){ try { // analyze the command line options and arguments // declare the options allowed from the command line only po::options_description desc_cmdline ("Options allowed on the command line only"); desc_cmdline.add_options() ("help,h", "print out program usage (this message)") ("version,v", "print the version number") ("copyright,c", "print out the copyright statement") ("config-file", po::value<vector<string> >(), "specify a config file (alternatively: @filepath)") ; // declare the options allowed on command line and in config files po::options_description desc_generic ("Options allowed additionally in a config file"); desc_generic.add_options() ("output,o", "specify a file to use for output instead of stdout") ("include,I", po::value<cmd_line_util::include_paths>()->composing(), "specify an additional include directory") ("sysinclude,S", po::value<vector<string> >()->composing(), "specify an additional system include directory") ("define,D", po::value<vector<string> >()->composing(), "specify a macro to define (as macro[=[value]])") ("predefine,P", po::value<vector<string> >()->composing(), "specify a macro to predefine (as macro[=[value]])") ("undefine,U", po::value<vector<string> >()->composing(), "specify a macro to undefine") ; // combine the options for the different usage schemes po::options_description desc_overall_cmdline; po::options_description desc_overall_cfgfile; desc_overall_cmdline.add(desc_cmdline).add(desc_generic); desc_overall_cfgfile.add(desc_generic); // parse command line and store results using namespace boost::program_options::command_line_style; po::parsed_options opts = po::parse_command_line(argc, argv, desc_overall_cmdline, unix_style, cmd_line_util::at_option_parser); po::variables_map vm; po::store(opts, vm); po::notify(vm); // Try to find a waveidl.cfg in the same directory as the executable was // started from. If this exists, treat it as a wave config file fs::path filename(argv[0], fs::native); filename = filename.branch_path() / "waveidl.cfg"; cmd_line_util::read_config_file_options(filename.string(), desc_overall_cfgfile, vm, true); // if there is specified at least one config file, parse it and add the // options to the main variables_map if (vm.count("config-file")) { vector<string> const &cfg_files = vm["config-file"].as<vector<string> >(); vector<string>::const_iterator end = cfg_files.end(); for (vector<string>::const_iterator cit = cfg_files.begin(); cit != end; ++cit) { // parse a single config file and store the results cmd_line_util::read_config_file_options(*cit, desc_overall_cfgfile, vm); } } // ... act as required if (vm.count("help")) { po::options_description desc_help ( "Usage: waveidl [options] [@config-file(s)] file"); desc_help.add(desc_cmdline).add(desc_generic); cout << desc_help << endl; return 1; } if (vm.count("version")) { return print_version(); } if (vm.count("copyright")) { return print_copyright(); } // extract the arguments from the parsed command line vector<po::option> arguments; std::remove_copy_if(opts.options.begin(), opts.options.end(), inserter(arguments, arguments.end()), cmd_line_util::is_argument()); // if there is no input file given, then exit if (0 == arguments.size() || 0 == arguments[0].value.size()) { cerr << "waveidl: no input file given, " << "use --help to get a hint." << endl; return 5; } // preprocess the given input file return do_actual_work(arguments[0].value[0], vm); } catch (std::exception const& e) { cout << "waveidl: exception caught: " << e.what() << endl; return 6; } catch (...) { cerr << "waveidl: unexpected exception caught." << endl; return 7; }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?