jot.c (62871) | jot.c (77276) |
---|---|
1/*- 2 * Copyright (c) 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 28 unchanged lines hidden (view full) --- 37 The Regents of the University of California. All rights reserved.\n"; 38#endif /* not lint */ 39 40#ifndef lint 41#if 0 42static char sccsid[] = "@(#)jot.c 8.1 (Berkeley) 6/6/93"; 43#endif 44static const char rcsid[] = | 1/*- 2 * Copyright (c) 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 28 unchanged lines hidden (view full) --- 37 The Regents of the University of California. All rights reserved.\n"; 38#endif /* not lint */ 39 40#ifndef lint 41#if 0 42static char sccsid[] = "@(#)jot.c 8.1 (Berkeley) 6/6/93"; 43#endif 44static const char rcsid[] = |
45 "$FreeBSD: head/usr.bin/jot/jot.c 62871 2000-07-10 06:02:13Z kris $"; | 45 "$FreeBSD: head/usr.bin/jot/jot.c 77276 2001-05-27 21:08:19Z dd $"; |
46#endif /* not lint */ 47 48/* 49 * jot - print sequential or random data 50 * 51 * Author: John Kunze, Office of Comp. Affairs, UCB 52 */ 53 --- 6 unchanged lines hidden (view full) --- 60#include <time.h> 61#include <unistd.h> 62 63#define REPS_DEF 100 64#define BEGIN_DEF 1 65#define ENDER_DEF 100 66#define STEP_DEF 1 67 | 46#endif /* not lint */ 47 48/* 49 * jot - print sequential or random data 50 * 51 * Author: John Kunze, Office of Comp. Affairs, UCB 52 */ 53 --- 6 unchanged lines hidden (view full) --- 60#include <time.h> 61#include <unistd.h> 62 63#define REPS_DEF 100 64#define BEGIN_DEF 1 65#define ENDER_DEF 100 66#define STEP_DEF 1 67 |
68#define isdefault(s) (strcmp((s), "-") == 0) | 68#define is_default(s) (strcmp((s), "-") == 0) |
69 70double begin; 71double ender; 72double s; 73long reps; 74int randomize; 75int infinity; 76int boring; 77int prec; 78int longdata; 79int intdata; 80int chardata; 81int nosign; 82int nofinalnl; 83char *sepstring = "\n"; 84char format[BUFSIZ]; 85 | 69 70double begin; 71double ender; 72double s; 73long reps; 74int randomize; 75int infinity; 76int boring; 77int prec; 78int longdata; 79int intdata; 80int chardata; 81int nosign; 82int nofinalnl; 83char *sepstring = "\n"; 84char format[BUFSIZ]; 85 |
86void getargs __P((int, char *[])); 87void getformat __P((void)); | 86void getformat __P((void)); |
88int getprec __P((char *)); | 87int getprec __P((char *)); |
89int putdata __P((double, long)); 90static void usage __P((void)); | 88int putdata __P((double, long)); 89static void usage __P((void)); |
91 92int 93main(argc, argv) 94 int argc; 95 char *argv[]; 96{ 97 double xd, yd; 98 long id; | 90 91int 92main(argc, argv) 93 int argc; 94 char *argv[]; 95{ 96 double xd, yd; 97 long id; |
99 register double *x = &xd; 100 register double *y = &yd; 101 register long *i = &id; | 98 double *x = &xd; 99 double *y = &yd; 100 long *i = &id; 101 unsigned int mask = 0; 102 int n = 0; 103 int ch; |
102 | 104 |
103 getargs(argc, argv); 104 if (randomize) { 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 120void 121getargs(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]) { | 105 while ((ch = getopt(argc, argv, "rb:w:cs:np:")) != -1) 106 switch ((char)ch) { |
130 case 'r': 131 randomize = 1; 132 break; 133 case 'c': 134 chardata = 1; 135 break; 136 case 'n': 137 nofinalnl = 1; 138 break; 139 case 'b': 140 boring = 1; | 107 case 'r': 108 randomize = 1; 109 break; 110 case 'c': 111 chardata = 1; 112 break; 113 case 'n': 114 nofinalnl = 1; 115 break; 116 case 'b': 117 boring = 1; |
118 /* FALLTHROUGH */ |
|
141 case 'w': | 119 case 'w': |
142 if ((*av)[2]) 143 strcpy(format, *av + 2); 144 else if (!--ac) 145 errx(1, "need context word after -w or -b"); 146 else 147 strcpy(format, *++av); | 120 if (strlcpy(format, optarg, sizeof(format)) >= 121 sizeof(format)) 122 errx(1, "-%c word too long", ch); |
148 break; 149 case 's': | 123 break; 124 case 's': |
150 if ((*av)[2]) 151 sepstring = *av + 2; 152 else if (!--ac) 153 errx(1, "need string after -s"); 154 else 155 sepstring = *++av; | 125 sepstring = optarg; |
156 break; 157 case 'p': | 126 break; 127 case 'p': |
158 if ((*av)[2]) 159 prec = atoi(*av + 2); 160 else if (!--ac) 161 errx(1, "need number after -p"); 162 else 163 prec = atoi(*++av); | 128 prec = atoi(optarg); |
164 if (prec <= 0) 165 errx(1, "bad precision value"); 166 break; 167 default: 168 usage(); 169 } | 129 if (prec <= 0) 130 errx(1, "bad precision value"); 131 break; 132 default: 133 usage(); 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])) { 174 if (!sscanf(av[3], "%lf", &s)) 175 errx(1, "bad s value: %s", av[3]); | 140 if (!is_default(argv[3])) { 141 if (!sscanf(argv[3], "%lf", &s)) 142 errx(1, "bad s value: %s", argv[3]); |
176 mask |= 01; 177 } 178 case 3: | 143 mask |= 01; 144 } 145 case 3: |
179 if (!isdefault(av[2])) { 180 if (!sscanf(av[2], "%lf", &ender)) 181 ender = av[2][strlen(av[2])-1]; | 146 if (!is_default(argv[2])) { 147 if (!sscanf(argv[2], "%lf", &ender)) 148 ender = argv[2][strlen(argv[2])-1]; |
182 mask |= 02; 183 if (!prec) | 149 mask |= 02; 150 if (!prec) |
184 n = getprec(av[2]); | 151 n = getprec(argv[2]); |
185 } 186 case 2: | 152 } 153 case 2: |
187 if (!isdefault(av[1])) { 188 if (!sscanf(av[1], "%lf", &begin)) 189 begin = av[1][strlen(av[1])-1]; | 154 if (!is_default(argv[1])) { 155 if (!sscanf(argv[1], "%lf", &begin)) 156 begin = argv[1][strlen(argv[1])-1]; |
190 mask |= 04; 191 if (!prec) | 157 mask |= 04; 158 if (!prec) |
192 prec = getprec(av[1]); | 159 prec = getprec(argv[1]); |
193 if (n > prec) /* maximum precision */ 194 prec = n; 195 } 196 case 1: | 160 if (n > prec) /* maximum precision */ 161 prec = n; 162 } 163 case 1: |
197 if (!isdefault(av[0])) { 198 if (!sscanf(av[0], "%ld", &reps)) 199 errx(1, "bad reps value: %s", av[0]); | 164 if (!is_default(argv[0])) { 165 if (!sscanf(argv[0], "%ld", &reps)) 166 errx(1, "bad reps value: %s", argv[0]); |
200 mask |= 010; 201 } 202 break; 203 case 0: 204 usage(); 205 default: | 167 mask |= 010; 168 } 169 break; 170 case 0: 171 usage(); 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 } 208 getformat(); 209 while (mask) /* 4 bit mask has 1's where last 4 args were given */ 210 switch (mask) { /* fill in the 0's by default or computation */ 211 case 001: 212 reps = REPS_DEF; 213 mask = 011; 214 break; --- 37 unchanged lines hidden (view full) --- 252 begin = BEGIN_DEF; 253 mask = 014; 254 break; 255 case 011: 256 begin = BEGIN_DEF; 257 mask = 015; 258 break; 259 case 012: | 175 } 176 getformat(); 177 while (mask) /* 4 bit mask has 1's where last 4 args were given */ 178 switch (mask) { /* fill in the 0's by default or computation */ 179 case 001: 180 reps = REPS_DEF; 181 mask = 011; 182 break; --- 37 unchanged lines hidden (view full) --- 220 begin = BEGIN_DEF; 221 mask = 014; 222 break; 223 case 011: 224 begin = BEGIN_DEF; 225 mask = 015; 226 break; 227 case 012: |
260 s = (randomize ? -1.0 : STEP_DEF); | 228 s = (randomize ? time(NULL) : STEP_DEF); |
261 mask = 013; 262 break; 263 case 013: 264 if (randomize) 265 begin = BEGIN_DEF; 266 else if (reps == 0) 267 errx(1, "must specify begin if reps == 0"); | 229 mask = 013; 230 break; 231 case 013: 232 if (randomize) 233 begin = BEGIN_DEF; 234 else if (reps == 0) 235 errx(1, "must specify begin if reps == 0"); |
268 else 269 begin = ender - reps * s + s; | 236 begin = ender - reps * s + s; |
270 mask = 0; 271 break; 272 case 014: 273 s = (randomize ? -1.0 : STEP_DEF); 274 mask = 015; 275 break; 276 case 015: 277 if (randomize) --- 23 unchanged lines hidden (view full) --- 301 } 302 mask = 0; 303 break; 304 default: 305 errx(1, "bad mask"); 306 } 307 if (reps == 0) 308 infinity = 1; | 237 mask = 0; 238 break; 239 case 014: 240 s = (randomize ? -1.0 : STEP_DEF); 241 mask = 015; 242 break; 243 case 015: 244 if (randomize) --- 23 unchanged lines hidden (view full) --- 268 } 269 mask = 0; 270 break; 271 default: 272 errx(1, "bad mask"); 273 } 274 if (reps == 0) 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} 310 311int 312putdata(x, notlast) 313 double x; 314 long notlast; 315{ 316 --- 36 unchanged lines hidden (view full) --- 353 " [reps [begin [end [s]]]]"); 354 exit(1); 355} 356 357int 358getprec(s) 359 char *s; 360{ | 290} 291 292int 293putdata(x, notlast) 294 double x; 295 long notlast; 296{ 297 --- 36 unchanged lines hidden (view full) --- 334 " [reps [begin [end [s]]]]"); 335 exit(1); 336} 337 338int 339getprec(s) 340 char *s; 341{ |
361 register char *p; 362 register char *q; | 342 char *p; 343 char *q; |
363 364 for (p = s; *p; p++) 365 if (*p == '.') 366 break; 367 if (!*p) 368 return (0); 369 for (q = ++p; *p; p++) 370 if (!isdigit(*p)) 371 break; 372 return (p - q); 373} 374 375void 376getformat() 377{ | 344 345 for (p = s; *p; p++) 346 if (*p == '.') 347 break; 348 if (!*p) 349 return (0); 350 for (q = ++p; *p; p++) 351 if (!isdigit(*p)) 352 break; 353 return (p - q); 354} 355 356void 357getformat() 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; 381 382 if (boring) /* no need to bother */ 383 return; 384 for (p = format; *p; p++) /* look for '%' */ 385 if (*p == '%' && *(p+1) != '%') /* leave %% alone */ 386 break; | 362 char *s; 363 364 if (boring) /* no need to bother */ 365 return; 366 for (p = format; *p; p++) /* look for '%' */ 367 if (*p == '%' && *(p+1) != '%') /* leave %% alone */ 368 break; |
387 if (!*p && !chardata) 388 sprintf(p, "%%.%df", prec); 389 else if (!*p && chardata) { 390 strcpy(p, "%c"); | 369 sz = sizeof(format) - strlen(format) - 1; 370 if (!*p && !chardata) { 371 if (snprintf(p, sz, "%%.%df", prec) >= (int)sz) 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 /* 396 * Allow conversion format specifiers of the form 397 * %[#][ ][{+,-}][0-9]*[.[0-9]*]? where ? must be one of 398 * [l]{d,i,o,u,x} or {f,e,g,E,G,d,o,x,D,O,U,X,c,u} 399 */ 400 s = p++; 401 dot = hash = space = sign = numbers = 0; 402 while (!isalpha(*p)) { --- 66 unchanged lines hidden --- | 382 /* 383 * Allow conversion format specifiers of the form 384 * %[#][ ][{+,-}][0-9]*[.[0-9]*]? where ? must be one of 385 * [l]{d,i,o,u,x} or {f,e,g,E,G,d,o,x,D,O,U,X,c,u} 386 */ 387 s = p++; 388 dot = hash = space = sign = numbers = 0; 389 while (!isalpha(*p)) { --- 66 unchanged lines hidden --- |