2002-04-01 Jeff Johnston <jjohnstn@redhat.com>
* libc/include/sys/reent.h (_REENT_INIT_PTR): New macro for
        initializing a struct _reent that has been dynamically allocated.
        (_REENT_CHECK_MISC): New macro that checks _misc struct for
        _REENT_SMALL and does nothing otherwise.
        (_REENT_STRTOK_LAST): New macro for reentrant strtok.
        (_REENT_MBLEN_STATE): New macro for reentrant mblen.
        (_REENT_MBTOWC_STATE): New macro for reentrant mbtowc.
        (_REENT_WCTOMB_STATE): New macro for reentrant wctomb.
        [_REENT_SMALL](struct _misc_reent): New structure containing
        miscellaneous reentrant areas needed by newlib.
        [_REENT_SMALL](struct _reent): Add _misc pointer.
        [_REENT_SMALL](_REENT_INIT_MISC): New macro.
        * libc/string/strtok (strtok): Change to use _REENT_CHECK_MISC
        and _REENT_STRTOK_LAST macros.
        * libc/stdlib/mblen (mblen): Change to use _REENT_CHECK_MISC
        and _REENT_MBLEN_STATE macros.
        * libc/stdlib/mbtowc (mbtowc): Change to use _REENT_CHECK_MISC
        and _REENT_MBTOWC_STATE macros.
        * libc/stdlib/wctomb (wctomb): Change to use _REENT_CHECK_MISC
        and _REENT_WCTOMB_STATE macros.
			
			
This commit is contained in:
		| @@ -1,3 +1,26 @@ | |||||||
