This is the mail archive of the newlib@sourceware.cygnus.com mailing list for the newlib project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Patch to newlib-1.8.1 concerning non-reentrant functions


Hallo!

I have made some changes to newlib-1.8.1 in order to make some
non-reentrant functions reentrant (asctime, localtime, strtok, rand,
srand, w_gamma, w_lgamma, wf_gamma and wf_lgamma). Because these
changes do affect the layout of the 'struct reent', I have guarded
them by a preprocessor macro '_COMPATIBLE_STRUCT_REENT' (I believe this
should be a configure-parameter, but I do not know how to introduce
one).

Another set of changes defines some initialised variables/structures
as const in order to save space in multithreaded systems with
shared text segments.

I append the patch. Please let me know if you are willing to apply it
to your sources and if some additional action is required by me.

-jr
--------------------------------------------------------------------------
Dr. Johannes Reisinger
System Design
FREQUENTIS
A-1120 Wien, Spittelbreitengasse 34
http://www.frequentis.com
Tel: +43/1/8100606-329, Fax -399
mailto:jreising@frequentis.com
--------------------------------------------------------------------------
diff -r -c newlib.orig/ChangeLog newlib.patched/ChangeLog
*** newlib.orig/ChangeLog	Mon Jun  1 17:51:07 1998
--- newlib.patched/ChangeLog	Thu Sep 24 15:38:12 1998
***************
*** 1,3 ****
--- 1,45 ----
+ Thu Sep 24 15:20:05 1998  Johannes Reisinger <jreising@frequentis.com>
+ 
+         * libc/include/sys/reent.h: add variables _rand_next, _strtok_last,
+         _asctime_buf, _localtime_buf and _gamma_signgam to struct reent
+         to make rand/srand, strtok, asctime, localtime, w_gamma,
+         w_lgamma, wf_gamma, and wf_lgamma reentrant. Remove unneeded
+         elements _nextf and _nmalloc from the struct reent.
+         * libc/include/time.h: move definition of struct tm to sys/reent.h.
+         * libc/include/sys/config.h: #undef _COMPATIBLE_STRUCT_REENT.
+         This should possibly be a configure-parameter
+         (-enable-compatible-struct-reent?)
+         * libc/stdlib/rand.c: don't emit functions 'rand' and 'srand' if
+         '_REENT_ONLY' is set. Use variable '_rand_next' from struct reent
+         instead of static variable 'next' if '_COMPATIBLE_STRUCT_REENT'
+         is not defined.
+         * libc/stdlib/strtok.c: Use variable '_strtok_last' from struct reent
+         instead of static variable 'last' if '_COMPATIBLE_STRUCT_REENT'
+         is not defined.
+         * libc/stdlib/asctime.c: Use variable '_asctime_buf' from
+         struct reent instead of static variable 'buf' if
+         '_COMPATIBLE_STRUCT_REENT' is not defined.
+         * libc/stdlib/lcltime.c: Use variable '_localtime_buf' from
+         struct reent instead of static variable 'tim_s' if
+         '_COMPATIBLE_STRUCT_REENT' is not defined.
+         * libm/math/s_signgam.c: don't define variable 'signgam' unless
+         '_COMPATIBLE_STRUCT_REENT' is defined
+         * libm/math/w_gamma.c: Use variable '_gamma_signgam' from
+         struct reent instead of global variable 'signgam' if
+         '_COMPATIBLE_STRUCT_REENT' is not defined.
+         * libm/math/w_lgamma.c: Likewise.
+         * libm/math/wf_gamma.c: Likewise.
+         * libm/math/wf_lgamma.c: Likewise.
+         * libc/include/unctrl.h: define arrays __unctrl and __unctrllen
+         to be const.
+         * libc/include/unctrl.c: define arrays __unctrl and __unctrllen
+         to be const.
+         * libc/stdio/vfprintf.c: define arrays 'blanks' and 'zeroes'
+         to be const.
+         * libc/stdlib/mbtowc_r.c: define arraya 'JIS_state_table' and
+         'JIS_action_table' to be const.
+         * libm/math/s_lib_ver.c: define variable _LIB_VERSION to be const.
+ 
  Fri May 29 03:04:29 1998  Geoffrey Noer  <noer@cygnus.com>
  
  	* libc/include/sys/fcntl.h: add _close proto for Cygwin32
