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_ */ |
.