1: /* This header file provides the reentrancy. */ 2: 3: /* WARNING: All identifiers here must begin with an underscore. This file is 4: included by stdio.h and others and we therefore must only use identifiers 5: in the namespace allotted to us. */ 6: 7: #ifndef _SYS_REENT_H_ 8: #ifdef __cplusplus 9: extern "C" { 10: #endif 11: #define _SYS_REENT_H_ 12: 13: #include <_ansi.h> 14: #include <sys/_types.h> 15: 16: #ifndef __Long 17: #if __LONG_MAX__ == 2147483647L 18: #define __Long long 19: typedef unsigned __Long __ULong; 20: #elif __INT_MAX__ == 2147483647 21: #define __Long int 22: typedef unsigned __Long __ULong; 23: #endif 24: #endif 25: 26: #if !defined( __Long) 27: #include <sys/types.h> 28: #endif 29: 30: #ifndef __Long 31: #define __Long __int32_t 32: typedef __uint32_t __ULong; 33: #endif 34: 35: /* 36: * If _REENT_SMALL is defined, we make struct _reent as small as possible, 37: * by having nearly everything possible allocated at first use. 38: */ 39: 40: struct _Bigint 41: { 42: struct _Bigint *_next; 43: int _k, _maxwds, _sign, _wds; 44: __ULong _x[1]; 45: }; 46: 47: /* needed by reentrant structure */ 48: struct __tm 49: { 50: int __tm_sec; 51: int __tm_min; 52: int __tm_hour; 53: int __tm_mday; 54: int __tm_mon; 55: int __tm_year; 56: int __tm_wday; 57: int __tm_yday; 58: int __tm_isdst; 59: }; 60: 61: /* 62: * atexit() support. For _REENT_SMALL, we limit to 32 max. 63: */ 64: 65: #define _ATEXIT_SIZE 32 /* must be at least 32 to guarantee ANSI conformance */ 66: 67: struct _on_exit_args { 68: void * _fnargs[_ATEXIT_SIZE]; /* fn args for on_exit */ 69: __ULong _fntypes; /* type of exit routine - 70: Must have at least _ATEXIT_SIZE bits */ 71: }; 72: 73: #ifdef _REENT_SMALL 74: struct _atexit { 75: int _ind; /* next index in this table */ 76: void (*_fns[_ATEXIT_SIZE])(void); /* the table itself */ 77: struct _on_exit_args * _on_exit_args_ptr; 78: }; 79: #else 80: struct _atexit { 81: struct _atexit *_next; /* next in list */ 82: int _ind; /* next index in this table */ 83: void (*_fns[_ATEXIT_SIZE])(void); /* the table itself */ 84: struct _on_exit_args _on_exit_args; 85: }; 86: #endif 87: 88: /* 89: * Stdio buffers. 90: * 91: * This and __FILE are defined here because we need them for struct _reent, 92: * but we don't want stdio.h included when stdlib.h is. 93: */ 94: 95: struct __sbuf { 96: unsigned char *_base; 97: int _size; 98: }; 99: 100: /* 101: * We need fpos_t for the following, but it doesn't have a leading "_", 102: * so we use _fpos_t instead. 103: */ 104: 105: typedef long _fpos_t; /* XXX must match off_t in <sys/types.h> */ 106: /* (and must be `long' for now) */ 107: 108: #ifdef __LARGE64_FILES 109: typedef _off64_t _fpos64_t; 110: #endif 111: 112: /* 113: * Stdio state variables. 114: * 115: * The following always hold: 116: * 117: * if (_flags&(__SLBF|__SWR)) == (__SLBF|__SWR), 118: * _lbfsize is -_bf._size, else _lbfsize is 0 119: * if _flags&__SRD, _w is 0 120: * if _flags&__SWR, _r is 0 121: * 122: * This ensures that the getc and putc macros (or inline functions) never 123: * try to write or read from a file that is in `read' or `write' mode. 124: * (Moreover, they can, and do, automatically switch from read mode to 125: * write mode, and back, on "r+" and "w+" files.) 126: * 127: * _lbfsize is used only to make the inline line-buffered output stream 128: * code as compact as possible. 129: * 130: * _ub, _up, and _ur are used when ungetc() pushes back more characters 131: * than fit in the current _bf, or when ungetc() pushes back a character 132: * that does not match the previous one in _bf. When this happens, 133: * _ub._base becomes non-nil (i.e., a stream has ungetc() data iff 134: * _ub._base!=NULL) and _up and _ur save the current values of _p and _r. 135: */ 136: 137: #ifdef _REENT_SMALL 138: /* 139: * struct __sFILE_fake is the start of a struct __sFILE, with only the 140: * minimal fields allocated. In __sinit() we really allocate the 3 141: * standard streams, etc., and point away from this fake. 142: */ 143: struct __sFILE_fake { 144: unsigned char *_p; /* current position in (some) buffer */ 145: int _r; /* read space left for getc() */ 146: int _w; /* write space left for putc() */ 147: short _flags; /* flags, below; this FILE is free if 0 */ 148: short _file; /* fileno, if Unix descriptor, else -1 */ 149: struct __sbuf _bf; /* the buffer (at least 1 byte, if !NULL) */ 150: int _lbfsize; /* 0 or -_bf._size, for inline putc */ 151: 152: struct _reent *_data; 153: }; 154: /* CHECK_INIT() comes from stdio/local.h; be sure to include that. */ 155: # define _REENT_SMALL_CHECK_INIT(fp) CHECK_INIT(fp) 156: #else 157: # define _REENT_SMALL_CHECK_INIT(fp) /* nothing */ 158: #endif 159: 160: struct __sFILE { 161: unsigned char *_p; /* current position in (some) buffer */ 162: int _r; /* read space left for getc() */ 163: int _w; /* write space left for putc() */ 164: short _flags; /* flags, below; this FILE is free if 0 */ 165: short _file; /* fileno, if Unix descriptor, else -1 */ 166: struct __sbuf _bf; /* the buffer (at least 1 byte, if !NULL) */ 167: int _lbfsize; /* 0 or -_bf._size, for inline putc */ 168: 169: #ifdef _REENT_SMALL 170: struct _reent *_data; 171: #endif 172: 173: /* operations */ 174: _PTR _cookie; /* cookie passed to io functions */ 175: 176: _READ_WRITE_RETURN_TYPE _EXFUN((*_read),(_PTR _cookie, char *_buf, int _n)); 177: _READ_WRITE_RETURN_TYPE _EXFUN((*_write),(_PTR _cookie, const char *_buf, 178: int _n)); 179: _fpos_t _EXFUN((*_seek),(_PTR _cookie, _fpos_t _offset, int _whence)); 180: int _EXFUN((*_close),(_PTR _cookie)); 181: 182: /* separate buffer for long sequences of ungetc() */ 183: struct __sbuf _ub; /* ungetc buffer */ 184: unsigned char *_up; /* saved _p when _p is doing ungetc data */ 185: int _ur; /* saved _r when _r is counting ungetc data */ 186: 187: /* tricks to meet minimum requirements even when malloc() fails */ 188: unsigned char _ubuf[3]; /* guarantee an ungetc() buffer */ 189: unsigned char _nbuf[1]; /* guarantee a getc() buffer */ 190: 191: /* separate buffer for fgetline() when line crosses buffer boundary */ 192: struct __sbuf _lb; /* buffer for fgetline() */ 193: 194: /* Unix stdio files get aligned to block boundaries on fseek() */ 195: int _blksize; /* stat.st_blksize (may be != _bf._size) */ 196: int _offset; /* current lseek offset */ 197: 198: #ifndef _REENT_SMALL 199: struct _reent *_data; /* Here for binary compatibility? Remove? */ 200: #endif 201: 202: #ifndef __SINGLE_THREAD__ 203: _flock_t _lock; /* for thread-safety locking */ 204: #endif 205: }; 206: 207: #ifdef __LARGE64_FILES 208: struct __sFILE64 { 209: unsigned char *_p; /* current position in (some) buffer */ 210: int _r; /* read space left for getc() */ 211: int _w; /* write space left for putc() */ 212: short _flags; /* flags, below; this FILE is free if 0 */ 213: short _file; /* fileno, if Unix descriptor, else -1 */ 214: struct __sbuf _bf; /* the buffer (at least 1 byte, if !NULL) */ 215: int _lbfsize; /* 0 or -_bf._size, for inline putc */ 216: 217: struct _reent *_data; 218: 219: /* operations */ 220: _PTR _cookie; /* cookie passed to io functions */ 221: 222: _READ_WRITE_RETURN_TYPE _EXFUN((*_read),(_PTR _cookie, char *_buf, int _n)); 223: _READ_WRITE_RETURN_TYPE _EXFUN((*_write),(_PTR _cookie, const char *_buf, 224: int _n)); 225: _fpos_t _EXFUN((*_seek),(_PTR _cookie, _fpos_t _offset, int _whence)); 226: int _EXFUN((*_close),(_PTR _cookie)); 227: 228: /* separate buffer for long sequences of ungetc() */ 229: struct __sbuf _ub; /* ungetc buffer */ 230: unsigned char *_up; /* saved _p when _p is doing ungetc data */ 231: int _ur; /* saved _r when _r is counting ungetc data */ 232: 233: /* tricks to meet minimum requirements even when malloc() fails */ 234: unsigned char _ubuf[3]; /* guarantee an ungetc() buffer */ 235: unsigned char _nbuf[1]; /* guarantee a getc() buffer */ 236: 237: /* separate buffer for fgetline() when line crosses buffer boundary */ 238: struct __sbuf _lb; /* buffer for fgetline() */ 239: 240: /* Unix stdio files get aligned to block boundaries on fseek() */ 241: int _blksize; /* stat.st_blksize (may be != _bf._size) */ 242: int _flags2; /* for future use */ 243: 244: _off64_t _offset; /* current lseek offset */ 245: _fpos64_t _EXFUN((*_seek64),(_PTR _cookie, _fpos64_t _offset, int _whence)); 246: 247: #ifndef __SINGLE_THREAD__ 248: _flock_t _lock; /* for thread-safety locking */ 249: #endif 250: }; 251: typedef struct __sFILE64 __FILE; 252: #else 253: typedef struct __sFILE __FILE; 254: #endif /* __LARGE64_FILES */ 255: 256: struct _glue 257: { 258: struct _glue *_next; 259: int _niobs; 260: __FILE *_iobs; 261: }; 262: 263: /* 264: * rand48 family support 265: * 266: * Copyright (c) 1993 Martin Birgmeier 267: * All rights reserved. 268: * 269: * You may redistribute unmodified or modified versions of this source 270: * code provided that the above copyright notice and this and the 271: * following conditions are retained. 272: * 273: * This software is provided ``as is'', and comes with no warranties 274: * of any kind. I shall in no event be liable for anything that happens 275: * to anyone/anything when using this software. 276: */ 277: #define _RAND48_SEED_0 (0x330e) 278: #define _RAND48_SEED_1 (0xabcd) 279: #define _RAND48_SEED_2 (0x1234) 280: #define _RAND48_MULT_0 (0xe66d) 281: #define _RAND48_MULT_1 (0xdeec) 282: #define _RAND48_MULT_2 (0x0005) 283: #define _RAND48_ADD (0x000b) 284: struct _rand48 { 285: unsigned short _seed[3]; 286: unsigned short _mult[3]; 287: unsigned short _add; 288: #ifdef _REENT_SMALL 289: /* Put this in here as well, for good luck. */ 290: __extension__ unsigned long long _rand_next; 291: #endif 292: }; 293: 294: /* How big the some arrays are. */ 295: #define _REENT_EMERGENCY_SIZE 25 296: #define _REENT_ASCTIME_SIZE 26 297: #define _REENT_SIGNAL_SIZE 24 298: 299: /* 300: * struct _reent 301: * 302: * This structure contains *all* globals needed by the library. 303: * It's raison d'etre is to facilitate threads by making all library routines 304: * reentrant. IE: All state information is contained here. 305: */ 306: 307: #ifdef _REENT_SMALL 308: 309: struct _mprec 310: { 311: /* used by mprec routines */ 312: struct _Bigint *_result; 313: int _result_k; 314: struct _Bigint *_p5s; 315: struct _Bigint **_freelist; 316: }; 317: 318: 319: struct _misc_reent 320: { 321: /* miscellaneous reentrant data */ 322: char *_strtok_last; 323: _mbstate_t _mblen_state; 324: _mbstate_t _wctomb_state; 325: _mbstate_t _mbtowc_state; 326: char _l64a_buf[8]; 327: int _getdate_err; 328: _mbstate_t _mbrlen_state; 329: _mbstate_t _mbrtowc_state; 330: _mbstate_t _mbsrtowcs_state; 331: _mbstate_t _wcrtomb_state; 332: _mbstate_t _wcsrtombs_state; 333: }; 334: 335: /* This version of _reent is layed our with "int"s in pairs, to help 336: * ports with 16-bit int's but 32-bit pointers, align nicely. */ 337: struct _reent 338: { 339: 340: /* FILE is a big struct and may change over time. To try to achieve binary 341: compatibility with future versions, put stdin,stdout,stderr here. 342: These are pointers into member __sf defined below. */ 343: __FILE *_stdin, *_stdout, *_stderr; /* XXX */ 344: 345: int _errno; /* local copy of errno */ 346: 347: int _inc; /* used by tmpnam */ 348: 349: char *_emergency; 350: 351: int __sdidinit; /* 1 means stdio has been init'd */ 352: 353: int _current_category; /* used by setlocale */ 354: _CONST char *_current_locale; 355: 356: struct _mprec *_mp; 357: 358: void _EXFUN((*__cleanup),(struct _reent *)); 359: 360: int _gamma_signgam; 361: 362: /* used by some fp conversion routines */ 363: int _cvtlen; /* should be size_t */ 364: char *_cvtbuf; 365: 366: struct _rand48 *_r48; 367: struct __tm *_localtime_buf; 368: char *_asctime_buf; 369: 370: /* signal info */ 371: void (**(_sig_func))(int); 372: 373: /* atexit stuff */ 374: struct _atexit _atexit; 375: 376: struct _glue __sglue; /* root of glue chain */ 377: __FILE *__sf; /* file descriptors */ 378: struct __sFILE_fake __sf_fake; /* fake initial stdin/out/err */ 379: struct _misc_reent *_misc; /* strtok, multibyte states */ 380: char *_signal_buf; /* strsignal */ 381: }; 382: 383: #define _REENT_INIT(var) \ 384: { (__FILE *)&var.__sf_fake, (__FILE *)&var.__sf_fake, \ 385: (__FILE *)&var.__sf_fake, 0, 0, _NULL, 0, 0, \ 386: "C", _NULL, _NULL, 0, 0, _NULL, _NULL, _NULL, _NULL, _NULL, \ 387: { 0, _NULL, _NULL, 0 }, { _NULL, 0, _NULL }, _NULL, 0, _NULL, _NULL } 388: 389: #define _REENT_INIT_PTR(var) \ 390: { var->_stdin = (__FILE *)&var->__sf_fake; \ 391: var->_stdout = (__FILE *)&var->__sf_fake; \ 392: var->_stderr = (__FILE *)&var->__sf_fake; \ 393: var->_errno = 0; \ 394: var->_inc = 0; \ 395: var->_emergency = _NULL; \ 396: var->__sdidinit = 0; \ 397: var->_current_category = 0; \ 398: var->_current_locale = "C"; \ 399: var->_mp = _NULL; \ 400: var->__cleanup = _NULL; \ 401: var->_gamma_signgam = 0; \ 402: var->_cvtlen = 0; \ 403: var->_cvtbuf = _NULL; \ 404: var->_r48 = _NULL; \ 405: var->_localtime_buf = _NULL; \ 406: var->_asctime_buf = _NULL; \ 407: var->_sig_func = _NULL; \ 408: var->_atexit._ind = 0; \ 409: var->_atexit._fns[0] = _NULL; \ 410: var->_atexit._on_exit_args = _NULL; \ 411: var->__sglue._next = _NULL; \ 412: var->__sglue._niobs = 0; \ 413: var->__sglue._iobs = _NULL; \ 414: var->__sf = 0; \ 415: var->_misc = _NULL; \ 416: var->_signal_buf = _NULL; \ 417: var->_getdate_err = 0; \ 418: var->__sf_fake._p = _NULL; \ 419: var->__sf_fake._r = 0; \ 420: var->__sf_fake._w = 0; \ 421: var->__sf_fake._flags = 0; \ 422: var->__sf_fake._file = 0; \ 423: var->__sf_fake._lbfsize = 0; \ 424: var->__sf_fake._data = _NULL; \ 425: } 426: 427: /* Only built the assert() calls if we are built with debugging. */ 428: #if DEBUG 429: #include <assert.h> 430: #else 431: #define assert(x) ((void)0) 432: #endif 433: 434: /* Generic _REENT check macro. */ 435: #define _REENT_CHECK(var, what, type, size, init) do { \ 436: struct _reent *_r = (var); \ 437: if (_r->what == NULL) { \ 438: _r->what = (type)malloc(size); \ 439: assert(_r->what); \ 440: init; \ 441: } \ 442: } while (0) 443: 444: #define _REENT_CHECK_TM(var) \ 445: _REENT_CHECK(var, _localtime_buf, struct __tm *, sizeof *((var)->_localtime_buf), \ 446: /* nothing */) 447: 448: #define _REENT_CHECK_ASCTIME_BUF(var) \ 449: _REENT_CHECK(var, _asctime_buf, char *, _REENT_ASCTIME_SIZE, \ 450: memset((var)->_asctime_buf, 0, _REENT_ASCTIME_SIZE)) 451: 452: /* Handle the dynamically allocated rand48 structure. */ 453: #define _REENT_INIT_RAND48(var) do { \ 454: struct _reent *_r = (var); \ 455: _r->_r48->_seed[0] = _RAND48_SEED_0; \ 456: _r->_r48->_seed[1] = _RAND48_SEED_1; \ 457: _r->_r48->_seed[2] = _RAND48_SEED_2; \ 458: _r->_r48->_mult[0] = _RAND48_MULT_0; \ 459: _r->_r48->_mult[1] = _RAND48_MULT_1; \ 460: _r->_r48->_mult[2] = _RAND48_MULT_2; \ 461: _r->_r48->_add = _RAND48_ADD; \ 462: } while (0) 463: #define _REENT_CHECK_RAND48(var) \ 464: _REENT_CHECK(var, _r48, struct _rand48 *, sizeof *((var)->_r48), _REENT_INIT_RAND48((var))) 465: 466: #define _REENT_INIT_MP(var) do { \ 467: struct _reent *_r = (var); \ 468: _r->_mp->_result_k = 0; \ 469: _r->_mp->_result = _r->_mp->_p5s = _NULL; \ 470: _r->_mp->_freelist = _NULL; \ 471: } while (0) 472: #define _REENT_CHECK_MP(var) \ 473: _REENT_CHECK(var, _mp, struct _mprec *, sizeof *((var)->_mp), _REENT_INIT_MP(var)) 474: 475: #define _REENT_CHECK_EMERGENCY(var) \ 476: _REENT_CHECK(var, _emergency, char *, _REENT_EMERGENCY_SIZE, /* nothing */) 477: 478: #define _REENT_INIT_MISC(var) do { \ 479: struct _reent *_r = (var); \ 480: _r->_misc->_strtok_last = _NULL; \ 481: _r->_misc->_mblen_state.__count = 0; \ 482: _r->_misc->_mblen_state.__value.__wch = 0; \ 483: _r->_misc->_wctomb_state.__count = 0; \ 484: _r->_misc->_wctomb_state.__value.__wch = 0; \ 485: _r->_misc->_mbtowc_state.__count = 0; \ 486: _r->_misc->_mbtowc_state.__value.__wch = 0; \ 487: _r->_misc->_mbrlen_state.__count = 0; \ 488: _r->_misc->_mbrlen_state.__value.__wch = 0; \ 489: _r->_misc->_mbrtowc_state.__count = 0; \ 490: _r->_misc->_mbrtowc_state.__value.__wch = 0; \ 491: _r->_misc->_mbsrtowcs_state.__count = 0; \ 492: _r->_misc->_mbsrtowcs_state.__value.__wch = 0; \ 493: _r->_misc->_wcrtomb_state.__count = 0; \ 494: _r->_misc->_wcrtomb_state.__value.__wch = 0; \ 495: _r->_misc->_wcsrtombs_state.__count = 0; \ 496: _r->_misc->_wcsrtombs_state.__value.__wch = 0; \ 497: _r->_misc->_l64a_buf[0] = '\0'; \ 498: _r->_misc->_getdate_err = 0; \ 499: } while (0) 500: #define _REENT_CHECK_MISC(var) \ 501: _REENT_CHECK(var, _misc, struct _misc_reent *, sizeof *((var)->_misc), _REENT_INIT_MISC(var)) 502: 503: #define _REENT_CHECK_SIGNAL_BUF(var) \ 504: _REENT_CHECK(var, _signal_buf, char *, _REENT_SIGNAL_SIZE, /* nothing */) 505: 506: #define _REENT_SIGNGAM(ptr) ((ptr)->_gamma_signgam) 507: #define _REENT_RAND_NEXT(ptr) ((ptr)->_r48->_rand_next) 508: #define _REENT_RAND48_SEED(ptr) ((ptr)->_r48->_seed) 509: #define _REENT_RAND48_MULT(ptr) ((ptr)->_r48->_mult) 510: #define _REENT_RAND48_ADD(ptr) ((ptr)->_r48->_add) 511: #define _REENT_MP_RESULT(ptr) ((ptr)->_mp->_result) 512: #define _REENT_MP_RESULT_K(ptr) ((ptr)->_mp->_result_k) 513: #define _REENT_MP_P5S(ptr) ((ptr)->_mp->_p5s) 514: #define _REENT_MP_FREELIST(ptr) ((ptr)->_mp->_freelist) 515: #define _REENT_ASCTIME_BUF(ptr) ((ptr)->_asctime_buf) 516: #define _REENT_TM(ptr) ((ptr)->_localtime_buf) 517: #define _REENT_EMERGENCY(ptr) ((ptr)->_emergency) 518: #define _REENT_STRTOK_LAST(ptr) ((ptr)->_misc->_strtok_last) 519: #define _REENT_MBLEN_STATE(ptr) ((ptr)->_misc->_mblen_state) 520: #define _REENT_MBTOWC_STATE(ptr)((ptr)->_misc->_mbtowc_state) 521: #define _REENT_WCTOMB_STATE(ptr)((ptr)->_misc->_wctomb_state) 522: #define _REENT_MBRLEN_STATE(ptr) ((ptr)->_misc->_mbrlen_state) 523: #define _REENT_MBRTOWC_STATE(ptr) ((ptr)->_misc->_mbrtowc_state) 524: #define _REENT_MBSRTOWCS_STATE(ptr) ((ptr)->_misc->_mbsrtowcs_state) 525: #define _REENT_WCRTOMB_STATE(ptr) ((ptr)->_misc->_wcrtomb_state) 526: #define _REENT_WCSRTOMBS_STATE(ptr) ((ptr)->_misc->_wcsrtombs_state) 527: #define _REENT_L64A_BUF(ptr) ((ptr)->_misc->_l64a_buf) 528: #define _REENT_GETDATE_ERR_P(ptr) (&((ptr)->_misc->_getdate_err)) 529: #define _REENT_SIGNAL_BUF(ptr) ((ptr)->_signal_buf) 530: 531: #else /* !_REENT_SMALL */ 532: 533: struct _reent 534: { 535: int _errno; /* local copy of errno */ 536: 537: /* FILE is a big struct and may change over time. To try to achieve binary 538: compatibility with future versions, put stdin,stdout,stderr here. 539: These are pointers into member __sf defined below. */ 540: __FILE *_stdin, *_stdout, *_stderr; 541: 542: int _inc; /* used by tmpnam */ 543: char _emergency[_REENT_EMERGENCY_SIZE]; 544: 545: int _current_category; /* used by setlocale */ 546: _CONST char *_current_locale; 547: 548: int __sdidinit; /* 1 means stdio has been init'd */ 549: 550: void _EXFUN((*__cleanup),(struct _reent *)); 551: 552: /* used by mprec routines */ 553: struct _Bigint *_result; 554: int _result_k; 555: struct _Bigint *_p5s; 556: struct _Bigint **_freelist; 557: 558: /* used by some fp conversion routines */ 559: int _cvtlen; /* should be size_t */ 560: char *_cvtbuf; 561: 562: union 563: { 564: struct 565: { 566: unsigned int _unused_rand; 567: char * _strtok_last; 568: char _asctime_buf[_REENT_ASCTIME_SIZE]; 569: struct __tm _localtime_buf; 570: int _gamma_signgam; 571: __extension__ unsigned long long _rand_next; 572: struct _rand48 _r48; 573: _mbstate_t _mblen_state; 574: _mbstate_t _mbtowc_state; 575: _mbstate_t _wctomb_state; 576: char _l64a_buf[8]; 577: char _signal_buf[_REENT_SIGNAL_SIZE]; 578: int _getdate_err; 579: _mbstate_t _mbrlen_state; 580: _mbstate_t _mbrtowc_state; 581: _mbstate_t _mbsrtowcs_state; 582: _mbstate_t _wcrtomb_state; 583: _mbstate_t _wcsrtombs_state; 584: } _reent; 585: /* Two next two fields were once used by malloc. They are no longer 586: used. They are used to preserve the space used before so as to 587: allow addition of new reent fields and keep binary compatibility. */ 588: struct 589: { 590: #define _N_LISTS 30 591: unsigned char * _nextf[_N_LISTS]; 592: unsigned int _nmalloc[_N_LISTS]; 593: } _unused; 594: } _new; 595: 596: /* atexit stuff */ 597: struct _atexit *_atexit; /* points to head of LIFO stack */ 598: struct _atexit _atexit0; /* one guaranteed table, required by ANSI */ 599: 600: /* signal info */ 601: void (**(_sig_func))(int); 602: 603: /* These are here last so that __FILE can grow without changing the offsets 604: of the above members (on the off chance that future binary compatibility 605: would be broken otherwise). */ 606: struct _glue __sglue; /* root of glue chain */ 607: __FILE __sf[3]; /* first three file descriptors */ 608: }; 609: 610: #define _REENT_INIT(var) \ 611: { 0, &var.__sf[0], &var.__sf[1], &var.__sf[2], 0, "", 0, "C", \ 612: 0, _NULL, _NULL, 0, _NULL, _NULL, 0, _NULL, { {0, _NULL, "", \ 613: { 0,0,0,0,0,0,0,0}, 0, 1, \ 614: {{_RAND48_SEED_0, _RAND48_SEED_1, _RAND48_SEED_2}, \ 615: {_RAND48_MULT_0, _RAND48_MULT_1, _RAND48_MULT_2}, _RAND48_ADD}, \ 616: {0, {0}}, {0, {0}}, {0, {0}}, "", "", 0, {0, {0}}, {0, {0}}, {0, {0}}, {0, {0}}, {0, {0}} } } } 617: 618: #define _REENT_INIT_PTR(var) \ 619: { int i; \ 620: char *tmp_ptr; \ 621: var->_errno = 0; \ 622: var->_stdin = &var->__sf[0]; \ 623: var->_stdout = &var->__sf[1]; \ 624: var->_stderr = &var->__sf[2]; \ 625: var->_inc = 0; \ 626: for (i = 0; i < _REENT_EMERGENCY_SIZE; ++i) \ 627: var->_emergency[i] = 0; \ 628: var->_current_category = 0; \ 629: var->_current_locale = "C"; \ 630: var->__sdidinit = 0; \ 631: var->__cleanup = _NULL; \ 632: var->_result = _NULL; \ 633: var->_result_k = 0; \ 634: var->_p5s = _NULL; \ 635: var->_freelist = _NULL; \ 636: var->_cvtlen = 0; \ 637: var->_cvtbuf = _NULL; \ 638: var->_new._reent._unused_rand = 0; \ 639: var->_new._reent._strtok_last = _NULL; \ 640: var->_new._reent._asctime_buf[0] = 0; \ 641: tmp_ptr = (char *)&var->_new._reent._localtime_buf; \ 642: for (i = 0; i < sizeof(struct __tm); ++i) \ 643: tmp_ptr[i] = 0; \ 644: var->_new._reent._gamma_signgam = 0; \ 645: var->_new._reent._rand_next = 1; \ 646: var->_new._reent._r48._seed[0] = _RAND48_SEED_0; \ 647: var->_new._reent._r48._seed[1] = _RAND48_SEED_1; \ 648: var->_new._reent._r48._seed[2] = _RAND48_SEED_2; \ 649: var->_new._reent._r48._mult[0] = _RAND48_MULT_0; \ 650: var->_new._reent._r48._mult[1] = _RAND48_MULT_1; \ 651: var->_new._reent._r48._mult[2] = _RAND48_MULT_2; \ 652: var->_new._reent._r48._add = _RAND48_ADD; \ 653: var->_new._reent._mblen_state.__count = 0; \ 654: var->_new._reent._mblen_state.__value.__wch = 0; \ 655: var->_new._reent._mbtowc_state.__count = 0; \ 656: var->_new._reent._mbtowc_state.__value.__wch = 0; \ 657: var->_new._reent._wctomb_state.__count = 0; \ 658: var->_new._reent._wctomb_state.__value.__wch = 0; \ 659: var->_new._reent._mbrlen_state.__count = 0; \ 660: var->_new._reent._mbrlen_state.__value.__wch = 0; \ 661: var->_new._reent._mbrtowc_state.__count = 0; \ 662: var->_new._reent._mbrtowc_state.__value.__wch = 0; \ 663: var->_new._reent._mbsrtowcs_state.__count = 0; \ 664: var->_new._reent._mbsrtowcs_state.__value.__wch = 0; \ 665: var->_new._reent._wcrtomb_state.__count = 0; \ 666: var->_new._reent._wcrtomb_state.__value.__wch = 0; \ 667: var->_new._reent._wcsrtombs_state.__count = 0; \ 668: var->_new._reent._wcsrtombs_state.__value.__wch = 0; \ 669: var->_new._reent._l64a_buf[0] = '\0'; \ 670: var->_new._reent._signal_buf[0] = '\0'; \ 671: var->_new._reent._getdate_err = 0; \ 672: var->_atexit = _NULL; \ 673: var->_atexit0._ind = 0; \ 674: var->_atexit0._fns[0] = _NULL; \ 675: var->_atexit0._on_exit_args._fntypes = 0; \ 676: var->_atexit0._on_exit_args._fnargs[0] = _NULL; \ 677: var->_sig_func = _NULL; \ 678: var->__sglue._next = _NULL; \ 679: var->__sglue._niobs = 0; \ 680: var->__sglue._iobs = _NULL; \ 681: memset(var->__sf,0,sizeof(var->__sf)); \ 682: } 683: 684: #define _REENT_CHECK_RAND48(ptr) /* nothing */ 685: #define _REENT_CHECK_MP(ptr) /* nothing */ 686: #define _REENT_CHECK_TM(ptr) /* nothing */ 687: #define _REENT_CHECK_ASCTIME_BUF(ptr) /* nothing */ 688: #define _REENT_CHECK_EMERGENCY(ptr) /* nothing */ 689: #define _REENT_CHECK_MISC(ptr) /* nothing */ 690: #define _REENT_CHECK_SIGNAL_BUF(ptr) /* nothing */ 691: 692: #define _REENT_SIGNGAM(ptr) ((ptr)->_new._reent._gamma_signgam) 693: #define _REENT_RAND_NEXT(ptr) ((ptr)->_new._reent._rand_next) 694: #define _REENT_RAND48_SEED(ptr) ((ptr)->_new._reent._r48._seed) 695: #define _REENT_RAND48_MULT(ptr) ((ptr)->_new._reent._r48._mult) 696: #define _REENT_RAND48_ADD(ptr) ((ptr)->_new._reent._r48._add) 697: #define _REENT_MP_RESULT(ptr) ((ptr)->_result) 698: #define _REENT_MP_RESULT_K(ptr) ((ptr)->_result_k) 699: #define _REENT_MP_P5S(ptr) ((ptr)->_p5s) 700: #define _REENT_MP_FREELIST(ptr) ((ptr)->_freelist) 701: #define _REENT_ASCTIME_BUF(ptr) ((ptr)->_new._reent._asctime_buf) 702: #define _REENT_TM(ptr) (&(ptr)->_new._reent._localtime_buf) 703: #define _REENT_EMERGENCY(ptr) ((ptr)->_emergency) 704: #define _REENT_STRTOK_LAST(ptr) ((ptr)->_new._reent._strtok_last) 705: #define _REENT_MBLEN_STATE(ptr) ((ptr)->_new._reent._mblen_state) 706: #define _REENT_MBTOWC_STATE(ptr)((ptr)->_new._reent._mbtowc_state) 707: #define _REENT_WCTOMB_STATE(ptr)((ptr)->_new._reent._wctomb_state) 708: #define _REENT_MBRLEN_STATE(ptr)((ptr)->_new._reent._mbrlen_state) 709: #define _REENT_MBRTOWC_STATE(ptr)((ptr)->_new._reent._mbrtowc_state) 710: #define _REENT_MBSRTOWCS_STATE(ptr)((ptr)->_new._reent._mbsrtowcs_state) 711: #define _REENT_WCRTOMB_STATE(ptr)((ptr)->_new._reent._wcrtomb_state) 712: #define _REENT_WCSRTOMBS_STATE(ptr)((ptr)->_new._reent._wcsrtombs_state) 713: #define _REENT_L64A_BUF(ptr) ((ptr)->_new._reent._l64a_buf) 714: #define _REENT_SIGNAL_BUF(ptr) ((ptr)->_new._reent._signal_buf) 715: #define _REENT_GETDATE_ERR_P(ptr) (&((ptr)->_new._reent._getdate_err)) 716: 717: #endif /* !_REENT_SMALL */ 718: 719: #define _NULL 0 720: 721: /* 722: * All references to struct _reent are via this pointer. 723: * Internally, newlib routines that need to reference it should use _REENT. 724: */ 725: 726: #ifndef __ATTRIBUTE_IMPURE_PTR__ 727: #define __ATTRIBUTE_IMPURE_PTR__ 728: #endif 729: 730: extern struct _reent *_impure_ptr __ATTRIBUTE_IMPURE_PTR__; 731: 732: void _reclaim_reent _PARAMS ((struct _reent *)); 733: 734: /* #define _REENT_ONLY define this to get only reentrant routines */ 735: 736: #ifndef _REENT_ONLY 737: 738: #if defined(__DYNAMIC_REENT__) && !defined(__SINGLE_THREAD__) 739: #ifndef __getreent 740: struct _reent * _EXFUN(__getreent, (void)); 741: #endif 742: # define _REENT (__getreent()) 743: #else /* __SINGLE_THREAD__ || !__DYNAMIC_REENT__ */ 744: # define _REENT _impure_ptr 745: #endif /* __SINGLE_THREAD__ || !__DYNAMIC_REENT__ */ 746: 747: #endif /* !_REENT_ONLY */ 748: 749: #define _GLOBAL_REENT _impure_ptr 750: 751: #ifdef __cplusplus 752: } 753: #endif 754: #endif /* _SYS_REENT_H_ */ 755: