V10/games/rnd.c

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

/*%cc -O %
 */
char copr[] = "Copyright (c) 1976 Thomas S. Duff";
#include <stdio.h>
#define NCOLS (132+1)
#define CENTRE	1
#define UL	2
#define UR	4
#define LL	8
#define LR	16
char line[NCOLS+1][3];
char outline[NCOLS];
int eof;
int xs, ys;
int nsp;
char buf[BUFSIZ];
main(argc, argv)
char *argv[];
{
	extern fout;
	if(argc!=3){
		fprintf(stderr, "Usage: rnd verscale horscale\n");
		exit(1);
	}
	setbuf(stdout, buf);
	ys=atoi(argv[1]);
	xs=atoi(argv[2]);
	readline();
	while(!eof){
		readline();
		fill();
		writeline();
	}
}
readline(){
	register c;
	register i;
	for(i=1;i!=NCOLS;i++){
		line[i][0]=line[i][1];
		line[i][1]=line[i][2];
	}
	if(eof)
		for(i=1;i!=NCOLS;i++)
			line[i][3]=0;

	else{
		for(i=1;i!=NCOLS;i++){
			switch(getchar()){
			case EOF:
				eof++;
			case '\n':
				for(;i!=NCOLS;i++)
					line[i][2]=0;
				return;
			case ' ':
				line[i][2]=0;
				break;
			default:
				line[i][2]=1;
			}
		}
		while(getchar()!='\n');
	}
}
#define wchars(bit,ctrl) if(outline[i]&bit)for(ctrl)putx();else for(ctrl)nsp++
writeline(){
	register i, j, k;
	int t;
	for(j=0;j<ys/2;j++){
		t=xs/2-j*xs/ys;
		if(t<0)
			t=0;
		for(i=1;i!=NCOLS;i++){
			wchars(UL, k=0;k<t;k++);
			wchars(CENTRE, ;k<xs-t;k++);
			wchars(UR, ;k<xs;k++);
		}
		nsp=0;
		putchar('\n');
	}
	for(;j<ys;j++){
		t=j*xs/ys-xs/2;
		if(t<0)
			t=0;
		for(i=1;i!=NCOLS;i++){
			wchars(LL, k=0;k<t;k++);
			wchars(CENTRE, ;k<xs-t;k++);
			wchars(LR, ;k<xs;k++);
		}
		nsp=0;
		putchar('\n');
	}
}
putx(){
	register i;
	i=nsp;
	if(i)
		do
			putchar(' ');
		while(--i);
	putchar('#');
	nsp=0;
}
#define NDIRS 4
char corner[NDIRS] = {
	UL,
	UR,
	LL,
	LR};
struct{
	int x0, y0, x1, y1, x2, y2;
}full[NDIRS] = {
	-1,0,0,0,-1,1,
	0,0,1,0,1,1,
	-1,1,-1,2,0,2,
	1,1,1,2,0,2
};
struct{
	int x0, y0, x1, y1;
}empty[NDIRS] = {
	-1,1,0,0,
	0,0,1,1,
	-1,1,0,2,
	0,2,1,1
};
fill(){
	register i, j;
	for(i=1;i!=NCOLS;i++)
		if(line[i][1]){
			outline[i]=CENTRE;
			for(j=0;j!=NDIRS;j++)
				if(line[full[j].x0+i][full[j].y0])
					outline[i]|=corner[j];
				else if(line[full[j].x1+i][full[j].y1])
					outline[i]|=corner[j];
				else if(line[full[j].x2+i][full[j].y2])
					outline[i]|=corner[j];
		}
		else{
			outline[i]=0;
			for(j=0;j!=NDIRS;j++)
				if(line[empty[j].x0+i][empty[j].y0]
				&& line[empty[j].x1+i][empty[j].y1])
					outline[i]|=corner[j];
		}
}