Factories for Backend creation
Modified: branches/xmlbuildsystem/reactos/tools/rbuild/backend/backend.cpp
Modified: branches/xmlbuildsystem/reactos/tools/rbuild/backend/backend.h
Modified: branches/xmlbuildsystem/reactos/tools/rbuild/backend/mingw/mingw.cpp
Modified: branches/xmlbuildsystem/reactos/tools/rbuild/backend/mingw/mingw.h
Modified: branches/xmlbuildsystem/reactos/tools/rbuild/backend/mingw/modulehandler.cpp
Modified: branches/xmlbuildsystem/reactos/tools/rbuild/exception.cpp
Modified: branches/xmlbuildsystem/reactos/tools/rbuild/exception.h
Modified: branches/xmlbuildsystem/reactos/tools/rbuild/module.cpp
Modified: branches/xmlbuildsystem/reactos/tools/rbuild/project.cpp
Modified: branches/xmlbuildsystem/reactos/tools/rbuild/rbuild.cpp
Modified: branches/xmlbuildsystem/reactos/tools/rbuild/ssprintf.cpp

Modified: branches/xmlbuildsystem/reactos/tools/rbuild/backend/backend.cpp
--- branches/xmlbuildsystem/reactos/tools/rbuild/backend/backend.cpp	2005-01-06 02:06:44 UTC (rev 12844)
+++ branches/xmlbuildsystem/reactos/tools/rbuild/backend/backend.cpp	2005-01-06 02:55:11 UTC (rev 12845)
@@ -4,6 +4,35 @@
 #include "../Rbuild.h"
 #include "backend.h"
 
