--- /dev/null
+\r
+#include <iostream>\r
+#include <fstream>\r
+#include <string>\r
+\r
+#include "devcpp.h"\r
+\r
+using namespace std;\r
+\r
+static class DevCppFactory : public Backend::Factory\r
+{\r
+ public:\r
+\r
+ DevCppFactory() : Factory("devcpp") {}\r
+ Backend *operator() (Project &project)\r
+ {\r
+ return new DevCppBackend(project);\r
+ }\r
+ \r
+} factory;\r
+\r
+\r
+DevCppBackend::DevCppBackend(Project &project) : Backend(project)\r
+{\r
+ m_unitCount = 0;\r
+}\r
+\r
+void DevCppBackend::Process()\r
+{\r
+ string filename = ProjectNode.name + ".dev";\r
+ \r
+ cout << "Creating Dev-C++ project: " << filename << endl;\r
+\r
+ ProcessModules();\r
+\r
+ m_devFile.open(filename.c_str());\r
+\r
+ if(!m_devFile.is_open())\r
+ {\r
+ cout << "Could not open file." << endl;\r
+ return;\r
+ }\r
+\r
+ m_devFile << "[Project]" << endl;\r
+ \r
+ m_devFile << "FileName=" << filename << endl\r
+ << "Name=" << ProjectNode.name << endl\r
+ << "UnitCount=" << m_unitCount << endl\r
+ << "Type=1" << endl\r
+ << "Ver=1" << endl\r
+ << "ObjFiles=" << endl\r
+ << "Includes=" << endl\r
+ << "Libs=" << endl\r
+ << "PrivateResource=" << endl\r
+ << "ResourceIncludes=" << endl\r
+ << "MakeIncludes=" << endl\r
+ << "Compiler=" << endl\r
+ << "CppCompiler=" << endl\r
+ << "Linker=" << endl\r
+ << "IsCpp=1" << endl\r
+ << "Icon=" << endl\r
+ << "ExeOutput=" << endl\r
+ << "ObjectOutput=" << endl\r
+ << "OverrideOutput=0" << endl\r
+ << "OverrideOutputName=" << endl\r
+ << "HostApplication=" << endl\r
+ << "CommandLine=" << endl\r
+ << "UseCustomMakefile=1" << endl\r
+ << "CustomMakefile=" << ProjectNode.makefile << endl\r
+ << "IncludeVersionInto=0" << endl\r
+ << "SupportXPThemes=0" << endl\r
+ << "CompilerSet=0" << endl\r
+ \r
+ << "CompilerSettings=0000000000000000000000" << endl;\r
+ \r
+ OutputFolders();\r
+\r
+ m_devFile << endl << endl;\r
+\r
+ OutputFileUnits();\r
+\r
+ m_devFile.close();\r
+ \r
+ // Dev-C++ needs a makefile, so use the MinGW backend to create one.\r
+ \r
+ cout << "Creating Makefile: " << ProjectNode.makefile << endl;\r
+ \r
+ Backend *backend = Backend::Factory::Create("mingw", ProjectNode);\r
+ backend->Process();\r
+ delete backend;\r
+\r
+ cout << "Done." << endl << endl;\r
+\r
+ cout << "You may want to disable Class browsing (see below) before you open this project in Dev-C++, as the "\r
+ << "parsing required for large projects can take quite awhile."\r
+ << endl << endl\r
+ << "(Tools->Editor Options->Class browsing->Enable class browsing check box)"\r
+ << endl << endl;\r
+}\r
+\r
+void DevCppBackend::ProcessModules()\r
+{\r
+ for(size_t i = 0; i < ProjectNode.modules.size(); i++)\r
+ {\r
+ Module &module = *ProjectNode.modules[i];\r
+\r
+ for(size_t k = 0; k < module.files.size(); k++)\r
+ {\r
+ File &file = *module.files[k];\r
+ \r
+ ProcessFile(file.name);\r
+ }\r
+ }\r
+}\r
+\r
+void DevCppBackend::ProcessFile(string &filepath)\r
+{\r
+ // Remove the .\ at the start of the filenames\r
+ filepath.erase(0, 2);\r
+\r
+ // Change the \ to /\r
+ for(size_t i = 0; i < filepath.length(); i++)\r
+ {\r
+ if(filepath[i] == '\\')\r
+ filepath[i] = '/';\r
+ }\r
+\r
+ // Remove the filename from the path\r
+ string folder = "";\r
+\r
+ size_t pos = filepath.rfind(string("/"), filepath.length() - 1);\r
+\r
+ if(pos != string::npos)\r
+ {\r
+ folder = filepath;\r
+ folder.erase(pos, folder.length() - pos);\r
+ }\r
+ \r
+ FileUnit fileUnit;\r
+ fileUnit.filename = filepath;\r
+ fileUnit.folder = folder;\r
+\r
+ m_fileUnits.push_back(fileUnit);\r
+\r
+ if(folder != "")\r
+ AddFolders(folder);\r
+\r
+ m_unitCount++;\r
+}\r
+\r
+bool DevCppBackend::CheckFolderAdded(string &folder)\r
+{\r
+ for(size_t i = 0; i < m_folders.size(); i++)\r
+ {\r
+ if(m_folders[i] == folder)\r
+ return true;\r
+ }\r
+\r
+ return false;\r
+}\r
+\r
+void DevCppBackend::AddFolders(string &folder)\r
+{\r
+ // Check if this folder was already added. true if it was, false otherwise.\r
+ if(CheckFolderAdded(folder))\r
+ return;\r
+ \r
+ m_folders.push_back(folder);\r
+ \r
+ size_t pos = folder.rfind(string("/"), folder.length() - 1);\r
+\r
+ if(pos == string::npos)\r
+ return;\r
+\r
+ folder.erase(pos, folder.length() - pos);\r
+ AddFolders(folder);\r
+}\r
+\r
+void DevCppBackend::OutputFolders()\r
+{\r
+ m_devFile << "Folders=";\r
+\r
+ for(size_t i = 0; i < m_folders.size(); i++)\r
+ {\r
+ if(i > 0)\r
+ m_devFile << ",";\r
+\r
+ m_devFile << m_folders[i];\r
+ }\r
+}\r
+\r
+void DevCppBackend::OutputFileUnits()\r
+{\r
+ for(size_t i = 0; i < m_fileUnits.size(); i++)\r
+ {\r
+ m_devFile << "[Unit" << i + 1 << "]" << endl;\r
+ \r
+ m_devFile << "FileName=" << m_fileUnits[i].filename << endl;\r
+ m_devFile << "CompileCpp=1" << endl;\r
+ m_devFile << "Folder=" << m_fileUnits[i].folder << endl;\r
+ m_devFile << "Compile=1" << endl;\r
+ m_devFile << "Link=1" << endl;\r
+ m_devFile << "Priority=1000" << endl;\r
+ m_devFile << "OverrideBuildCmd=0" << endl;\r
+ m_devFile << "BuildCmd=" << endl << endl;;\r
+ }\r
+}\r
+\r