summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-07-18 00:16:25 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-07-18 00:16:25 +0000
commitf3d022543ef2afde3d53e7f6b3028eafe39d0ef4 (patch)
treeb8b953ffb6bd74579a97e173543db10f0f41c93f
parent8195282dfc4752ae8ec7fc1cb18f7c8e5f3d9d65 (diff)
* random.c (rb_random_{int32,real,bytes,int}): added functions for
extension libraries. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@24189 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog5
-rw-r--r--include/ruby/intern.h6
-rw-r--r--random.c29
3 files changed, 35 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index 4f0131cf58..246514f080 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Sat Jul 18 09:16:18 2009 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * random.c (rb_random_{int32,real,bytes,int}): added functions for
+ extension libraries.
+
Sat Jul 18 09:07:00 2009 Nobuyoshi Nakada <nobu@ruby-lang.org>
* random.c (fill_random_seed): use cryptographic service on Windows.
diff --git a/include/ruby/intern.h b/include/ruby/intern.h
index 7375442b41..4418806a6b 100644
--- a/include/ruby/intern.h
+++ b/include/ruby/intern.h
@@ -524,9 +524,13 @@ VALUE rb_range_new(VALUE, VALUE, int);
VALUE rb_range_beg_len(VALUE, long*, long*, long, int);
int rb_range_values(VALUE range, VALUE *begp, VALUE *endp, int *exclp);
/* random.c */
-unsigned long rb_genrand_int32(void);
+unsigned int rb_genrand_int32(void);
double rb_genrand_real(void);
void rb_reset_random_seed(void);
+VALUE rb_random_bytes(VALUE rnd, long n);
+VALUE rb_random_int(VALUE rnd, VALUE max);
+unsigned int rb_random_int32(VALUE rnd);
+double rb_random_real(VALUE rnd);
/* re.c */
#define rb_memcmp memcmp
int rb_memcicmp(const void*,const void*,long);
diff --git a/random.c b/random.c
index 57ab673831..ceec247fa1 100644
--- a/random.c
+++ b/random.c
@@ -211,7 +211,7 @@ struct Random {
static struct Random default_rand;
-unsigned long
+unsigned int
rb_genrand_int32(void)
{
return genrand_int32(&default_rand.rnd.mt);
@@ -767,6 +767,20 @@ rb_rand_internal(unsigned long i)
return limited_rand(mt, i);
}
+unsigned int
+rb_random_int32(VALUE obj)
+{
+ rb_random_t *rnd = get_rnd(obj);
+ return genrand_int32(&rnd->mt);
+}
+
+double
+rb_random_real(VALUE obj)
+{
+ rb_random_t *rnd = get_rnd(obj);
+ return genrand_real(&rnd->mt);
+}
+
/*
* call-seq: prng.bytes(size) -> prng
*
@@ -776,8 +790,13 @@ rb_rand_internal(unsigned long i)
static VALUE
random_bytes(VALUE obj, VALUE len)
{
+ return rb_random_bytes(obj, FIX2LONG(rb_to_int(len)));
+}
+
+VALUE
+rb_random_bytes(VALUE obj, long n)
+{
rb_random_t *rnd = get_rnd(obj);
- long n = FIX2LONG(rb_to_int(len));
VALUE bytes = rb_str_new(0, n);
char *ptr = RSTRING_PTR(bytes);
unsigned int r, i;
@@ -868,8 +887,8 @@ rand_int(struct MT *mt, VALUE vmax)
*
* Otherwise, it raises an ArgumentError.
*/
-static VALUE
-random_int(VALUE obj, VALUE vmax)
+VALUE
+rb_random_int(VALUE obj, VALUE vmax)
{
VALUE v, beg = Qundef;
rb_random_t *rnd = get_rnd(obj);
@@ -887,6 +906,8 @@ random_int(VALUE obj, VALUE vmax)
return add_to_begin(beg, v);
}
+#define random_int rb_random_int
+
/*
* call-seq:
* prng.float -> float