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 &macros = 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 + -
显示快捷键?