Search
lxdream.org :: lxdream/test/include/sys/reent.h
lxdream 0.9.1
released Jun 29
Download Now
filename test/include/sys/reent.h
changeset 185:6755a04c447f
author nkeynes
date Fri Feb 08 00:06:56 2008 +0000 (16 years ago)
permissions -rw-r--r--
last change Fix LDS/STS to FPUL/FPSCR to check the FPU disabled bit. Fixes
the linux 2.4.0-test8 kernel boot
(this wasn't exactly very well documented in the original manual)
file annotate diff log raw
nkeynes@185
     1
/* This header file provides the reentrancy.  */
nkeynes@185
     2
nkeynes@185
     3
/* WARNING: All identifiers here must begin with an underscore.  This file is
nkeynes@185
     4
   included by stdio.h and others and we therefore must only use identifiers
nkeynes@185
     5
   in the namespace allotted to us.  */
nkeynes@185
     6
nkeynes@185
     7
#ifndef _SYS_REENT_H_
nkeynes@185
     8
#ifdef __cplusplus
nkeynes@185
     9
extern "C" {
nkeynes@185
    10
#endif
nkeynes@185
    11
#define _SYS_REENT_H_
nkeynes@185
    12
nkeynes@185
    13
#include <_ansi.h>
nkeynes@185
    14
#include <time.h>
nkeynes@185
    15
nkeynes@185
    16
#ifndef __Long
nkeynes@185
    17
#if __LONG_MAX__ == 2147483647L
nkeynes@185
    18
#define __Long long
nkeynes@185
    19
typedef unsigned __Long __ULong;
nkeynes@185
    20
#elif __INT_MAX__ == 2147483647
nkeynes@185
    21
#define __Long int
nkeynes@185
    22
typedef unsigned __Long __ULong;
nkeynes@185
    23
#endif
nkeynes@185
    24
#endif
nkeynes@185
    25
nkeynes@185
    26
#ifndef __Long
nkeynes@185
    27
#define __Long __int32_t
nkeynes@185
    28
typedef __uint32_t __ULong;
nkeynes@185
    29
#endif
nkeynes@185
    30
nkeynes@185
    31
struct _glue 
nkeynes@185
    32
{
nkeynes@185
    33
  struct _glue *_next;
nkeynes@185
    34
  int _niobs;
nkeynes@185
    35
  struct __sFILE *_iobs;
nkeynes@185
    36
};
nkeynes@185
    37
nkeynes@185
    38
struct _Bigint 
nkeynes@185
    39
{
nkeynes@185
    40
  struct _Bigint *_next;
nkeynes@185
    41
  int _k, _maxwds, _sign, _wds;
nkeynes@185
    42
  __ULong _x[1];
nkeynes@185
    43
};
nkeynes@185
    44
nkeynes@185
    45
/*
nkeynes@185
    46
 * atexit() support
nkeynes@185
    47
 */
nkeynes@185
    48
nkeynes@185
    49
#define	_ATEXIT_SIZE 32	/* must be at least 32 to guarantee ANSI conformance */
nkeynes@185
    50
nkeynes@185
    51
struct _atexit {
nkeynes@185
    52
	struct	_atexit *_next;			/* next in list */
nkeynes@185
    53
	int	_ind;				/* next index in this table */
nkeynes@185
    54
	void	(*_fns[_ATEXIT_SIZE])(void);	/* the table itself */
nkeynes@185
    55
};
nkeynes@185
    56
nkeynes@185
    57
/*
nkeynes@185
    58
 * Stdio buffers.
nkeynes@185
    59
 *
nkeynes@185
    60
 * This and __sFILE are defined here because we need them for struct _reent,
nkeynes@185
    61
 * but we don't want stdio.h included when stdlib.h is.
nkeynes@185
    62
 */
nkeynes@185
    63
nkeynes@185
    64
struct __sbuf {
nkeynes@185
    65
	unsigned char *_base;
nkeynes@185
    66
	int	_size;
nkeynes@185
    67
};
nkeynes@185
    68
nkeynes@185
    69
/*
nkeynes@185
    70
 * We need fpos_t for the following, but it doesn't have a leading "_",
nkeynes@185
    71
 * so we use _fpos_t instead.
nkeynes@185
    72
 */
nkeynes@185
    73
nkeynes@185
    74
typedef long _fpos_t;		/* XXX must match off_t in <sys/types.h> */
nkeynes@185
    75
				/* (and must be `long' for now) */
nkeynes@185
    76
nkeynes@185
    77
/*
nkeynes@185
    78
 * Stdio state variables.
nkeynes@185
    79
 *
nkeynes@185
    80
 * The following always hold:
nkeynes@185
    81
 *
nkeynes@185
    82
 *	if (_flags&(__SLBF|__SWR)) == (__SLBF|__SWR),
nkeynes@185
    83
 *		_lbfsize is -_bf._size, else _lbfsize is 0
nkeynes@185
    84
 *	if _flags&__SRD, _w is 0
nkeynes@185
    85
 *	if _flags&__SWR, _r is 0
nkeynes@185
    86
 *
nkeynes@185
    87
 * This ensures that the getc and putc macros (or inline functions) never
nkeynes@185
    88
 * try to write or read from a file that is in `read' or `write' mode.
nkeynes@185
    89
 * (Moreover, they can, and do, automatically switch from read mode to
nkeynes@185
    90
 * write mode, and back, on "r+" and "w+" files.)
nkeynes@185
    91
 *
nkeynes@185
    92
 * _lbfsize is used only to make the inline line-buffered output stream
nkeynes@185
    93
 * code as compact as possible.
nkeynes@185
    94
 *
nkeynes@185
    95
 * _ub, _up, and _ur are used when ungetc() pushes back more characters
nkeynes@185
    96
 * than fit in the current _bf, or when ungetc() pushes back a character
nkeynes@185
    97
 * that does not match the previous one in _bf.  When this happens,
nkeynes@185
    98
 * _ub._base becomes non-nil (i.e., a stream has ungetc() data iff
nkeynes@185
    99
 * _ub._base!=NULL) and _up and _ur save the current values of _p and _r.
nkeynes@185
   100
 */
nkeynes@185
   101
nkeynes@185
   102
struct __sFILE {
nkeynes@185
   103
  unsigned char *_p;	/* current position in (some) buffer */
nkeynes@185
   104
  int	_r;		/* read space left for getc() */
nkeynes@185
   105
  int	_w;		/* write space left for putc() */
nkeynes@185
   106
  short	_flags;		/* flags, below; this FILE is free if 0 */
nkeynes@185
   107
  short	_file;		/* fileno, if Unix descriptor, else -1 */
nkeynes@185
   108
  struct __sbuf _bf;	/* the buffer (at least 1 byte, if !NULL) */
nkeynes@185
   109
  int	_lbfsize;	/* 0 or -_bf._size, for inline putc */
nkeynes@185
   110
nkeynes@185
   111
  /* operations */
nkeynes@185
   112
  _PTR	_cookie;	/* cookie passed to io functions */
nkeynes@185
   113
nkeynes@185
   114
  int	_EXFUN((*_read),(_PTR _cookie, char *_buf, int _n));
nkeynes@185
   115
  int	_EXFUN((*_write),(_PTR _cookie, const char *_buf, int _n));
nkeynes@185
   116
  _fpos_t _EXFUN((*_seek),(_PTR _cookie, _fpos_t _offset, int _whence));
nkeynes@185
   117
  int	_EXFUN((*_close),(_PTR _cookie));
nkeynes@185
   118
nkeynes@185
   119
  /* separate buffer for long sequences of ungetc() */
nkeynes@185
   120
  struct __sbuf _ub;	/* ungetc buffer */
nkeynes@185
   121
  unsigned char *_up;	/* saved _p when _p is doing ungetc data */
nkeynes@185
   122
  int	_ur;		/* saved _r when _r is counting ungetc data */
nkeynes@185
   123
nkeynes@185
   124
  /* tricks to meet minimum requirements even when malloc() fails */
nkeynes@185
   125
  unsigned char _ubuf[3];	/* guarantee an ungetc() buffer */
nkeynes@185
   126
  unsigned char _nbuf[1];	/* guarantee a getc() buffer */
nkeynes@185
   127
nkeynes@185
   128
  /* separate buffer for fgetline() when line crosses buffer boundary */
nkeynes@185
   129
  struct __sbuf _lb;	/* buffer for fgetline() */
nkeynes@185
   130
nkeynes@185
   131
  /* Unix stdio files get aligned to block boundaries on fseek() */
nkeynes@185
   132
  int	_blksize;	/* stat.st_blksize (may be != _bf._size) */
nkeynes@185
   133
  int	_offset;	/* current lseek offset */
nkeynes@185
   134
nkeynes@185
   135
  struct _reent *_data;
nkeynes@185
   136
};
nkeynes@185
   137
nkeynes@185
   138
/*
nkeynes@185
   139
 * struct _reent
nkeynes@185
   140
 *
nkeynes@185
   141
 * This structure contains *all* globals needed by the library.
nkeynes@185
   142
 * It's raison d'etre is to facilitate threads by making all library routines
nkeynes@185
   143
 * reentrant.  IE: All state information is contained here.
nkeynes@185
   144
 */
nkeynes@185
   145
nkeynes@185
   146
struct _reent
nkeynes@185
   147
{
nkeynes@185
   148
  /* local copy of errno */
nkeynes@185
   149
  int _errno;
nkeynes@185
   150
nkeynes@185
   151
  /* FILE is a big struct and may change over time.  To try to achieve binary
nkeynes@185
   152
     compatibility with future versions, put stdin,stdout,stderr here.
nkeynes@185
   153
     These are pointers into member __sf defined below.  */
nkeynes@185
   154
  struct __sFILE *_stdin, *_stdout, *_stderr;
nkeynes@185
   155
nkeynes@185
   156
  int  _inc;			/* used by tmpnam */
nkeynes@185
   157
  char _emergency[25];
nkeynes@185
   158
 
nkeynes@185
   159
  int _current_category;	/* used by setlocale */
nkeynes@185
   160
  _CONST char *_current_locale;
nkeynes@185
   161
nkeynes@185
   162
  int __sdidinit;		/* 1 means stdio has been init'd */
nkeynes@185
   163
nkeynes@185
   164
  void _EXFUN((*__cleanup),(struct _reent *));
nkeynes@185
   165
nkeynes@185
   166
  /* used by mprec routines */
nkeynes@185
   167
  struct _Bigint *_result;
nkeynes@185
   168
  int _result_k;
nkeynes@185
   169
  struct _Bigint *_p5s;
nkeynes@185
   170
  struct _Bigint **_freelist;
nkeynes@185
   171
nkeynes@185
   172
  /* used by some fp conversion routines */
nkeynes@185
   173
  int _cvtlen;			/* should be size_t */
nkeynes@185
   174
  char *_cvtbuf;
nkeynes@185
   175
nkeynes@185
   176
  union
nkeynes@185
   177
    {
nkeynes@185
   178
      struct
nkeynes@185
   179
        {
nkeynes@185
   180
          unsigned int _rand_next;
nkeynes@185
   181
          char * _strtok_last;
nkeynes@185
   182
          char _asctime_buf[26];
nkeynes@185
   183
          struct tm _localtime_buf;
nkeynes@185
   184
          int _gamma_signgam;
nkeynes@185
   185
        } _reent;
nkeynes@185
   186
  /* Two next two fields were once used by malloc.  They are no longer
nkeynes@185
   187
     used. They are used to preserve the space used before so as to
nkeynes@185
   188
     allow addition of new reent fields and keep binary compatibility.   */ 
nkeynes@185
   189
      struct
nkeynes@185
   190
        {
nkeynes@185
   191
#define _N_LISTS 30
nkeynes@185
   192
          unsigned char * _nextf[_N_LISTS];
nkeynes@185
   193
          unsigned int _nmalloc[_N_LISTS];
nkeynes@185
   194
        } _unused;
nkeynes@185
   195
    } _new;
nkeynes@185
   196
nkeynes@185
   197
  /* atexit stuff */
nkeynes@185
   198
  struct _atexit *_atexit;	/* points to head of LIFO stack */
nkeynes@185
   199
  struct _atexit _atexit0;	/* one guaranteed table, required by ANSI */
nkeynes@185
   200
nkeynes@185
   201
  /* signal info */
nkeynes@185
   202
  void (**(_sig_func))(int);
nkeynes@185
   203
nkeynes@185
   204
  /* These are here last so that __sFILE can grow without changing the offsets
nkeynes@185
   205
     of the above members (on the off chance that future binary compatibility
nkeynes@185
   206
     would be broken otherwise).  */
nkeynes@185
   207
  struct _glue __sglue;			/* root of glue chain */
nkeynes@185
   208
  struct __sFILE __sf[3];		/* first three file descriptors */
nkeynes@185
   209
};
nkeynes@185
   210
nkeynes@185
   211
#define _REENT_INIT(var) \
nkeynes@185
   212
  { 0, &var.__sf[0], &var.__sf[1], &var.__sf[2], 0, "", 0, "C", \
nkeynes@185
   213
    0, NULL, NULL, 0, NULL, NULL, 0, NULL, { {1, NULL, "", \
nkeynes@185
   214
    { 0,0,0,0,0,0,0,0}, 0 } } }
nkeynes@185
   215
nkeynes@185
   216
/*
nkeynes@185
   217
 * All references to struct _reent are via this pointer.
nkeynes@185
   218
 * Internally, newlib routines that need to reference it should use _REENT.
nkeynes@185
   219
 */
nkeynes@185
   220
nkeynes@185
   221
#ifndef __ATTRIBUTE_IMPURE_PTR__
nkeynes@185
   222
#define __ATTRIBUTE_IMPURE_PTR__
nkeynes@185
   223
#endif
nkeynes@185
   224
nkeynes@185
   225
extern struct _reent *_impure_ptr __ATTRIBUTE_IMPURE_PTR__;
nkeynes@185
   226
nkeynes@185
   227
void _reclaim_reent _PARAMS ((struct _reent *));
nkeynes@185
   228
nkeynes@185
   229
/* #define _REENT_ONLY define this to get only reentrant routines */
nkeynes@185
   230
nkeynes@185
   231
#ifndef _REENT_ONLY
nkeynes@185
   232
#define _REENT _impure_ptr
nkeynes@185
   233
#endif
nkeynes@185
   234
nkeynes@185
   235
#ifdef __cplusplus
nkeynes@185
   236
}
nkeynes@185
   237
#endif
nkeynes@185
   238
#endif /* _SYS_REENT_H_ */
.