Annotation of 43BSD/contrib/tools/src/jot.c, revision 1.1.1.1

1.1       root        1: /* Copyright (c) 1983 Regents of the University of California */
                      2: 
                      3: #ifndef lint
                      4: static char sccsid[] = "@(#)jot.c      4.3     (Berkeley)      4/5/86";
                      5: #endif not lint
                      6: 
                      7: /*
                      8:  *     jot - print sequential or random data
                      9:  *     Author:  John Kunze, Office of Comp. Affairs, UCB
                     10:  */
                     11: 
                     12: #include <stdio.h>
                     13: #include <ctype.h>
                     14: 
                     15: #define        REPS_DEF        100
                     16: #define        BEGIN_DEF       1
                     17: #define        ENDER_DEF       100
                     18: #define        STEP_DEF        1
                     19: 
                     20: #define BSD4_2         1
                     21: #if BSD4_2
                     22: #define RAND           random
                     23: #define SRAND          srandom
                     24: long RAND();
                     25: #else
                     26: #define RAND           rand
                     27: #define SRAND          srand
                     28: #endif
                     29: 
                     30: #define        isdefault(s)    (strcmp((s), "-") == 0)
                     31: #define        LARGESTINT      (~ (unsigned) 0 >> 1)
                     32: #define        CASE            break; case
                     33: 
                     34: char   *sepstring = "\n";
                     35: char   format[BUFSIZ];
                     36: char   buf[BUFSIZ];
                     37: int    randomize;
                     38: int    infinity;
                     39: int    boring;
                     40: int    prec;
                     41: int    dox;
                     42: int    chardata;
                     43: int    nofinalnl;
                     44: 
                     45: long   reps;
                     46: double begin;
                     47: double ender;
                     48: double s;
                     49: 
                     50: main(argc, argv)
                     51: int    argc;
                     52: char   **argv;
                     53: {
                     54:        double  xd, yd;
                     55:        long    id;
                     56:        register double *x = &xd;
                     57:        register double *y = &yd;
                     58:        register long   *i = &id;
                     59: 
                     60:        setbuf(stdout, buf);
                     61:        getargs(argc, argv);
                     62:        if (randomize) {
                     63:                *x = (ender - begin) * (ender > begin ? 1 : -1);
                     64:                SRAND((int) s);
                     65:                for (*i = 1; *i <= reps || infinity; (*i)++) {
                     66:                        *y = (double) RAND() / LARGESTINT;
                     67:                        putdata(*y * *x + begin, reps - *i);
                     68:                }
                     69:        }
                     70:        else
                     71:                for (*i = 1, *x = begin; *i <= reps || infinity; (*i)++, *x += s)
                     72:                        putdata(*x, reps - *i);
                     73:        if (!nofinalnl)
                     74:                putchar('\n');
                     75:        exit(0);
                     76: }
                     77: 
                     78: getargs(ac, av)
                     79: int    ac;
                     80: char   **av;
                     81: {
                     82:        register unsigned int   mask = 0;
                     83:        register int            n = 0;
                     84: 
                     85:        while (--ac && **++av == '-' && !isdefault(*av))
                     86:                switch ((*av)[1]) {
                     87:                case 'r':
                     88:                        randomize = 1;
                     89:                        break;
                     90:                case 'c':
                     91:                        chardata = 1;
                     92:                        break;
                     93:                case 'n':
                     94:                        nofinalnl = 1;
                     95:                        break;
                     96:                case 'b':
                     97:                        boring = 1;
                     98:                case 'w':
                     99:                        if ((*av)[2])
                    100:                                strcpy(format, *av + 2);
                    101:                        else if (!--ac)
                    102:                                error("Need context word after -w or -b", "");
                    103:                        else
                    104:                                strcpy(format, *++av);
                    105:                        break;
                    106:                case 's':
                    107:                        if ((*av)[2])
                    108:                                strcpy(sepstring, *av + 2);
                    109:                        else if (!--ac)
                    110:                                error("Need string after -s", "");
                    111:                        else
                    112:                                strcpy(sepstring, *++av);
                    113:                        break;
                    114:                case 'p':
                    115:                        if ((*av)[2])
                    116:                                prec = atoi(*av + 2);
                    117:                        else if (!--ac)
                    118:                                error("Need number after -p", "");
                    119:                        else
                    120:                                prec = atoi(*++av);
                    121:                        if (prec <= 0)
                    122:                                error("Bad precision value", "");
                    123:                        break;
                    124:                default:
                    125:                        error("Unknown option %s", *av);
                    126:                }
                    127:        switch (ac) {   /* examine args right to left, falling thru cases */
                    128:        case 4:
                    129:                if (!isdefault(av[3])) {
                    130:                        if (!sscanf(av[3], "%F", &s))
                    131:                                error("Bad s value:  %s", av[3]);
                    132:                        mask |= 01;
                    133:                }
                    134:        case 3:
                    135:                if (!isdefault(av[2])) {
                    136:                        if (!sscanf(av[2], "%F", &ender))
                    137:                                ender = av[2][strlen(av[2])-1];
                    138:                        mask |= 02;
                    139:                        if (!prec)
                    140:                                n = getprec(av[2]);
                    141:                }
                    142:        case 2:
                    143:                if (!isdefault(av[1])) {
                    144:                        if (!sscanf(av[1], "%F", &begin))
                    145:                                begin = av[1][strlen(av[1])-1];
                    146:                        mask |= 04;
                    147:                        if (!prec)
                    148:                                prec = getprec(av[1]);
                    149:                        if (n > prec)           /* maximum precision */
                    150:                                prec = n;
                    151:                }
                    152:        case 1:
                    153:                if (!isdefault(av[0])) {
                    154:                        if (!sscanf(av[0], "%D", &reps))
                    155:                                error("Bad reps value:  %s", av[0]);
                    156:                        mask |= 010;
                    157:                }
                    158:                break;
                    159:        case 0:
                    160:                error("jot - print sequential or random data", "");
                    161:        default:
                    162:                error("Too many arguments.  What do you mean by %s?", av[4]);
                    163:        }
                    164:        getformat();
                    165:        while (mask)    /* 4 bit mask has 1's where last 4 args were given */
                    166:                switch (mask) { /* fill in the 0's by default or computation */
                    167:                CASE 001:
                    168:                        reps = REPS_DEF;
                    169:                        mask = 011;
                    170:                CASE 002:
                    171:                        reps = REPS_DEF;
                    172:                        mask = 012;
                    173:                CASE 003:
                    174:                        reps = REPS_DEF;
                    175:                        mask = 013;
                    176:                CASE 004:
                    177:                        reps = REPS_DEF;
                    178:                        mask = 014;
                    179:                CASE 005:
                    180:                        reps = REPS_DEF;
                    181:                        mask = 015;
                    182:                CASE 006:
                    183:                        reps = REPS_DEF;
                    184:                        mask = 016;
                    185:                CASE 007:
                    186:                        if (randomize) {
                    187:                                reps = REPS_DEF;
                    188:                                mask = 0;
                    189:                                break;
                    190:                        }
                    191:                        if (s == 0.0) {
                    192:                                reps = 0;
                    193:                                mask = 0;
                    194:                                break;
                    195:                        }
                    196:                        reps = (ender - begin + s) / s;
                    197:                        if (reps <= 0)
                    198:                                error("Impossible stepsize", "");
                    199:                        mask = 0;
                    200:                CASE 010:
                    201:                        begin = BEGIN_DEF;
                    202:                        mask = 014;
                    203:                CASE 011:
                    204:                        begin = BEGIN_DEF;
                    205:                        mask = 015;
                    206:                CASE 012:
                    207:                        s = (randomize ? time(0) : STEP_DEF);
                    208:                        mask = 013;
                    209:                CASE 013:
                    210:                        if (randomize)
                    211:                                begin = BEGIN_DEF;
                    212:                        else if (reps == 0)
                    213:                                error("Must specify begin if reps == 0", "");
                    214:                        begin = ender - reps * s + s;
                    215:                        mask = 0;
                    216:                CASE 014:
                    217:                        s = (randomize ? time(0) : STEP_DEF);
                    218:                        mask = 015;
                    219:                CASE 015:
                    220:                        if (randomize)
                    221:                                ender = ENDER_DEF;
                    222:                        else
                    223:                                ender = begin + reps * s - s;
                    224:                        mask = 0;
                    225:                CASE 016:
                    226:                        if (randomize)
                    227:                                s = time(0);
                    228:                        else if (reps == 0)
                    229:                                error("Infinite sequences cannot be bounded", "");
                    230:                        else if (reps == 1)
                    231:                                s = 0.0;
                    232:                        else
                    233:                                s = (ender - begin) / (reps - 1);
                    234:                        mask = 0;
                    235:                CASE 017:
                    236:                        if (!randomize && s != 0.0) {   /* if reps given and implied, */
                    237:                                long t = (ender - begin + s) / s;
                    238:                                if (t <= 0)
                    239:                                        error("Impossible stepsize", "");
                    240:                                if (t < reps)           /* take lesser */
                    241:                                        reps = t;
                    242:                        }
                    243:                        mask = 0;
                    244:                        break;
                    245:                default:
                    246:                        error("Bad mask", "");
                    247:                }
                    248:        if (reps == 0)
                    249:                infinity = 1;
                    250: }
                    251: 
                    252: putdata(x, notlast)
                    253: double x;
                    254: long   notlast;
                    255: {
                    256:        long            d = x;
                    257:        register long   *dp = &d;
                    258: 
                    259:        if (boring)                             /* repeated word */
                    260:                printf(format);
                    261:        else if (dox)                           /* scalar */
                    262:                printf(format, *dp);
                    263:        else                                    /* real */
                    264:                printf(format, x);
                    265:        if (notlast != 0)
                    266:                fputs(sepstring, stdout);
                    267: }
                    268: 
                    269: error(msg, s)
                    270: char   *msg;
                    271: char   *s;
                    272: {
                    273:        char    buf[BUFSIZ];
                    274: 
                    275:        setbuf(stderr, buf);
                    276:        fprintf(stderr, "jot: ");
                    277:        fprintf(stderr, msg, s);
                    278:        fprintf(stderr, "\nUsage:  jot [ options ] [ reps [ begin [ end [ s ] ] ] ]\n");
                    279:        if (strncmp("jot - ", msg, 6) == 0)
                    280:                fprintf(stderr, "Options:\n\t%s\t%s\t%s\t%s\t%s\t%s",
                    281:                        "-r             random data\n",
                    282:                        "-c             character data\n",
                    283:                        "-n             no final newline\n",
                    284:                        "-b word                repeated word\n",
                    285:                        "-w word                context word\n",
                    286:                        "-s string      data separator\n",
                    287:                        "-p precision   number of characters\n");
                    288:        exit(1);
                    289: }
                    290: 
                    291: getprec(s)
                    292: char   *s;
                    293: {
                    294:        register char   *p;
                    295:        register char   *q;
                    296: 
                    297:        for (p = s; *p; p++)
                    298:                if (*p == '.')
                    299:                        break;
                    300:        if (!*p)
                    301:                return(0);
                    302:        for (q = ++p; *p; p++)
                    303:                if (!isdigit(*p))
                    304:                        break;
                    305:        return(p - q);
                    306: }
                    307: 
                    308: getformat()
                    309: {
                    310:        register char   *p;
                    311: 
                    312:        if (boring)                             /* no need to bother */
                    313:                return;
                    314:        for (p = format; *p; p++)               /* look for '%' */
                    315:                if (*p == '%' && *(p+1) != '%') /* leave %% alone */
                    316:                        break;
                    317:        if (!*p && !chardata)
                    318:                sprintf(p, "%%.%df", prec);
                    319:        else if (!*p && chardata) {
                    320:                strcpy(p, "%c");
                    321:                dox = 1;
                    322:        }
                    323:        else if (!*(p+1))
                    324:                strcat(format, "%");            /* cannot end in single '%' */
                    325:        else {
                    326:                while (!isalpha(*p))
                    327:                        p++;
                    328:                switch (*p) {
                    329:                case 'f': case 'e': case 'g': case '%':
                    330:                        break;
                    331:                case 's':
                    332:                        error("Cannot convert numeric data to strings", "");
                    333:                        break;
                    334:                /* case 'd': case 'o': case 'x': case 'D': case 'O': case 'X':
                    335:                case 'c': case 'u': */
                    336:                default:
                    337:                        dox = 1;
                    338:                        break;
                    339:                }
                    340:        }
                    341: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.