View | Details | Raw Unified | Return to bug 27480
Collapse All | Expand All

(-)jot.c (-81 / +68 lines)
Lines 65-71 Link Here
65
#define	ENDER_DEF	100
65
#define	ENDER_DEF	100
66
#define	STEP_DEF	1
66
#define	STEP_DEF	1
67
67
68
#define	isdefault(s)	(strcmp((s), "-") == 0)
68
#define	is_default(s)	(strcmp((s), "-") == 0)
69
69
70
double	begin;
70
double	begin;
71
double	ender;
71
double	ender;
Lines 83-93 Link Here
83
char	*sepstring = "\n";
83
char	*sepstring = "\n";
84
char	format[BUFSIZ];
84
char	format[BUFSIZ];
85
85
86
void	getargs __P((int, char *[]));
86
void		getformat __P((void));
87
void	getformat __P((void));
88
int		getprec __P((char *));
87
int		getprec __P((char *));
89
int	putdata __P((double, long));
88
int		putdata __P((double, long));
90
static void usage __P((void));
89
static void	usage __P((void));
91
90
92
int
91
int
93
main(argc, argv)
92
main(argc, argv)
Lines 96-132 Link Here
96
{
95
{
97
	double	xd, yd;
96
	double	xd, yd;
98
	long	id;
97
	long	id;
99
	register double	*x = &xd;
98
	double	*x = &xd;
100
	register double	*y = &yd;
99
	double	*y = &yd;
101
	register long	*i = &id;
100
	long	*i = &id;
101
	unsigned int	mask = 0;
102
	int	n = 0;
103
	int	ch;
102
104
103
	getargs(argc, argv);
105
	while ((ch = getopt(argc, argv, "rb:w:cs:np:")) != -1)
104
	if (randomize) {
106
		switch ((char)ch) {
105
		*x = (ender - begin) * (ender > begin ? 1 : -1);
106
		for (*i = 1; *i <= reps || infinity; (*i)++) {
107
			*y = (double) arc4random() / ULONG_MAX;
108
			if (putdata(*y * *x + begin, reps - *i))
109
				errx(1, "range error in conversion");
110
		}
111
	} else
112
		for (*i = 1, *x = begin; *i <= reps || infinity; (*i)++, *x += s)
113
			if (putdata(*x, reps - *i))
114
				errx(1, "range error in conversion");
115
	if (!nofinalnl)
116
		putchar('\n');
117
	exit(0);
118
}
119
120
void
121
getargs(ac, av)
122
	int ac;
123
	char *av[];
124
{
125
	register unsigned int	mask = 0;
126
	register int		n = 0;
127
128
	while (--ac && **++av == '-' && !isdefault(*av))
129
		switch ((*av)[1]) {
130
		case 'r':
107
		case 'r':
131
			randomize = 1;
108
			randomize = 1;
132
			break;
109
			break;
Lines 138-209 Link Here
138
			break;
115
			break;
139
		case 'b':
116
		case 'b':
140
			boring = 1;
117
			boring = 1;
118
			/* FALLTHROUGH */
141
		case 'w':
119
		case 'w':
142
			if ((*av)[2])
120
			if (strlcpy(format, optarg, sizeof(format)) >=
143
				strcpy(format, *av + 2);
121
			    sizeof(format))
144
			else if (!--ac)
122
				errx(1, "-%c word too long", ch);
145
				errx(1, "need context word after -w or -b");
146
			else
147
				strcpy(format, *++av);
148
			break;
123
			break;
149
		case 's':
124
		case 's':
150
			if ((*av)[2])
125
			sepstring = optarg;
151
				sepstring = *av + 2;
152
			else if (!--ac)
153
				errx(1, "need string after -s");
154
			else
155
				sepstring = *++av;
156
			break;
126
			break;
157
		case 'p':
127
		case 'p':
158
			if ((*av)[2])
128
			prec = atoi(optarg);
159
				prec = atoi(*av + 2);
160
			else if (!--ac)
161
				errx(1, "need number after -p");
162
			else
163
				prec = atoi(*++av);
164
			if (prec <= 0)
129
			if (prec <= 0)
165
				errx(1, "bad precision value");
130
				errx(1, "bad precision value");
166
			break;
131
			break;
167
		default:
132
		default:
168
			usage();
133
			usage();
169
		}
134
		}
135
	argc -= optind;
136
	argv += optind;
170
137
171
	switch (ac) {	/* examine args right to left, falling thru cases */
138
	switch (argc) {	/* examine args right to left, falling thru cases */
172
	case 4:
139
	case 4:
173
		if (!isdefault(av[3])) {
140
		if (!is_default(argv[3])) {
174
			if (!sscanf(av[3], "%lf", &s))
141
			if (!sscanf(argv[3], "%lf", &s))
175
				errx(1, "bad s value: %s", av[3]);
142
				errx(1, "bad s value: %s", argv[3]);
176
			mask |= 01;
143
			mask |= 01;
177
		}
144
		}
178
	case 3:
145
	case 3:
179
		if (!isdefault(av[2])) {
146
		if (!is_default(argv[2])) {
180
			if (!sscanf(av[2], "%lf", &ender))
147
			if (!sscanf(argv[2], "%lf", &ender))
181
				ender = av[2][strlen(av[2])-1];
148
				ender = argv[2][strlen(argv[2])-1];
182
			mask |= 02;
149
			mask |= 02;
183
			if (!prec)
150
			if (!prec)
184
				n = getprec(av[2]);
151
				n = getprec(argv[2]);
185
		}
152
		}
186
	case 2:
153
	case 2:
187
		if (!isdefault(av[1])) {
154
		if (!is_default(argv[1])) {
188
			if (!sscanf(av[1], "%lf", &begin))
155
			if (!sscanf(argv[1], "%lf", &begin))
189
				begin = av[1][strlen(av[1])-1];
156
				begin = argv[1][strlen(argv[1])-1];
190
			mask |= 04;
157
			mask |= 04;
191
			if (!prec)
158
			if (!prec)
192
				prec = getprec(av[1]);
159
				prec = getprec(argv[1]);
193
			if (n > prec)		/* maximum precision */
160
			if (n > prec)		/* maximum precision */
194
				prec = n;
161
				prec = n;
195
		}
162
		}
196
	case 1:
163
	case 1:
197
		if (!isdefault(av[0])) {
164
		if (!is_default(argv[0])) {
198
			if (!sscanf(av[0], "%ld", &reps))
165
			if (!sscanf(argv[0], "%ld", &reps))
199
				errx(1, "bad reps value: %s", av[0]);
166
				errx(1, "bad reps value: %s", argv[0]);
200
			mask |= 010;
167
			mask |= 010;
201
		}
168
		}
202
		break;
169
		break;
203
	case 0:
170
	case 0:
204
		usage();
171
		usage();
205
	default:
172
	default:
206
		errx(1, "too many arguments. What do you mean by %s?", av[4]);
173
		errx(1, "too many arguments.  What do you mean by %s?",
174
		    argv[4]);
207
	}
175
	}
208
	getformat();
176
	getformat();
209
	while (mask)	/* 4 bit mask has 1's where last 4 args were given */
177
	while (mask)	/* 4 bit mask has 1's where last 4 args were given */
Lines 257-263 Link Here
257
			mask = 015;
225
			mask = 015;
258
			break;
226
			break;
259
		case 012:
227
		case 012:
260
			s = (randomize ? -1.0 : STEP_DEF);
228
			s = (randomize ? time(NULL) : STEP_DEF);
261
			mask = 013;
229
			mask = 013;
262
			break;
230
			break;
263
		case 013:
231
		case 013:
Lines 265-272 Link Here
265
				begin = BEGIN_DEF;
233
				begin = BEGIN_DEF;
266
			else if (reps == 0)
234
			else if (reps == 0)
267
				errx(1, "must specify begin if reps == 0");
235
				errx(1, "must specify begin if reps == 0");
268
			else
236
			begin = ender - reps * s + s;
269
				begin = ender - reps * s + s;
270
			mask = 0;
237
			mask = 0;
271
			break;
238
			break;
272
		case 014:
239
		case 014:
Lines 306-311 Link Here
306
		}
273
		}
