X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/blobdiff_plain/ff1bcce4ae6bfef07581e0aa7f5d30ede9ee2027..ad7871609881e73855d0b04da49b486cd93efca7:/usr/src/usr.bin/column/column.c diff --git a/usr/src/usr.bin/column/column.c b/usr/src/usr.bin/column/column.c index 7888ec0e5e..456a3a3341 100644 --- a/usr/src/usr.bin/column/column.c +++ b/usr/src/usr.bin/column/column.c @@ -1,53 +1,80 @@ /* - * Copyright (c) 1989 The Regents of the University of California. - * All rights reserved. + * Copyright (c) 1989, 1993 + * The Regents of the University of California. All rights reserved. * - * Redistribution and use in source and binary forms are permitted - * provided that the above copyright notice and this paragraph are - * duplicated in all such forms and that any documentation, - * advertising materials, and other materials related to such - * distribution and use acknowledge that the software was developed - * by the University of California, Berkeley. The name of the - * University may not be used to endorse or promote products derived - * from this software without specific prior written permission. - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + * 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 -char copyright[] = -"@(#) Copyright (c) 1989 The Regents of the University of California.\n\ - All rights reserved.\n"; +static char copyright[] = +"@(#) Copyright (c) 1989, 1993\n\ + The Regents of the University of California. All rights reserved.\n"; #endif /* not lint */ #ifndef lint -static char sccsid[] = "@(#)column.c 5.3 (Berkeley) %G%"; +static char sccsid[] = "@(#)column.c 8.1 (Berkeley) 6/6/93"; #endif /* not lint */ #include #include +#include #include -#include +#include +#include #include +void c_columnate __P((void)); +void *emalloc __P((int)); +void input __P((FILE *)); +void maketbl __P((void)); +void nomem __P((void)); +void print __P((void)); +void r_columnate __P((void)); +void usage __P((void)); + int termwidth = 80; /* default terminal width */ -char **list; /* array of pointers to records */ int entries; /* number of records */ int eval; /* exit value */ int maxlength; /* longest record */ +char **list; /* array of pointers to records */ +char *separator = "\t "; /* field separator for table option */ +int main(argc, argv) int argc; char **argv; { - extern char *optarg; - extern int errno, optind; struct winsize win; FILE *fp; int ch, tflag, xflag; - char *p, *getenv(); + char *p; if (ioctl(1, TIOCGWINSZ, &win) == -1 || !win.ws_col) { if (p = getenv("COLUMNS")) @@ -55,12 +82,15 @@ main(argc, argv) } else termwidth = win.ws_col; - xflag = 0; - while ((ch = getopt(argc, argv, "c:tx")) != EOF) + tflag = xflag = 0; + while ((ch = getopt(argc, argv, "c:s:tx")) != EOF) switch(ch) { case 'c': termwidth = atoi(optarg); break; + case 's': + separator = optarg; + break; case 't': tflag = 1; break; @@ -91,18 +121,17 @@ main(argc, argv) if (tflag) maketbl(); - else { - if (maxlength >= termwidth) - print(); - if (xflag) - c_columnate(); - else - r_columnate(); - } + else if (maxlength >= termwidth) + print(); + else if (xflag) + c_columnate(); + else + r_columnate(); exit(eval); } #define TAB 8 +void c_columnate() { register int chcnt, col, cnt, numcols; @@ -132,6 +161,7 @@ c_columnate() putchar('\n'); } +void r_columnate() { register int base, chcnt, cnt, col; @@ -159,6 +189,7 @@ r_columnate() } } +void print() { register int cnt; @@ -174,6 +205,7 @@ typedef struct _tbl { } TBL; #define DEFCOLS 25 +void maketbl() { register TBL *t; @@ -181,26 +213,26 @@ maketbl() register char *p, **lp; int *lens, maxcols; TBL *tbl; - char **cols, *emalloc(), *realloc(); + char **cols; - t = tbl = (TBL *)emalloc(entries * sizeof(TBL)); - cols = (char **)emalloc((maxcols = DEFCOLS) * sizeof(char *)); - lens = (int *)emalloc(maxcols * sizeof(int)); + t = tbl = emalloc(entries * sizeof(TBL)); + cols = emalloc((maxcols = DEFCOLS) * sizeof(char *)); + lens = emalloc(maxcols * sizeof(int)); for (cnt = 0, lp = list; cnt < entries; ++cnt, ++lp, ++t) { - for (coloff = 0, p = *lp; cols[coloff] = strtok(p, "\t "); + for (coloff = 0, p = *lp; cols[coloff] = strtok(p, separator); p = NULL) if (++coloff == maxcols) { - if (!(cols = (char **)realloc((char *)cols, - (u_int)maxcols + DEFCOLS * sizeof(char *))) || - !(lens = (int *)realloc((char *)lens, + if (!(cols = realloc(cols, (u_int)maxcols + + DEFCOLS * sizeof(char *))) || + !(lens = realloc(lens, (u_int)maxcols + DEFCOLS * sizeof(int)))) nomem(); bzero((char *)lens + maxcols * sizeof(int), DEFCOLS * sizeof(int)); maxcols += DEFCOLS; } - t->list = (char **)emalloc(coloff * sizeof(char *)); - t->len = (int *)emalloc(coloff * sizeof(int)); + t->list = emalloc(coloff * sizeof(char *)); + t->len = emalloc(coloff * sizeof(int)); for (t->cols = coloff; --coloff >= 0;) { t->list[coloff] = cols[coloff]; t->len[coloff] = strlen(cols[coloff]); @@ -219,16 +251,17 @@ maketbl() #define DEFNUM 1000 #define MAXLINELEN (2048 + 1) +void input(fp) register FILE *fp; { static int maxentry; register int len; register char *p; - char buf[MAXLINELEN], *emalloc(), *realloc(); + char buf[MAXLINELEN]; if (!list) - list = (char **)emalloc((maxentry = DEFNUM) * sizeof(char *)); + list = emalloc((maxentry = DEFNUM) * sizeof(char *)); while (fgets(buf, MAXLINELEN, fp)) { for (p = buf; *p && isspace(*p); ++p); if (!*p) @@ -244,8 +277,7 @@ input(fp) maxlength = len; if (entries == maxentry) { maxentry += DEFNUM; - if (!(list = - (char **)realloc((char *)list, + if (!(list = realloc(list, (u_int)maxentry * sizeof(char *)))) nomem(); } @@ -253,25 +285,26 @@ input(fp) } } -char * +void * emalloc(size) int size; { - char *p, *malloc(); + char *p; - /* NOSTRICT */ - if (!(p = malloc((u_int)size))) + if (!(p = malloc(size))) nomem(); bzero(p, size); return(p); } +void nomem() { (void)fprintf(stderr, "column: out of memory.\n"); exit(1); } +void usage() { (void)fprintf(stderr,