mirror of
				https://github.com/0xFEEDC0DE64/arduino-esp32.git
				synced 2025-11-03 23:51:39 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			794 lines
		
	
	
		
			24 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			794 lines
		
	
	
		
			24 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* 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 */
 | 
						|
  void (**(_sig_func))(int);
 | 
						|
 | 
						|
# 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 \
 | 
						|
  }
 | 
						|
 | 
						|
#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"; \
 | 
						|
  }
 | 
						|
 | 
						|
/* 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_ */
 |