/*
 *	improved banner program
 *
 * Taken from a unix sig distribution tape.
 *
 * Modified for vms/decus by Martin Minow.
 */


#include <stdio.h>

#define LINESIZE	256

/*
 *	bit pattern character table
 */

char btab[][7] =
{
	010,	010,	010,	010,	010,	00,	010,
	024,	024,	024,	00,	00,	00,	00,
	024,	024,	0177,	024,	0177,	024,	024,
	010,	034,	050,	034,	012,	034,	010,
	0161,	0122,	0164,	010,	027,	045,	0107,
	034,	042,	024,	010,	025,	042,	035,
	04,	010,	020,	00,	00,	00,	00,
	01,	02,	04,	04,	04,	02,	01,
	0100,	040,	020,	020,	020,	040,	0100,
	0111,	052,	034,	0177,	034,	052,	0111,
	00,	010,	010,	076,	010,	010,	00,
	00,	00,	00,	00,	00,	040,	0100,
	00,	00,	00,	074,	00,	00,	00,
	00,	00,	00,	00,	00,	00,	040,
	01,	02,	04,	010,	020,	040,	0100,
	034,	042,	0105,	0111,	0121,	042,	034,
	030,	010,	010,	010,	010,	010,	034,
	034,	042,	02,	04,	010,	020,	076,
	034,	042,	02,	04,	02,	042,	034,
	02,	06,	012,	022,	077,	02,	02,
	076,	040,	040,	074,	02,	042,	034,
	02,	04,	010,	036,	041,	041,	036,
	077,	01,	02,	04,	010,	020,	040,
	034,	042,	042,	034,	042,	042,	034,
	036,	041,	041,	036,	04,	010,	020,
	00,	00,	00,	010,	00,	010,	00,
	00,	00,	00,	010,	00,	010,	020,
	02,	04,	010,	020,	010,	04,	02,
	00,	00,	074,	00,	074,	00,	00,
	040,	020,	010,	04,	010,	020,	040,
	034,	042,	02,	04,	010,	00,	010,
	076,	0101,	0117,	0111,	0117,	0100,	076,
	034,	042,	0101,	0177,	0101,	0101,	0101,
	0176,	0101,	0101,	0176,	0101,	0101,	0176,
	034,	042,	0100,	0100,	0100,	042,	034,
	0174,	0102,	0101,	0101,	0101,	0102,	0174,
	0176,	0100,	0100,	0170,	0100,	0100,	0176,
	0176,	0100,	0100,	0170,	0100,	0100,	0100,
	036,	041,	0100,	0100,	0107,	041,	036,
	0101,	0101,	0101,	0177,	0101,	0101,	0101,
	034,	010,	010,	010,	010,	010,	034,
	02,	02,	02,	02,	02,	042,	034,
	0102,	0104,	0110,	0120,	0150,	0104,	0102,
	0100,	0100,	0100,	0100,	0100,	0100,	0176,
	0101,	0143,	0125,	0111,	0101,	0101,	0101,
	0101,	0141,	0121,	0111,	0105,	0103,	0101,
	076,	0101,	0101,	0101,	0101,	0101,	076,
	0176,	0101,	0101,	0176,	0100,	0100,	0100,
	076,	0101,	0101,	0111,	0105,	0102,	075,
	0176,	0101,	0101,	0176,	0104,	0102,	0101,
	076,	0101,	0100,	076,	01,	0101,	076,
	0177,	010,	010,	010,	010,	010,	010,
	0101,	0101,	0101,	0101,	0101,	0101,	076,
	0101,	0101,	0101,	0101,	042,	024,	010,
	0101,	0101,	0101,	0111,	0125,	0143,	0101,
	0101,	042,	024,	010,	024,	042,	0101,
	0101,	042,	024,	010,	010,	010,	010,
	0177,	02,	04,	010,	020,	040,	0177,
	07,	04,	04,	04,	04,	04,	07,
	0100,	040,	020,	010,	04,	02,	01,
	0160,	020,	020,	020,	020,	020,	0160,
	010,	024,	042,	0101,	00,	00,	00,
	00,	00,	00,	00,	00,	00,	0177,
	020,	010,	04,	00,	00,	00,	00,
	00,	076,	02,	076,	042,	077,	00,
	040,	040,	074,	042,	042,	0174,	00,
	00,	036,	040,	040,	040,	036,	00,
	02,	02,	036,	042,	042,	037,	00,
	00,	036,	041,	077,	040,	036,	00,
	010,	024,	020,	070,	020,	020,	00,
	00,	034,	042,	042,	036,	02,	014,
	040,	040,	076,	041,	041,	041,	00,
	010,	00,	010,	010,	010,	034,	00,
	02,	00,	02,	02,	02,	022,	014,
	040,	044,	050,	060,	050,	044,	00,
	030,	010,	010,	010,	010,	034,	00,
	00,	0166,	0111,	0111,	0111,	0111,	00,
	00,	076,	041,	041,	041,	041,	00,
	00,	036,	041,	041,	041,	036,	00,
	00,	074,	042,	042,	074,	040,	040,
	00,	036,	042,	042,	036,	02,	03,
	00,	054,	042,	040,	040,	040,	00,
	00,	036,	040,	036,	01,	036,	00,
	020,	074,	020,	020,	022,	014,	00,
	00,	041,	041,	041,	041,	035,	00,
	00,	042,	042,	024,	024,	010,	00,
	00,	0101,	0101,	0111,	0111,	066,	00,
	00,	042,	024,	010,	024,	042,	00,
	00,	042,	042,	042,	036,	02,	014,
	00,	076,	04,	010,	020,	076,	00,
	03,	04,	04,	030,	04,	04,	03,
	010,	010,	010,	010,	010,	010,	010,
	0140,	020,	020,	014,	020,	020,	0140,
	060,	0111,	06,	00,	00,	00,	00,
	0177,	0177,	0177,	0177,	0177,	0177,	0177
};

