for (i = 0; i < ocols; i++) {
for (ep = elem, i = 0; i < ocols; i++) {
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));#define INCR(ep) do {			\	if (++ep >= endelem)		\		ep = getptrs(ep);	\} while(0)intmain(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);}voidgetfile(){	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;			INCR(ep);		/* prepare for next entry */			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;			INCR(ep);		/* prepare for next entry */		}		irows++;			/* update row count */		if (nullpad) {			/* pad missing entries */			padto = elem + irows * icols;			while (ep < padto) {				*ep = "";				INCR(ep);			}		}	} while (getline() != EOF);	*ep = 0;				/* mark end of pointers */	nelem = ep - elem;}voidputfile(){	register char **ep;	register int i, j, n;	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 (n = 0, i = 0; i < orows && n < nelem; i++) {			for (j = 0; j < ocols; j++) {				if (n++ >= nelem)					break;				prints(*ep++, j);			}			putchar('\n');		}	}}voidprints(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);}voidusage(msg, s)	char *msg, *s;{	warnx(msg, s);	fprintf(stderr,"Usage:  rs [ -[csCS][x][kKgGw][N]tTeEnyjhHm ] [ rows [ cols ] ]\n");	exit(1);}voidprepfile(){	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) {			warnx("Display width %d is less than column width %d",			    owidth, colw);			ocols = 1;		}		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))))		errx(1, "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	2048char	ibuf[BSIZE];		/* two screenfuls should do */intgetline()	/* 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)))			errx(1, "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;	allocsize += allocsize;	p = (char **)realloc(elem, allocsize * sizeof(char *));	if (p == (char **)0)		err(1, "no memory");	sp += (p - elem);	endelem = (elem = p) + allocsize;	return(sp);}voidgetargs(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)				usage("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:				usage("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:		usage("Too many arguments.", "");	}}char *getlist(list, p)	short **list;	char *p;{	register int count = 1;	register char *t;	for (t = p + 1; *t; t++) {		if (!isdigit(*t))			usage("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))))		errx(1, "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);}