1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- // Copyright Frank Mori Hess 2009.
- //
- // Quick hack to extract code snippets from example programs, so
- // they can be included into boostbook.
- //
- // Use, modification and
- // distribution is subject to the Boost Software License, Version
- // 1.0. (See accompanying file LICENSE_1_0.txt or copy at
- // http://www.boost.org/LICENSE_1_0.txt)
- #include <fstream>
- #include <iostream>
- #include <sstream>
- #include <stdexcept>
- int main(int argc, const char *argv[])
- {
- if(argc < 3)
- {
- std::cerr << "Too few arguments: need output directory and input file name(s).\n";
- return -1;
- }
- static const std::string output_directory = argv[1];
- static const int num_files = argc - 2;
- int i;
- for(i = 0; i < num_files; ++i)
- {
- const std::string file_name = argv[2 + i];
- std::cout << "opening file: " << file_name << std::endl;
- std::ifstream infile(file_name.c_str());
- bool inside_snippet = false;
- std::ofstream snippet_out_file;
- while(infile.good())
- {
- std::string line;
- getline(infile, line);
- if(infile.bad()) break;
- if(inside_snippet)
- {
- size_t snippet_end_pos = line.find("//]");
- if(snippet_end_pos == std::string::npos)
- {
- snippet_out_file << line << "\n";
- }else
- {
- snippet_out_file << "]]></code>";
- inside_snippet = false;
- std::cout << "done.\n";
- continue;
- }
- }else
- {
- size_t snippet_start_pos = line.find("//[");
- if(snippet_start_pos == std::string::npos)
- {
- continue;
- }else
- {
- inside_snippet = true;
- std::string snippet_name = line.substr(snippet_start_pos + 3);
- std::istringstream snippet_stream(snippet_name);
- snippet_stream >> snippet_name;
- if(snippet_name == "")
- {
- throw std::runtime_error("failed to obtain snippet name");
- }
- snippet_out_file.close();
- snippet_out_file.clear();
- snippet_out_file.open(std::string(output_directory + "/" + snippet_name + ".xml").c_str());
- snippet_out_file << "<!-- Code snippet \"" << snippet_name <<
- "\" extracted from \"" << file_name << "\" by snippet_extractor.\n" <<
- "--><code><![CDATA[";
- std::cout << "processing snippet \"" << snippet_name << "\"... ";
- continue;
- }
- }
- }
- }
- return 0;
- }
|