Forwarding this, as NetBSD is affected, too.
-- Elias
----- Forwarded message from Elias Pipping <elias%pipping.org@localhost> -----
From: Elias Pipping <elias%pipping.org@localhost>
Date: Sat, 23 Feb 2008 14:11:56 +0100
To: bugs%openbsd.org@localhost
Subject: `-c` truncates range with `jot -r`
I've come across what I believe to be a bug in jot(1).
The bug affects jot(1) on OpenBSD, NetBSD, and Mac OS X, but not
FreeBSD.
`jot -r 100000 97 98` is supposed to generate 100000 numbers in the
range from 97 to 98. That's what it does. Now `-c` is supposed to
convert those numbers to ASCII, but it also changes the range, which it
shouldn't. Without `-c`, the range is [97,98], with `-c` it's [a,b).
Here's a demo:
% ./jot_obsd -r 100000 97 98 | sort -n | uniq -c
49983 97
50017 98
% ./jot_obsd -r -c 100000 97 98 | sort -n | uniq -c
100000 a
and, for comparison:
% ./jot_fbsd -r 100000 97 98 | sort -n | uniq -c
50018 97
49982 98
% ./jot_fbsd -r -c 100000 97 98 | sort -n | uniq -c
50082 a
49918 b
% ./jot_nbsd -r 100000 97 98 | sort -n | uniq -c
49963 97
50037 98
% ./jot_nbsd -r -c 100000 97 98 | sort -n | uniq -c
100000 a
% ./jot_apple -r 100000 97 98 | sort -n | uniq -c
50028 97
49972 98
% ./jot_apple -r -c 100000 97 98 | sort -n | uniq -c
100000 a
The tests were run on i386-apple-darwin9.2.0.
jot.c was retrieved from the following locations:
http://www.freebsd.org/cgi/cvsweb.cgi/~checkout~/src/usr.bin/jot/jot.c?rev=1.26.8.2
http://www.openbsd.org/cgi-bin/cvsweb/~checkout~/src/usr.bin/jot/jot.c?rev=1.19
http://cvsweb.netbsd.org/bsdweb.cgi/~checkout~/src/usr.bin/jot/jot.c?rev=1.14.2.1
http://www.opensource.apple.com/darwinsource/10.5.2/shell_cmds-118/jot/jot.c
And the following patches were applied (*only* to make jot compile!):
== snip ==
--- jot_fbsd.c
+++ jot_fbsd.c
@@ -43,7 +43,6 @@
#endif
#endif
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/usr.bin/jot/jot.c,v 1.26.8.2 2006/12/26 20:09:40 dds
Exp $");
/*
* jot - print sequential or random data
--- jot_obsd.c
+++ jot_obsd.c
@@ -56,6 +56,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <unistd.h>
#define REPS_DEF 100
#define BEGIN_DEF 1
@@ -124,7 +125,7 @@
errx(1, "-s word too long");
break;
case 'p':
- prec = strtonum(optarg, 0, INT_MAX, &errstr);
+ prec = atoi(optarg);
if (errstr != NULL)
errx(1, "bad precision value, %s: %s", errstr,
optarg);
== snip ==
gcc 4.0.1 (Apple Inc. build 5465) was used for compilation.
----- End forwarded message -----
Attachment:
pgpuaYKib_2pf.pgp
Description: PGP signature