svn commit: r272207 - in head/games: factor primes

Colin Percival cperciva at FreeBSD.org
Sat Sep 27 09:00:40 UTC 2014


Author: cperciva
Date: Sat Sep 27 09:00:38 2014
New Revision: 272207
URL: http://svnweb.freebsd.org/changeset/base/272207

Log:
  Switch primes(6) from using unsigned long to using uint64_t.  This fixes
  'limited range of type' warnings about comparisons on 32-bit systems, and
  allows 32-bit systems to compute the full range of primes.

Modified:
  head/games/factor/factor.6
  head/games/primes/primes.c
  head/games/primes/primes.h

Modified: head/games/factor/factor.6
==============================================================================
--- head/games/factor/factor.6	Sat Sep 27 08:59:43 2014	(r272206)
+++ head/games/factor/factor.6	Sat Sep 27 09:00:38 2014	(r272207)
@@ -89,8 +89,7 @@ The
 value must not be greater than the maximum.
 The default and maximum value of
 .Ar stop
-is 4294967295 on 32-bit architectures
-and 3825123056546413050 on 64-bit ones.
+is 3825123056546413050.
 .Pp
 When the
 .Nm primes

Modified: head/games/primes/primes.c
==============================================================================
--- head/games/primes/primes.c	Sat Sep 27 08:59:43 2014	(r272206)
+++ head/games/primes/primes.c	Sat Sep 27 09:00:38 2014	(r272207)
@@ -64,6 +64,7 @@ static const char rcsid[] =
 #include <ctype.h>
 #include <err.h>
 #include <errno.h>
+#include <inttypes.h>
 #include <limits.h>
 #include <math.h>
 #include <stdio.h>
@@ -111,10 +112,10 @@ main(int argc, char *argv[])
 	argv += optind;
 
 	start = 0;
-	stop = (sizeof(ubig) > 4) ? SPSPMAX : BIG;
+	stop = SPSPMAX;
 
 	/*
-	 * Convert low and high args.  Strtoul(3) sets errno to
+	 * Convert low and high args.  Strtoumax(3) sets errno to
 	 * ERANGE if the number is too large, but, if there's
 	 * a leading minus sign it returns the negation of the
 	 * result of the conversion, which we'd rather disallow.
@@ -126,19 +127,19 @@ main(int argc, char *argv[])
 			errx(1, "negative numbers aren't permitted.");
 
 		errno = 0;
-		start = strtoul(argv[0], &p, 0);
+		start = strtoumax(argv[0], &p, 0);
 		if (errno)
 			err(1, "%s", argv[0]);
 		if (*p != '\0')
 			errx(1, "%s: illegal numeric format.", argv[0]);
 
 		errno = 0;
-		stop = strtoul(argv[1], &p, 0);
+		stop = strtoumax(argv[1], &p, 0);
 		if (errno)
 			err(1, "%s", argv[1]);
 		if (*p != '\0')
 			errx(1, "%s: illegal numeric format.", argv[1]);
-		if ((uint64_t)stop > SPSPMAX)
+		if (stop > SPSPMAX)
 			errx(1, "%s: stop value too large.", argv[1]);
 		break;
 	case 1:
@@ -147,7 +148,7 @@ main(int argc, char *argv[])
 			errx(1, "negative numbers aren't permitted.");
 
 		errno = 0;
-		start = strtoul(argv[0], &p, 0);
+		start = strtoumax(argv[0], &p, 0);
 		if (errno)
 			err(1, "%s", argv[0]);
 		if (*p != '\0')
@@ -188,7 +189,7 @@ read_num_buf(void)
 		if (*p == '-')
 			errx(1, "negative numbers aren't permitted.");
 		errno = 0;
-		val = strtoul(buf, &p, 0);
+		val = strtoumax(buf, &p, 0);
 		if (errno)
 			err(1, "%s", buf);
 		if (*p != '\n')
@@ -243,7 +244,7 @@ primes(ubig start, ubig stop)
 		for (p = &prime[0], factor = prime[0];
 		    factor < stop && p <= pr_limit; factor = *(++p)) {
 			if (factor >= start) {
-				printf(hflag ? "0x%lx\n" : "%lu\n", factor);
+				printf(hflag ? "%" PRIx64 "\n" : "%" PRIu64 "\n", factor);
 			}
 		}
 		/* return early if we are done */
@@ -306,11 +307,11 @@ primes(ubig start, ubig stop)
 		 */
 		for (q = table; q < tab_lim; ++q, start+=2) {
 			if (*q) {
-				if ((uint64_t)start > SIEVEMAX) {
+				if (start > SIEVEMAX) {
 					if (!isprime(start))
 						continue;
 				}
-				printf(hflag ? "0x%lx\n" : "%lu\n", start);
+				printf(hflag ? "%" PRIx64 "\n" : "%" PRIu64 "\n", start);
 			}
 		}
 	}

Modified: head/games/primes/primes.h
==============================================================================
--- head/games/primes/primes.h	Sat Sep 27 08:59:43 2014	(r272206)
+++ head/games/primes/primes.h	Sat Sep 27 09:00:38 2014	(r272207)
@@ -41,8 +41,10 @@
  * chongo <for a good prime call: 391581 * 2^216193 - 1> /\oo/\
  */
 
+#include <stdint.h>
+
 /* ubig is the type that holds a large unsigned value */
-typedef unsigned long ubig;		/* must be >=32 bit unsigned value */
+typedef uint64_t ubig;			/* must be >=32 bit unsigned value */
 #define	BIG		ULONG_MAX	/* largest value will sieve */
 
 /* bytes in sieve table (must be > 3*5*7*11) */


More information about the svn-src-head mailing list