diff options
Diffstat (limited to 'usr.bin/rs/rs.c')
-rw-r--r-- | usr.bin/rs/rs.c | 546 |
1 files changed, 0 insertions, 546 deletions
diff --git a/usr.bin/rs/rs.c b/usr.bin/rs/rs.c deleted file mode 100644 index 429dadc..0000000 --- a/usr.bin/rs/rs.c +++ /dev/null @@ -1,546 +0,0 @@ -/*- - * 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[] = "@(#)rs.c 8.1 (Berkeley) 6/6/93"; -#endif /* not lint */ - -/* - * rs - reshape a data array - * Author: John Kunze, Office of Comp. Affairs, UCB - * BEWARE: lots of unfinished edges - */ - -#include <ctype.h> -#include <stdio.h> -#include <stdlib.h> - -long flags; -#define TRANSPOSE 000001 -#define MTRANSPOSE 000002 -#define ONEPERLINE 000004 -#define ONEISEPONLY 000010 -#define ONEOSEPONLY 000020 -#define NOTRIMENDCOL 000040 -#define SQUEEZE 000100 -#define SHAPEONLY 000200 -#define DETAILSHAPE 000400 -#define RIGHTADJUST 001000 -#define NULLPAD 002000 -#define RECYCLE 004000 -#define SKIPPRINT 010000 -#define ICOLBOUNDS 020000 -#define OCOLBOUNDS 040000 -#define ONEPERCHAR 0100000 -#define NOARGS 0200000 - -short *colwidths; -short *cord; -short *icbd; -short *ocbd; -int nelem; -char **elem; -char **endelem; -char *curline; -int allocsize = BUFSIZ; -int curlen; -int irows, icols; -int orows, ocols; -int maxlen; -int skip; -int propgutter; -char isep = ' ', osep = ' '; -int owidth = 80, gutter = 2; - -void error __P((char *, char *)); -void getargs __P((int, char *[])); -void getfile __P((void)); -int getline __P((void)); -char *getlist __P((short **, char *)); -char *getnum __P((int *, char *, int)); -char **getptrs __P((char **)); -void prepfile __P((void)); -void prints __P((char *, int)); -void putfile __P((void)); - -int -main(argc, argv) - int argc; - char *argv[]; -{ - getargs(argc, argv); - getfile(); - if (flags & SHAPEONLY) { - printf("%d %d\n", irows, icols); - exit(0); - } - prepfile(); - putfile(); - exit(0); -} - -void -getfile() -{ - register char *p; - register char *endp; - register char **ep = 0; - int multisep = (flags & ONEISEPONLY ? 0 : 1); - int nullpad = flags & NULLPAD; - char **padto; - - while (skip--) { - getline(); - if (flags & SKIPPRINT) - puts(curline); - } - getline(); - if (flags & NOARGS && curlen < owidth) - flags |= ONEPERLINE; - if (flags & ONEPERLINE) - icols = 1; - else /* count cols on first line */ - for (p = curline, endp = curline + curlen; p < endp; p++) { - if (*p == isep && multisep) - continue; - icols++; - while (*p && *p != isep) - p++; - } - ep = getptrs(elem); - p = curline; - do { - if (flags & ONEPERLINE) { - *ep++ = curline; - if (maxlen < curlen) - maxlen = curlen; - irows++; - continue; - } - for (p = curline, endp = curline + curlen; p < endp; p++) { - if (*p == isep && multisep) - continue; /* eat up column separators */ - if (*p == isep) /* must be an empty column */ - *ep = ""; - else /* store column entry */ - *ep = p; - while (p < endp && *p != isep) - p++; /* find end of entry */ - *p = '\0'; /* mark end of entry */ - if (maxlen < p - *ep) /* update maxlen */ - maxlen = p - *ep; - ep++; /* prepare for next entry */ - } - irows++; /* update row count */ - if (nullpad) { /* pad missing entries */ - padto = elem + irows * icols; - while (ep < padto) - *ep++ = ""; - } - if (ep > endelem) /* if low on pointers */ - ep = getptrs(ep); /* get some more */ - } while (getline() != EOF); - *ep = 0; /* mark end of pointers */ - nelem = ep - elem; -} - -void -putfile() -{ - register char **ep; - register int i, j; - - ep = elem; - if (flags & TRANSPOSE) - for (i = 0; i < orows; i++) { - for (j = i; j < nelem; j += orows) - prints(ep[j], (j - i) / orows); - putchar('\n'); - } - else - for (i = 0; i < orows; i++) { - for (j = 0; j < ocols; j++) - prints(*ep++, j); - putchar('\n'); - } -} - -void -prints(s, col) - char *s; - int col; -{ - register int n; - register char *p = s; - - while (*p) - p++; - n = (flags & ONEOSEPONLY ? 1 : colwidths[col] - (p - s)); - if (flags & RIGHTADJUST) - while (n-- > 0) - putchar(osep); - for (p = s; *p; p++) - putchar(*p); - while (n-- > 0) - putchar(osep); -} - -void -error(msg, s) - char *msg, *s; -{ - fprintf(stderr, "rs: "); - fprintf(stderr, msg, s); - fprintf(stderr, -"\nUsage: rs [ -[csCS][x][kKgGw][N]tTeEnyjhHm ] [ rows [ cols ] ]\n"); - exit(1); -} - -void -prepfile() -{ - register char **ep; - register int i; - register int j; - char **lp; - int colw; - int max = 0; - int n; - - if (!nelem) - exit(0); - gutter += maxlen * propgutter / 100.0; - colw = maxlen + gutter; - if (flags & MTRANSPOSE) { - orows = icols; - ocols = irows; - } - else if (orows == 0 && ocols == 0) { /* decide rows and cols */ - ocols = owidth / colw; - if (ocols == 0) - fprintf(stderr, "Display width %d is less than column width %d\n", owidth, colw); - if (ocols > nelem) - ocols = nelem; - orows = nelem / ocols + (nelem % ocols ? 1 : 0); - } - else if (orows == 0) /* decide on rows */ - orows = nelem / ocols + (nelem % ocols ? 1 : 0); - else if (ocols == 0) /* decide on cols */ - ocols = nelem / orows + (nelem % orows ? 1 : 0); - lp = elem + orows * ocols; - while (lp > endelem) { - getptrs(elem + nelem); - lp = elem + orows * ocols; - } - if (flags & RECYCLE) { - for (ep = elem + nelem; ep < lp; ep++) - *ep = *(ep - nelem); - nelem = lp - elem; - } - if (!(colwidths = (short *) malloc(ocols * sizeof(short)))) - error("malloc: No gutter space", ""); - if (flags & SQUEEZE) { - if (flags & TRANSPOSE) - for (ep = elem, i = 0; i < ocols; i++) { - for (j = 0; j < orows; j++) - if ((n = strlen(*ep++)) > max) - max = n; - colwidths[i] = max + gutter; - } - else - for (i = 0; i < ocols; i++) { - for (j = i; j < nelem; j += ocols) - if ((n = strlen(ep[j])) > max) - max = n; - colwidths[i] = max + gutter; - } - } - /* for (i = 0; i < orows; i++) { - for (j = i; j < nelem; j += orows) - prints(ep[j], (j - i) / orows); - putchar('\n'); - } - else - for (i = 0; i < orows; i++) { - for (j = 0; j < ocols; j++) - prints(*ep++, j); - putchar('\n'); - }*/ - else - for (i = 0; i < ocols; i++) - colwidths[i] = colw; - if (!(flags & NOTRIMENDCOL)) { - if (flags & RIGHTADJUST) - colwidths[0] -= gutter; - else - colwidths[ocols - 1] = 0; - } - n = orows * ocols; - if (n > nelem && (flags & RECYCLE)) - nelem = n; - /*for (i = 0; i < ocols; i++) - fprintf(stderr, "%d ",colwidths[i]); - fprintf(stderr, "is colwidths, nelem %d\n", nelem);*/ -} - -#define BSIZE 2048 -char ibuf[BSIZE]; /* two screenfuls should do */ - -int -getline() /* get line; maintain curline, curlen; manage storage */ -{ - static int putlength; - static char *endblock = ibuf + BSIZE; - register char *p; - register int c, i; - - if (!irows) { - curline = ibuf; - putlength = flags & DETAILSHAPE; - } - else if (skip <= 0) { /* don't waste storage */ - curline += curlen + 1; - if (putlength) /* print length, recycle storage */ - printf(" %d line %d\n", curlen, irows); - } - if (!putlength && endblock - curline < BUFSIZ) { /* need storage */ - /*ww = endblock-curline; tt += ww;*/ - /*printf("#wasted %d total %d\n",ww,tt);*/ - if (!(curline = (char *) malloc(BSIZE))) - error("File too large", ""); - endblock = curline + BSIZE; - /*printf("#endb %d curline %d\n",endblock,curline);*/ - } - for (p = curline, i = 1; i < BUFSIZ; *p++ = c, i++) - if ((c = getchar()) == EOF || c == '\n') - break; - *p = '\0'; - curlen = i - 1; - return(c); -} - -char ** -getptrs(sp) - char **sp; -{ - register char **p, **ep; - - for (;;) { - allocsize += allocsize; - if (!(p = (char **) malloc(allocsize * sizeof(char *)))) { - perror("rs"); - exit(1); - } - if ((endelem = p + allocsize - icols) <= p) { - free(p); - continue; - } - if (elem != 0) - free(elem); - ep = elem; - elem = p; - while (ep < sp) - *p++ = *ep++; - return(p); - } -} - -void -getargs(ac, av) - int ac; - char *av[]; -{ - register char *p; - - if (ac == 1) { - flags |= NOARGS | TRANSPOSE; - } - while (--ac && **++av == '-') - for (p = *av+1; *p; p++) - switch (*p) { - case 'T': - flags |= MTRANSPOSE; - case 't': - flags |= TRANSPOSE; - break; - case 'c': /* input col. separator */ - flags |= ONEISEPONLY; - case 's': /* one or more allowed */ - if (p[1]) - isep = *++p; - else - isep = '\t'; /* default is ^I */ - break; - case 'C': - flags |= ONEOSEPONLY; - case 'S': - if (p[1]) - osep = *++p; - else - osep = '\t'; /* default is ^I */ - break; - case 'w': /* window width, default 80 */ - p = getnum(&owidth, p, 0); - if (owidth <= 0) - error("Width must be a positive integer", ""); - break; - case 'K': /* skip N lines */ - flags |= SKIPPRINT; - case 'k': /* skip, do not print */ - p = getnum(&skip, p, 0); - if (!skip) - skip = 1; - break; - case 'm': - flags |= NOTRIMENDCOL; - break; - case 'g': /* gutter space */ - p = getnum(&gutter, p, 0); - break; - case 'G': - p = getnum(&propgutter, p, 0); - break; - case 'e': /* each line is an entry */ - flags |= ONEPERLINE; - break; - case 'E': - flags |= ONEPERCHAR; - break; - case 'j': /* right adjust */ - flags |= RIGHTADJUST; - break; - case 'n': /* null padding for missing values */ - flags |= NULLPAD; - break; - case 'y': - flags |= RECYCLE; - break; - case 'H': /* print shape only */ - flags |= DETAILSHAPE; - case 'h': - flags |= SHAPEONLY; - break; - case 'z': /* squeeze col width */ - flags |= SQUEEZE; - break; - /*case 'p': - ipagespace = atoi(++p); (default is 1) - break;*/ - case 'o': /* col order */ - p = getlist(&cord, p); - break; - case 'b': - flags |= ICOLBOUNDS; - p = getlist(&icbd, p); - break; - case 'B': - flags |= OCOLBOUNDS; - p = getlist(&ocbd, p); - break; - default: - error("Bad flag: %.1s", p); - } - /*if (!osep) - osep = isep;*/ - switch (ac) { - /*case 3: - opages = atoi(av[2]);*/ - case 2: - ocols = atoi(av[1]); - case 1: - orows = atoi(av[0]); - case 0: - break; - default: - error("Too many arguments. What do you mean by `%s'?", av[3]); - } -} - -char * -getlist(list, p) - short **list; - char *p; -{ - register int count = 1; - register char *t; - - for (t = p + 1; *t; t++) { - if (!isdigit(*t)) - error("Option %.1s requires a list of unsigned numbers separated by commas", t); - count++; - while (*t && isdigit(*t)) - t++; - if (*t != ',') - break; - } - if (!(*list = (short *) malloc(count * sizeof(short)))) - error("No list space", ""); - count = 0; - for (t = p + 1; *t; t++) { - (*list)[count++] = atoi(t); - printf("++ %d ", (*list)[count-1]); - fflush(stdout); - while (*t && isdigit(*t)) - t++; - if (*t != ',') - break; - } - (*list)[count] = 0; - return(t - 1); -} - -char * -getnum(num, p, strict) /* num = number p points to; if (strict) complain */ - int *num, strict; /* returns pointer to end of num */ - char *p; -{ - register char *t = p; - - if (!isdigit(*++t)) { - if (strict || *t == '-' || *t == '+') - error("Option %.1s requires an unsigned integer", p); - *num = 0; - return(p); - } - *num = atoi(t); - while (*++t) - if (!isdigit(*t)) - break; - return(--t); -} |