AUSAM/source/S/banner.c
#
/*
* 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 );
}
}