#include #include #include const std::string ext(".cpp"); static std::string str(unsigned int value) { std::ostringstream ostr; ostr << value; return ostr.str(); } int main(const int argc, const char * const * const argv) { if(argc != 2) { std::cerr << "syntax: extracttests testfile" << std::endl; return 0; } std::string testname; unsigned int subcount = 0; std::ifstream f(argv[1]); std::string line; while(std::getline(f, line)) { { std::string::size_type pos = line.find_first_not_of(" "); if(pos > 0 && pos != std::string::npos) line.erase(0, pos); } if(line.compare(0, 5, "void ") == 0) { testname = line.substr(5, line.size() - 7); subcount = 0; continue; } if(line == "}") { testname = ""; subcount = 0; continue; } if(!testname.empty() && line.compare(0, 5, "check") == 0 && line.find("(\"") != std::string::npos) { std::ofstream fout((testname + str(++subcount) + ext).c_str()); fout << "#include " << std::endl; fout << "#include " << std::endl; fout << "#include " << std::endl; if(testname == "nullpointer1") { if(subcount < 6) { fout << "class Token\n" << "{\n" << "public:\n" << " const char *str() const;\n" << " const Token *next() const;\n" << " unsigned int size() const;\n" << " char read () const;\n" << " operator bool() const;\n" << "};\n" << "static Token *tokens;\n"; } else { fout << "struct A\n" "{\n" " char b();\n" " A *next;\n" "};\n"; } } if(testname == "nullpointer2") { fout << "class Fred\n" << "{\n" << "public:\n" << " void hello() const;\n" << " operator bool() const;\n" << "};\n"; } if(testname == "nullpointer3") { fout << "struct DEF { };\n" << "struct ABC : public DEF\n" << "{\n" << " int a,b,c;\n" << " struct ABC *next;\n" << "};\n" << "void bar(int); void f(struct ABC **);\n"; } if(testname == "nullpointer4") { fout << "void bar(int);\n" << "int** f(int **p = 0);\n" << "extern int x;\n" << "struct P {\n" << " bool check() const;\n" << " P* next() const;\n" << "};\n"; } if(testname == "nullpointer5") { fout << "struct A {\n" << " char c() const;\n" << " operator bool() const;\n" << "};\n"; } if(testname == "nullpointer6") { fout << "struct Foo {\n" << " void abcd() const;\n" << "};\n" << "struct FooBar : public Foo { };\n" << "struct FooCar : public Foo { };\n" << "extern int a;\n"; } if(testname == "nullpointer7") { fout << "struct wxLongLong {\n" << " wxLongLong(int) { }\n" << " long GetValue() const;\n" << "};\n"; } do { std::string::size_type pos = line.find("\""); if(pos == std::string::npos) break; line.erase(0, pos + 1); pos = line.rfind("\""); if(pos == std::string::npos) break; const bool lastline(line.find(");", pos) != std::string::npos); line.erase(pos); pos = 0; while((pos = line.find("\\", pos)) != std::string::npos) { line.erase(pos, 1); if(line[pos] == 'n') line.erase(pos, 1); else ++pos; } fout << line << std::endl; if(lastline) break; } while(std::getline(f, line)); fout << std::endl; continue; } } return 0; }