svn commit: r271879 - head/contrib/one-true-awk

Pedro F. Giffuni pfg at FreeBSD.org
Fri Sep 19 18:24:03 UTC 2014


Author: pfg
Date: Fri Sep 19 18:24:02 2014
New Revision: 271879
URL: http://svnweb.freebsd.org/changeset/base/271879

Log:
  awk: Use random(3) instead of rand(3)
  
  While none of them is considered even near to cryptographic
  level, random(3) is a better random generator than rand(3).
  
  Use random(3) for awk as is done in other systems.
  
  Thanks to Chenguang Li for discussing this in the lists
  and submitting the patch upstream.
  
  PR:		193147
  MFC after:	5 weeks

Modified:
  head/contrib/one-true-awk/awk.1
  head/contrib/one-true-awk/main.c
  head/contrib/one-true-awk/run.c

Modified: head/contrib/one-true-awk/awk.1
==============================================================================
--- head/contrib/one-true-awk/awk.1	Fri Sep 19 18:13:56 2014	(r271878)
+++ head/contrib/one-true-awk/awk.1	Fri Sep 19 18:24:02 2014	(r271879)
@@ -208,7 +208,7 @@ or of
 if no argument.
 .TP
 .B rand
-random number on (0,1)
+random number on [0,1)
 .TP
 .B srand
 sets seed for

Modified: head/contrib/one-true-awk/main.c
==============================================================================
--- head/contrib/one-true-awk/main.c	Fri Sep 19 18:13:56 2014	(r271878)
+++ head/contrib/one-true-awk/main.c	Fri Sep 19 18:24:02 2014	(r271879)
@@ -74,7 +74,7 @@ int main(int argc, char *argv[])
 	signal(SIGFPE, fpecatch);
 
 	srand_seed = 1;
-	srand(srand_seed);
+	srandom((unsigned long) srand_seed);
 
 	yyin = NULL;
 	symtab = makesymtab(NSYMTAB/NSYMTAB);

Modified: head/contrib/one-true-awk/run.c
==============================================================================
--- head/contrib/one-true-awk/run.c	Fri Sep 19 18:13:56 2014	(r271878)
+++ head/contrib/one-true-awk/run.c	Fri Sep 19 18:24:02 2014	(r271879)
@@ -1521,8 +1521,10 @@ Cell *bltin(Node **a, int n)	/* builtin 
 		u = (Awkfloat) system(getsval(x)) / 256;   /* 256 is unix-dep */
 		break;
 	case FRAND:
-		/* in principle, rand() returns something in 0..RAND_MAX */
-		u = (Awkfloat) (rand() % RAND_MAX) / RAND_MAX;
+		/* random() returns numbers in [0..2^31-1]
+		 * in order to get a number in [0, 1), divide it by 2^31
+		 */
+		u = (Awkfloat) random() / (0x7fffffffL + 0x1UL);
 		break;
 	case FSRAND:
 		if (isrec(x))	/* no argument provided */
@@ -1530,7 +1532,7 @@ Cell *bltin(Node **a, int n)	/* builtin 
 		else
 			u = getfval(x);
 		tmp = u;
-		srand((unsigned int) u);
+		srandom((unsigned long) u);
 		u = srand_seed;
 		srand_seed = tmp;
 		break;


More information about the svn-src-head mailing list