cdlcompilertoolkit/src/CdlTkSyntaxCheck.cpp
changeset 0 f58d6ec98e88
child 1 b700e12870ca
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cdlcompilertoolkit/src/CdlTkSyntaxCheck.cpp	Thu Dec 17 09:14:18 2009 +0200
@@ -0,0 +1,131 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+#include "CdlCompilerToolkit/CdlTkProcess.h"
+#include "CdlTkPriv.h"
+#include <fstream>
+#include <iomanip>
+#include <direct.h>
+#include <iostream>
+using namespace std;
+
+namespace CdlCompilerToolkit {
+
+//
+// CppSyntaxErr
+//
+
+class CppSyntaxErr : public CdlCompilerToolkitErr
+	{
+public:
+	CppSyntaxErr(int aErr);
+	void Show(ostream& aStream) const;
+private:
+	int iErr;
+	};
+
+CppSyntaxErr::CppSyntaxErr(int aErr)
+: iErr(aErr)
+	{
+	}
+
+void CppSyntaxErr::Show(ostream& aStream) const
+	{
+	aStream << "CDL C++ Syntax check failed. Cpp returned " << iErr << endl;
+	}
+
+
+//
+// CCdlTkSyntaxCheck
+//
+
+CCdlTkSyntaxCheck::CCdlTkSyntaxCheck(const CCdlTkInterface& aCdl)
+: CCdlTkWriteClientHeader(aCdl)
+	{
+	}
+
+CCdlTkSyntaxCheck::~CCdlTkSyntaxCheck()
+	{
+	}
+
+void CCdlTkSyntaxCheck::Process()
+	{
+	AssertInterfaceNotExtended(iCdl);
+	string name = iCdl.FileName() + ".tempCdlSyntaxCheck";
+
+	// these will automatically delete the files when the function returns
+	CCdlTkFileCleanup cppClean(name + ".cpp");
+	CCdlTkFileCleanup objClean(name + ".s");
+
+	WriteSyntaxCheckCpp(name + ".cpp");
+	DoSyntaxCheckBuild(name + ".cpp");
+	}
+
+void CCdlTkSyntaxCheck::WriteSyntaxCheckCpp(string aName) const
+	{
+	ofstream out;
+	CdlTkUtil::OpenOutput(out, aName);
+
+	out << "#line 1 \"" << CdlTkUtil::StripPath(iCdl.FileName()) << "\"" << endl;
+	out << "#include <cdlengine.h>" << endl;
+	const CCdlTkCpp& cpp = iCdl.Cpp();
+	for (CCdlTkCpp::const_iterator pCpp = cpp.begin(); pCpp != cpp.end(); ++pCpp)
+		{
+		out << *pCpp << endl;
+		}
+	WriteNamespaceStart(iCdl, out);
+	for (CCdlTkApiList::const_iterator pApi = iCdl.ApiList().begin(); pApi != iCdl.ApiList().end(); ++pApi)
+		WriteSyntaxCheckApi(**pApi, out);
+	WriteNamespaceEnd(iCdl, out);
+	out << "GLDEF_C TInt E32Dll(TDllReason /*aReason*/)" << endl;
+	out << "\t{" << endl;
+	out << "\treturn(KErrNone);" << endl;
+	out << "\t}" << endl;
+
+	out.close();
+	}
+
+void CCdlTkSyntaxCheck::DoSyntaxCheckBuild(string aName) const
+	{
+	string s = "gcc ";
+	if (!iParams.empty())
+		{
+		s += "\"";
+		s += iParams;
+		s += "\" ";
+		}
+	s += "-Wp,-DNDEBUG,-D_UNICODE,-D__SYMBIAN32__,-D__GCC32__,-D__EPOC32__,-D__MARM__,-D__MARM_ARMI__,-D__DLL__,-I";
+	s += CdlTkUtil::CurrentDrive();	// drive
+	s += "\\epoc32\\include -S -xc++ ";
+	s += CdlTkUtil::CurrentDrive();	// drive
+	s += aName;
+	int err = system(s.c_str());
+	if (err)
+		throw CppSyntaxErr(err);
+	}
+
+void CCdlTkSyntaxCheck::WriteSyntaxCheckApi(const CCdlTkApi& aApi, ofstream& aStream) const
+	{
+	aStream << "#line " << setbase(10) << aApi.SourceFileLineNum() << endl;
+	aStream << ClientReturnType(aApi) << " " << aApi.Name() << aApi.ParamsTypeAndNameList() << ";" << endl;
+	}
+
+void CCdlTkSyntaxCheck::SetParams(string aParams)
+	{
+	iParams = aParams;
+	}
+
+}	// end of namespace CdlCompilerToolkit