+#include "mingw/mingw.h"
+
+using std::string;
+using std::vector;
+
+vector<Backend::Factory*> Backend::factories;
+
+/*static*/ void
+Backend::InitFactories()
+{
+	factories.push_back ( new Factory ( "mingw", MingwBackend::Factory ) );
+}
+
+/*static*/ Backend*
+Backend::Create ( const std::string& name, Project& project )
+{
+	string sname ( name );
+	strlwr ( &sname[0] );
+	if ( !factories.size() )
+		throw Exception ( "internal tool error: no registered factories" );
+	for ( size_t i = 0; i < factories.size(); i++ )
+	{
+		if ( sname == factories[i]->name )
+			return (factories[i]->factory) ( project );
+	}
+	throw UnknownBackendException ( sname );
+	return NULL;
+}
+
 Backend::Backend ( Project& project )
 	: ProjectNode ( project )
 {

Modified: branches/xmlbuildsystem/reactos/tools/rbuild/backend/backend.h
--- branches/xmlbuildsystem/reactos/tools/rbuild/backend/backend.h	2005-01-06 02:06:44 UTC (rev 12844)
+++ branches/xmlbuildsystem/reactos/tools/rbuild/backend/backend.h	2005-01-06 02:55:11 UTC (rev 12845)
@@ -3,11 +3,36 @@
 
 #include "../rbuild.h"
 
+class Backend;
+
+typedef Backend* BackendFactory ( Project& project );
+
 class Backend
 {
+	class Factory
+	{
+	public:
+		std::string name;
+		BackendFactory* factory;
+
+		Factory ( const std::string& name_, BackendFactory* factory_ )
+			: name(name_), factory(factory_)
+		{
+		}
+	};
+
+	static std::vector<Factory*> factories;
+
 public:
+	static void InitFactories();
+	static Backend* Create ( const std::string& name, Project& project );
+
+protected:
 	Backend ( Project& project );
+
+public:
 	virtual void Process () = 0;
+
 protected:
 	Project& ProjectNode;
 };

Modified: branches/xmlbuildsystem/reactos/tools/rbuild/backend/mingw/mingw.cpp
--- branches/xmlbuildsystem/reactos/tools/rbuild/backend/mingw/mingw.cpp	2005-01-06 02:06:44 UTC (rev 12844)
+++ branches/xmlbuildsystem/reactos/tools/rbuild/backend/mingw/mingw.cpp	2005-01-06 02:55:11 UTC (rev 12845)
@@ -6,10 +6,17 @@
 using std::string;
 using std::vector;
 
+Backend*
+MingwBackend::Factory ( Project& project )
+{
+	return new MingwBackend ( project );
+}
+
 #ifdef WIN32
 #define EXEPOSTFIX ".exe"
 #define SEP "\\"
-string FixSep ( const string& s )
+string
+FixSep ( const string& s )
 {
 	string s2(s);
 	char* p = strchr ( &s2[0], '/' );
@@ -23,7 +30,8 @@
 #else
 #define EXEPOSTFIX
 #define SEP "/"
-string FixSep ( const string& s )
+string
+FixSep ( const string& s )
 {
 	string s2(s);
 	char* p = strchr ( &s2[0], '\\' );
@@ -41,7 +49,8 @@
 {
 }
 
-void MingwBackend::Process ()
+void
+MingwBackend::Process ()
 {
 	CreateMakefile ();
 	GenerateHeader ();
@@ -54,25 +63,29 @@
 	CloseMakefile ();
 }
 
-void MingwBackend::CreateMakefile ()
+void
+MingwBackend::CreateMakefile ()
 {
 	fMakefile = fopen ( ProjectNode.makefile.c_str (), "w" );
 	if ( !fMakefile )
 		throw AccessDeniedException ( ProjectNode.makefile );
 }
 
-void MingwBackend::CloseMakefile ()
+void
+MingwBackend::CloseMakefile ()
 {
 	if (fMakefile)
 		fclose ( fMakefile );
 }
 
-void MingwBackend::GenerateHeader ()
+void
+MingwBackend::GenerateHeader ()
 {
 	fprintf ( fMakefile, "# THIS FILE IS AUTOMATICALLY GENERATED, EDIT 'ReactOS.xml' INSTEAD\n\n" );
 }
 
-void MingwBackend::GenerateAllTarget ()
+void
+MingwBackend::GenerateAllTarget ()
 {
 	fprintf ( fMakefile, "all: " );
 	for ( size_t i = 0; i < ProjectNode.modules.size (); i++ )
@@ -86,7 +99,8 @@
 	fprintf ( fMakefile, "\n\n" );
 }
 
-void MingwBackend::ProcessModule ( Module& module )
+void
+MingwBackend::ProcessModule ( Module& module )
 {
 	MingwModuleHandlerList moduleHandlers;
 	GetModuleHandlers ( moduleHandlers );
@@ -101,7 +115,8 @@
 	}
 }
 
-void MingwBackend::GetModuleHandlers ( MingwModuleHandlerList& moduleHandlers )
+void
+MingwBackend::GetModuleHandlers ( MingwModuleHandlerList& moduleHandlers )
 {
 	moduleHandlers.push_back ( new MingwKernelModuleHandler ( fMakefile ) );
 }

Modified: branches/xmlbuildsystem/reactos/tools/rbuild/backend/mingw/mingw.h
--- branches/xmlbuildsystem/reactos/tools/rbuild/backend/mingw/mingw.h	2005-01-06 02:06:44 UTC (rev 12844)
+++ branches/xmlbuildsystem/reactos/tools/rbuild/backend/mingw/mingw.h	2005-01-06 02:55:11 UTC (rev 12845)
@@ -20,7 +20,10 @@
 class MingwBackend : public Backend
 {
 public:
+	static Backend* Factory ( Project& project );
+protected:
 	MingwBackend ( Project& project );
+public:
 	virtual void Process ();
 private:
 	void ProcessModule ( Module& module );

Modified: branches/xmlbuildsystem/reactos/tools/rbuild/backend/mingw/modulehandler.cpp
--- branches/xmlbuildsystem/reactos/tools/rbuild/backend/mingw/modulehandler.cpp	2005-01-06 02:06:44 UTC (rev 12844)
+++ branches/xmlbuildsystem/reactos/tools/rbuild/backend/mingw/modulehandler.cpp	2005-01-06 02:55:11 UTC (rev 12845)
@@ -12,15 +12,17 @@
 {
 }
 
-string MingwModuleHandler::GetModuleDependencies ( Module& module )
+string
+MingwModuleHandler::GetModuleDependencies ( Module& module )
 {
-	string dependencies ( "" );
-	
-	for ( size_t i = 0; i < module.libraries.size(); i++ )
+	if ( !module.libraries.size() )
+		return "";
+
+	string dependencies ( module.libraries[0]->name );
+
+	for ( size_t i = 1; i < module.libraries.size(); i++ )
 	{
-		if (dependencies.size () > 0)
-			dependencies += " ";
-		dependencies += module.libraries[i]->name;
+		dependencies += " " + module.libraries[i]->name;
 	}
 	return dependencies;
 }
@@ -31,17 +33,20 @@
 {
 }
 
-bool MingwKernelModuleHandler::CanHandleModule ( Module& module )
+bool
+MingwKernelModuleHandler::CanHandleModule ( Module& module )
 {
 	return true;
 }
 
-void MingwKernelModuleHandler::Process ( Module& module )
+void
+MingwKernelModuleHandler::Process ( Module& module )
 {
 	GenerateKernelModuleTarget ( module );
 }
 
-void MingwKernelModuleHandler::GenerateKernelModuleTarget ( Module& module )
+void
+MingwKernelModuleHandler::GenerateKernelModuleTarget ( Module& module )
 {
 	fprintf ( fMakefile, "%s: %s",
 	          module.name.c_str (),

Modified: branches/xmlbuildsystem/reactos/tools/rbuild/exception.cpp
--- branches/xmlbuildsystem/reactos/tools/rbuild/exception.cpp	2005-01-06 02:06:44 UTC (rev 12844)
+++ branches/xmlbuildsystem/reactos/tools/rbuild/exception.cpp	2005-01-06 02:55:11 UTC (rev 12845)
@@ -61,7 +61,7 @@
 }
 
 
-XMLSyntaxErrorException::XMLSyntaxErrorException ( const std::string& location,
+XMLSyntaxErrorException::XMLSyntaxErrorException ( const string& location,
 	                                               const char* message,
 	                                               ... )
 {
@@ -72,19 +72,30 @@
 }
 
 
-RequiredAttributeNotFoundException::RequiredAttributeNotFoundException(const std::string& attributeName,
-                                                                       const std::string& elementName)
+RequiredAttributeNotFoundException::RequiredAttributeNotFoundException(const string& attributeName,
+                                                                       const string& elementName)
 	: InvalidBuildFileException ( "Required attribute '%s' not found on '%s'.",
 	                              attributeName.c_str (),
 	                              elementName.c_str ())
 {
 }
 
-InvalidAttributeValueException::InvalidAttributeValueException(const std::string& name,
-	                                                           const std::string& value)
+InvalidAttributeValueException::InvalidAttributeValueException(const string& name,
+	                                                           const string& value)
 	: InvalidBuildFileException ( "Attribute '%s' has an invalid value '%s'.",
 	                              name.c_str (),
 	                              value.c_str ())
 {
 	
 }
+
+BackendNameConflictException::BackendNameConflictException ( const string& name )
+	: Exception ( "Backend name conflict: '%s'", name.c_str() )
+{
+}
+
+
+UnknownBackendException::UnknownBackendException ( const string& name )
+	: Exception ( "Unknown Backend requested: '%s'", name.c_str() )
+{
+}

Modified: branches/xmlbuildsystem/reactos/tools/rbuild/exception.h
--- branches/xmlbuildsystem/reactos/tools/rbuild/exception.h	2005-01-06 02:06:44 UTC (rev 12844)
+++ branches/xmlbuildsystem/reactos/tools/rbuild/exception.h	2005-01-06 02:55:11 UTC (rev 12845)
@@ -67,4 +67,18 @@
 	                               const std::string& value);
 };
 
+
+class BackendNameConflictException : public Exception
+{
+public:
+	BackendNameConflictException ( const std::string& name );
+};
+
+
+class UnknownBackendException : public Exception
+{
+public:
+	UnknownBackendException ( const std::string& name );
+};
+
 #endif /* __EXCEPTION_H */

Modified: branches/xmlbuildsystem/reactos/tools/rbuild/module.cpp
--- branches/xmlbuildsystem/reactos/tools/rbuild/module.cpp	2005-01-06 02:06:44 UTC (rev 12844)
+++ branches/xmlbuildsystem/reactos/tools/rbuild/module.cpp	2005-01-06 02:55:11 UTC (rev 12845)
@@ -27,8 +27,9 @@
 		delete libraries[i];
 }
 
-void Module::ProcessXML ( const XMLElement& e,
-                          const string& path )
+void
+Module::ProcessXML ( const XMLElement& e,
+                     const string& path )
 {
 	string subpath ( path );
 	if ( e.name == "file" && e.value.size () )
@@ -49,7 +50,8 @@
 		ProcessXML ( *e.subElements[i], subpath );
 }
 
-ModuleType Module::GetModuleType ( const XMLAttribute& attribute )
+ModuleType
+Module::GetModuleType ( const XMLAttribute& attribute )
 {
 	if ( attribute.value == "buildtool" )
 		return BuildTool;

Modified: branches/xmlbuildsystem/reactos/tools/rbuild/project.cpp
--- branches/xmlbuildsystem/reactos/tools/rbuild/project.cpp	2005-01-06 02:06:44 UTC (rev 12844)
+++ branches/xmlbuildsystem/reactos/tools/rbuild/project.cpp	2005-01-06 02:55:11 UTC (rev 12845)
@@ -25,7 +25,8 @@
 	delete head;
 }
 
-void Project::ReadXml ()
+void
+Project::ReadXml ()
 {
 	Path path;
 

Modified: branches/xmlbuildsystem/reactos/tools/rbuild/rbuild.cpp
--- branches/xmlbuildsystem/reactos/tools/rbuild/rbuild.cpp	2005-01-06 02:06:44 UTC (rev 12844)
+++ branches/xmlbuildsystem/reactos/tools/rbuild/rbuild.cpp	2005-01-06 02:55:11 UTC (rev 12845)
@@ -17,11 +17,19 @@
 int
 main ( int argc, char** argv )
 {
+	Backend::InitFactories();
+	if ( argc != 2 )
+	{
+		printf ( "syntax: rbuild {buildtarget}\n" );
+		return 1;
+	}
+	string buildtarget ( argv[1] );
+	strlwr ( &buildtarget[0] );
 	try
 	{
 		string projectFilename ( "ReactOS.xml" );
 		Project project ( projectFilename );
-		Backend* backend = new MingwBackend ( project );
+		Backend* backend = Backend::Create ( buildtarget, project );
 		backend->Process ();
 		delete backend;
 		

Modified: branches/xmlbuildsystem/reactos/tools/rbuild/ssprintf.cpp
--- branches/xmlbuildsystem/reactos/tools/rbuild/ssprintf.cpp	2005-01-06 02:06:44 UTC (rev 12844)
+++ branches/xmlbuildsystem/reactos/tools/rbuild/ssprintf.cpp	2005-01-06 02:55:11 UTC (rev 12845)
@@ -34,7 +34,8 @@
     unsigned int empty:16;
 } ieee_long_double_t;
 
-std::string ssprintf ( const char* fmt, ... )
+std::string
+ssprintf ( const char* fmt, ... )
 {
 	va_list arg;
 	va_start(arg, fmt);
@@ -43,7 +44,8 @@
 	return f;
 }
 
-std::wstring sswprintf ( const wchar_t* fmt, ... )
+std::wstring
+sswprintf ( const wchar_t* fmt, ... )
 {
 	va_list arg;
 	va_start(arg, fmt);
@@ -62,7 +64,8 @@
 #define ZEROTRUNC	128	/* truncate zero 's */
 
 
-static int skip_atoi(const char **s)
+static int
+skip_atoi(const char **s)
 {
 	int i=0;
 
@@ -71,7 +74,8 @@
 	return i;
 }
 
-static int skip_wtoi(const wchar_t **s)
+static int
+skip_wtoi(const wchar_t **s)
 {
 	int i=0;
 
@@ -81,7 +85,8 @@
 }
 
 
-static int do_div(LONGLONG *n,int base)
+static int
+do_div(LONGLONG *n,int base)
 {
 	int __res = ((ULONGLONG) *n) % (unsigned) base;
 	*n = ((ULONGLONG) *n) / (unsigned) base;
@@ -89,7 +94,8 @@
 }
 
 
-static bool number(std::string& f, LONGLONG num, int base, int size, int precision ,int type)
+static bool
+number(std::string& f, LONGLONG num, int base, int size, int precision ,int type)
 {
 	char c,sign,tmp[66];
 	const char *digits="0123456789abcdefghijklmnopqrstuvwxyz";
@@ -165,7 +171,8 @@
 	return true;
 }
 
-static bool wnumber(std::wstring& f, LONGLONG num, int base, int size, int precision ,int type)
+static bool
+wnumber(std::wstring& f, LONGLONG num, int base, int size, int precision ,int type)
 {
 	wchar_t c,sign,tmp[66];
 	const wchar_t *digits = L"0123456789abcdefghijklmnopqrstuvwxyz";
@@ -242,7 +249,8 @@
 }
 
 
-static bool numberf(std::string& f, double __n, char exp_sign,  int size, int precision, int type)
+static bool
+numberf(std::string& f, double __n, char exp_sign,  int size, int precision, int type)
 {
 	double exponent = 0.0;
 	double e;
@@ -435,7 +443,8 @@
 	return true;
 }
 
-static bool wnumberf(std::wstring& f, double __n, wchar_t exp_sign,  int size, int precision, int type)
+static bool
+wnumberf(std::wstring& f, double __n, wchar_t exp_sign,  int size, int precision, int type)
 {
 	double exponent = 0.0;
 	double e;
@@ -628,7 +637,8 @@
 	return true;
 }
 
-static bool numberfl(std::string& f, long double __n, char exp_sign,  int size, int precision, int type)
+static bool
+numberfl(std::string& f, long double __n, char exp_sign,  int size, int precision, int type)
 {
 	long double exponent = 0.0;
 	long double e;
@@ -834,7 +844,8 @@
 	return true;
 }
 
-static bool wnumberfl(std::wstring& f, long double __n, wchar_t exp_sign,  int size, int precision, int type)
+static bool
+wnumberfl(std::wstring& f, long double __n, wchar_t exp_sign,  int size, int precision, int type)
 {
 	long double exponent = 0.0;
 	long double e;
@@ -1035,7 +1046,8 @@
 	return true;
 }
 
-static int do_string(std::string& f, const char* s, int len, int field_width, int precision, int flags)
+static int
+do_string(std::string& f, const char* s, int len, int field_width, int precision, int flags)
 {
 	int i, done = 0;
 	if (s == NULL)
@@ -1076,7 +1088,8 @@
 	return done;
 }
 
-static int do_wstring(std::wstring& f, const wchar_t* s, int len, int field_width, int precision, int flags)
+static int
+do_wstring(std::wstring& f, const wchar_t* s, int len, int field_width, int precision, int flags)
 {
 	int i, done = 0;
 	if (s == NULL)
@@ -1117,7 +1130,8 @@
 	return done;
 }
 
-static int stringw(std::string& f, const wchar_t* sw, int len, int field_width, int precision, int flags)
+static int
+stringw(std::string& f, const wchar_t* sw, int len, int field_width, int precision, int flags)
 {
 	int i, done = 0;
 	if (sw == NULL)
@@ -1169,7 +1183,8 @@
 	return done;
 }
 
-static int wstringa(std::wstring& f, const char* sa, int len, int field_width, int precision, int flags)
+static int
+wstringa(std::wstring& f, const char* sa, int len, int field_width, int precision, int flags)
 {
 	int i, done = 0;
 	if (sa == NULL)
@@ -1219,7 +1234,8 @@
 #define _isnanl _isnan
 #define _finitel _finite
 
-std::string ssvprintf ( const char *fmt, va_list args )
+std::string
+ssvprintf ( const char *fmt, va_list args )
 {
 	ULONGLONG num;
 	int base;
@@ -1569,7 +1585,8 @@
 	return f;
 }
 
-std::wstring sswvprintf ( const wchar_t* fmt, va_list args )
+std::wstring
+sswvprintf ( const wchar_t* fmt, va_list args )
 {
 	ULONGLONG num;
 	int base;