/*
- * 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 <sys/types.h>
#include <sys/ioctl.h>
+#include <errno.h>
#include <stdio.h>
-#include <strings.h>
+#include <stdlib.h>
+#include <string.h>
#include <ctype.h>
+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"))
} 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;
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;
putchar('\n');
}
+void
r_columnate()
{
register int base, chcnt, cnt, col;
}
}
+void
print()
{
register int cnt;
} TBL;
#define DEFCOLS 25
+void
maketbl()
{
register TBL *t;
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]);
#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)
maxlength = len;
if (entries == maxentry) {
maxentry += DEFNUM;
- if (!(list =
- (char **)realloc((char *)list,
+ if (!(list = realloc(list,
(u_int)maxentry * sizeof(char *))))
nomem();
}
}
}
-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,