sl@0: // Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies).
sl@0: // All rights reserved.
sl@0: // This component and the accompanying materials are made available
sl@0: // under the terms of "Eclipse Public License v1.0"
sl@0: // which accompanies this distribution, and is available
sl@0: // at the URL "http://www.eclipse.org/legal/epl-v10.html".
sl@0: //
sl@0: // Initial Contributors:
sl@0: // Nokia Corporation - initial contribution.
sl@0: //
sl@0: // Contributors:
sl@0: //
sl@0: // Description:
sl@0: // EPOC32 version of crt0.c for C programs which always want multi-threaded support
sl@0: // 
sl@0: //
sl@0: 
sl@0: #include <e32std.h>
sl@0: #include <e32base.h>
sl@0: #include <estlib.h>	// for SpawnPosixServerThread()
sl@0: #include <stdlib.h>
sl@0: 
sl@0: #ifdef __ARMCC__
sl@0: __asm int CallMain(int argc, char *argv[], char *envp[])
sl@0: {
sl@0:        import main
sl@0:        code32
sl@0:        b main
sl@0: }
sl@0: #define CALLMAIN(argc, argv, envp) CallMain(argc, argv, envp)
sl@0: #else
sl@0: extern "C" int main (int argc, char *argv[], char *envp[]);
sl@0: #define CALLMAIN(argc, argv, envp) main(argc, argv, envp)
sl@0: #endif
sl@0: 
sl@0: GLDEF_C TInt E32Main()
sl@0: 	{     
sl@0: 	CTrapCleanup::New();
sl@0: 
sl@0: 	SpawnPosixServerThread();		// arrange for multi-threaded operation
sl@0: 
sl@0: 	int argc=0;
sl@0: 	char ** argv=0;
sl@0: 	char ** envp=0;
sl@0: 
sl@0: 
sl@0: 	__crt0(argc,argv,envp);			// get args & environment from somewhere
sl@0: 
sl@0: 	int ret=CALLMAIN(argc, argv, envp);		// go
sl@0: 
sl@0: 	// no need to explicitly delete the cleanup stack here as all memory used by
sl@0: 	// the process will be released by RProcess::Terminate(), called from inside exit().
sl@0: 
sl@0: 	exit(ret);				// finish with atexit processing
sl@0: 
sl@0: 	return(KErrNone);
sl@0: 	}
sl@0: 
sl@0: 
sl@0: #if defined __GCC32__ && !defined __X86GCC__
sl@0: 
sl@0: /* stub function inserted into main() by GCC */
sl@0: extern "C" void __gccmain (void) {}
sl@0: 
sl@0: /* Default GCC entrypoint */
sl@0: extern "C" TInt _mainCRTStartup (void) 
sl@0:     {
sl@0:     extern TInt _E32Startup();
sl@0:     return _E32Startup();
sl@0:     }
sl@0: 
sl@0: #endif /* __GCC32__ */
sl@0: 
sl@0: // X86GCC uses def files derived from EABI
sl@0: #if (defined (__EABI__)) || (defined (__X86GCC__))
sl@0: 
sl@0: // standard entrypoint for C runtime, expected by some linkers
sl@0: // Symbian OS does not currently use this function
sl@0: extern "C" void __main() {}
sl@0: #endif