diff -r -c newlib.orig/libc/include/math.h newlib.patched/libc/include/math.h
*** newlib.orig/libc/include/math.h	Sat May 30 00:02:42 1998
--- newlib.patched/libc/include/math.h	Wed Sep 23 14:08:22 1998
***************
*** 254,260 ****
  #define _LIB_VERSION_TYPE enum __fdlibm_version
  #define _LIB_VERSION __fdlib_version
  
! extern _LIB_VERSION_TYPE _LIB_VERSION;
  
  #define _IEEE_  __fdlibm_ieee
  #define _SVID_  __fdlibm_svid
--- 254,260 ----
  #define _LIB_VERSION_TYPE enum __fdlibm_version
  #define _LIB_VERSION __fdlib_version
  
! extern _CONST _LIB_VERSION_TYPE _LIB_VERSION;
  
  #define _IEEE_  __fdlibm_ieee
  #define _SVID_  __fdlibm_svid
diff -r -c newlib.orig/libc/include/sys/config.h newlib.patched/libc/include/sys/config.h
*** newlib.orig/libc/include/sys/config.h	Mon Jun  1 17:49:15 1998
--- newlib.patched/libc/include/sys/config.h	Thu Sep 24 15:17:22 1998
***************
*** 1,6 ****
--- 1,8 ----
  #ifndef __SYS_CONFIG_H__
  #define __SYS_CONFIG_H__
  
+ #undef _COMPATIBLE_STRUCT_REENT
+ 
  /* exceptions first */
  /* ??? Why is much of this stuff duplicated with machine/ieeefp.h?  */
  #if defined(__H8300__) || defined(__H8500__) || defined (__H8300H__) ||  defined(__W65__) || defined (__H8300S__)
diff -r -c newlib.orig/libc/include/sys/reent.h newlib.patched/libc/include/sys/reent.h
*** newlib.orig/libc/include/sys/reent.h	Sat May 30 00:02:45 1998
--- newlib.patched/libc/include/sys/reent.h	Thu Sep 24 13:50:16 1998
***************
*** 12,17 ****
--- 12,30 ----
  
  #include <_ansi.h>
  
