genericopenlibs/cstdlib/LSTDLIB/REENT.CPP
changeset 31 ce057bb09d0b
parent 0 e4d67989cc36
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/genericopenlibs/cstdlib/LSTDLIB/REENT.CPP	Fri Jun 04 16:20:51 2010 +0100
@@ -0,0 +1,109 @@
+// Copyright (c) 1998-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:
+// FUNCTION
+// <<reent>>---definition of impure data.
+// INDEX
+// reent
+// This module defines the impure data area used by the
+// non-rentrant functions, such as strtok.
+// 
+//
+
+#include "SYSIF.H"
+#include <sys/reent.h>
+#include <stdlib.h>
+
+/* Interim cleanup code */
+
+static void cleanup_glue (struct _glue *glue)
+	{
+	/* Have to reclaim these in reverse order: */
+	if (glue->_next)
+		cleanup_glue (glue->_next);
+	free (glue);
+	}
+
+extern "C" {
+
+/**
+The struct _reent is managed on a per-thread basis by EPOC32, so there is no
+global variable _impure_pointer and everyone has to use _REENT (panics in the
+event of an error) or REENT2 (which returns a NULL pointer in the event of an
+error).
+
+@return
+@param ptr
+*/
+EXPORT_C void
+_reclaim_reent (struct _reent *ptr)
+	{
+	/* atexit stuff */
+	if ((ptr->_atexit) && (ptr->_atexit != &ptr->_atexit0))
+		{
+		struct _atexit *p, *q;
+		for (p = ptr->_atexit; p != &ptr->_atexit0;)
+			{
+			q = p;
+			p = p->_next;
+			free(q);
+			}
+		}
+
+	if (ptr->environ)
+		free(ptr->environ);
+
+	if (ptr->_netdb)
+		free(ptr->_netdb);
+
+	if (ptr->__sdidinit)
+		{
+		/* cleanup won't reclaim memory 'coz usually it's run
+		before the program exits, and who wants to wait for that? */
+		ptr->__cleanup (ptr);
+		if (ptr->__sglue._next)
+			cleanup_glue (ptr->__sglue._next);
+		}
+
+	// narrow environment buffer
+	if (ptr->_pNarrowEnvBuffer)
+		{
+		free(ptr->_pNarrowEnvBuffer);
+		ptr->_pNarrowEnvBuffer = 0;
+		}
+
+	MSystemInterface& sysIf=Interface(ptr);
+	sysIf.Release();
+
+	ptr->_system=0;
+	}
+
+EXPORT_C void _REENT_INIT(struct _reent *ptr)
+	{
+	MSystemInterface& sysIf=Interface(ImpurePtr());
+	_init_reent(ptr,&sysIf.Clone());
+	}
+
+extern "C" void __sinit(struct _reent*);	// LSTDIO/LOCAL.H
+
+EXPORT_C void _init_reent(struct _reent *ptr, void* _system)
+	{
+	ptr->_system=_system;
+	__sinit(ptr);
+	ptr->_next[0]=1;
+	ptr->_next[1]=1;
+
+	ptr->_pNarrowEnvBuffer = 0;
+	}
+
+} // extern "C"