AUSAM/source/S/message.c

#define	CHPERL	 11	/* characters per line */
#define	LNPERCH	 12	/* lines per character */
#define	CHR	'@'	/* the character printed out */

char letters[] "/usr/lib/letters";
int line[LNPERCH * CHPERL];
char **gargv;
int colcnt;		/* current printing column */
int blanks;		/* blanks since last character */

main(ac, av)
char *av[];
{
	register char c;
	register cnt, *wp;
	int fd, count, linec;

	if ((fd = open(letters, 0)) < 0)
	{
		perror(letters);
		return 1;
	}
	if (ac == 1) prints(2, "\007Go Ahead (11 chars/line; 5 lines/page)\n");
	else gargv = ++av;
	for (;;)
	{
		for (count = 0; count < CHPERL; count++)
		{
			if ((c = getch()) == '\n' || c == 0) break;
			if (c < ' ')
			{
				prints(2, "Control-chrs. not allowed.\n");
				c = ' ';
			}
			seek(fd, (c - ' ') * 2 * LNPERCH, 0);
			if (read(fd, &line[count * LNPERCH], 2 * LNPERCH) != 2 * LNPERCH)
			{
				perror(letters);
				return 1;
			}
		}
		if (c == 0 && count == 0) break;
		if (c && c != '\n') while ((c = getch()) && c != '\n');
		for (linec = 0; linec < LNPERCH; linec++)
		{
			wp = &line[linec];
			for (cnt = 0; cnt < count; cnt++)
			{
				print(*wp);
				wp =+ LNPERCH;
			}
			putchar('\n');
			blanks = 0;
			colcnt = 0;
		}
		if (c == 0) break;
	}
}


getch()
{
	char c;

	if (gargv)
	{
		if (gargv == -1) return 0;
		if (**gargv) return *(*gargv)++;
		if (*++gargv == -1) return 0;
		return '\n';
	}
	if (read(0, &c, 1) != 1) return 0;
	return c;
}


print(wd)
register wd;
{
	register mask, col;

	mask = 04000;
	do
		if ((wd & mask) == 0) blanks++;
		else
		{
			col = colcnt; colcnt =+ blanks; blanks = col;
			while ((col = (col + 8) & ~07) <= colcnt)
			{
				putchar('\t');
				blanks = col;
			}
			for (col = blanks; col < colcnt; col++) putchar(' ');
			blanks = 0;
			colcnt++;
			putchar(CHR);
		}
	while (mask =>> 1);
}