AUSAM/source/S/banner.c

Compare this file to the similar file:
Show the results in this format:

#
/*
 *	banner [-] [ "string" ... ]
 */


#define nchars	64	/*number of chars in char set*/
#define nlines	6	/*number of lines in a banner character*/
#define pposs	129	/*number of print positions on a line (must be multiple of 4)*/
			/*followed by end of string character*/
#define	pospch	8	/*number of char positions per banner char*/
int	chpln	10;	/*number of banner characters per line*/

struct bann
{
	  char alpha[nlines][pposs];
};


struct bann buffer,*bp &buffer;


char ctbl[nchars][nlines]
{
	036,041,047,051,046,036,	/*@*/
	014,022,041,077,041,041,	/*A*/
	076,041,076,041,041,076,	/*B*/
	036,041,040,040,041,036,	/*C*/
	076,041,041,041,041,076,	/*D*/
	077,040,076,040,040,077,	/*E*/
	077,040,076,040,040,040,	/*F*/
	036,041,040,047,041,036,	/*G*/
	041,041,077,041,041,041,	/*H*/
	004,004,004,004,004,004,	/*I*/
	001,001,001,001,041,036,	/*J*/
	041,042,074,044,042,041,	/*K*/
	040,040,040,040,040,077,	/*L*/
	041,063,055,041,041,041,	/*M*/
	041,061,051,045,043,041,	/*N*/
	036,041,041,041,041,036,	/*O*/
	076,041,041,076,040,040,	/*P*/
	036,041,041,045,042,035,	/*Q*/
	076,041,041,076,042,041,	/*R*/
	036,040,036,001,041,036,	/*S*/
	037,004,004,004,004,004,	/*T*/
	041,041,041,041,041,036,	/*U*/
	041,041,041,041,022,014,	/*V*/
	041,041,041,055,063,041,	/*W*/
	041,022,014,014,022,041,	/*X*/
	021,012,004,004,004,004,	/*Y*/
	077,002,004,010,020,077,	/*Z*/
	016,010,010,010,010,016,	/*[*/
	040,020,010,004,002,001,	/*\*/
	034,004,004,004,004,034,	/*]*/
	004,012,000,000,000,000,	/*^*/
	000,000,000,000,000,077,	/*_*/
	000,000,000,000,000,000,	/* */
	010,010,010,010,000,010,	/*!*/
	022,022,000,000,000,000,	/*"*/
	022,077,022,022,077,022,	/*#*/
	036,054,036,015,055,036,	/*$*/
	001,062,064,013,023,040,	/*%*/
	014,022,014,024,042,035,	/*&*/
	010,010,000,000,000,000,	/*'*/
	004,010,010,010,010,004,	/*(*/
	010,004,004,004,004,010,	/*)*/
	000,022,014,014,022,000,	/***/
	000,010,010,076,010,010,	/*+*/
	000,000,000,014,004,010,	/*,*/
	000,000,000,037,000,000,	/*-*/
	000,000,000,000,014,014,	/*.*/
	001,002,004,010,020,040,	/*/*/
	014,022,045,051,022,014,	/*0*/
	010,030,010,010,010,034,	/*1*/
	034,042,002,014,020,076,	/*2*/
	034,042,014,002,042,034,	/*3*/
	020,020,024,037,004,004,	/*4*/
	037,040,036,001,001,036,	/*5*/
	004,010,024,031,021,016,	/*6*/
	037,001,002,004,010,020,	/*7*/
	016,021,016,021,021,016,	/*8*/
	016,021,023,015,002,004,	/*9*/
	000,014,014,000,014,014,	/*:*/
	000,014,000,014,004,010,	/*;*/
	000,004,010,020,010,004,	/*<*/
	000,000,037,000,037,000,	/*=*/
	000,010,004,002,004,010,	/*>*/
	016,021,006,004,000,004,	/*?*/
};

char	blank	' ';
char	plot	'@';
int	msk	040;	/* mask at sixth bit */
char	buf[512];



main(argc,argp)
char **argp;int argc;
{
	int i;

	if ( argc > 1 && *argp[1] == '-' )
	{
		argc--;
		argp++;
		chpln = 16;	/* assume 132 cols */
	}

	if(argc<2)
		while ( i = read( 0 , buf , 512 ) )
		{
			buf[i-1] = '\0';
			banner( buf , bp );
			banprt( bp );
		}
	else
		while ( --argc )
		{
			banner(*++argp,bp);
			banprt(bp);
		}

	return( 0 );
}



banner(s,bufp)
char *s;struct bann *bufp;
{
	char c,*p,*q,*r;

	p = s;
	r = bufp;
	banset(blank,bufp);

	while((c = *s++)!=0)
	{
		if((s-p)>chpln)return(s-p);
		if(c>='`')c =- ' ';	/*map lower to upper case*/
		if(c<' ')c='#';
		if(c>'?')c=- 0100;
		q=ctbl[c];
		banfil(q,r);
		r=+pospch;
	}
}


banfil(c,p)
char *c;
struct bann *p;
{
	int i,j;

	for(i=0;i<nlines;i++)
	{
		for(j=0;j<pospch;j++)
		{
			if(((c[i]<<j)&msk)!=0)p->alpha[i][j] = plot;
		}
	}
	return(0);
}


banset(c,p)
char c;
struct bann *p;
{
	int i,j;

	for(i=0;i<nlines;i++)
		for(j=0;j<pposs-1;j++)
			p->alpha[i][j] = c;
}


banprt(ptr)
struct bann *ptr;
{
	int i,j;

	for(i=0;i<nlines;i++)
	{
		ptr->alpha[i][pposs-1]='\0';
		for(j=pposs-2;j>=0;j--)
		{
			if(ptr->alpha[i][j]!=blank)break;
			ptr->alpha[i][j]='\0';
		}
		printf("%s\n",ptr->alpha[i]);
	}
}


printf( s , a )
  register char *s;
{
	static		vcol, col;
	register	*p;
	char		c;

  p = &a;

  while ( c = *s++ )
  {
loop:
	switch ( c )
	{
		case '%':	switch ( c = *s++ )
				{
					case 0:		return;
					case 's':	printf( *p++ );
							continue;
				}
				goto loop;

		case '\t':	vcol =| 7;
		case ' ':	vcol++;
				continue;

		case '\n':	vcol = col = 0;
				break;

		default:	while ( (vcol & ~7) > col )
				{
					write( 1 , "\t" , 1 );
					col =| 7;  col++;
				}
				while ( vcol > col )
				{
					write( 1 , " " , 1 );
					col++;
				}
				col++;
				vcol++;
	}
	write( 1 , &c , 1 );
  }
}