4
0
mirror of git://sourceware.org/git/newlib-cygwin.git synced 2025-01-19 21:09:22 +08:00
Jeff Johnston 2d5862dee6 2000-08-23 Werner Almesberger <Werner.Almesberger@epfl.ch>
* libc/stdlib/mprec.c (ulp, b2d, d2b): changed a few expressions
        like  x << y-z  to the equivalent  x << (y-z).
        (d2b): changed if statements with assignment to perform the
        assignment prior to the if check.
        * libc/reent/reent.c: included stdlib.h for "_free_r" prototype.
        * libc/unix/getpass.c (getpass): moved "echo" assignment out of if.
        * libc/unix/ttyname.c: included string.h for "strcpy" prototype.
        * libc/unix/getcwd.c (ISDOT): added parentheses to clarify && and ||
        precedence.
        * libc/include/sys/unistd.h: added "vfork" prototype (for popen.c).
        Added "_execve" prototype (for execl.c, execle.c, execv.c, and
        execve.c).
        * libc/posix/popen.c (popen): added parentheses to clarify && and ||
        precedence.
        * libm/math/e_cosh.c (__ieee754_cosh): changed parentheses to
        clarify && and || precendence (and to remove pascalism).
        * libm/math/e_sinh.c (__ieee754_sinh): Ditto.
        * libm/math/s_infconst.c: added another pair of braces to all
        initializers for __infinity (need three: for __infinity[1] array,
        for union __dmath, and for i[2]).
2000-08-24 22:32:38 +00:00

109 lines
2.0 KiB
C

/*
FUNCTION
<<reent>>---definition of impure data.
INDEX
reent
DESCRIPTION
This module defines the impure data area used by the
non-rentrant functions, such as strtok.
*/
#include <stdlib.h>
#include <reent.h>
/* Interim cleanup code */
void
cleanup_glue (ptr, glue)
struct _reent *ptr;
struct _glue *glue;
{
/* Have to reclaim these in reverse order: */
if (glue->_next)
cleanup_glue (ptr, glue->_next);
_free_r (ptr, glue);
}
void
_reclaim_reent (ptr)
struct _reent *ptr;
{
if (ptr != _impure_ptr)
{
/* used by mprec routines. */
if (ptr->_freelist)
{
int i;
for (i = 0; i < 15 /* _Kmax */; i++)
{
struct _Bigint *thisone, *nextone;
nextone = ptr->_freelist[i];
while (nextone)
{
thisone = nextone;
nextone = nextone->_next;
_free_r (ptr, thisone);
}
}
_free_r (ptr, ptr->_freelist);
}
/* 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_r (ptr, q);
}
}
if (ptr->_cvtbuf)
_free_r (ptr, ptr->_cvtbuf);
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, ptr->__sglue._next);
}
/* Malloc memory not reclaimed; no good way to return memory anyway. */
}
}
/*
* Do atexit() processing and cleanup
*
* NOTE: This is to be executed at task exit. It does not tear anything
* down which is used on a global basis.
*/
void
_wrapup_reent(struct _reent *ptr)
{
register struct _atexit *p;
register int n;
if (ptr == 0)
ptr = _REENT;
for (p = ptr->_atexit; p; p = p->_next)
for (n = p->_ind; --n >= 0;)
(*p->_fns[n]) ();
if (ptr->__cleanup)
(*ptr->__cleanup) (ptr);
}