summary refs log blame commit diff stats
path: root/HACKING.md
blob: 3ac46cadae73d3e3326b9d678dd4075c9d372133 (plain) (tree)
n>o < old_lines.size() && (old_lines.at(o).empty() || starts_with(old_lines.at(o), "#line "))) { ++o; } if (l >= lines.size() && o >= old_lines.size()) return true; // no change if (l >= lines.size() || o >= old_lines.size()) return false; // contents changed //? cerr << "comparing\n"; //? cerr << o << ": " << old_lines.at(o) << '\n'; //? cerr << l << ": " << lines.at(l) << '\n'; if (lines.at(l) != old_lines.at(o)) return false; // contents changed ++l; ++o; } assert(false); } string next_output_filename(const string& output_directory) { static int file_count = 0; ostringstream out; out << output_directory << "/mu_" << file_count << ".cc"; file_count++; return out.str(); } void emit_file(const vector<string>& lines, const string& output_filename) { if (no_change(lines, output_filename)) return; cerr << " updating " << output_filename << '\n'; ofstream out(output_filename.c_str()); for (size_t i = 0; i < lines.size(); ++i) out << lines.at(i) << '\n'; } void emit_compilation_unit(const vector<string>& lines, const string& output_directory) { string output_filename = next_output_filename(output_directory); emit_file(lines, output_filename); } int main(int argc, const char* argv[]) { if (argc != 3) { cerr << "usage: cleave [input .cc file] [output directory]\n"; exit(0); } // read input vector<string> lines; slurp(argv[1], lines); // write header until but excluding '// Global' delimiter string output_directory = argv[2]; size_t line_num = 0; { vector<string> out; while (line_num < lines.size()) { const string& line = lines.at(line_num); if (trim(line) == "// Globals") break; // todo: #line directive for delimiters out.push_back(line); ++line_num; } emit_file(out, output_directory+"/header"); } // write global_definitions_list (including delimiters) { vector<string> out; while (line_num < lines.size()) { const string& line = lines.at(line_num); out.push_back(line); ++line_num; if (trim(line) == "// End Globals") break; } emit_file(out, output_directory+"/global_definitions_list"); } // segment functions // first one is special if (line_num < lines.size()) { vector<string> function; line_num = slurp_some_functions(lines, line_num, function, true); emit_compilation_unit(function, output_directory); } while (line_num < lines.size()) { vector<string> function; line_num = slurp_some_functions(lines, line_num, function, false); emit_compilation_unit(function, output_directory); } }