| 
									
										
										
										
											2016-10-06 14:21:30 +03:00
										 |  |  | /* This header file provides the reentrancy.  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* WARNING: All identifiers here must begin with an underscore.  This file is
 | 
					
						
							|  |  |  |    included by stdio.h and others and we therefore must only use identifiers | 
					
						
							|  |  |  |    in the namespace allotted to us.  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifndef _SYS_REENT_H_
 | 
					
						
							|  |  |  | #ifdef __cplusplus
 | 
					
						
							|  |  |  | extern "C" { | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | #define _SYS_REENT_H_
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <_ansi.h>
 | 
					
						
							|  |  |  | #include <stddef.h>
 | 
					
						
							|  |  |  | #include <sys/_types.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define _NULL 0
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifndef __Long
 | 
					
						
							|  |  |  | #if __LONG_MAX__ == 2147483647L
 | 
					
						
							|  |  |  | #define __Long long
 | 
					
						
							|  |  |  | typedef unsigned __Long __ULong; | 
					
						
							|  |  |  | #elif __INT_MAX__ == 2147483647
 | 
					
						
							|  |  |  | #define __Long int
 | 
					
						
							|  |  |  | typedef unsigned __Long __ULong; | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #if !defined( __Long)
 | 
					
						
							|  |  |  | #include <sys/types.h>
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifndef __Long
 | 
					
						
							|  |  |  | #define __Long __int32_t
 | 
					
						
							|  |  |  | typedef __uint32_t __ULong; | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct _reent; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * If _REENT_SMALL is defined, we make struct _reent as small as possible, | 
					
						
							|  |  |  |  * by having nearly everything possible allocated at first use. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct _Bigint | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   struct _Bigint *_next; | 
					
						
							|  |  |  |   int _k, _maxwds, _sign, _wds; | 
					
						
							|  |  |  |   __ULong _x[1]; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* needed by reentrant structure */ | 
					
						
							|  |  |  | 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; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * atexit() support. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define	_ATEXIT_SIZE 32	/* must be at least 32 to guarantee ANSI conformance */
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct _on_exit_args { | 
					
						
							|  |  |  | 	void *  _fnargs[_ATEXIT_SIZE];	        /* user fn args */ | 
					
						
							|  |  |  | 	void *	_dso_handle[_ATEXIT_SIZE]; | 
					
						
							|  |  |  | 	/* Bitmask is set if user function takes arguments.  */ | 
					
						
							|  |  |  | 	__ULong _fntypes;           	        /* type of exit routine -
 | 
					
						
							|  |  |  | 				   Must have at least _ATEXIT_SIZE bits */ | 
					
						
							|  |  |  | 	/* Bitmask is set if function was registered via __cxa_atexit.  */ | 
					
						
							|  |  |  | 	__ULong _is_cxa; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifdef _REENT_SMALL
 | 
					
						
							|  |  |  | struct _atexit { | 
					
						
							|  |  |  | 	struct	_atexit *_next;			/* next in list */ | 
					
						
							|  |  |  | 	int	_ind;				/* next index in this table */ | 
					
						
							|  |  |  | 	void	(*_fns[_ATEXIT_SIZE])(void);	/* the table itself */ | 
					
						
							|  |  |  |         struct _on_exit_args * _on_exit_args_ptr; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | # define _ATEXIT_INIT {_NULL, 0, {_NULL}, _NULL}
 | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  | struct _atexit { | 
					
						
							|  |  |  | 	struct	_atexit *_next;			/* next in list */ | 
					
						
							|  |  |  | 	int	_ind;				/* next index in this table */ | 
					
						
							|  |  |  | 	/* Some entries may already have been called, and will be NULL.  */ | 
					
						
							|  |  |  | 	void	(*_fns[_ATEXIT_SIZE])(void);	/* the table itself */ | 
					
						
							|  |  |  |         struct _on_exit_args _on_exit_args; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | # define _ATEXIT_INIT {_NULL, 0, {_NULL}, {{_NULL}, {_NULL}, 0, 0}}
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifdef _REENT_GLOBAL_ATEXIT
 | 
					
						
							|  |  |  | # define _REENT_INIT_ATEXIT
 | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  | # define _REENT_INIT_ATEXIT \
 | 
					
						
							|  |  |  |   _NULL, _ATEXIT_INIT, | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * Stdio buffers. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This and __FILE are defined here because we need them for struct _reent, | 
					
						
							|  |  |  |  * but we don't want stdio.h included when stdlib.h is. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct __sbuf { | 
					
						
							|  |  |  | 	unsigned char *_base; | 
					
						
							|  |  |  | 	int	_size; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * Stdio state variables. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * The following always hold: | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  *	if (_flags&(__SLBF|__SWR)) == (__SLBF|__SWR), | 
					
						
							|  |  |  |  *		_lbfsize is -_bf._size, else _lbfsize is 0 | 
					
						
							|  |  |  |  *	if _flags&__SRD, _w is 0 | 
					
						
							|  |  |  |  *	if _flags&__SWR, _r is 0 | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This ensures that the getc and putc macros (or inline functions) never | 
					
						
							|  |  |  |  * try to write or read from a file that is in `read' or `write' mode. | 
					
						
							|  |  |  |  * (Moreover, they can, and do, automatically switch from read mode to | 
					
						
							|  |  |  |  * write mode, and back, on "r+" and "w+" files.) | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * _lbfsize is used only to make the inline line-buffered output stream | 
					
						
							|  |  |  |  * code as compact as possible. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * _ub, _up, and _ur are used when ungetc() pushes back more characters | 
					
						
							|  |  |  |  * than fit in the current _bf, or when ungetc() pushes back a character | 
					
						
							|  |  |  |  * that does not match the previous one in _bf.  When this happens, | 
					
						
							|  |  |  |  * _ub._base becomes non-nil (i.e., a stream has ungetc() data iff | 
					
						
							|  |  |  |  * _ub._base!=NULL) and _up and _ur save the current values of _p and _r. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifdef _REENT_SMALL
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * struct __sFILE_fake is the start of a struct __sFILE, with only the | 
					
						
							|  |  |  |  * minimal fields allocated.  In __sinit() we really allocate the 3 | 
					
						
							|  |  |  |  * standard streams, etc., and point away from this fake. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | struct __sFILE_fake { | 
					
						
							|  |  |  |   unsigned char *_p;	/* current position in (some) buffer */ | 
					
						
							|  |  |  |   int	_r;		/* read space left for getc() */ | 
					
						
							|  |  |  |   int	_w;		/* write space left for putc() */ | 
					
						
							|  |  |  |   short	_flags;		/* flags, below; this FILE is free if 0 */ | 
					
						
							|  |  |  |   short	_file;		/* fileno, if Unix descriptor, else -1 */ | 
					
						
							|  |  |  |   struct __sbuf _bf;	/* the buffer (at least 1 byte, if !NULL) */ | 
					
						
							|  |  |  |   int	_lbfsize;	/* 0 or -_bf._size, for inline putc */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   struct _reent *_data; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Following is needed both in libc/stdio and libc/stdlib so we put it
 | 
					
						
							|  |  |  |  * here instead of libc/stdio/local.h where it was previously. */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | extern _VOID   _EXFUN(__sinit,(struct _reent *)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # define _REENT_SMALL_CHECK_INIT(ptr)		\
 | 
					
						
							|  |  |  |   do						\ | 
					
						
							|  |  |  |     {						\ | 
					
						
							|  |  |  |       if ((ptr) && !(ptr)->__sdidinit)		\ | 
					
						
							|  |  |  | 	__sinit (ptr);				\ | 
					
						
							|  |  |  |     }						\ | 
					
						
							|  |  |  |   while (0) | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  | # define _REENT_SMALL_CHECK_INIT(ptr) /* nothing */
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct __sFILE { | 
					
						
							|  |  |  |   unsigned char *_p;	/* current position in (some) buffer */ | 
					
						
							|  |  |  |   int	_r;		/* read space left for getc() */ | 
					
						
							|  |  |  |   int	_w;		/* write space left for putc() */ | 
					
						
							|  |  |  |   short	_flags;		/* flags, below; this FILE is free if 0 */ | 
					
						
							|  |  |  |   short	_file;		/* fileno, if Unix descriptor, else -1 */ | 
					
						
							|  |  |  |   struct __sbuf _bf;	/* the buffer (at least 1 byte, if !NULL) */ | 
					
						
							|  |  |  |   int	_lbfsize;	/* 0 or -_bf._size, for inline putc */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifdef _REENT_SMALL
 | 
					
						
							|  |  |  |   struct _reent *_data; | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /* operations */ | 
					
						
							|  |  |  |   _PTR	_cookie;	/* cookie passed to io functions */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   _READ_WRITE_RETURN_TYPE _EXFNPTR(_read, (struct _reent *, _PTR, | 
					
						
							|  |  |  | 					   char *, _READ_WRITE_BUFSIZE_TYPE)); | 
					
						
							|  |  |  |   _READ_WRITE_RETURN_TYPE _EXFNPTR(_write, (struct _reent *, _PTR, | 
					
						
							|  |  |  | 					    const char *, | 
					
						
							|  |  |  | 					    _READ_WRITE_BUFSIZE_TYPE)); | 
					
						
							|  |  |  |   _fpos_t _EXFNPTR(_seek, (struct _reent *, _PTR, _fpos_t, int)); | 
					
						
							|  |  |  |   int _EXFNPTR(_close, (struct _reent *, _PTR)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /* separate buffer for long sequences of ungetc() */ | 
					
						
							|  |  |  |   struct __sbuf _ub;	/* ungetc buffer */ | 
					
						
							|  |  |  |   unsigned char *_up;	/* saved _p when _p is doing ungetc data */ | 
					
						
							|  |  |  |   int	_ur;		/* saved _r when _r is counting ungetc data */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /* tricks to meet minimum requirements even when malloc() fails */ | 
					
						
							|  |  |  |   unsigned char _ubuf[3];	/* guarantee an ungetc() buffer */ | 
					
						
							|  |  |  |   unsigned char _nbuf[1];	/* guarantee a getc() buffer */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /* separate buffer for fgetline() when line crosses buffer boundary */ | 
					
						
							|  |  |  |   struct __sbuf _lb;	/* buffer for fgetline() */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /* Unix stdio files get aligned to block boundaries on fseek() */ | 
					
						
							|  |  |  |   int	_blksize;	/* stat.st_blksize (may be != _bf._size) */ | 
					
						
							|  |  |  |   _off_t _offset;	/* current lseek offset */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifndef _REENT_SMALL
 | 
					
						
							|  |  |  |   struct _reent *_data;	/* Here for binary compatibility? Remove? */ | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifndef __SINGLE_THREAD__
 | 
					
						
							|  |  |  |   _flock_t _lock;	/* for thread-safety locking */ | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  |   _mbstate_t _mbstate;	/* for wide char stdio functions. */ | 
					
						
							|  |  |  |   int   _flags2;        /* for future use */ | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifdef __CUSTOM_FILE_IO__
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Get custom _FILE definition.  */ | 
					
						
							|  |  |  | #include <sys/custom_file.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #else /* !__CUSTOM_FILE_IO__ */
 | 
					
						
							|  |  |  | #ifdef __LARGE64_FILES
 | 
					
						
							|  |  |  | struct __sFILE64 { | 
					
						
							|  |  |  |   unsigned char *_p;	/* current position in (some) buffer */ | 
					
						
							|  |  |  |   int	_r;		/* read space left for getc() */ | 
					
						
							|  |  |  |   int	_w;		/* write space left for putc() */ | 
					
						
							|  |  |  |   short	_flags;		/* flags, below; this FILE is free if 0 */ | 
					
						
							|  |  |  |   short	_file;		/* fileno, if Unix descriptor, else -1 */ | 
					
						
							|  |  |  |   struct __sbuf _bf;	/* the buffer (at least 1 byte, if !NULL) */ | 
					
						
							|  |  |  |   int	_lbfsize;	/* 0 or -_bf._size, for inline putc */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   struct _reent *_data; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /* operations */ | 
					
						
							|  |  |  |   _PTR	_cookie;	/* cookie passed to io functions */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   _READ_WRITE_RETURN_TYPE _EXFNPTR(_read, (struct _reent *, _PTR, | 
					
						
							|  |  |  | 					   char *, _READ_WRITE_BUFSIZE_TYPE)); | 
					
						
							|  |  |  |   _READ_WRITE_RETURN_TYPE _EXFNPTR(_write, (struct _reent *, _PTR, | 
					
						
							|  |  |  | 					    const char *, | 
					
						
							|  |  |  | 					    _READ_WRITE_BUFSIZE_TYPE)); | 
					
						
							|  |  |  |   _fpos_t _EXFNPTR(_seek, (struct _reent *, _PTR, _fpos_t, int)); | 
					
						
							|  |  |  |   int _EXFNPTR(_close, (struct _reent *, _PTR)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /* separate buffer for long sequences of ungetc() */ | 
					
						
							|  |  |  |   struct __sbuf _ub;	/* ungetc buffer */ | 
					
						
							|  |  |  |   unsigned char *_up;	/* saved _p when _p is doing ungetc data */ | 
					
						
							|  |  |  |   int	_ur;		/* saved _r when _r is counting ungetc data */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /* tricks to meet minimum requirements even when malloc() fails */ | 
					
						
							|  |  |  |   unsigned char _ubuf[3];	/* guarantee an ungetc() buffer */ | 
					
						
							|  |  |  |   unsigned char _nbuf[1];	/* guarantee a getc() buffer */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /* separate buffer for fgetline() when line crosses buffer boundary */ | 
					
						
							|  |  |  |   struct __sbuf _lb;	/* buffer for fgetline() */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /* Unix stdio files get aligned to block boundaries on fseek() */ | 
					
						
							|  |  |  |   int	_blksize;	/* stat.st_blksize (may be != _bf._size) */ | 
					
						
							|  |  |  |   int   _flags2;        /* for future use */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   _off64_t _offset;     /* current lseek offset */ | 
					
						
							|  |  |  |   _fpos64_t _EXFNPTR(_seek64, (struct _reent *, _PTR, _fpos64_t, int)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifndef __SINGLE_THREAD__
 | 
					
						
							|  |  |  |   _flock_t _lock;	/* for thread-safety locking */ | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  |   _mbstate_t _mbstate;	/* for wide char stdio functions. */ | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | typedef struct __sFILE64 __FILE; | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  | typedef struct __sFILE   __FILE; | 
					
						
							|  |  |  | #endif /* __LARGE64_FILES */
 | 
					
						
							|  |  |  | #endif /* !__CUSTOM_FILE_IO__ */
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct _glue | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   struct _glue *_next; | 
					
						
							|  |  |  |   int _niobs; | 
					
						
							|  |  |  |   __FILE *_iobs; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * rand48 family support | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Copyright (c) 1993 Martin Birgmeier | 
					
						
							|  |  |  |  * All rights reserved. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * You may redistribute unmodified or modified versions of this source | 
					
						
							|  |  |  |  * code provided that the above copyright notice and this and the | 
					
						
							|  |  |  |  * following conditions are retained. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This software is provided ``as is'', and comes with no warranties | 
					
						
							|  |  |  |  * of any kind. I shall in no event be liable for anything that happens | 
					
						
							|  |  |  |  * to anyone/anything when using this software. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | #define        _RAND48_SEED_0  (0x330e)
 | 
					
						
							|  |  |  | #define        _RAND48_SEED_1  (0xabcd)
 | 
					
						
							|  |  |  | #define        _RAND48_SEED_2  (0x1234)
 | 
					
						
							|  |  |  | #define        _RAND48_MULT_0  (0xe66d)
 | 
					
						
							|  |  |  | #define        _RAND48_MULT_1  (0xdeec)
 | 
					
						
							|  |  |  | #define        _RAND48_MULT_2  (0x0005)
 | 
					
						
							|  |  |  | #define        _RAND48_ADD     (0x000b)
 | 
					
						
							|  |  |  | struct _rand48 { | 
					
						
							|  |  |  |   unsigned short _seed[3]; | 
					
						
							|  |  |  |   unsigned short _mult[3]; | 
					
						
							|  |  |  |   unsigned short _add; | 
					
						
							|  |  |  | #ifdef _REENT_SMALL
 | 
					
						
							|  |  |  |   /* Put this in here as well, for good luck.  */ | 
					
						
							|  |  |  |   __extension__ unsigned long long _rand_next; | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* How big the some arrays are.  */ | 
					
						
							|  |  |  | #define _REENT_EMERGENCY_SIZE 25
 | 
					
						
							|  |  |  | #define _REENT_ASCTIME_SIZE 26
 | 
					
						
							|  |  |  | #define _REENT_SIGNAL_SIZE 24
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * struct _reent | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This structure contains *all* globals needed by the library. | 
					
						
							|  |  |  |  * It's raison d'etre is to facilitate threads by making all library routines | 
					
						
							|  |  |  |  * reentrant.  IE: All state information is contained here. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifdef _REENT_SMALL
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct _mprec | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   /* used by mprec routines */ | 
					
						
							|  |  |  |   struct _Bigint *_result; | 
					
						
							|  |  |  |   int _result_k; | 
					
						
							|  |  |  |   struct _Bigint *_p5s; | 
					
						
							|  |  |  |   struct _Bigint **_freelist; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct _misc_reent | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   /* miscellaneous reentrant data */ | 
					
						
							|  |  |  |   char *_strtok_last; | 
					
						
							|  |  |  |   _mbstate_t _mblen_state; | 
					
						
							|  |  |  |   _mbstate_t _wctomb_state; | 
					
						
							|  |  |  |   _mbstate_t _mbtowc_state; | 
					
						
							|  |  |  |   char _l64a_buf[8]; | 
					
						
							|  |  |  |   int _getdate_err; | 
					
						
							|  |  |  |   _mbstate_t _mbrlen_state; | 
					
						
							|  |  |  |   _mbstate_t _mbrtowc_state; | 
					
						
							|  |  |  |   _mbstate_t _mbsrtowcs_state; | 
					
						
							|  |  |  |   _mbstate_t _wcrtomb_state; | 
					
						
							|  |  |  |   _mbstate_t _wcsrtombs_state; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* This version of _reent is laid out with "int"s in pairs, to help
 | 
					
						
							|  |  |  |  * ports with 16-bit int's but 32-bit pointers, align nicely.  */ | 
					
						
							|  |  |  | struct _reent | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   /* As an exception to the above put _errno first for binary
 | 
					
						
							|  |  |  |      compatibility with non _REENT_SMALL targets.  */ | 
					
						
							|  |  |  |   int _errno;			/* local copy of errno */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /* FILE is a big struct and may change over time.  To try to achieve binary
 | 
					
						
							|  |  |  |      compatibility with future versions, put stdin,stdout,stderr here. | 
					
						
							|  |  |  |      These are pointers into member __sf defined below.  */ | 
					
						
							|  |  |  |   __FILE *_stdin, *_stdout, *_stderr;	/* XXX */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   int  _inc;			/* used by tmpnam */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   char *_emergency; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   int __sdidinit;		/* 1 means stdio has been init'd */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   int _current_category;	/* unused */ | 
					
						
							|  |  |  |   _CONST char *_current_locale;	/* unused */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   struct _mprec *_mp; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   void _EXFNPTR(__cleanup, (struct _reent *)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   int _gamma_signgam; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /* used by some fp conversion routines */ | 
					
						
							|  |  |  |   int _cvtlen;			/* should be size_t */ | 
					
						
							|  |  |  |   char *_cvtbuf; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   struct _rand48 *_r48; | 
					
						
							|  |  |  |   struct __tm *_localtime_buf; | 
					
						
							|  |  |  |   char *_asctime_buf; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /* signal info */ | 
					
						
							| 
									
										
										
										
											2018-09-21 08:39:36 +02:00
										 |  |  |   void (**_sig_func)(int); | 
					
						
							| 
									
										
										
										
											2016-10-06 14:21:30 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | # ifndef _REENT_GLOBAL_ATEXIT
 | 
					
						
							|  |  |  |   /* atexit stuff */ | 
					
						
							|  |  |  |   struct _atexit *_atexit; | 
					
						
							|  |  |  |   struct _atexit _atexit0; | 
					
						
							|  |  |  | # endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   struct _glue __sglue;			/* root of glue chain */ | 
					
						
							|  |  |  |   __FILE *__sf;			        /* file descriptors */ | 
					
						
							|  |  |  |   struct _misc_reent *_misc;            /* strtok, multibyte states */ | 
					
						
							|  |  |  |   char *_signal_buf;                    /* strsignal */ | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | extern const struct __sFILE_fake __sf_fake_stdin; | 
					
						
							|  |  |  | extern const struct __sFILE_fake __sf_fake_stdout; | 
					
						
							|  |  |  | extern const struct __sFILE_fake __sf_fake_stderr; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # define _REENT_INIT(var) \
 | 
					
						
							|  |  |  |   { 0, \ | 
					
						
							|  |  |  |     (__FILE *)&__sf_fake_stdin, \ | 
					
						
							|  |  |  |     (__FILE *)&__sf_fake_stdout, \ | 
					
						
							|  |  |  |     (__FILE *)&__sf_fake_stderr, \ | 
					
						
							|  |  |  |     0, \ | 
					
						
							|  |  |  |     _NULL, \ | 
					
						
							|  |  |  |     0, \ | 
					
						
							|  |  |  |     0, \ | 
					
						
							|  |  |  |     "C", \ | 
					
						
							|  |  |  |     _NULL, \ | 
					
						
							|  |  |  |     _NULL, \ | 
					
						
							|  |  |  |     0, \ | 
					
						
							|  |  |  |     0, \ | 
					
						
							|  |  |  |     _NULL, \ | 
					
						
							|  |  |  |     _NULL, \ | 
					
						
							|  |  |  |     _NULL, \ | 
					
						
							|  |  |  |     _NULL, \ | 
					
						
							|  |  |  |     _NULL, \ | 
					
						
							|  |  |  |     _REENT_INIT_ATEXIT \ | 
					
						
							|  |  |  |     {_NULL, 0, _NULL}, \ | 
					
						
							|  |  |  |     _NULL, \ | 
					
						
							|  |  |  |     _NULL, \ | 
					
						
							|  |  |  |     _NULL \ | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  | #ifndef ESP_PLATFORM
 | 
					
						
							| 
									
										
										
										
											2016-10-06 14:21:30 +03:00
										 |  |  | #define _REENT_INIT_PTR(var) \
 | 
					
						
							|  |  |  |   { memset((var), 0, sizeof(*(var))); \ | 
					
						
							|  |  |  |     (var)->_stdin = (__FILE *)&__sf_fake_stdin; \ | 
					
						
							|  |  |  |     (var)->_stdout = (__FILE *)&__sf_fake_stdout; \ | 
					
						
							|  |  |  |     (var)->_stderr = (__FILE *)&__sf_fake_stderr; \ | 
					
						
							|  |  |  |     (var)->_current_locale = "C"; \ | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2018-06-27 09:01:06 +02:00
										 |  |  | #else
 | 
					
						
							|  |  |  | extern void esp_reent_init(struct _reent* reent); | 
					
						
							|  |  |  | #define _REENT_INIT_PTR(var) esp_reent_init(var)
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2016-10-06 14:21:30 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* Only built the assert() calls if we are built with debugging.  */ | 
					
						
							|  |  |  | #if DEBUG
 | 
					
						
							|  |  |  | #include <assert.h>
 | 
					
						
							|  |  |  | #define __reent_assert(x) assert(x)
 | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  | #define __reent_assert(x) ((void)0)
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifdef __CUSTOM_FILE_IO__
 | 
					
						
							|  |  |  | #error Custom FILE I/O and _REENT_SMALL not currently supported.
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Generic _REENT check macro.  */ | 
					
						
							|  |  |  | #define _REENT_CHECK(var, what, type, size, init) do { \
 | 
					
						
							|  |  |  |   struct _reent *_r = (var); \ | 
					
						
							|  |  |  |   if (_r->what == NULL) { \ | 
					
						
							|  |  |  |     _r->what = (type)malloc(size); \ | 
					
						
							|  |  |  |     __reent_assert(_r->what); \ | 
					
						
							|  |  |  |     init; \ | 
					
						
							|  |  |  |   } \ | 
					
						
							|  |  |  | } while (0) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define _REENT_CHECK_TM(var) \
 | 
					
						
							|  |  |  |   _REENT_CHECK(var, _localtime_buf, struct __tm *, sizeof *((var)->_localtime_buf), \ | 
					
						
							|  |  |  |     /* nothing */) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define _REENT_CHECK_ASCTIME_BUF(var) \
 | 
					
						
							|  |  |  |   _REENT_CHECK(var, _asctime_buf, char *, _REENT_ASCTIME_SIZE, \ | 
					
						
							|  |  |  |     memset((var)->_asctime_buf, 0, _REENT_ASCTIME_SIZE)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Handle the dynamically allocated rand48 structure. */ | 
					
						
							|  |  |  | #define _REENT_INIT_RAND48(var) do { \
 | 
					
						
							|  |  |  |   struct _reent *_r = (var); \ | 
					
						
							|  |  |  |   _r->_r48->_seed[0] = _RAND48_SEED_0; \ | 
					
						
							|  |  |  |   _r->_r48->_seed[1] = _RAND48_SEED_1; \ | 
					
						
							|  |  |  |   _r->_r48->_seed[2] = _RAND48_SEED_2; \ | 
					
						
							|  |  |  |   _r->_r48->_mult[0] = _RAND48_MULT_0; \ | 
					
						
							|  |  |  |   _r->_r48->_mult[1] = _RAND48_MULT_1; \ | 
					
						
							|  |  |  |   _r->_r48->_mult[2] = _RAND48_MULT_2; \ | 
					
						
							|  |  |  |   _r->_r48->_add = _RAND48_ADD; \ | 
					
						
							|  |  |  |   _r->_r48->_rand_next = 1; \ | 
					
						
							|  |  |  | } while (0) | 
					
						
							|  |  |  | #define _REENT_CHECK_RAND48(var) \
 | 
					
						
							|  |  |  |   _REENT_CHECK(var, _r48, struct _rand48 *, sizeof *((var)->_r48), _REENT_INIT_RAND48((var))) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define _REENT_INIT_MP(var) do { \
 | 
					
						
							|  |  |  |   struct _reent *_r = (var); \ | 
					
						
							|  |  |  |   _r->_mp->_result_k = 0; \ | 
					
						
							|  |  |  |   _r->_mp->_result = _r->_mp->_p5s = _NULL; \ | 
					
						
							|  |  |  |   _r->_mp->_freelist = _NULL; \ | 
					
						
							|  |  |  | } while (0) | 
					
						
							|  |  |  | #define _REENT_CHECK_MP(var) \
 | 
					
						
							|  |  |  |   _REENT_CHECK(var, _mp, struct _mprec *, sizeof *((var)->_mp), _REENT_INIT_MP(var)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define _REENT_CHECK_EMERGENCY(var) \
 | 
					
						
							|  |  |  |   _REENT_CHECK(var, _emergency, char *, _REENT_EMERGENCY_SIZE, /* nothing */) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define _REENT_INIT_MISC(var) do { \
 | 
					
						
							|  |  |  |   struct _reent *_r = (var); \ | 
					
						
							|  |  |  |   _r->_misc->_strtok_last = _NULL; \ | 
					
						
							|  |  |  |   _r->_misc->_mblen_state.__count = 0; \ | 
					
						
							|  |  |  |   _r->_misc->_mblen_state.__value.__wch = 0; \ | 
					
						
							|  |  |  |   _r->_misc->_wctomb_state.__count = 0; \ | 
					
						
							|  |  |  |   _r->_misc->_wctomb_state.__value.__wch = 0; \ | 
					
						
							|  |  |  |   _r->_misc->_mbtowc_state.__count = 0; \ | 
					
						
							|  |  |  |   _r->_misc->_mbtowc_state.__value.__wch = 0; \ | 
					
						
							|  |  |  |   _r->_misc->_mbrlen_state.__count = 0; \ | 
					
						
							|  |  |  |   _r->_misc->_mbrlen_state.__value.__wch = 0; \ | 
					
						
							|  |  |  |   _r->_misc->_mbrtowc_state.__count = 0; \ | 
					
						
							|  |  |  |   _r->_misc->_mbrtowc_state.__value.__wch = 0; \ | 
					
						
							|  |  |  |   _r->_misc->_mbsrtowcs_state.__count = 0; \ | 
					
						
							|  |  |  |   _r->_misc->_mbsrtowcs_state.__value.__wch = 0; \ | 
					
						
							|  |  |  |   _r->_misc->_wcrtomb_state.__count = 0; \ | 
					
						
							|  |  |  |   _r->_misc->_wcrtomb_state.__value.__wch = 0; \ | 
					
						
							|  |  |  |   _r->_misc->_wcsrtombs_state.__count = 0; \ | 
					
						
							|  |  |  |   _r->_misc->_wcsrtombs_state.__value.__wch = 0; \ | 
					
						
							|  |  |  |   _r->_misc->_l64a_buf[0] = '\0'; \ | 
					
						
							|  |  |  |   _r->_misc->_getdate_err = 0; \ | 
					
						
							|  |  |  | } while (0) | 
					
						
							|  |  |  | #define _REENT_CHECK_MISC(var) \
 | 
					
						
							|  |  |  |   _REENT_CHECK(var, _misc, struct _misc_reent *, sizeof *((var)->_misc), _REENT_INIT_MISC(var)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define _REENT_CHECK_SIGNAL_BUF(var) \
 | 
					
						
							|  |  |  |   _REENT_CHECK(var, _signal_buf, char *, _REENT_SIGNAL_SIZE, /* nothing */) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define _REENT_SIGNGAM(ptr)	((ptr)->_gamma_signgam)
 | 
					
						
							|  |  |  | #define _REENT_RAND_NEXT(ptr)	((ptr)->_r48->_rand_next)
 | 
					
						
							|  |  |  | #define _REENT_RAND48_SEED(ptr)	((ptr)->_r48->_seed)
 | 
					
						
							|  |  |  | #define _REENT_RAND48_MULT(ptr)	((ptr)->_r48->_mult)
 | 
					
						
							|  |  |  | #define _REENT_RAND48_ADD(ptr)	((ptr)->_r48->_add)
 | 
					
						
							|  |  |  | #define _REENT_MP_RESULT(ptr)	((ptr)->_mp->_result)
 | 
					
						
							|  |  |  | #define _REENT_MP_RESULT_K(ptr)	((ptr)->_mp->_result_k)
 | 
					
						
							|  |  |  | #define _REENT_MP_P5S(ptr)	((ptr)->_mp->_p5s)
 | 
					
						
							|  |  |  | #define _REENT_MP_FREELIST(ptr)	((ptr)->_mp->_freelist)
 | 
					
						
							|  |  |  | #define _REENT_ASCTIME_BUF(ptr)	((ptr)->_asctime_buf)
 | 
					
						
							|  |  |  | #define _REENT_TM(ptr)		((ptr)->_localtime_buf)
 | 
					
						
							|  |  |  | #define _REENT_EMERGENCY(ptr)	((ptr)->_emergency)
 | 
					
						
							|  |  |  | #define _REENT_STRTOK_LAST(ptr)	((ptr)->_misc->_strtok_last)
 | 
					
						
							|  |  |  | #define _REENT_MBLEN_STATE(ptr)	((ptr)->_misc->_mblen_state)
 | 
					
						
							|  |  |  | #define _REENT_MBTOWC_STATE(ptr)((ptr)->_misc->_mbtowc_state)
 | 
					
						
							|  |  |  | #define _REENT_WCTOMB_STATE(ptr)((ptr)->_misc->_wctomb_state)
 | 
					
						
							|  |  |  | #define _REENT_MBRLEN_STATE(ptr) ((ptr)->_misc->_mbrlen_state)
 | 
					
						
							|  |  |  | #define _REENT_MBRTOWC_STATE(ptr) ((ptr)->_misc->_mbrtowc_state)
 | 
					
						
							|  |  |  | #define _REENT_MBSRTOWCS_STATE(ptr) ((ptr)->_misc->_mbsrtowcs_state)
 | 
					
						
							|  |  |  | #define _REENT_WCRTOMB_STATE(ptr) ((ptr)->_misc->_wcrtomb_state)
 | 
					
						
							|  |  |  | #define _REENT_WCSRTOMBS_STATE(ptr) ((ptr)->_misc->_wcsrtombs_state)
 | 
					
						
							|  |  |  | #define _REENT_L64A_BUF(ptr)    ((ptr)->_misc->_l64a_buf)
 | 
					
						
							|  |  |  | #define _REENT_GETDATE_ERR_P(ptr) (&((ptr)->_misc->_getdate_err))
 | 
					
						
							|  |  |  | #define _REENT_SIGNAL_BUF(ptr)  ((ptr)->_signal_buf)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #else /* !_REENT_SMALL */
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct _reent | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   int _errno;			/* local copy of errno */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /* FILE is a big struct and may change over time.  To try to achieve binary
 | 
					
						
							|  |  |  |      compatibility with future versions, put stdin,stdout,stderr here. | 
					
						
							|  |  |  |      These are pointers into member __sf defined below.  */ | 
					
						
							|  |  |  |   __FILE *_stdin, *_stdout, *_stderr; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   int  _inc;			/* used by tmpnam */ | 
					
						
							|  |  |  |   char _emergency[_REENT_EMERGENCY_SIZE]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   int _current_category;	/* used by setlocale */ | 
					
						
							|  |  |  |   _CONST char *_current_locale; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   int __sdidinit;		/* 1 means stdio has been init'd */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   void _EXFNPTR(__cleanup, (struct _reent *)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /* used by mprec routines */ | 
					
						
							|  |  |  |   struct _Bigint *_result; | 
					
						
							|  |  |  |   int _result_k; | 
					
						
							|  |  |  |   struct _Bigint *_p5s; | 
					
						
							|  |  |  |   struct _Bigint **_freelist; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /* used by some fp conversion routines */ | 
					
						
							|  |  |  |   int _cvtlen;			/* should be size_t */ | 
					
						
							|  |  |  |   char *_cvtbuf; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   union | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       struct | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |           unsigned int _unused_rand; | 
					
						
							|  |  |  |           char * _strtok_last; | 
					
						
							|  |  |  |           char _asctime_buf[_REENT_ASCTIME_SIZE]; | 
					
						
							|  |  |  |           struct __tm _localtime_buf; | 
					
						
							|  |  |  |           int _gamma_signgam; | 
					
						
							|  |  |  |           __extension__ unsigned long long _rand_next; | 
					
						
							|  |  |  |           struct _rand48 _r48; | 
					
						
							|  |  |  |           _mbstate_t _mblen_state; | 
					
						
							|  |  |  |           _mbstate_t _mbtowc_state; | 
					
						
							|  |  |  |           _mbstate_t _wctomb_state; | 
					
						
							|  |  |  |           char _l64a_buf[8]; | 
					
						
							|  |  |  |           char _signal_buf[_REENT_SIGNAL_SIZE]; | 
					
						
							|  |  |  |           int _getdate_err; | 
					
						
							|  |  |  |           _mbstate_t _mbrlen_state; | 
					
						
							|  |  |  |           _mbstate_t _mbrtowc_state; | 
					
						
							|  |  |  |           _mbstate_t _mbsrtowcs_state; | 
					
						
							|  |  |  |           _mbstate_t _wcrtomb_state; | 
					
						
							|  |  |  |           _mbstate_t _wcsrtombs_state; | 
					
						
							|  |  |  | 	  int _h_errno; | 
					
						
							|  |  |  |         } _reent; | 
					
						
							|  |  |  |   /* Two next two fields were once used by malloc.  They are no longer
 | 
					
						
							|  |  |  |      used. They are used to preserve the space used before so as to | 
					
						
							|  |  |  |      allow addition of new reent fields and keep binary compatibility.   */ | 
					
						
							|  |  |  |       struct | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  | #define _N_LISTS 30
 | 
					
						
							|  |  |  |           unsigned char * _nextf[_N_LISTS]; | 
					
						
							|  |  |  |           unsigned int _nmalloc[_N_LISTS]; | 
					
						
							|  |  |  |         } _unused; | 
					
						
							|  |  |  |     } _new; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # ifndef _REENT_GLOBAL_ATEXIT
 | 
					
						
							|  |  |  |   /* atexit stuff */ | 
					
						
							|  |  |  |   struct _atexit *_atexit;	/* points to head of LIFO stack */ | 
					
						
							|  |  |  |   struct _atexit _atexit0;	/* one guaranteed table, required by ANSI */ | 
					
						
							|  |  |  | # endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /* signal info */ | 
					
						
							|  |  |  |   void (**(_sig_func))(int); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /* These are here last so that __FILE can grow without changing the offsets
 | 
					
						
							|  |  |  |      of the above members (on the off chance that future binary compatibility | 
					
						
							|  |  |  |      would be broken otherwise).  */ | 
					
						
							|  |  |  |   struct _glue __sglue;		/* root of glue chain */ | 
					
						
							|  |  |  |   __FILE __sf[3];  		/* first three file descriptors */ | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define _REENT_INIT(var) \
 | 
					
						
							|  |  |  |   { 0, \ | 
					
						
							|  |  |  |     &(var).__sf[0], \ | 
					
						
							|  |  |  |     &(var).__sf[1], \ | 
					
						
							|  |  |  |     &(var).__sf[2], \ | 
					
						
							|  |  |  |     0, \ | 
					
						
							|  |  |  |     "", \ | 
					
						
							|  |  |  |     0, \ | 
					
						
							|  |  |  |     "C", \ | 
					
						
							|  |  |  |     0, \ | 
					
						
							|  |  |  |     _NULL, \ | 
					
						
							|  |  |  |     _NULL, \ | 
					
						
							|  |  |  |     0, \ | 
					
						
							|  |  |  |     _NULL, \ | 
					
						
							|  |  |  |     _NULL, \ | 
					
						
							|  |  |  |     0, \ | 
					
						
							|  |  |  |     _NULL, \ | 
					
						
							|  |  |  |     { \ | 
					
						
							|  |  |  |       { \ | 
					
						
							|  |  |  |         0, \ | 
					
						
							|  |  |  |         _NULL, \ | 
					
						
							|  |  |  |         "", \ | 
					
						
							|  |  |  |         {0, 0, 0, 0, 0, 0, 0, 0, 0}, \ | 
					
						
							|  |  |  |         0, \ | 
					
						
							|  |  |  |         1, \ | 
					
						
							|  |  |  |         { \ | 
					
						
							|  |  |  |           {_RAND48_SEED_0, _RAND48_SEED_1, _RAND48_SEED_2}, \ | 
					
						
							|  |  |  |           {_RAND48_MULT_0, _RAND48_MULT_1, _RAND48_MULT_2}, \ | 
					
						
							|  |  |  |           _RAND48_ADD \ | 
					
						
							|  |  |  |         }, \ | 
					
						
							|  |  |  |         {0, {0}}, \ | 
					
						
							|  |  |  |         {0, {0}}, \ | 
					
						
							|  |  |  |         {0, {0}}, \ | 
					
						
							|  |  |  |         "", \ | 
					
						
							|  |  |  |         "", \ | 
					
						
							|  |  |  |         0, \ | 
					
						
							|  |  |  |         {0, {0}}, \ | 
					
						
							|  |  |  |         {0, {0}}, \ | 
					
						
							|  |  |  |         {0, {0}}, \ | 
					
						
							|  |  |  |         {0, {0}}, \ | 
					
						
							|  |  |  |         {0, {0}} \ | 
					
						
							|  |  |  |       } \ | 
					
						
							|  |  |  |     }, \ | 
					
						
							|  |  |  |     _REENT_INIT_ATEXIT \ | 
					
						
							|  |  |  |     _NULL, \ | 
					
						
							|  |  |  |     {_NULL, 0, _NULL} \ | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define _REENT_INIT_PTR(var) \
 | 
					
						
							|  |  |  |   { memset((var), 0, sizeof(*(var))); \ | 
					
						
							|  |  |  |     (var)->_stdin = &(var)->__sf[0]; \ | 
					
						
							|  |  |  |     (var)->_stdout = &(var)->__sf[1]; \ | 
					
						
							|  |  |  |     (var)->_stderr = &(var)->__sf[2]; \ | 
					
						
							|  |  |  |     (var)->_current_locale = "C"; \ | 
					
						
							|  |  |  |     (var)->_new._reent._rand_next = 1; \ | 
					
						
							|  |  |  |     (var)->_new._reent._r48._seed[0] = _RAND48_SEED_0; \ | 
					
						
							|  |  |  |     (var)->_new._reent._r48._seed[1] = _RAND48_SEED_1; \ | 
					
						
							|  |  |  |     (var)->_new._reent._r48._seed[2] = _RAND48_SEED_2; \ | 
					
						
							|  |  |  |     (var)->_new._reent._r48._mult[0] = _RAND48_MULT_0; \ | 
					
						
							|  |  |  |     (var)->_new._reent._r48._mult[1] = _RAND48_MULT_1; \ | 
					
						
							|  |  |  |     (var)->_new._reent._r48._mult[2] = _RAND48_MULT_2; \ | 
					
						
							|  |  |  |     (var)->_new._reent._r48._add = _RAND48_ADD; \ | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define _REENT_CHECK_RAND48(ptr)	/* nothing */
 | 
					
						
							|  |  |  | #define _REENT_CHECK_MP(ptr)		/* nothing */
 | 
					
						
							|  |  |  | #define _REENT_CHECK_TM(ptr)		/* nothing */
 | 
					
						
							|  |  |  | #define _REENT_CHECK_ASCTIME_BUF(ptr)	/* nothing */
 | 
					
						
							|  |  |  | #define _REENT_CHECK_EMERGENCY(ptr)	/* nothing */
 | 
					
						
							|  |  |  | #define _REENT_CHECK_MISC(ptr)	        /* nothing */
 | 
					
						
							|  |  |  | #define _REENT_CHECK_SIGNAL_BUF(ptr)	/* nothing */
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define _REENT_SIGNGAM(ptr)	((ptr)->_new._reent._gamma_signgam)
 | 
					
						
							|  |  |  | #define _REENT_RAND_NEXT(ptr)	((ptr)->_new._reent._rand_next)
 | 
					
						
							|  |  |  | #define _REENT_RAND48_SEED(ptr)	((ptr)->_new._reent._r48._seed)
 | 
					
						
							|  |  |  | #define _REENT_RAND48_MULT(ptr)	((ptr)->_new._reent._r48._mult)
 | 
					
						
							|  |  |  | #define _REENT_RAND48_ADD(ptr)	((ptr)->_new._reent._r48._add)
 | 
					
						
							|  |  |  | #define _REENT_MP_RESULT(ptr)	((ptr)->_result)
 | 
					
						
							|  |  |  | #define _REENT_MP_RESULT_K(ptr)	((ptr)->_result_k)
 | 
					
						
							|  |  |  | #define _REENT_MP_P5S(ptr)	((ptr)->_p5s)
 | 
					
						
							|  |  |  | #define _REENT_MP_FREELIST(ptr)	((ptr)->_freelist)
 | 
					
						
							|  |  |  | #define _REENT_ASCTIME_BUF(ptr)	((ptr)->_new._reent._asctime_buf)
 | 
					
						
							|  |  |  | #define _REENT_TM(ptr)		(&(ptr)->_new._reent._localtime_buf)
 | 
					
						
							|  |  |  | #define _REENT_EMERGENCY(ptr)	((ptr)->_emergency)
 | 
					
						
							|  |  |  | #define _REENT_STRTOK_LAST(ptr)	((ptr)->_new._reent._strtok_last)
 | 
					
						
							|  |  |  | #define _REENT_MBLEN_STATE(ptr)	((ptr)->_new._reent._mblen_state)
 | 
					
						
							|  |  |  | #define _REENT_MBTOWC_STATE(ptr)((ptr)->_new._reent._mbtowc_state)
 | 
					
						
							|  |  |  | #define _REENT_WCTOMB_STATE(ptr)((ptr)->_new._reent._wctomb_state)
 | 
					
						
							|  |  |  | #define _REENT_MBRLEN_STATE(ptr)((ptr)->_new._reent._mbrlen_state)
 | 
					
						
							|  |  |  | #define _REENT_MBRTOWC_STATE(ptr)((ptr)->_new._reent._mbrtowc_state)
 | 
					
						
							|  |  |  | #define _REENT_MBSRTOWCS_STATE(ptr)((ptr)->_new._reent._mbsrtowcs_state)
 | 
					
						
							|  |  |  | #define _REENT_WCRTOMB_STATE(ptr)((ptr)->_new._reent._wcrtomb_state)
 | 
					
						
							|  |  |  | #define _REENT_WCSRTOMBS_STATE(ptr)((ptr)->_new._reent._wcsrtombs_state)
 | 
					
						
							|  |  |  | #define _REENT_L64A_BUF(ptr)    ((ptr)->_new._reent._l64a_buf)
 | 
					
						
							|  |  |  | #define _REENT_SIGNAL_BUF(ptr)  ((ptr)->_new._reent._signal_buf)
 | 
					
						
							|  |  |  | #define _REENT_GETDATE_ERR_P(ptr) (&((ptr)->_new._reent._getdate_err))
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif /* !_REENT_SMALL */
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* This value is used in stdlib/misc.c.  reent/reent.c has to know it
 | 
					
						
							|  |  |  |    as well to make sure the freelist is correctly free'd.  Therefore | 
					
						
							|  |  |  |    we define it here, rather than in stdlib/misc.c, as before. */ | 
					
						
							|  |  |  | #define _Kmax (sizeof (size_t) << 3)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * All references to struct _reent are via this pointer. | 
					
						
							|  |  |  |  * Internally, newlib routines that need to reference it should use _REENT. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifndef __ATTRIBUTE_IMPURE_PTR__
 | 
					
						
							|  |  |  | #define __ATTRIBUTE_IMPURE_PTR__
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #if !defined(__DYNAMIC_REENT__) || defined(__SINGLE_THREAD__)
 | 
					
						
							|  |  |  | extern struct _reent *_impure_ptr __ATTRIBUTE_IMPURE_PTR__; | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | extern struct _reent *_global_impure_ptr __ATTRIBUTE_IMPURE_PTR__; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void _reclaim_reent _PARAMS ((struct _reent *)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* #define _REENT_ONLY define this to get only reentrant routines */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #if defined(__DYNAMIC_REENT__) && !defined(__SINGLE_THREAD__)
 | 
					
						
							|  |  |  | #ifndef __getreent
 | 
					
						
							|  |  |  |   struct _reent * _EXFUN(__getreent, (void)); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | # define _REENT (__getreent())
 | 
					
						
							|  |  |  | #else /* __SINGLE_THREAD__ || !__DYNAMIC_REENT__ */
 | 
					
						
							|  |  |  | # define _REENT _impure_ptr
 | 
					
						
							|  |  |  | #endif /* __SINGLE_THREAD__ || !__DYNAMIC_REENT__ */
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define _GLOBAL_REENT _global_impure_ptr
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifdef _REENT_GLOBAL_ATEXIT
 | 
					
						
							|  |  |  | extern struct _atexit *_global_atexit; /* points to head of LIFO stack */ | 
					
						
							|  |  |  | # define _GLOBAL_ATEXIT _global_atexit
 | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  | # define _GLOBAL_ATEXIT (_GLOBAL_REENT->_atexit)
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifdef __cplusplus
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | #endif /* _SYS_REENT_H_ */
 |