diff options
author | Joel Sherrill <joel@rtems.org> | 2016-03-23 01:50:48 +0300 |
---|---|---|
committer | Joel Sherrill <joel@rtems.org> | 2016-03-29 06:39:50 +0300 |
commit | ecf453f9635fb278cff4d4bae21a1e249313b817 (patch) | |
tree | 691716a58754527b45dd04f53f36731b12596899 | |
parent | a0c477242996403344a0b3c46e6d4645a3fa672c (diff) |
Add simple versions of random() and srandom()
Prototypes also added for initstate() and setstate() but they
were not implemented in the shared newlib code.
* newlib/libc/include/cygwin/stdlib.h: Prototypes added.
* winsup/cygwin/include/cygwin/stdlib.h: Prototypes removed.
* newlib/libc/stdlib/random.c: New file.
* newlib/libc/machine/epiphany/machine/stdlib.h: Removed
* newlib/libc/stdlib/Makefile.am: Added random.c.
* newlib/libc/stdlib/stdlib.tex: Added random.def.
* newlib/libc/stdlib/Makefile.in: Regenerated.
-rw-r--r-- | newlib/libc/include/stdlib.h | 6 | ||||
-rw-r--r-- | newlib/libc/machine/epiphany/machine/stdlib.h | 17 | ||||
-rw-r--r-- | newlib/libc/stdlib/Makefile.am | 2 | ||||
-rw-r--r-- | newlib/libc/stdlib/Makefile.in | 36 | ||||
-rw-r--r-- | newlib/libc/stdlib/random.c | 82 | ||||
-rw-r--r-- | newlib/libc/stdlib/stdlib.tex | 4 | ||||
-rw-r--r-- | winsup/cygwin/include/cygwin/stdlib.h | 6 |
7 files changed, 116 insertions, 37 deletions
diff --git a/newlib/libc/include/stdlib.h b/newlib/libc/include/stdlib.h index 363b7df4b..3194d6bc5 100644 --- a/newlib/libc/include/stdlib.h +++ b/newlib/libc/include/stdlib.h @@ -226,6 +226,12 @@ unsigned short * _VOID _EXFUN(srand48,(long)); _VOID _EXFUN(_srand48_r,(struct _reent *, long)); #endif /* __SVID_VISIBLE || __XSI_VISIBLE */ +#if __SVID_VISIBLE || __XSI_VISIBLE >= 4 || __BSD_VISIBLE +char * _EXFUN(initstate,(unsigned, char *, size_t)); +long _EXFUN(random,(_VOID)); +char * _EXFUN(setstate,(char *)); +_VOID _EXFUN(srandom,(unsigned)); +#endif #if __ISO_C_VISIBLE >= 1999 long long _EXFUN(atoll,(const char *__nptr)); #endif diff --git a/newlib/libc/machine/epiphany/machine/stdlib.h b/newlib/libc/machine/epiphany/machine/stdlib.h deleted file mode 100644 index 7ede4dd5c..000000000 --- a/newlib/libc/machine/epiphany/machine/stdlib.h +++ /dev/null @@ -1,17 +0,0 @@ -#ifndef __rtems__ -static __inline__ long int -random (void) -{ - extern int rand(void); - - return rand (); -} - -static __inline__ void -srandom (unsigned int seed) -{ - void srand(unsigned int seed); - - srand (seed); -} -#endif diff --git a/newlib/libc/stdlib/Makefile.am b/newlib/libc/stdlib/Makefile.am index 9deaf9a64..2d45d1029 100644 --- a/newlib/libc/stdlib/Makefile.am +++ b/newlib/libc/stdlib/Makefile.am @@ -50,6 +50,7 @@ GENERAL_SOURCES = \ quick_exit.c \ rand.c \ rand_r.c \ + random.c \ realloc.c \ reallocf.c \ sb_charsets.c \ @@ -282,6 +283,7 @@ CHEWOUT_FILES= \ on_exit.def \ rand.def \ rand48.def \ + random.def \ rpmatch.def \ strtod.def \ strtol.def \ diff --git a/newlib/libc/stdlib/Makefile.in b/newlib/libc/stdlib/Makefile.in index c991cb7e4..5ab16a730 100644 --- a/newlib/libc/stdlib/Makefile.in +++ b/newlib/libc/stdlib/Makefile.in @@ -103,15 +103,16 @@ am__objects_2 = lib_a-__adjust.$(OBJEXT) lib_a-__atexit.$(OBJEXT) \ lib_a-mlock.$(OBJEXT) lib_a-mprec.$(OBJEXT) \ lib_a-mstats.$(OBJEXT) lib_a-on_exit_args.$(OBJEXT) \ lib_a-quick_exit.$(OBJEXT) lib_a-rand.$(OBJEXT) \ - lib_a-rand_r.$(OBJEXT) lib_a-realloc.$(OBJEXT) \ - lib_a-reallocf.$(OBJEXT) lib_a-sb_charsets.$(OBJEXT) \ - lib_a-strtod.$(OBJEXT) lib_a-strtodg.$(OBJEXT) \ - lib_a-strtol.$(OBJEXT) lib_a-strtorx.$(OBJEXT) \ - lib_a-strtoul.$(OBJEXT) lib_a-utoa.$(OBJEXT) \ - lib_a-wcstod.$(OBJEXT) lib_a-wcstol.$(OBJEXT) \ - lib_a-wcstoul.$(OBJEXT) lib_a-wcstombs.$(OBJEXT) \ - lib_a-wcstombs_r.$(OBJEXT) lib_a-wctomb.$(OBJEXT) \ - lib_a-wctomb_r.$(OBJEXT) $(am__objects_1) + lib_a-rand_r.$(OBJEXT) lib_a-random.$(OBJEXT) \ + lib_a-realloc.$(OBJEXT) lib_a-reallocf.$(OBJEXT) \ + lib_a-sb_charsets.$(OBJEXT) lib_a-strtod.$(OBJEXT) \ + lib_a-strtodg.$(OBJEXT) lib_a-strtol.$(OBJEXT) \ + lib_a-strtorx.$(OBJEXT) lib_a-strtoul.$(OBJEXT) \ + lib_a-utoa.$(OBJEXT) lib_a-wcstod.$(OBJEXT) \ + lib_a-wcstol.$(OBJEXT) lib_a-wcstoul.$(OBJEXT) \ + lib_a-wcstombs.$(OBJEXT) lib_a-wcstombs_r.$(OBJEXT) \ + lib_a-wctomb.$(OBJEXT) lib_a-wctomb_r.$(OBJEXT) \ + $(am__objects_1) am__objects_3 = lib_a-arc4random.$(OBJEXT) \ lib_a-arc4random_uniform.$(OBJEXT) lib_a-cxa_atexit.$(OBJEXT) \ lib_a-cxa_finalize.$(OBJEXT) lib_a-drand48.$(OBJEXT) \ @@ -159,10 +160,10 @@ am__objects_9 = __adjust.lo __atexit.lo __call_atexit.lo __exp10.lo \ itoa.lo labs.lo ldiv.lo ldtoa.lo malloc.lo mblen.lo mblen_r.lo \ mbstowcs.lo mbstowcs_r.lo mbtowc.lo mbtowc_r.lo mlock.lo \ mprec.lo mstats.lo on_exit_args.lo quick_exit.lo rand.lo \ - rand_r.lo realloc.lo reallocf.lo sb_charsets.lo strtod.lo \ - strtodg.lo strtol.lo strtorx.lo strtoul.lo utoa.lo wcstod.lo \ - wcstol.lo wcstoul.lo wcstombs.lo wcstombs_r.lo wctomb.lo \ - wctomb_r.lo $(am__objects_8) + rand_r.lo random.lo realloc.lo reallocf.lo sb_charsets.lo \ + strtod.lo strtodg.lo strtol.lo strtorx.lo strtoul.lo utoa.lo \ + wcstod.lo wcstol.lo wcstoul.lo wcstombs.lo wcstombs_r.lo \ + wctomb.lo wctomb_r.lo $(am__objects_8) am__objects_10 = arc4random.lo arc4random_uniform.lo cxa_atexit.lo \ cxa_finalize.lo drand48.lo ecvtbuf.lo efgcvt.lo erand48.lo \ jrand48.lo lcong48.lo lrand48.lo mrand48.lo msize.lo mtrim.lo \ @@ -363,7 +364,7 @@ GENERAL_SOURCES = __adjust.c __atexit.c __call_atexit.c __exp10.c \ gdtoa-hexnan.c getenv.c getenv_r.c itoa.c labs.c ldiv.c \ ldtoa.c malloc.c mblen.c mblen_r.c mbstowcs.c mbstowcs_r.c \ mbtowc.c mbtowc_r.c mlock.c mprec.c mstats.c on_exit_args.c \ - quick_exit.c rand.c rand_r.c realloc.c reallocf.c \ + quick_exit.c rand.c rand_r.c random.c realloc.c reallocf.c \ sb_charsets.c strtod.c strtodg.c strtol.c strtorx.c strtoul.c \ utoa.c wcstod.c wcstol.c wcstoul.c wcstombs.c wcstombs_r.c \ wctomb.c wctomb_r.c $(am__append_1) @@ -526,6 +527,7 @@ CHEWOUT_FILES = \ on_exit.def \ rand.def \ rand48.def \ + random.def \ rpmatch.def \ strtod.def \ strtol.def \ @@ -883,6 +885,12 @@ lib_a-rand_r.o: rand_r.c lib_a-rand_r.obj: rand_r.c $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-rand_r.obj `if test -f 'rand_r.c'; then $(CYGPATH_W) 'rand_r.c'; else $(CYGPATH_W) '$(srcdir)/rand_r.c'; fi` +lib_a-random.o: random.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-random.o `test -f 'random.c' || echo '$(srcdir)/'`random.c + +lib_a-random.obj: random.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-random.obj `if test -f 'random.c'; then $(CYGPATH_W) 'random.c'; else $(CYGPATH_W) '$(srcdir)/random.c'; fi` + lib_a-realloc.o: realloc.c $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-realloc.o `test -f 'realloc.c' || echo '$(srcdir)/'`realloc.c diff --git a/newlib/libc/stdlib/random.c b/newlib/libc/stdlib/random.c new file mode 100644 index 000000000..de132f363 --- /dev/null +++ b/newlib/libc/stdlib/random.c @@ -0,0 +1,82 @@ +/* +FUNCTION +<<random>>, <<srandom>>---pseudo-random numbers + +INDEX + random +INDEX + srandom + +ANSI_SYNOPSIS + #define _XOPEN_SOURCE 500 + #include <stdlib.h> + long int random(void); + void srandom(unsigned int <[seed]>); + + + +DESCRIPTION +<<random>> returns a different integer each time it is called; each +integer is chosen by an algorithm designed to be unpredictable, so +that you can use <<random>> when you require a random number. +The algorithm depends on a static variable called the ``random seed''; +starting with a given value of the random seed always produces the +same sequence of numbers in successive calls to <<random>>. + +You can set the random seed using <<srandom>>; it does nothing beyond +storing its argument in the static variable used by <<rand>>. You can +exploit this to make the pseudo-random sequence less predictable, if +you wish, by using some other unpredictable value (often the least +significant parts of a time-varying value) as the random seed before +beginning a sequence of calls to <<rand>>; or, if you wish to ensure +(for example, while debugging) that successive runs of your program +use the same ``random'' numbers, you can use <<srandom>> to set the same +random seed at the outset. + +RETURNS +<<random>> returns the next pseudo-random integer in sequence; it is a +number between <<0>> and <<RAND_MAX>> (inclusive). + +<<srandom>> does not return a result. + +NOTES +<<random>> and <<srandom>> are unsafe for multi-threaded applications. + +_XOPEN_SOURCE may be any value >= 500. + +PORTABILITY +<<random>> is required by XSI. This implementation uses the same +algorithm as <<rand>>. + +<<random>> requires no supporting OS subroutines. +*/ + +#ifndef _REENT_ONLY + +#include <stdlib.h> +#include <reent.h> + +void +_DEFUN (srandom, (seed), unsigned int seed) +{ + struct _reent *reent = _REENT; + + _REENT_CHECK_RAND48(reent); + _REENT_RAND_NEXT(reent) = seed; +} + +long int +_DEFUN_VOID (random) +{ + struct _reent *reent = _REENT; + + /* This multiplier was obtained from Knuth, D.E., "The Art of + Computer Programming," Vol 2, Seminumerical Algorithms, Third + Edition, Addison-Wesley, 1998, p. 106 (line 26) & p. 108 */ + _REENT_CHECK_RAND48(reent); + _REENT_RAND_NEXT(reent) = + _REENT_RAND_NEXT(reent) * __extension__ 6364136223846793005LL + 1; + return (long int)((_REENT_RAND_NEXT(reent) >> 32) & RAND_MAX); +} + +#endif /* _REENT_ONLY */ diff --git a/newlib/libc/stdlib/stdlib.tex b/newlib/libc/stdlib/stdlib.tex index 53f0b9c14..75d80f4d6 100644 --- a/newlib/libc/stdlib/stdlib.tex +++ b/newlib/libc/stdlib/stdlib.tex @@ -38,6 +38,7 @@ The corresponding declarations are in the header file @file{stdlib.h}. * on_exit:: Request execution of functions at program exit * qsort:: Array sort * rand:: Pseudo-random numbers +* random:: Pseudo-random numbers * rand48:: Uniformly distributed pseudo-random numbers * rpmatch:: Determine whether response is affirmative or negative * strtod:: String to double or float @@ -154,6 +155,9 @@ The corresponding declarations are in the header file @file{stdlib.h}. @include stdlib/rand.def @page +@include stdlib/random.def + +@page @include stdlib/rand48.def @page diff --git a/winsup/cygwin/include/cygwin/stdlib.h b/winsup/cygwin/include/cygwin/stdlib.h index 002a90433..2318764ab 100644 --- a/winsup/cygwin/include/cygwin/stdlib.h +++ b/winsup/cygwin/include/cygwin/stdlib.h @@ -28,12 +28,6 @@ char *canonicalize_file_name (const char *); #if __BSD_VISIBLE || __POSIX_VISIBLE >= 200112 int unsetenv (const char *); #endif -#if __BSD_VISIBLE || __SVID_SOURCE || __XSI_VISIBLE >= 4 -char *initstate (unsigned seed, char *state, size_t size); -long random (void); -char *setstate (const char *state); -void srandom (unsigned); -#endif #if __XSI_VISIBLE char *ptsname (int); int grantpt (int); |