diff -r 000000000000 -r f58d6ec98e88 cdlcompilertoolkit/src/CdlTkSyntaxCheck.cpp --- /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 +#include +#include +#include +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 " << 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