genericopenlibs/cstdlib/USTLIB/ESTLIB.CPP
changeset 0 e4d67989cc36
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/genericopenlibs/cstdlib/USTLIB/ESTLIB.CPP	Tue Feb 02 02:01:42 2010 +0200
@@ -0,0 +1,214 @@
+// Copyright (c) 1997-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 "POSIXIF.H"
+
+// Category for the panic.
+_LIT(KEstlibInit, "ESTLIB-INIT");
+
+// Access for the outside world
+extern "C" {
+
+EXPORT_C void CloseSTDLIB()
+	{
+	struct _reent* p=(struct _reent*)Dll::Tls();
+	if (p==0)
+		return;
+	_reclaim_reent(p);	// Reclaiming calls the atexit processing and generally tries to tidy up
+	User::Free(p);		// then we give back the struct _reent itself
+	Dll::SetTls(0);		// ... so we don't free it again when the DLL exits
+	}
+
+/**
+Allocates memory for the library globals struct and returns a pointer to it. If the
+memory has been allocated previously then it simply returns a pointer to the memory.
+Panics if any error/failure occurs.
+
+@return On Success, a pointer to the memory containing the library globals.
+*/
+EXPORT_C struct _reent *ImpurePtr(void)
+	{
+	struct _reent* p=(struct _reent*)Dll::Tls();
+	if (p)
+		return p; // Memory is already allocated for the library globals.
+
+	// First use, so construct the default struct _reent and the associated SystemInterface
+	p=(struct _reent*)User::Alloc(sizeof(struct _reent));
+	if(p ==0)
+		{
+		User::Panic(KEstlibInit,KErrNoMemory);
+		}
+
+	TInt err= Dll::SetTls(p);
+
+	if (err != KErrNone)
+		{
+		delete p;
+		p = 0;
+		Dll::FreeTls();
+		User::Panic(KEstlibInit, err);
+		}
+
+	void* sysIf=0;
+
+	CProcessSystemInterface* pSysIf=new CProcessSystemInterface;
+	if (pSysIf && pSysIf->Connect()==KErrNone)
+		{
+		sysIf=pSysIf;
+		}
+	else
+		{
+		delete pSysIf;
+		pSysIf = 0;
+
+		CTrapCleanup *cleanup = NULL;
+		if(User::TrapHandler() == NULL)
+			{
+			cleanup = CTrapCleanup::New();
+			if(cleanup != NULL)
+		        {
+				//use static_cast to perform the valid conversion from CLocalSystemInterface to base class MSystemInterface
+				TRAP(err, sysIf = static_cast<MSystemInterface*> (CLocalSystemInterface::NewL()));
+		        }
+		    else
+		    	{
+				err = KErrNoMemory;
+				}
+	    	delete cleanup;
+			}
+		else
+			{
+			//use static_cast to perform the valid conversion from CLocalSystemInterface to base class MSystemInterface
+			TRAP(err, sysIf = static_cast<MSystemInterface*> (CLocalSystemInterface::NewL()));
+			}
+		}
+
+	if (err != KErrNone)
+		{
+	    delete p;
+	    p = 0;
+		Dll::FreeTls();
+		User::Panic(KEstlibInit, err);
+		}
+
+	Mem::FillZ(p,sizeof(struct _reent));
+	_init_reent(p,sysIf);
+
+	return p;
+	}
+
+/**
+This is a panic free version of ImpurePtr. It allocates memory for the library globals
+struct and returns a pointer to it. If the memory has been allocated previously then it
+simply returns a pointer to the memory.
+If there is not enough memory available to set up the library globals or other error occurs,
+a NULL pointer will be returned.
+
+@return On Success, a pointer to the memory containing the library globals.
+		On Failure, a NULL pointer.
+*/
+EXPORT_C struct _reent * ImpurePtr2(void)
+	{
+	struct _reent* p = (struct _reent*)Dll::Tls();
+	if (p)
+		return p; // Memory is already allocated for the library globals.
+
+	// First use, so construct the default struct _reent and the associated SystemInterface
+	p =(struct _reent*)User::Alloc(sizeof(struct _reent));
+	if (p== 0)
+		return p ; // NULL
+
+	if (Dll::SetTls(p))
+		{
+		delete p;
+		p = 0;
+		Dll::FreeTls();
+		return p; // NULL
+		}
+
+	void* sysIf=0;
+	CProcessSystemInterface* pSysIf=new CProcessSystemInterface;
+	if (pSysIf && pSysIf->Connect()==KErrNone)
+		{
+		sysIf=pSysIf;
+		}
+	else
+		{
+		TInt err=KErrNone;
+		delete pSysIf;
+		pSysIf = 0;
+
+		CTrapCleanup *cleanup = NULL;
+		if(User::TrapHandler() == NULL)
+			{
+			cleanup = CTrapCleanup::New();
+			if(cleanup != NULL)
+		        {
+				//use static_cast to perform the valid conversion from CLocalSystemInterface to base class MSystemInterface
+				TRAP(err, sysIf = static_cast<MSystemInterface*> (CLocalSystemInterface::NewL()));
+		        }
+	    	delete cleanup;
+			}
+		else
+			{
+			//use static_cast to perform the valid conversion from CLocalSystemInterface to base class MSystemInterface
+			TRAP(err, sysIf = static_cast<MSystemInterface*> (CLocalSystemInterface::NewL()));
+			}
+		}
+
+	if (!sysIf)
+		{
+		delete p;
+		p = 0;
+		Dll::FreeTls();
+		return p; // NULL
+		}
+
+	Mem::FillZ(p,sizeof(struct _reent));
+	_init_reent(p,sysIf);
+
+	return p; // Library globals have been set up correctly.
+	}
+
+
+EXPORT_C int *__errno(void)
+	{
+	return &(ImpurePtr()->_errno);
+	}
+
+EXPORT_C void _exit (int status) _ATTRIBUTE((noreturn))
+	{
+	struct _reent* p=(struct _reent*)Dll::Tls();
+	if (p)
+		{
+		MSystemInterface& sysIf=Interface(p);
+		sysIf.TerminateProcess(status);
+		}
+	RProcess().Terminate(status);	// just in case
+	}
+
+} // extern "C"
+
+#ifndef EKA2
+GLDEF_C TInt E32Dll(TDllReason)
+//
+// DLL entry point
+//
+	{
+
+	return KErrNone;
+	}
+#endif
+