diff options
author | rgrimes <rgrimes@FreeBSD.org> | 1994-05-27 12:33:43 +0000 |
---|---|---|
committer | rgrimes <rgrimes@FreeBSD.org> | 1994-05-27 12:33:43 +0000 |
commit | f9ab90d9d6d02989a075d0f0074496d5b1045e4b (patch) | |
tree | add7e996bac5289cdc55e6935750c352505560a9 /usr.bin/jot | |
parent | be22b15ae2ff8d7fe06b6e14fddf0c5b444a95da (diff) | |
download | FreeBSD-src-f9ab90d9d6d02989a075d0f0074496d5b1045e4b.zip FreeBSD-src-f9ab90d9d6d02989a075d0f0074496d5b1045e4b.tar.gz |
BSD 4.4 Lite Usr.bin Sources
Diffstat (limited to 'usr.bin/jot')
-rw-r--r-- | usr.bin/jot/Makefile | 5 | ||||
-rw-r--r-- | usr.bin/jot/jot.1 | 195 | ||||
-rw-r--r-- | usr.bin/jot/jot.c | 393 |
3 files changed, 593 insertions, 0 deletions
diff --git a/usr.bin/jot/Makefile b/usr.bin/jot/Makefile new file mode 100644 index 0000000..83db4c0 --- /dev/null +++ b/usr.bin/jot/Makefile @@ -0,0 +1,5 @@ +# @(#)Makefile 8.1 (Berkeley) 6/6/93 + +PROG= jot + +.include <bsd.prog.mk> diff --git a/usr.bin/jot/jot.1 b/usr.bin/jot/jot.1 new file mode 100644 index 0000000..c7dba58 --- /dev/null +++ b/usr.bin/jot/jot.1 @@ -0,0 +1,195 @@ +.\" Copyright (c) 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. All advertising materials mentioning features or use of this software +.\" must display the following acknowledgement: +.\" This product includes software developed by the University of +.\" California, Berkeley and its contributors. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)jot.1 8.1 (Berkeley) 6/6/93 +.\" +.TH JOT 1 "June 6, 1993" +.UC 4 +.SH NAME +jot \- print sequential or random data +.SH SYNOPSIS +.B jot [ +options +.B ] [ +\fRreps \fB[\fP begin \fB[\fP end \fB[\fP s \fB] ] ] ]\fP +.SH DESCRIPTION +.I Jot +is used to print out increasing, decreasing, random, +or redundant data, usually numbers, one per line. +The +.I options +are understood as follows. +.IP \fB\-r\fP +Generate random data instead of sequential data, the default. +.IP \fB\-b\fP\ word +Just print +.I word +repetitively. +.IP \fB\-w\fP\ word +Print +.IR word +with the generated data appended to it. +Octal, hexadecimal, exponential, ASCII, zero padded, +and right-adjusted representations +are possible by using the appropriate +.IR printf (3) +conversion specification inside +.IR word , +in which case the data are inserted rather than appended. +.IP \fB\-c\fP +This is an abbreviation for \fB\-w %c\fP. +.IP \fB\-s\fP\ string +Print data separated by +.IR string . +Normally, newlines separate data. +.IP \fB\-n\fP +Do not print the final newline normally appended to the output. +.IP \fB\-p\fP\ precision +Print only as many digits or characters of the data +as indicated by the integer +.IR precision . +In the absence of +.BR \-p , +the precision is the greater of the precisions of +.I begin +and +.IR end . +The +.B \-p +option is overridden by whatever appears in a +.IR printf (3) +conversion following +.BR \-w . +.PP +The last four arguments indicate, respectively, +the number of data, the lower bound, the upper bound, +and the step size or, for random data, the seed. +While at least one of them must appear, +any of the other three may be omitted, and +will be considered as such if given as +.BR \- . +Any three of these arguments determines the fourth. +If four are specified and the given and computed values of +.I reps +conflict, the lower value is used. +If fewer than three are specified, defaults are assigned +left to right, except for +.IR s , +which assumes its default unless both +.I begin +and +.I end +are given. +.PP +Defaults for the four arguments are, respectively, +100, 1, 100, and 1, except that when random data are requested, +.I s +defaults to a seed depending upon the time of day. +.I Reps +is expected to be an unsigned integer, +and if given as zero is taken to be infinite. +.I Begin +and +.I end +may be given as real numbers or as characters +representing the corresponding value in ASCII. +The last argument must be a real number. +.PP +Random numbers are obtained through +.IR random (3). +The name +.I jot +derives in part from +.IR iota , +a function in APL. +.SH EXAMPLES +.de IC +.IP +.ss 36 +.ft B +.. +.de NC +.br +.ss 12 +.PP +.. +.PP +The command +.IC +jot 21 \-1 1.00 +.NC +prints 21 evenly spaced numbers increasing from \-1 to 1. +The ASCII character set is generated with +.IC +jot \-c 128 0 +.NC +and the strings xaa through xaz with +.IC +jot \-w xa%c 26 a +.NC +while 20 random 8-letter strings are produced with +.IC +jot \-r \-c 160 a z | rs \-g 0 8 +.NC +Infinitely many +.IR yes 's +may be obtained through +.IC +jot \-b yes 0 +.NC +and thirty +.IR ed (1) +substitution commands applying to lines 2, 7, 12, etc. is +the result of +.IC +jot \-w %ds/old/new/ 30 2 \- 5 +.NC +The stuttering sequence 9, 9, 8, 8, 7, etc. can be +produced by suitable choice of precision and step size, +as in +.IC +jot 0 9 \- \-.5 +.NC +and a file containing exactly 1024 bytes is created with +.IC +jot \-b x 512 > block +.NC +Finally, to set tabs four spaces apart starting +from column 10 and ending in column 132, use +.IC +expand \-\`jot \-s, \- 10 132 4\` +.NC +and to print all lines 80 characters or longer, +.IC +grep \`jot \-s "" \-b . 80\` +.NC +.SH SEE ALSO +ed(1), expand(1), rs(1), yes(1), printf(3), random(3), expand(1) diff --git a/usr.bin/jot/jot.c b/usr.bin/jot/jot.c new file mode 100644 index 0000000..442d083 --- /dev/null +++ b/usr.bin/jot/jot.c @@ -0,0 +1,393 @@ +/*- + * Copyright (c) 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char copyright[] = +"@(#) Copyright (c) 1993\n\ + The Regents of the University of California. All rights reserved.\n"; +#endif /* not lint */ + +#ifndef lint +static char sccsid[] = "@(#)jot.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +/* + * jot - print sequential or random data + * + * Author: John Kunze, Office of Comp. Affairs, UCB + */ + +#include <ctype.h> +#include <limits.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <time.h> + +#define REPS_DEF 100 +#define BEGIN_DEF 1 +#define ENDER_DEF 100 +#define STEP_DEF 1 + +#define isdefault(s) (strcmp((s), "-") == 0) + +double begin; +double ender; +double s; +long reps; +int randomize; +int infinity; +int boring; +int prec; +int dox; +int chardata; +int nofinalnl; +char *sepstring = "\n"; +char format[BUFSIZ]; + +void error __P((char *, char *)); +void getargs __P((int, char *[])); +void getformat __P((void)); +int getprec __P((char *)); +void putdata __P((double, long)); + +int +main(argc, argv) + int argc; + char *argv[]; +{ + double xd, yd; + long id; + register double *x = &xd; + register double *y = &yd; + register long *i = &id; + + getargs(argc, argv); + if (randomize) { + *x = (ender - begin) * (ender > begin ? 1 : -1); + srandom((int) s); + for (*i = 1; *i <= reps || infinity; (*i)++) { + *y = (double) random() / INT_MAX; + putdata(*y * *x + begin, reps - *i); + } + } + else + for (*i = 1, *x = begin; *i <= reps || infinity; (*i)++, *x += s) + putdata(*x, reps - *i); + if (!nofinalnl) + putchar('\n'); + exit(0); +} + +void +getargs(ac, av) + int ac; + char *av[]; +{ + register unsigned int mask = 0; + register int n = 0; + + while (--ac && **++av == '-' && !isdefault(*av)) + switch ((*av)[1]) { + case 'r': + randomize = 1; + break; + case 'c': + chardata = 1; + break; + case 'n': + nofinalnl = 1; + break; + case 'b': + boring = 1; + case 'w': + if ((*av)[2]) + strcpy(format, *av + 2); + else if (!--ac) + error("Need context word after -w or -b", ""); + else + strcpy(format, *++av); + break; + case 's': + if ((*av)[2]) + strcpy(sepstring, *av + 2); + else if (!--ac) + error("Need string after -s", ""); + else + strcpy(sepstring, *++av); + break; + case 'p': + if ((*av)[2]) + prec = atoi(*av + 2); + else if (!--ac) + error("Need number after -p", ""); + else + prec = atoi(*++av); + if (prec <= 0) + error("Bad precision value", ""); + break; + default: + error("Unknown option %s", *av); + } + + switch (ac) { /* examine args right to left, falling thru cases */ + case 4: + if (!isdefault(av[3])) { + if (!sscanf(av[3], "%lf", &s)) + error("Bad s value: %s", av[3]); + mask |= 01; + } + case 3: + if (!isdefault(av[2])) { + if (!sscanf(av[2], "%lf", &ender)) + ender = av[2][strlen(av[2])-1]; + mask |= 02; + if (!prec) + n = getprec(av[2]); + } + case 2: + if (!isdefault(av[1])) { + if (!sscanf(av[1], "%lf", &begin)) + begin = av[1][strlen(av[1])-1]; + mask |= 04; + if (!prec) + prec = getprec(av[1]); + if (n > prec) /* maximum precision */ + prec = n; + } + case 1: + if (!isdefault(av[0])) { + if (!sscanf(av[0], "%ld", &reps)) + error("Bad reps value: %s", av[0]); + mask |= 010; + } + break; + case 0: + error("jot - print sequential or random data", ""); + default: + error("Too many arguments. What do you mean by %s?", av[4]); + } + getformat(); + while (mask) /* 4 bit mask has 1's where last 4 args were given */ + switch (mask) { /* fill in the 0's by default or computation */ + case 001: + reps = REPS_DEF; + mask = 011; + break; + case 002: + reps = REPS_DEF; + mask = 012; + break; + case 003: + reps = REPS_DEF; + mask = 013; + break; + case 004: + reps = REPS_DEF; + mask = 014; + break; + case 005: + reps = REPS_DEF; + mask = 015; + break; + case 006: + reps = REPS_DEF; + mask = 016; + break; + case 007: + if (randomize) { + reps = REPS_DEF; + mask = 0; + break; + } + if (s == 0.0) { + reps = 0; + mask = 0; + break; + } + reps = (ender - begin + s) / s; + if (reps <= 0) + error("Impossible stepsize", ""); + mask = 0; + break; + case 010: + begin = BEGIN_DEF; + mask = 014; + break; + case 011: + begin = BEGIN_DEF; + mask = 015; + break; + case 012: + s = (randomize ? time(0) : STEP_DEF); + mask = 013; + break; + case 013: + if (randomize) + begin = BEGIN_DEF; + else if (reps == 0) + error("Must specify begin if reps == 0", ""); + begin = ender - reps * s + s; + mask = 0; + break; + case 014: + s = (randomize ? time(0) : STEP_DEF); + mask = 015; + break; + case 015: + if (randomize) + ender = ENDER_DEF; + else + ender = begin + reps * s - s; + mask = 0; + break; + case 016: + if (randomize) + s = time(0); + else if (reps == 0) + error("Infinite sequences cannot be bounded", + ""); + else if (reps == 1) + s = 0.0; + else + s = (ender - begin) / (reps - 1); + mask = 0; + break; + case 017: /* if reps given and implied, */ + if (!randomize && s != 0.0) { + long t = (ender - begin + s) / s; + if (t <= 0) + error("Impossible stepsize", ""); + if (t < reps) /* take lesser */ + reps = t; + } + mask = 0; + break; + default: + error("Bad mask", ""); + } + if (reps == 0) + infinity = 1; +} + +void +putdata(x, notlast) + double x; + long notlast; +{ + long d = x; + register long *dp = &d; + + if (boring) /* repeated word */ + printf(format); + else if (dox) /* scalar */ + printf(format, *dp); + else /* real */ + printf(format, x); + if (notlast != 0) + fputs(sepstring, stdout); +} + +void +error(msg, s) + char *msg, *s; +{ + fprintf(stderr, "jot: "); + fprintf(stderr, msg, s); + fprintf(stderr, + "\nusage: jot [ options ] [ reps [ begin [ end [ s ] ] ] ]\n"); + if (strncmp("jot - ", msg, 6) == 0) + fprintf(stderr, "Options:\n\t%s\t%s\t%s\t%s\t%s\t%s\t%s", + "-r random data\n", + "-c character data\n", + "-n no final newline\n", + "-b word repeated word\n", + "-w word context word\n", + "-s string data separator\n", + "-p precision number of characters\n"); + exit(1); +} + +int +getprec(s) + char *s; +{ + register char *p; + register char *q; + + for (p = s; *p; p++) + if (*p == '.') + break; + if (!*p) + return (0); + for (q = ++p; *p; p++) + if (!isdigit(*p)) + break; + return (p - q); +} + +void +getformat() +{ + register char *p; + + if (boring) /* no need to bother */ + return; + for (p = format; *p; p++) /* look for '%' */ + if (*p == '%' && *(p+1) != '%') /* leave %% alone */ + break; + if (!*p && !chardata) + sprintf(p, "%%.%df", prec); + else if (!*p && chardata) { + strcpy(p, "%c"); + dox = 1; + } + else if (!*(p+1)) + strcat(format, "%"); /* cannot end in single '%' */ + else { + while (!isalpha(*p)) + p++; + switch (*p) { + case 'f': case 'e': case 'g': case '%': + break; + case 's': + error("Cannot convert numeric data to strings", ""); + break; + /* case 'd': case 'o': case 'x': case 'D': case 'O': case 'X': + case 'c': case 'u': */ + default: + dox = 1; + break; + } + } +} |