Annotation of 43BSD/contrib/tools/src/rs.c, revision 1.1

1.1     ! root        1: /* Copyright (c) 1983 Regents of the University of California */
        !             2: 
        !             3: #ifndef lint
        !             4: static char sccsid[] = "@(#)rs.c       4.3     (Berkeley)      4/5/86";
        !             5: #endif not lint
        !             6: 
        !             7: /*
        !             8:  *     rs - reshape a data array
        !             9:  *     Author:  John Kunze, Office of Comp. Affairs, UCB
        !            10:  *             BEWARE: lots of unfinished edges
        !            11:  */
        !            12: 
        !            13: #include <stdio.h>
        !            14: #include <ctype.h>
        !            15: 
        !            16: long   flags;
        !            17: #define        TRANSPOSE       000001
        !            18: #define        MTRANSPOSE      000002
        !            19: #define        ONEPERLINE      000004
        !            20: #define        ONEISEPONLY     000010
        !            21: #define        ONEOSEPONLY     000020
        !            22: #define        NOTRIMENDCOL    000040
        !            23: #define        SQUEEZE         000100
        !            24: #define        SHAPEONLY       000200
        !            25: #define        DETAILSHAPE     000400
        !            26: #define        RIGHTADJUST     001000
        !            27: #define        NULLPAD         002000
        !            28: #define        RECYCLE         004000
        !            29: #define        SKIPPRINT       010000
        !            30: #define        ICOLBOUNDS      020000
        !            31: #define        OCOLBOUNDS      040000
        !            32: #define ONEPERCHAR     0100000
        !            33: #define NOARGS         0200000
        !            34: 
        !            35: char   buf[BUFSIZ];
        !            36: short  *colwidths;
        !            37: short  *cord;
        !            38: short  *icbd;
        !            39: short  *ocbd;
        !            40: int    nelem;
        !            41: char   **elem;
        !            42: char   **endelem;
        !            43: char   *curline;
        !            44: int    allocsize = BUFSIZ;
        !            45: int    curlen;
        !            46: int    irows, icols;
        !            47: int    orows, ocols;
        !            48: int    maxlen;
        !            49: int    skip;
        !            50: int    propgutter;
        !            51: char   isep = ' ', osep = ' ';
        !            52: int    owidth = 80, gutter = 2;
        !            53: 
        !            54: char   **getptrs();
        !            55: 
        !            56: main(argc, argv)
        !            57: int    argc;
        !            58: char   **argv;
        !            59: {
        !            60:        setbuf(stdout, buf);
        !            61:        getargs(argc, argv);
        !            62:        getfile();
        !            63:        if (flags & SHAPEONLY) {
        !            64:                printf("%d %d\n", irows, icols);
        !            65:                exit(0);
        !            66:        }
        !            67:        prepfile();
        !            68:        /*fprintf(stderr, "#irows %d icols %d orows %d ocols %d\n",irows,icols,orows,ocols);*/
        !            69:        putfile();
        !            70:        exit(0);
        !            71: }
        !            72: 
        !            73: getfile()
        !            74: {
        !            75:        register char   *p;
        !            76:        register char   *endp;
        !            77:        register char   **ep = 0;
        !            78:        int     multisep = (flags & ONEISEPONLY ? 0 : 1);
        !            79:        int     nullpad = flags & NULLPAD;
        !            80:        char    **padto;
        !            81: 
        !            82:        while (skip--) {
        !            83:                getline();
        !            84:                if (flags & SKIPPRINT)
        !            85:                        puts(curline);
        !            86:        }
        !            87:        getline();
        !            88:        if (flags & NOARGS && curlen < owidth)
        !            89:                flags |= ONEPERLINE;
        !            90:        if (flags & ONEPERLINE)
        !            91:                icols = 1;
        !            92:        else                            /* count cols on first line */
        !            93:                for (p = curline, endp = curline + curlen; p < endp; p++) {
        !            94:                        if (*p == isep && multisep)
        !            95:                                continue;
        !            96:                        icols++;
        !            97:                        while (*p && *p != isep)
        !            98:                                p++;
        !            99:                }
        !           100:        ep = getptrs(elem);
        !           101:        p = curline;
        !           102:        do {
        !           103:                if (flags & ONEPERLINE) {
        !           104:                        *ep++ = curline;
        !           105:                        if (maxlen < curlen)
        !           106:                                maxlen = curlen;
        !           107:                        irows++;
        !           108:                        continue;
        !           109:                }
        !           110:                for (p = curline, endp = curline + curlen; p < endp; p++) {
        !           111:                        if (*p == isep && multisep)
        !           112:                                continue;       /* eat up column separators */
        !           113:                        if (*p == isep)         /* must be an empty column */
        !           114:                                *ep = "";
        !           115:                        else                    /* store column entry */
        !           116:                                *ep = p;
        !           117:                        while (p < endp && *p != isep)
        !           118:                                p++;            /* find end of entry */
        !           119:                        *p = '\0';              /* mark end of entry */
        !           120:                        if (maxlen < p - *ep)   /* update maxlen */
        !           121:                                maxlen = p - *ep;
        !           122:                        ep++;                   /* prepare for next entry */
        !           123:                }
        !           124:                irows++;                        /* update row count */
        !           125:                if (nullpad) {                  /* pad missing entries */
        !           126:                        padto = elem + irows * icols;
        !           127:                        while  (ep < padto)
        !           128:                                *ep++ = "";
        !           129:                }
        !           130:        if (ep > endelem)                       /* if low on pointers */
        !           131:                ep = getptrs(ep);               /* get some more */
        !           132:        } while (getline() != EOF);
        !           133:        *ep = 0;                                /* mark end of pointers */
        !           134:        nelem = ep - elem;
        !           135: }
        !           136: 
        !           137: putfile()
        !           138: {
        !           139:        register char   **ep;
        !           140:        register int    i;
        !           141:        register int    j;
        !           142: 
        !           143:        ep = elem;
        !           144:        if (flags & TRANSPOSE)
        !           145:                for (i = 0; i < orows; i++) {
        !           146:                        for (j = i; j < nelem; j += orows)
        !           147:                                prints(ep[j], (j - i) / orows);
        !           148:                        putchar('\n');
        !           149:                }
        !           150:        else
        !           151:                for (i = 0; i < orows; i++) {
        !           152:                        for (j = 0; j < ocols; j++)
        !           153:                                prints(*ep++, j);
        !           154:                        putchar('\n');
        !           155:                }
        !           156: }
        !           157: 
        !           158: prints(s, col)
        !           159: char   *s;
        !           160: int    col;
        !           161: {
        !           162:        register char   *p = s;
        !           163:        register int    n;
        !           164: 
        !           165:        while (*p)
        !           166:                p++;
        !           167:        n = (flags & ONEOSEPONLY ? 1 : colwidths[col] - (p - s));
        !           168:        if (flags & RIGHTADJUST)
        !           169:                while (n-- > 0)
        !           170:                        putchar(osep);
        !           171:        for (p = s; *p; p++)
        !           172:                putchar(*p);
        !           173:        while (n-- > 0)
        !           174:                putchar(osep);
        !           175: }
        !           176: 
        !           177: error(msg, s)
        !           178: char   *msg;
        !           179: char   *s;
        !           180: {
        !           181:        fprintf(stderr, "rs:  ");
        !           182:        fprintf(stderr, msg, s);
        !           183:        fprintf(stderr, "\nUsage:  rs [ -[csCS][x][kKgGw][N]tTeEnyjhHm ] [ rows [ cols ] ]\n");
        !           184:        exit(1);
        !           185: }
        !           186: 
        !           187: prepfile()
        !           188: {
        !           189:        register char   **ep;
        !           190:        register int    i;
        !           191:        register int    j;
        !           192:        char    **lp;
        !           193:        int     colw;
        !           194:        int     max = 0;
        !           195:        int     n;
        !           196: 
        !           197:        if (!nelem)
        !           198:                exit(0);
        !           199:        gutter += maxlen * propgutter / 100.0;
        !           200:        colw = maxlen + gutter;
        !           201:        if (flags & MTRANSPOSE) {
        !           202:                orows = icols;
        !           203:                ocols = irows;
        !           204:        }
        !           205:        else if (orows == 0 && ocols == 0) {    /* decide rows and cols */
        !           206:                ocols = owidth / colw;
        !           207:                if (ocols == 0)
        !           208:                        fprintf(stderr, "Display width %d is less than column width %d\n", owidth, colw);
        !           209:                if (ocols > nelem)
        !           210:                        ocols = nelem;
        !           211:                orows = nelem / ocols + (nelem % ocols ? 1 : 0);
        !           212:        }
        !           213:        else if (orows == 0)                    /* decide on rows */
        !           214:                orows = nelem / ocols + (nelem % ocols ? 1 : 0);
        !           215:        else if (ocols == 0)                    /* decide on cols */
        !           216:                ocols = nelem / orows + (nelem % orows ? 1 : 0);
        !           217:        lp = elem + orows * ocols;
        !           218:        while (lp > endelem) {
        !           219:                getptrs(elem + nelem);
        !           220:                lp = elem + orows * ocols;
        !           221:        }
        !           222:        if (flags & RECYCLE) {
        !           223:                for (ep = elem + nelem; ep < lp; ep++)
        !           224:                        *ep = *(ep - nelem);
        !           225:                nelem = lp - elem;
        !           226:        }
        !           227:        if (!(colwidths = (short *) malloc(ocols * sizeof(short))))
        !           228:                error("malloc:  No gutter space", "");
        !           229:        if (flags & SQUEEZE) {
        !           230:                if (flags & TRANSPOSE)
        !           231:                        for (ep = elem, i = 0; i < ocols; i++) {
        !           232:                                for (j = 0; j < orows; j++)
        !           233:                                        if ((n = strlen(*ep++)) > max)
        !           234:                                                max = n;
        !           235:                                colwidths[i] = max + gutter;
        !           236:                        }
        !           237:                else
        !           238:                        for (i = 0; i < ocols; i++) {
        !           239:                                for (j = i; j < nelem; j += ocols)
        !           240:                                        if ((n = strlen(ep[j])) > max)
        !           241:                                                max = n;
        !           242:                                colwidths[i] = max + gutter;
        !           243:                        }
        !           244:        }
        !           245:        /*      for (i = 0; i < orows; i++) {
        !           246:                        for (j = i; j < nelem; j += orows)
        !           247:                                prints(ep[j], (j - i) / orows);
        !           248:                        putchar('\n');
        !           249:                }
        !           250:        else
        !           251:                for (i = 0; i < orows; i++) {
        !           252:                        for (j = 0; j < ocols; j++)
        !           253:                                prints(*ep++, j);
        !           254:                        putchar('\n');
        !           255:                }*/
        !           256:        else
        !           257:                for (i = 0; i < ocols; i++)
        !           258:                        colwidths[i] = colw;
        !           259:        if (!(flags & NOTRIMENDCOL)) {
        !           260:                if (flags & RIGHTADJUST)
        !           261:                        colwidths[0] -= gutter;
        !           262:                else
        !           263:                        colwidths[ocols - 1] = 0;
        !           264:        }
        !           265:        n = orows * ocols;
        !           266:        if (n > nelem && (flags & RECYCLE))
        !           267:                nelem = n;
        !           268:        /*for (i = 0; i < ocols; i++)
        !           269:                fprintf(stderr, "%d ",colwidths[i]);
        !           270:        fprintf(stderr, "is colwidths, nelem %d\n", nelem);*/
        !           271: }
        !           272: 
        !           273: #define        BSIZE   2048
        !           274: char   ibuf[BSIZE];            /* two screenfuls should do */
        !           275: 
        !           276: getline()      /* get line; maintain curline, curlen; manage storage */
        !           277: {
        !           278:        register char   *p;
        !           279:        register int    c;
        !           280:        register int    i;
        !           281:        static  int     putlength;
        !           282:        static  char    *endblock = ibuf + BSIZE;
        !           283: 
        !           284:        if (!irows) {
        !           285:                curline = ibuf;
        !           286:                putlength = flags & DETAILSHAPE;
        !           287:        }
        !           288:        else if (skip <= 0) {                   /* don't waste storage */
        !           289:                curline += curlen + 1;
        !           290:                if (putlength)          /* print length, recycle storage */
        !           291:                        printf(" %d line %d\n", curlen, irows);
        !           292:        }
        !           293:        if (!putlength && endblock - curline < BUFSIZ) {   /* need storage */
        !           294:                /*ww = endblock-curline; tt += ww;*/
        !           295:                /*printf("#wasted %d total %d\n",ww,tt);*/
        !           296:                if (!(curline = (char *) malloc(BSIZE)))
        !           297:                        error("File too large", "");
        !           298:                endblock = curline + BSIZE;
        !           299:                /*printf("#endb %d curline %d\n",endblock,curline);*/
        !           300:        }
        !           301:        for (p = curline, i = 1; i < BUFSIZ; *p++ = c, i++)
        !           302:                if ((c = getchar()) == EOF || c == '\n')
        !           303:                        break;
        !           304:        *p = '\0';
        !           305:        curlen = i - 1;
        !           306:        return(c);
        !           307: }
        !           308: 
        !           309: char   **
        !           310: getptrs(sp)
        !           311: char   **sp;
        !           312: {
        !           313:        register char   **p;
        !           314:        register char   **ep;
        !           315: 
        !           316:        for (;;) {
        !           317:                allocsize += allocsize;
        !           318:                if (!(p = (char **) malloc(allocsize * sizeof(char *)))) {
        !           319:                        perror("rs");
        !           320:                        exit(1);
        !           321:                }
        !           322:                if ((endelem = p + allocsize - icols) <= p) {
        !           323:                        free(p);
        !           324:                        continue;
        !           325:                }
        !           326:                if (elem != 0)
        !           327:                        free(elem);
        !           328:                ep = elem;
        !           329:                elem = p;
        !           330:                while (ep < sp)
        !           331:                        *p++ = *ep++;
        !           332:                return(p);
        !           333:        }
        !           334: }
        !           335: 
        !           336: getargs(ac, av)
        !           337: int    ac;
        !           338: char   **av;
        !           339: {
        !           340:        register char   *p;
        !           341:        char    *getnum(), *getlist();
        !           342: 
        !           343:        if (ac == 1) {
        !           344:                flags |= NOARGS | TRANSPOSE;
        !           345:        }
        !           346:        while (--ac && **++av == '-')
        !           347:                for (p = *av+1; *p; p++)
        !           348:                        switch (*p) {
        !           349:                        case 'T':
        !           350:                                flags |= MTRANSPOSE;
        !           351:                        case 't':
        !           352:                                flags |= TRANSPOSE;
        !           353:                                break;
        !           354:                        case 'c':               /* input col. separator */
        !           355:                                flags |= ONEISEPONLY;
        !           356:                        case 's':               /* one or more allowed */
        !           357:                                if (p[1])
        !           358:                                        isep = *++p;
        !           359:                                else
        !           360:                                        isep = '\t';    /* default is ^I */
        !           361:                                break;
        !           362:                        case 'C':
        !           363:                                flags |= ONEOSEPONLY;
        !           364:                        case 'S':
        !           365:                                if (p[1])
        !           366:                                        osep = *++p;
        !           367:                                else
        !           368:                                        osep = '\t';    /* default is ^I */
        !           369:                                break;
        !           370:                        case 'w':               /* window width, default 80 */
        !           371:                                p = getnum(&owidth, p, 0);
        !           372:                                if (owidth <= 0)
        !           373:                                        error("Width must be a positive integer", "");
        !           374:                                break;
        !           375:                        case 'K':                       /* skip N lines */
        !           376:                                flags |= SKIPPRINT;
        !           377:                        case 'k':                       /* skip, do not print */
        !           378:                                p = getnum(&skip, p, 0);
        !           379:                                if (!skip)
        !           380:                                        skip = 1;
        !           381:                                break;
        !           382:                        case 'm':
        !           383:                                flags |= NOTRIMENDCOL;
        !           384:                                break;
        !           385:                        case 'g':               /* gutter space */
        !           386:                                p = getnum(&gutter, p, 0);
        !           387:                                break;
        !           388:                        case 'G':
        !           389:                                p = getnum(&propgutter, p, 0);
        !           390:                                break;
        !           391:                        case 'e':               /* each line is an entry */
        !           392:                                flags |= ONEPERLINE;
        !           393:                                break;
        !           394:                        case 'E':
        !           395:                                flags |= ONEPERCHAR;
        !           396:                                break;
        !           397:                        case 'j':                       /* right adjust */
        !           398:                                flags |= RIGHTADJUST;
        !           399:                                break;
        !           400:                        case 'n':       /* null padding for missing values */
        !           401:                                flags |= NULLPAD;
        !           402:                                break;
        !           403:                        case 'y':
        !           404:                                flags |= RECYCLE;
        !           405:                                break;
        !           406:                        case 'H':                       /* print shape only */
        !           407:                                flags |= DETAILSHAPE;
        !           408:                        case 'h':
        !           409:                                flags |= SHAPEONLY;
        !           410:                                break;
        !           411:                        case 'z':                       /* squeeze col width */
        !           412:                                flags |= SQUEEZE;
        !           413:                                break;
        !           414:                        /*case 'p':
        !           415:                                ipagespace = atoi(++p); (default is 1)
        !           416:                                break;*/
        !           417:                        case 'o':                       /* col order */
        !           418:                                p = getlist(&cord, p);
        !           419:                                break;
        !           420:                        case 'b':
        !           421:                                flags |= ICOLBOUNDS;
        !           422:                                p = getlist(&icbd, p);
        !           423:                                break;
        !           424:                        case 'B':
        !           425:                                flags |= OCOLBOUNDS;
        !           426:                                p = getlist(&ocbd, p);
        !           427:                                break;
        !           428:                        default:
        !           429:                                error("Bad flag:  %.1s", p);
        !           430:                        }
        !           431:        /*if (!osep)
        !           432:                osep = isep;*/
        !           433:        switch (ac) {
        !           434:        /*case 3:
        !           435:                opages = atoi(av[2]);*/
        !           436:        case 2:
        !           437:                ocols = atoi(av[1]);
        !           438:        case 1:
        !           439:                orows = atoi(av[0]);
        !           440:        case 0:
        !           441:                break;
        !           442:        default:
        !           443:                error("Too many arguments.  What do you mean by `%s'?", av[3]);
        !           444:        }
        !           445: }
        !           446: 
        !           447: char   *
        !           448: getlist(list, p)
        !           449: short  **list;
        !           450: char   *p;
        !           451: {
        !           452:        register char   *t;
        !           453:        register int    count = 1;
        !           454: 
        !           455:        for (t = p + 1; *t; t++) {
        !           456:                if (!isdigit(*t))
        !           457:                        error("Option %.1s requires a list of unsigned numbers separated by commas", t);
        !           458:                count++;
        !           459:                while (*t && isdigit(*t))
        !           460:                        t++;
        !           461:                if (*t != ',')
        !           462:                        break;
        !           463:        }
        !           464:        if (!(*list = (short *) malloc(count * sizeof(short))))
        !           465:                error("No list space", "");
        !           466:        count = 0;
        !           467:        for (t = p + 1; *t; t++) {
        !           468:                (*list)[count++] = atoi(t);
        !           469:                printf("++ %d ", (*list)[count-1]);
        !           470:                fflush(stdout);
        !           471:                while (*t && isdigit(*t))
        !           472:                        t++;
        !           473:                if (*t != ',')
        !           474:                        break;
        !           475:        }
        !           476:        (*list)[count] = 0;
        !           477:        return(t - 1);
        !           478: }
        !           479: 
        !           480: char   *
        !           481: getnum(num, p, strict) /* num = number p points to; if (strict) complain */
        !           482: int    *num;                           /* returns pointer to end of num */
        !           483: char   *p;
        !           484: int    strict;
        !           485: {
        !           486:        register char   *t = p;
        !           487: 
        !           488:        if (!isdigit(*++t)) {
        !           489:                if (strict || *t == '-' || *t == '+')
        !           490:                        error("Option %.1s requires an unsigned integer", p);
        !           491:                *num = 0;
        !           492:                return(p);
        !           493:        }
        !           494:        *num = atoi(t);
        !           495:        while (*++t)
        !           496:                if (!isdigit(*t))
        !           497:                        break;
        !           498:        return(--t);
        !           499: }

unix.superglobalmegacorp.com

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