|  | 2002-04-01  Jeff Johnston  <jjohnstn@redhat.com> | ||||||
|  |  | ||||||
|  | 	* libc/include/sys/reent.h (_REENT_INIT_PTR): New macro for | ||||||
|  | 	initializing a struct _reent that has been dynamically allocated. | ||||||
|  | 	(_REENT_CHECK_MISC): New macro that checks _misc struct for | ||||||
|  | 	_REENT_SMALL and does nothing otherwise. | ||||||
|  | 	(_REENT_STRTOK_LAST): New macro for reentrant strtok. | ||||||
|  | 	(_REENT_MBLEN_STATE): New macro for reentrant mblen. | ||||||
|  | 	(_REENT_MBTOWC_STATE): New macro for reentrant mbtowc. | ||||||
|  | 	(_REENT_WCTOMB_STATE): New macro for reentrant wctomb. | ||||||
|  | 	[_REENT_SMALL](struct _misc_reent): New structure containing | ||||||
|  | 	miscellaneous reentrant areas needed by newlib. | ||||||
|  | 	[_REENT_SMALL](struct _reent): Add _misc pointer. | ||||||
|  | 	[_REENT_SMALL](_REENT_INIT_MISC): New macro. | ||||||
|  | 	* libc/string/strtok (strtok): Change to use _REENT_CHECK_MISC | ||||||
|  | 	and _REENT_STRTOK_LAST macros. | ||||||
|  | 	* libc/stdlib/mblen (mblen): Change to use _REENT_CHECK_MISC | ||||||
|  | 	and _REENT_MBLEN_STATE macros. | ||||||
|  | 	* libc/stdlib/mbtowc (mbtowc): Change to use _REENT_CHECK_MISC | ||||||
|  | 	and _REENT_MBTOWC_STATE macros. | ||||||
|  | 	* libc/stdlib/wctomb (wctomb): Change to use _REENT_CHECK_MISC | ||||||
|  | 	and _REENT_WCTOMB_STATE macros. | ||||||
|  |  | ||||||
| 2002-04-01  Till Straumann <strauman@SLAC.Stanford.EDU> | 2002-04-01  Till Straumann <strauman@SLAC.Stanford.EDU> | ||||||
|  |  | ||||||
| 	* libc/stdlib/getenv_r.c (_findenv_r): Add missing ENV_UNLOCK. | 	* libc/stdlib/getenv_r.c (_findenv_r): Add missing ENV_UNLOCK. | ||||||
|   | |||||||
| @@ -245,6 +245,16 @@ struct _mprec | |||||||
|   struct _Bigint **_freelist; |   struct _Bigint **_freelist; | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | struct _misc_reent | ||||||
|  | { | ||||||
|  |   /* miscellaneous reentrant data */ | ||||||
|  |   char *_strtok_last; | ||||||
|  |   int _mblen_state; | ||||||
|  |   int _wctomb_state; | ||||||
|  |   int _mbtowc_state; | ||||||
|  | }; | ||||||
|  |  | ||||||
| /* This version of _reent is layed our with "int"s in pairs, to help | /* This version of _reent is layed our with "int"s in pairs, to help | ||||||
|  * ports with 16-bit int's but 32-bit pointers, align nicely.  */ |  * ports with 16-bit int's but 32-bit pointers, align nicely.  */ | ||||||
| struct _reent | struct _reent | ||||||
| @@ -289,13 +299,44 @@ struct _reent | |||||||
|   struct _glue __sglue;			/* root of glue chain */ |   struct _glue __sglue;			/* root of glue chain */ | ||||||
|   struct __sFILE *__sf;			/* file descriptors */ |   struct __sFILE *__sf;			/* file descriptors */ | ||||||
|   struct __sFILE_fake __sf_fake;	/* fake initial stdin/out/err */ |   struct __sFILE_fake __sf_fake;	/* fake initial stdin/out/err */ | ||||||
|  |   struct _misc_reent *_misc;            /* strtok, multibyte states */ | ||||||
| }; | }; | ||||||
|  |  | ||||||
| #define _REENT_INIT(var) \ | #define _REENT_INIT(var) \ | ||||||
|   { &var.__sf_fake, &var.__sf_fake, &var.__sf_fake, 0, 0, _NULL, 0, 0, \ |   { &var.__sf_fake, &var.__sf_fake, &var.__sf_fake, 0, 0, _NULL, 0, 0, \ | ||||||
|     "C", _NULL, _NULL, 0, 0, _NULL, _NULL, _NULL, _NULL, _NULL, \ |     "C", _NULL, _NULL, 0, 0, _NULL, _NULL, _NULL, _NULL, _NULL, \ | ||||||
|     { 0, _NULL }, { _NULL, 0, _NULL }, 0 } |     { 0, _NULL }, { _NULL, 0, _NULL }, 0, _NULL } | ||||||
|  |  | ||||||
|  | #define _REENT_INIT_PTR(var) \ | ||||||
|  |   { var->_stdin = &var->__sf_fake; \ | ||||||
|  |     var->_stdout = &var->__sf_fake; \ | ||||||
|  |     var->_stderr = &var->__sf_fake; \ | ||||||
|  |     var->_errno = 0; \ | ||||||
|  |     var->_inc = 0; \ | ||||||
|  |     var->_emergency = _NULL; \ | ||||||
|  |     var->__sdidinit = 0; \ | ||||||
|  |     var->_current_category = 0; \ | ||||||
|  |     var->_current_locale = "C"; \ | ||||||
|  |     var->_mp = _NULL; \ | ||||||
|  |     var->__cleanup = _NULL; \ | ||||||
|  |     var->_gamma_signgam = 0; \ | ||||||
|  |     var->_cvtlen = 0; \ | ||||||
|  |     var->_cvtbuf = _NULL; \ | ||||||
|  |     var->_r48 = _NULL; \ | ||||||
|  |     var->_localtime_buf = _NULL; \ | ||||||
|  |     var->_asctime_buf = _NULL; \ | ||||||
|  |     var->_sig_func = _NULL; | ||||||
|  |     var->_atexit._ind = 0; \ | ||||||
|  |     var->_atexit._fns = _NULL}; \ | ||||||
|  |     var->__sglue._next = _NULL; \ | ||||||
|  |     var->__sglue._niobs = 0; \ | ||||||
|  |     var->__sglue._iobs = _NULL; \ | ||||||
|  |     var->__sf = 0; \ | ||||||
|  |     var->_misc = _NULL; \ | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   /* signal info */ | ||||||
|  |   void (**(_sig_func))(int); | ||||||
| /* Only built the assert() calls if we are built with debugging.  */ | /* Only built the assert() calls if we are built with debugging.  */ | ||||||
| #if DEBUG  | #if DEBUG  | ||||||
| #include <assert.h> | #include <assert.h> | ||||||
| @@ -347,6 +388,16 @@ struct _reent | |||||||
| #define _REENT_CHECK_EMERGENCY(var) \ | #define _REENT_CHECK_EMERGENCY(var) \ | ||||||
|   _REENT_CHECK(var, _emergency, char *, _REENT_EMERGENCY_SIZE, /* nothing */) |   _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 = 0; \ | ||||||
|  |   _r->_misc->_wctomb_state = 0; \ | ||||||
|  |   _r->_misc->_mbtowc_state = 0; \ | ||||||
|  | } while (0) | ||||||
|  | #define _REENT_CHECK_MISC(var) \ | ||||||
|  |   _REENT_CHECK(var, _misc, struct _misc_reent *, sizeof *((var)->_misc), _REENT_INIT_MISC(var)) | ||||||
|  |  | ||||||
| #define _REENT_SIGNGAM(ptr)	((ptr)->_gamma_signgam) | #define _REENT_SIGNGAM(ptr)	((ptr)->_gamma_signgam) | ||||||
| #define _REENT_RAND_NEXT(ptr)	((ptr)->_r48->_rand_next) | #define _REENT_RAND_NEXT(ptr)	((ptr)->_r48->_rand_next) | ||||||
| #define _REENT_RAND48_SEED(ptr)	((ptr)->_r48->_seed) | #define _REENT_RAND48_SEED(ptr)	((ptr)->_r48->_seed) | ||||||
| @@ -359,6 +410,10 @@ struct _reent | |||||||
| #define _REENT_ASCTIME_BUF(ptr)	((ptr)->_asctime_buf) | #define _REENT_ASCTIME_BUF(ptr)	((ptr)->_asctime_buf) | ||||||
| #define _REENT_TM(ptr)		((ptr)->_localtime_buf) | #define _REENT_TM(ptr)		((ptr)->_localtime_buf) | ||||||
| #define _REENT_EMERGENCY(ptr)	((ptr)->_emergency) | #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) | ||||||
|  |  | ||||||
| #else /* !_REENT_SMALL */ | #else /* !_REENT_SMALL */ | ||||||
|  |  | ||||||
| @@ -396,12 +451,15 @@ struct _reent | |||||||
|       struct |       struct | ||||||
|         { |         { | ||||||
|           unsigned int _unused_rand; |           unsigned int _unused_rand; | ||||||
|           char * _unused_strtok_last; |           char * _strtok_last; | ||||||
|           char _asctime_buf[26]; |           char _asctime_buf[26]; | ||||||
|           struct __tm _localtime_buf; |           struct __tm _localtime_buf; | ||||||
|           int _gamma_signgam; |           int _gamma_signgam; | ||||||
|           __extension__ unsigned long long _rand_next; |           __extension__ unsigned long long _rand_next; | ||||||
|           struct _rand48 _r48; |           struct _rand48 _r48; | ||||||
|  |           int _mblen_state; | ||||||
|  |           int _mbtowc_state; | ||||||
|  |           int _wctomb_state; | ||||||
|         } _reent; |         } _reent; | ||||||
|   /* Two next two fields were once used by malloc.  They are no longer |   /* 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 |      used. They are used to preserve the space used before so as to | ||||||
| @@ -433,13 +491,55 @@ struct _reent | |||||||
|     0, _NULL, _NULL, 0, _NULL, _NULL, 0, _NULL, { {0, _NULL, "", \ |     0, _NULL, _NULL, 0, _NULL, _NULL, 0, _NULL, { {0, _NULL, "", \ | ||||||
|     { 0,0,0,0,0,0,0,0}, 0, 1, \ |     { 0,0,0,0,0,0,0,0}, 0, 1, \ | ||||||
|     {{_RAND48_SEED_0, _RAND48_SEED_1, _RAND48_SEED_2}, \ |     {{_RAND48_SEED_0, _RAND48_SEED_1, _RAND48_SEED_2}, \ | ||||||
|      {_RAND48_MULT_0, _RAND48_MULT_1, _RAND48_MULT_2}, _RAND48_ADD}} } } |      {_RAND48_MULT_0, _RAND48_MULT_1, _RAND48_MULT_2}, _RAND48_ADD}, \ | ||||||
|  |     0, 0, 0} } } | ||||||
|  |  | ||||||
|  | #define _REENT_INIT_PTR(var) \ | ||||||
|  |   { int i; \ | ||||||
|  |     char *tmp_ptr; \ | ||||||
|  |     var->_errno = 0; \ | ||||||
|  |     var->_stdin = &var->__sf[0]; \ | ||||||
|  |     var->_stdout = &var->__sf[1]; \ | ||||||
|  |     var->_stderr = &var->__sf[2]; \ | ||||||
|  |     var->_inc = 0; \ | ||||||
|  |     for (i = 0; i < _REENT_EMERGENCY_SIZE; ++i) \ | ||||||
|  |       var->_emergency[i] = 0; \ | ||||||
|  |     var->_current_category = 0; \ | ||||||
|  |     var->_current_locale = "C"; \ | ||||||
|  |     var->__sdidinit = 0; \ | ||||||
|  |     var->__cleanup = _NULL; \ | ||||||
|  |     var->_result = _NULL; \ | ||||||
|  |     var->_result_k = 0; \ | ||||||
|  |     var->_p5s = _NULL; \ | ||||||
|  |     var->_freelist = _NULL; \ | ||||||
|  |     var->_cvtlen = 0; \ | ||||||
|  |     var->_cvtbuf = _NULL; \ | ||||||
|  |     var->_new._reent._unused_rand = 0; \ | ||||||
|  |     var->_new._reent._strtok_last = _NULL; \ | ||||||
|  |     var->_new._reent._asctime_buf[0] = 0; \ | ||||||
|  |     tmp_ptr = (char *)&var->_new._reent._localtime_buf; \ | ||||||
|  |     for (i = 0; i < sizeof(struct __tm); ++i) \ | ||||||
|  |       tmp_ptr[i] = 0; \ | ||||||
|  |     var->_new._reent._gamma_signgam = 0; \ | ||||||
|  |     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; \ | ||||||
|  |     var->_new._reent._mblen_state = 0; \ | ||||||
|  |     var->_new._reent._mbtowc_state = 0; \ | ||||||
|  |     var->_new._reent._wctomb_state = 0; \ | ||||||
|  |   } | ||||||
|  |  | ||||||
| #define _REENT_CHECK_RAND48(ptr)	/* nothing */ | #define _REENT_CHECK_RAND48(ptr)	/* nothing */ | ||||||
| #define _REENT_CHECK_MP(ptr)		/* nothing */ | #define _REENT_CHECK_MP(ptr)		/* nothing */ | ||||||
| #define _REENT_CHECK_TM(ptr)		/* nothing */ | #define _REENT_CHECK_TM(ptr)		/* nothing */ | ||||||
| #define _REENT_CHECK_ASCTIME_BUF(ptr)	/* nothing */ | #define _REENT_CHECK_ASCTIME_BUF(ptr)	/* nothing */ | ||||||
| #define _REENT_CHECK_EMERGENCY(ptr)	/* nothing */ | #define _REENT_CHECK_EMERGENCY(ptr)	/* nothing */ | ||||||
|  | #define _REENT_CHECK_MISC(ptr)	        /* nothing */ | ||||||
|  |  | ||||||
| #define _REENT_SIGNGAM(ptr)	((ptr)->_new._reent._gamma_signgam) | #define _REENT_SIGNGAM(ptr)	((ptr)->_new._reent._gamma_signgam) | ||||||
| #define _REENT_RAND_NEXT(ptr)	((ptr)->_new._reent._rand_next) | #define _REENT_RAND_NEXT(ptr)	((ptr)->_new._reent._rand_next) | ||||||
| @@ -453,6 +553,10 @@ struct _reent | |||||||
| #define _REENT_ASCTIME_BUF(ptr)	(&(ptr)->_new._reent._asctime_buf) | #define _REENT_ASCTIME_BUF(ptr)	(&(ptr)->_new._reent._asctime_buf) | ||||||
| #define _REENT_TM(ptr)		(&(ptr)->_new._reent._localtime_buf) | #define _REENT_TM(ptr)		(&(ptr)->_new._reent._localtime_buf) | ||||||
| #define _REENT_EMERGENCY(ptr)	((ptr)->_emergency) | #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) | ||||||
|  |  | ||||||
| #endif /* !_REENT_SMALL */ | #endif /* !_REENT_SMALL */ | ||||||
|  |  | ||||||
| @@ -475,7 +579,7 @@ void _reclaim_reent _PARAMS ((struct _reent *)); | |||||||
|  |  | ||||||
| #ifndef _REENT_ONLY | #ifndef _REENT_ONLY | ||||||
| #define _REENT _impure_ptr | #define _REENT _impure_ptr | ||||||
| #endif | #endif /* !_REENT_ONLY */ | ||||||
|  |  | ||||||
| #ifdef __cplusplus | #ifdef __cplusplus | ||||||
| } | } | ||||||
|   | |||||||
| @@ -51,9 +51,9 @@ _DEFUN (mblen, (s, n), | |||||||
|         size_t n) |         size_t n) | ||||||
| { | { | ||||||
| #ifdef MB_CAPABLE | #ifdef MB_CAPABLE | ||||||
|         static int state; |         _REENT_CHECK_MISC(_REENT); | ||||||
|  |  | ||||||
|         return _mbtowc_r (_REENT, NULL, s, n, &state); |         return _mbtowc_r (_REENT, NULL, s, n, &(_REENT_MBLEN_STATE(_REENT))); | ||||||
| #else /* not MB_CAPABLE */ | #else /* not MB_CAPABLE */ | ||||||
|         if (s == NULL || *s == '\0') |         if (s == NULL || *s == '\0') | ||||||
|                 return 0; |                 return 0; | ||||||
|   | |||||||
| @@ -60,9 +60,9 @@ _DEFUN (mbtowc, (pwc, s, n), | |||||||
|         size_t n) |         size_t n) | ||||||
| { | { | ||||||
| #ifdef MB_CAPABLE | #ifdef MB_CAPABLE | ||||||
|         static int state; |         _REENT_CHECK_MISC(_REENT); | ||||||
|  |  | ||||||
|         return _mbtowc_r (_REENT, pwc, s, n, &state); |         return _mbtowc_r (_REENT, pwc, s, n, &(_REENT_MBTOWC_STATE(_REENT))); | ||||||
| #else /* not MB_CAPABLE */ | #else /* not MB_CAPABLE */ | ||||||
|         if (s == NULL) |         if (s == NULL) | ||||||
|                 return 0; |                 return 0; | ||||||
|   | |||||||
| @@ -54,9 +54,9 @@ _DEFUN (wctomb, (s, wchar), | |||||||
|         wchar_t wchar) |         wchar_t wchar) | ||||||
| { | { | ||||||
| #ifdef MB_CAPABLE | #ifdef MB_CAPABLE | ||||||
|         static int state; |         _REENT_CHECK_MISC(_REENT); | ||||||
|  |  | ||||||
|         return _wctomb_r (_REENT, s, wchar, &state); |         return _wctomb_r (_REENT, s, wchar, &(_REENT_WCTOMB_STATE(_REENT))); | ||||||
| #else /* not MB_CAPABLE */ | #else /* not MB_CAPABLE */ | ||||||
|         if (s == NULL) |         if (s == NULL) | ||||||
|                 return 0; |                 return 0; | ||||||
|   | |||||||
| @@ -73,7 +73,7 @@ _DEFUN (strtok, (s, delim), | |||||||
| 	register char *s _AND | 	register char *s _AND | ||||||
| 	register const char *delim) | 	register const char *delim) | ||||||
| { | { | ||||||
| 	static char *last; | 	_REENT_CHECK_MISC(_REENT); | ||||||
| 	return strtok_r (s, delim, &last); | 	return strtok_r (s, delim, &(_REENT_STRTOK_LAST(_REENT))); | ||||||
| } | } | ||||||
| #endif | #endif | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user