/*
 * subroutine to make the characters for a banner
 */

char *
mkline(s,prch,line,space)
char *s, prch, *space;
int line;
{
	register char *rs, *rl;
	register int bit;
	int i, j, m;
	rl = space;
	for (i = 0; i < 7; i++)
	{
		j = 0;
		for (rs = s; *rs && j < line; j++)
		{
			bit = (bit=(*rs++&0177)-'!') < 0 ? 0 : btab[bit][i];
			for (m = 0100; bit; m >>= 1)
			{
				*rl++ = m&bit ? (prch ? prch : rs[-1]) : ' ';
				bit &= ~m;
			}
			*rl++ = '\t';
		}
		while (*--rl == '\t');
		++rl;
		*rl++ = '\n';
	}
	*rl = '\0';
	return(space);
}

main(argc,argv)
int argc;
char **argv;
{
	register char prch, *space;
	static char buf[LINESIZE];
	register int line;
	extern char *malloc();
	prch = '*';
	line = 10;
	while (argc > 1 && **++argv == '-')
	{
		--argc;
		switch(*++*argv | 040)
		{
		case 'c':		/* char to use			*/
			prch = *++*argv;
			break;
		case 'l':		/* line width			*/
		case 'w':
			line = atoi(++*argv)>>3;
			break;
		}
	}
	space = malloc(line*64);
	putchar('\n');
	if (--argc > 0) {
		do
		{
			printf("\n%s",mkline(*argv++,prch,line,space));
			fflush(stdout);
		} while (--argc);
	}
	else
		while (getline(buf))
		{
			printf("\n%s",mkline(buf,prch,line,space));
		 	fflush(stdout);
		}
}

/*
 *	read in a line from the standard input
 */

getline(p)
char *p;
{
#ifndef vms
	register char *q;
	q = p;
	while ((*q = getchar()) != EOF) {
		if (*q++ == '\n') {
			break;
		}
	}
	if (*q == EOF) {
		return(0);
	}
	*++q = '\0';
	return (q-p);
#else
	return(fgetss(p, LINESIZE, stdin) != NULL);
#endif
}
