V10/games/banner.c
/*%cc -go # %
* Tom Duff, U of Toronto 1976, BTL 1984
*/
#include <stdio.h>
int blankcount;
/*
* Simulated <jerq.h>, <font.h>
* The jerq font format is not very portable. Neither is this code.
*/
struct font{
short n;
char height, ascent;
long unused;
}head;
struct fontchar{
short x;
unsigned char top, bottom;
char left;
unsigned char width;
short slack;
}info[257];
int width;
int *bits;
getfont(fname)
char *fname;
{
register font, size, i, j, v;
char *malloc();
if((font=open(fname, 0))<0){
chdir("/usr/jerq/font");
if((font=open(fname,0))<0)
err("Font open error");
}
read(font, &head, sizeof head);
head.n=((head.n&255)<<8)|((head.n>>8)&255);
if(head.n>256)
err("Font too big");
read(font, info, sizeof info[0]*(head.n+1));
for(i=0;i<=head.n;i++)
info[i].x=((info[i].x&255)<<8)|((info[i].x>>8)&255);
width=(info[head.n].x+31)/32;
size=width*head.height*sizeof(int);
if((bits=(int *)malloc(size))==NULL)
err("Can't alloc");
if(read(font, bits, size)!=size)
err("Bad font");
size/=sizeof(int);
for(i=0;i!=size;i++){
v=0;
for(j=0;j!=4;j++){
v=(v<<8)|(bits[i]&255);
bits[i]>>=8;
}
bits[i]=v;
}
close(font);
}
main(argc, argv)
char *argv[];
{
register i;
register char *k;
char buf[BUFSIZ];
--argc;
argv++;
if(argc>1 && **argv=='-'){
getfont(*argv+1);
--argc;
argv++;
}
else
getfont("tiny");
setbuf(stdout, buf);
while(argc){
for(i=0;i!=head.height;i++){
for(k = *argv;*k;k++)
scanchar(*k, i);
blankcount=0;
putchar('\n');
}
if(--argc!=0)
putchar('\n');
argv++;
}
exit(0);
}
scanchar(c, line){
register char *bitp;
register i;
register x=info[c].x;
register dx=info[c+1].x-x;
register w=info[c].width;
register l=info[c].left;
for(i=0;i!=w;i++){
if(i<l || dx+l<=i)
blankcount++;
else if(fontbit(x+i-l, line)){
while(blankcount){
putchar(' ');
--blankcount;
}
putchar('#');
}
else
blankcount++;
}
}
fontbit(x, y){
return(bits[y*width+x/32]&(1<<(31-(x&31))));
}
err(m){
fprintf(stderr, "%s.\n", m);
exit(1);
}