307
	if (reps == 0)
274
	if (reps == 0)
308
		infinity = 1;
275
		infinity = 1;
276
	if (randomize) {
277
		*x = (ender - begin) * (ender > begin ? 1 : -1);
278
		for (*i = 1; *i <= reps || infinity; (*i)++) {
279
			*y = (double) arc4random() / ULONG_MAX;
280
			if (putdata(*y * *x + begin, reps - *i))
281
				errx(1, "range error in conversion");
282
		}
283
	} else
284
		for (*i = 1, *x = begin; *i <= reps || infinity; (*i)++, *x += s)
285
			if (putdata(*x, reps - *i))
286
				errx(1, "range error in conversion");
287
	if (!nofinalnl)
288
		putchar('\n');
289
	exit(0);
309
}
290
}
310
291
311
int
292
int
Lines 358-365 Link Here
358
getprec(s)
339
getprec(s)
359
	char *s;
340
	char *s;
360
{
341
{
361
	register char	*p;
342
	char	*p;
362
	register char	*q;
343
	char	*q;
363
344
364
	for (p = s; *p; p++)
345
	for (p = s; *p; p++)
365
		if (*p == '.')
346
		if (*p == '.')
Lines 375-382 Link Here
375
void
356
void
376
getformat()
357
getformat()
377
{
358
{
378
	register char	*p;
359
	char	*p;
379
	int dot, hash, space, sign, numbers = 0;
360
	int dot, hash, space, sign, numbers = 0;
361
	size_t sz;
380
	char *s;
362
	char *s;
381
363
382
	if (boring)				/* no need to bother */
364
	if (boring)				/* no need to bother */
Lines 384-397 Link Here
384
	for (p = format; *p; p++)		/* look for '%' */
366
	for (p = format; *p; p++)		/* look for '%' */
385
		if (*p == '%' && *(p+1) != '%')	/* leave %% alone */
367
		if (*p == '%' && *(p+1) != '%')	/* leave %% alone */
386
			break;
368
			break;
387
	if (!*p && !chardata)
369
	sz = sizeof(format) - strlen(format) - 1;
388
		sprintf(p, "%%.%df", prec);
370
	if (!*p && !chardata) {
389
	else if (!*p && chardata) {
371
		if (snprintf(p, sz, "%%.%df", prec) >= (int)sz)
390
		strcpy(p, "%c");
372
			errx(1, "-w word too long");
373
	} else if (!*p && chardata) {
374
		if (strlcpy(p, "%c", sz) >= sz)
375
			errx(1, "-w word too long");
391
		intdata = 1;
376
		intdata = 1;
392
	} else if (!*(p+1))
377
	} else if (!*(p+1)) {
378
		if (sz <= 0)
379
			errx(1, "-w word too long");
393
		strcat(format, "%");		/* cannot end in single '%' */
380
		strcat(format, "%");		/* cannot end in single '%' */
394
	else {
381
	} else {
395
		/*
382
		/*
396
		 * Allow conversion format specifiers of the form
383
		 * Allow conversion format specifiers of the form
397
		 * %[#][ ][{+,-}][0-9]*[.[0-9]*]? where ? must be one of
384
		 * %[#][ ][{+,-}][0-9]*[.[0-9]*]? where ? must be one of

Return to bug 27480