+ struct tm
+ {
+   int	tm_sec;
+   int	tm_min;
+   int	tm_hour;
+   int	tm_mday;
+   int	tm_mon;
+   int	tm_year;
+   int	tm_wday;
+   int	tm_yday;
+   int	tm_isdst;
+ };
+ 
  struct _glue 
  {
    struct _glue *_next;
***************
*** 157,168 ****
--- 170,189 ----
    int _cvtlen;			/* should be size_t */
    char *_cvtbuf;
  
+ #ifdef _COMPATIBLE_STRUCT_REENT
    /* Two next two fields were once used by malloc.  They are no longer
       used.  I'm leaving them here for now in case there really is a
       binary compatibility issue.  */
  #define _N_LISTS 30
    unsigned char * _nextf[_N_LISTS];
    unsigned int _nmalloc[_N_LISTS];
+ #else /* _COMPATIBLE_STRUCT_REENT */
+   unsigned int _rand_next;
+   char * _strtok_last;
+   char _asctime_buf[26];
+   struct tm _localtime_buf;
+   int _gamma_signgam;
+ #endif /* _COMPATIBLE_STRUCT_REENT */
  
    /* atexit stuff */
    struct _atexit *_atexit;	/* points to head of LIFO stack */
diff -r -c newlib.orig/libc/include/time.h newlib.patched/libc/include/time.h
*** newlib.orig/libc/include/time.h	Sat May 30 00:02:43 1998
--- newlib.patched/libc/include/time.h	Thu Sep 24 13:48:24 1998
***************
*** 34,51 ****
  #define __time_t_defined
  #endif
  
! struct tm
! {
!   int	tm_sec;
!   int	tm_min;
!   int	tm_hour;
!   int	tm_mday;
!   int	tm_mon;
!   int	tm_year;
!   int	tm_wday;
!   int	tm_yday;
!   int	tm_isdst;
! };
  
  clock_t	   _EXFUN(clock,    (void));
  double	   _EXFUN(difftime, (time_t _time2, time_t _time1));
--- 34,46 ----
  #define __time_t_defined
  #endif
  
! /*
!  * <sys/reent.h> defines struct tm
!  * They must be defined there because struct _reent needs them (and we don't
!  * want reent.h to include this file.
!  */
! 
! #include <sys/reent.h>
  
  clock_t	   _EXFUN(clock,    (void));
  double	   _EXFUN(difftime, (time_t _time2, time_t _time1));
diff -r -c newlib.orig/libc/include/unctrl.h newlib.patched/libc/include/unctrl.h
*** newlib.orig/libc/include/unctrl.h	Sat May 30 00:02:43 1998
--- newlib.patched/libc/include/unctrl.h	Thu Sep 24 13:51:16 1998
***************
*** 35,44 ****
  #ifndef _UNCTRL_H_
  #define _UNCTRL_H_
  
  #define unctrl(c)		__unctrl[(c) & 0xff]
  #define unctrllen(ch)		__unctrllen[(ch) & 0xff]
  
! extern char *__unctrl[256];	/* Control strings. */
! extern char __unctrllen[256];	/* Control strings length. */
  
  #endif /* _UNCTRL_H_ */
--- 35,46 ----
  #ifndef _UNCTRL_H_
  #define _UNCTRL_H_
  
+ #include <_ansi.h>
+ 
  #define unctrl(c)		__unctrl[(c) & 0xff]
  #define unctrllen(ch)		__unctrllen[(ch) & 0xff]
  
! extern _CONST char *__unctrl[256];	/* Control strings. */
! extern _CONST char __unctrllen[256];	/* Control strings length. */
  
  #endif /* _UNCTRL_H_ */
diff -r -c newlib.orig/libc/misc/unctrl.c newlib.patched/libc/misc/unctrl.c
*** newlib.orig/libc/misc/unctrl.c	Sat May 30 00:03:11 1998
--- newlib.patched/libc/misc/unctrl.c	Wed Sep 23 14:19:27 1998
***************
*** 68,78 ****
   * SUCH DAMAGE.
   */
  
! #ifndef lint
  static char sccsid[] = "@(#)unctrl.c	8.1 (Berkeley) 6/4/93";
! #endif /* not lint */
  
! char *__unctrl[256] = {
  	"^@",  "^A",  "^B",  "^C",  "^D",  "^E",  "^F",  "^G",
  	"^H",  "^I",  "^J",  "^K",  "^L",  "^M",  "^N",  "^O",
  	"^P",  "^Q",  "^R",  "^S",  "^T",  "^U",  "^V",  "^W",
--- 68,79 ----
   * SUCH DAMAGE.
   */
  
! #if defined(LIBC_SCCS) && !defined(lint)
  static char sccsid[] = "@(#)unctrl.c	8.1 (Berkeley) 6/4/93";
! #endif /* LIBC_SCCS and not lint */
  
! #include <_ansi.h>
! _CONST char * _CONST __unctrl[256] = {
  	"^@",  "^A",  "^B",  "^C",  "^D",  "^E",  "^F",  "^G",
  	"^H",  "^I",  "^J",  "^K",  "^L",  "^M",  "^N",  "^O",
  	"^P",  "^Q",  "^R",  "^S",  "^T",  "^U",  "^V",  "^W",
***************
*** 108,114 ****
  	"0xf8", "0xf9",	"0xfa", "0xfb", "0xfc", "0xfd", "0xfe", "0xff",
  };
  
! char __unctrllen[256] = {
  	2, 2, 2, 2, 2, 2, 2, 2,
  	2, 2, 2, 2, 2, 2, 2, 2,
  	2, 2, 2, 2, 2, 2, 2, 2,
--- 109,115 ----
  	"0xf8", "0xf9",	"0xfa", "0xfb", "0xfc", "0xfd", "0xfe", "0xff",
  };
  
! _CONST char __unctrllen[256] = {
  	2, 2, 2, 2, 2, 2, 2, 2,
  	2, 2, 2, 2, 2, 2, 2, 2,
  	2, 2, 2, 2, 2, 2, 2, 2,
diff -r -c newlib.orig/libc/stdio/vfprintf.c newlib.patched/libc/stdio/vfprintf.c
*** newlib.orig/libc/stdio/vfprintf.c	Sat May 30 00:03:22 1998
--- newlib.patched/libc/stdio/vfprintf.c	Wed Sep 23 13:20:06 1998
***************
*** 315,323 ****
  	 * below longer.
  	 */
  #define	PADSIZE	16		/* pad chunk size */
! 	static char blanks[PADSIZE] =
  	 {' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '};
! 	static char zeroes[PADSIZE] =
  	 {'0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0'};
  
  	/*
--- 315,323 ----
  	 * below longer.
  	 */
  #define	PADSIZE	16		/* pad chunk size */
! 	static _CONST char blanks[PADSIZE] =
  	 {' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '};
! 	static _CONST char zeroes[PADSIZE] =
  	 {'0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0'};
  
  	/*
diff -r -c newlib.orig/libc/stdlib/mbtowc_r.c newlib.patched/libc/stdlib/mbtowc_r.c
*** newlib.orig/libc/stdlib/mbtowc_r.c	Sat May 30 00:03:31 1998
--- newlib.patched/libc/stdlib/mbtowc_r.c	Wed Sep 23 13:18:29 1998
***************
*** 15,21 ****
   * is 2 (switch to JIS) + 2 (JIS characters) + 2 (switch back to ASCII) = 6.
   *************************************************************************************/
  
! static JIS_STATE JIS_state_table[JIS_S_NUM][JIS_C_NUM] = {
  /*              ESCAPE   DOLLAR    BRACKET   AT       B       J        NUL      JIS_CHAR  OTHER */
  /* ASCII */   { A_ESC,   DONE,     DONE,     DONE,    DONE,   DONE,    DONE,    DONE,     DONE },
  /* A_ESC */   { DONE,    A_ESC_DL, DONE,     DONE,    DONE,   DONE,    DONE,    DONE,     DONE },
--- 15,21 ----
   * is 2 (switch to JIS) + 2 (JIS characters) + 2 (switch back to ASCII) = 6.
   *************************************************************************************/
  
! static _CONST JIS_STATE JIS_state_table[JIS_S_NUM][JIS_C_NUM] = {
  /*              ESCAPE   DOLLAR    BRACKET   AT       B       J        NUL      JIS_CHAR  OTHER */
  /* ASCII */   { A_ESC,   DONE,     DONE,     DONE,    DONE,   DONE,    DONE,    DONE,     DONE },
  /* A_ESC */   { DONE,    A_ESC_DL, DONE,     DONE,    DONE,   DONE,    DONE,    DONE,     DONE },
***************
*** 29,35 ****
  /* J2_ESC_BR*/{ INV,     INV,      INV,      INV,     DONE,   DONE,    INV,     INV,      INV },
  };
  
! static JIS_ACTION JIS_action_table[JIS_S_NUM][JIS_C_NUM] = {
  /*              ESCAPE   DOLLAR    BRACKET   AT       B        J        NUL      JIS_CHAR  OTHER */
  /* ASCII */   { NOOP,    COPY_A,   COPY_A,   COPY_A,  COPY_A,  COPY_A,  EMPTY,   COPY_A,  COPY_A},
  /* A_ESC */   { COPY_A,  NOOP,     COPY_A,   COPY_A,  COPY_A,  COPY_A,  COPY_A,  COPY_A,  COPY_A},
--- 29,35 ----
  /* J2_ESC_BR*/{ INV,     INV,      INV,      INV,     DONE,   DONE,    INV,     INV,      INV },
  };
  
! static _CONST JIS_ACTION JIS_action_table[JIS_S_NUM][JIS_C_NUM] = {
  /*              ESCAPE   DOLLAR    BRACKET   AT       B        J        NUL      JIS_CHAR  OTHER */
  /* ASCII */   { NOOP,    COPY_A,   COPY_A,   COPY_A,  COPY_A,  COPY_A,  EMPTY,   COPY_A,  COPY_A},
  /* A_ESC */   { COPY_A,  NOOP,     COPY_A,   COPY_A,  COPY_A,  COPY_A,  COPY_A,  COPY_A,  COPY_A},
diff -r -c newlib.orig/libc/stdlib/rand.c newlib.patched/libc/stdlib/rand.c
*** newlib.orig/libc/stdlib/rand.c	Sat May 30 00:03:32 1998
--- newlib.patched/libc/stdlib/rand.c	Wed Sep 23 09:59:24 1998
***************
*** 64,81 ****
--- 64,97 ----
  <<rand>> requires no supporting OS subroutines.
  */
  
+ #ifndef _REENT_ONLY
+ 
  #include <stdlib.h>
+ #include <reent.h>
  
+ #ifdef _COMPATIBLE_STRUCT_REENT
  static unsigned int next = 1;
+ #endif
  
  void
  _DEFUN (srand, (seed), unsigned int seed)
  {
+ #ifdef _COMPATIBLE_STRUCT_REENT
          next = seed;
+ #else
+         _REENT->_rand_next = seed;
+ #endif
  }
  
  int
  _DEFUN_VOID (rand)
  {
+ #ifdef _COMPATIBLE_STRUCT_REENT
          return ((next = next * 1103515245 + 12345) & RAND_MAX);
+ #else
+         return ((_REENT->_rand_next = _REENT->_rand_next * 1103515245 + 12345 )
+                 & RAND_MAX );
+ #endif
  }
+ 
+ #endif /* _REENT_ONLY */
diff -r -c newlib.orig/libc/string/strtok.c newlib.patched/libc/string/strtok.c
*** newlib.orig/libc/string/strtok.c	Sat May 30 00:03:37 1998
--- newlib.patched/libc/string/strtok.c	Wed Sep 23 10:09:48 1998
***************
*** 62,67 ****
--- 62,70 ----
  
  #include <string.h>
  #include <_ansi.h>
+ #ifndef _COMPATIBLE_STRUCT_REENT
+ #include <reent.h>
+ #endif
  
  #ifndef _REENT_ONLY
  
***************
*** 70,76 ****
--- 73,83 ----
  	register char *s _AND
  	register const char *delim)
  {
+ #ifdef _COMPATIBLE_STRUCT_REENT
  	static char *last;
  	return strtok_r (s, delim, &last);
+ #else
+ 	return strtok_r (s, delim, &(_REENT->_strtok_last));
+ #endif
  }
  #endif
diff -r -c newlib.orig/libc/time/asctime.c newlib.patched/libc/time/asctime.c
*** newlib.orig/libc/time/asctime.c	Sat May 30 00:04:48 1998
--- newlib.patched/libc/time/asctime.c	Wed Sep 23 13:56:30 1998
***************
*** 48,53 ****
--- 48,57 ----
  */
  
  #include <time.h>
+ #include <_ansi.h>
+ #ifndef _COMPATIBLE_STRUCT_REENT
+ #include <reent.h>
+ #endif
  
  #ifndef _REENT_ONLY
  
***************
*** 55,61 ****
--- 59,69 ----
  _DEFUN (asctime, (tim_p),
  	_CONST struct tm *tim_p)
  {
+ #ifdef _COMPATIBLE_STRUCT_REENT
    static char buf[26];
+ #else
+   char *buf = _REENT->_asctime_buf;
+ #endif
    return asctime_r (tim_p, buf);
  }
  
diff -r -c newlib.orig/libc/time/lcltime.c newlib.patched/libc/time/lcltime.c
*** newlib.orig/libc/time/lcltime.c	Sat May 30 00:04:48 1998
--- newlib.patched/libc/time/lcltime.c	Wed Sep 23 13:59:30 1998
***************
*** 43,48 ****
--- 43,51 ----
  */
  
  #include <time.h>
+ #ifndef _COMPATIBLE_STRUCT_REENT
+ #include <reent.h>
+ #endif
  
  #ifndef _REENT_ONLY
  
***************
*** 50,57 ****
--- 53,64 ----
  _DEFUN (localtime, (tim_p),
  	_CONST time_t * tim_p)
  {
+ #ifdef _COMPATIBLE_STRUCT_REENT
    static struct tm tim_s;
    return localtime_r (tim_p, &tim_s);
+ #else
+   return localtime_r (tim_p, &(_REENT -> _localtime_buf));
+ #endif
  }
  
  #endif
diff -r -c newlib.orig/libm/math/s_lib_ver.c newlib.patched/libm/math/s_lib_ver.c
*** newlib.orig/libm/math/s_lib_ver.c	Sat May 30 00:05:02 1998
--- newlib.patched/libm/math/s_lib_ver.c	Wed Sep 23 13:39:43 1998
***************
*** 21,35 ****
   * define and initialize _LIB_VERSION
   */
  #ifdef _POSIX_MODE
! _LIB_VERSION_TYPE _LIB_VERSION = _POSIX_;
  #else
  #ifdef _XOPEN_MODE
! _LIB_VERSION_TYPE _LIB_VERSION = _XOPEN_;
  #else
  #ifdef _SVID3_MODE
! _LIB_VERSION_TYPE _LIB_VERSION = _SVID_;
  #else					/* default _IEEE_MODE */
! _LIB_VERSION_TYPE _LIB_VERSION = _IEEE_;
  #endif
  #endif
  #endif
--- 21,35 ----
   * define and initialize _LIB_VERSION
   */
  #ifdef _POSIX_MODE
! _CONST _LIB_VERSION_TYPE _LIB_VERSION = _POSIX_;
  #else
  #ifdef _XOPEN_MODE
! _CONST _LIB_VERSION_TYPE _LIB_VERSION = _XOPEN_;
  #else
  #ifdef _SVID3_MODE
! _CONST _LIB_VERSION_TYPE _LIB_VERSION = _SVID_;
  #else					/* default _IEEE_MODE */
! _CONST _LIB_VERSION_TYPE _LIB_VERSION = _IEEE_;
  #endif
  #endif
  #endif
diff -r -c newlib.orig/libm/math/s_signgam.c newlib.patched/libm/math/s_signgam.c
*** newlib.orig/libm/math/s_signgam.c	Sat May 30 00:05:04 1998
--- newlib.patched/libm/math/s_signgam.c	Wed Sep 23 13:46:44 1998
***************
*** 1 ****
--- 1,5 ----
+ #include <_ansi.h>
+ 
+ #ifdef _COMPATIBLE_STRUCT_REENT
  int signgam = 0;
+ #endif
diff -r -c newlib.orig/libm/math/w_gamma.c newlib.patched/libm/math/w_gamma.c
*** newlib.orig/libm/math/w_gamma.c	Sat May 30 00:05:11 1998
--- newlib.patched/libm/math/w_gamma.c	Wed Sep 23 13:50:41 1998
***************
*** 132,137 ****
--- 132,140 ----
   */
  
  #include "fdlibm.h"
+ #ifndef _COMPATIBLE_STRUCT_REENT
+ #include <reent.h>
+ #endif
  #include <errno.h>
  
  #ifndef _DOUBLE_IS_32BITS
***************
*** 144,154 ****
--- 147,165 ----
  #endif
  {
  #ifdef _IEEE_LIBM
+ #ifdef _COMPATIBLE_STRUCT_REENT
  	return __ieee754_gamma_r(x,&signgam);
  #else
+ 	return __ieee754_gamma_r(x,&(_REENT->_gamma_signgam));
+ #endif
+ #else
          double y;
  	struct exception exc;
+ #ifdef _COMPATIBLE_STRUCT_REENT
          y = __ieee754_gamma_r(x,&signgam);
+ #else
+         y = __ieee754_gamma_r(x,&(_REENT->_gamma_signgam));
+ #endif
          if(_LIB_VERSION == _IEEE_) return y;
          if(!finite(y)&&finite(x)) {
  #ifndef HUGE_VAL 
diff -r -c newlib.orig/libm/math/w_lgamma.c newlib.patched/libm/math/w_lgamma.c
*** newlib.orig/libm/math/w_lgamma.c	Sat May 30 00:05:12 1998
--- newlib.patched/libm/math/w_lgamma.c	Wed Sep 23 13:52:51 1998
***************
*** 19,24 ****
--- 19,27 ----
   */
  
  #include "fdlibm.h"
+ #ifndef _COMPATIBLE_STRUCT_REENT
+ #include <reent.h>
+ #endif
  #include <errno.h>
  
  #ifndef _DOUBLE_IS_32BITS
***************
*** 31,41 ****
--- 34,52 ----
  #endif
  {
  #ifdef _IEEE_LIBM
+ #ifdef _COMPATIBLE_STRUCT_REENT
  	return __ieee754_lgamma_r(x,&signgam);
  #else
+ 	return __ieee754_lgamma_r(x,&(_REENT->_gamma_signgam));
+ #endif
+ #else
          double y;
  	struct exception exc;
+ #ifdef _COMPATIBLE_STRUCT_REENT
          y = __ieee754_lgamma_r(x,&signgam);
+ #else
+         y = __ieee754_lgamma_r(x,&(_REENT->_gamma_signgam));
+ #endif
          if(_LIB_VERSION == _IEEE_) return y;
          if(!finite(y)&&finite(x)) {
  #ifndef HUGE_VAL 
diff -r -c newlib.orig/libm/math/wf_gamma.c newlib.patched/libm/math/wf_gamma.c
*** newlib.orig/libm/math/wf_gamma.c	Sat May 30 00:05:15 1998
--- newlib.patched/libm/math/wf_gamma.c	Wed Sep 23 13:53:13 1998
***************
*** 15,20 ****
--- 15,23 ----
   */
  
  #include "fdlibm.h"
+ #ifndef _COMPATIBLE_STRUCT_REENT
+ #include <reent.h>
+ #endif
  #include <errno.h>
  
  #ifdef __STDC__
***************
*** 25,35 ****
--- 28,46 ----
  #endif
  {
  #ifdef _IEEE_LIBM
+ #ifdef _COMPATIBLE_STRUCT_REENT
  	return __ieee754_gammaf_r(x,&signgam);
  #else
+ 	return __ieee754_gammaf_r(x,&(_REENT->_gamma_signgam));
+ #endif
+ #else
          float y;
  	struct exception exc;
+ #ifdef _COMPATIBLE_STRUCT_REENT
          y = __ieee754_gammaf_r(x,&signgam);
+ #else
+         y = __ieee754_gammaf_r(x,&(_REENT->_gamma_signgam));
+ #endif
          if(_LIB_VERSION == _IEEE_) return y;
          if(!finitef(y)&&finitef(x)) {
  #ifndef HUGE_VAL 
diff -r -c newlib.orig/libm/math/wf_lgamma.c newlib.patched/libm/math/wf_lgamma.c
*** newlib.orig/libm/math/wf_lgamma.c	Sat May 30 00:05:15 1998
--- newlib.patched/libm/math/wf_lgamma.c	Wed Sep 23 13:53:29 1998
***************
*** 15,20 ****
--- 15,23 ----
   */
  
  #include "fdlibm.h"
+ #ifndef _COMPATIBLE_STRUCT_REENT
+ #include <reent.h>
+ #endif
  #include <errno.h>
  
  #ifdef __STDC__
***************
*** 25,35 ****
--- 28,46 ----
  #endif
  {
  #ifdef _IEEE_LIBM
+ #ifdef _COMPATIBLE_STRUCT_REENT
  	return __ieee754_lgammaf_r(x,&signgam);
  #else
+ 	return __ieee754_lgammaf_r(x,&(_REENT->_gamma_signgam));
+ #endif
+ #else
          float y;
  	struct exception exc;
+ #ifdef _COMPATIBLE_STRUCT_REENT
          y = __ieee754_lgammaf_r(x,&signgam);
+ #else
+         y = __ieee754_lgammaf_r(x,&(_REENT->_gamma_signgam));
+ #endif
          if(_LIB_VERSION == _IEEE_) return y;
          if(!finitef(y)&&finitef(x)) {
  #ifndef HUGE_VAL