--- /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"