henesyinit from p9f47575dc5 years agoHistory
215 lines · 3.9 KB · C
RawDownload
#include	<u.h>#include	<libc.h>#include	<cda/fizz.h> #define		RAD(x)	(drdiam(x)/2) #define	NPKG	32 static int	drdiam(int);static void	dorect(Rectangle);static void	dogrid(Rectangle);void	picpr(Package*); int	bflag;int	gflag; char *	pkgnames[NPKG];int	npkg; voidmain(int argc, char **argv){	Board b;	int n;	char *fname; 	ARGBEGIN{	case 'b':		++bflag;	/* show bottom view */		break;	case 'g':		++gflag;	/* show 100 mil grid */		break;	case 'p':		if(npkg < NPKG)			pkgnames[npkg++] = ARGF();		break;	default:		fprint(2, "usage: %s [-b] [-p name] [files...]\n", argv0);		exits("usage");	}ARGEND	f_init(&b);	if(*argv)		fname = *argv++;	else		fname = "/fd/0";	do{		if(n = f_crack(fname, &b)){			fprint(2, "%s: %d errors\n", fname, n);			exits("errors");		}	}while(fname = *argv++);	/* assign = */	symtraverse(S_PACKAGE, picpr);	exits(0);} static char *dir = "nesw";static char *adj[] = { "above", "ljust", "below", "rjust" }; voidpicpr(Package *p){	int i, orient;	Plane *pl; 	if(npkg){		for(i=0; i<npkg; i++)			if(strcmp(p->name, pkgnames[i]) == 0)				break;		if(i >= npkg)			return;	} 	fprint(1, ".sp 2i\n");	fprint(1, ".PS 6.0\n");	fprint(1, "boxwid=20\n");	fprint(1, "boxht=20\n");	fprint(1, "define pin X\n");	fprint(1, "box invis \"\\(bu\" at $1,$2\n");	fprint(1, "\"\\s-2$3\\s0\" $4 at last box.$5\n");	fprint(1, "X\n");	fprint(1, "line from -30,0 to 30,0\n");	fprint(1, "line from 0,-30 to 0,30\n");	if (!bflag)		fprint(1, "\"%s\" at %d,%d\n",		p->name, (p->r.min.x+p->r.max.x)/2, p->r.max.y+100);	else		fprint(1, "\"%s\" \"(bottom)\" at %d,%d\n",		p->name, -(p->r.min.x+p->r.max.x)/2, p->r.max.y+100);	dorect(p->r);	if(gflag)		dogrid(p->r);	for(i = 0; i < p->npins; i++){		orient = 3;	/* west for now */		if (!bflag)			fprint(1, "pin(%d,%d,%d,%s,%c)\n",			p->pins[i].p.x, p->pins[i].p.y,			i+p->pmin, adj[orient], dir[orient]);		else			fprint(1, "pin(%d,%d,%d,%s,%c)\n",			-p->pins[i].p.x, p->pins[i].p.y,			i+p->pmin, adj[orient], dir[orient]);	}	for(i=0; i < p->ndrills; i++){		fprint(1, "circlerad=%d\n", RAD(p->drills[i].drill));		if (!bflag)			fprint(1, "circle at %d,%d\n",			p->drills[i].p.x, p->drills[i].p.y);		else			fprint(1, "circle at %d,%d\n",			-p->drills[i].p.x, p->drills[i].p.y);	}	for(i=0; i < p->ncutouts; i++){		pl = &p->cutouts[i];		dorect(pl->r);	}	fprint(1, ".PE\n");} static intdrdiam(int c){	static int drills[] = {		'A', 33,		'B', 34,		'C', 39,		'D', 42,		'E', 50,		'F', 62,		'G', 106,		'H', 107,		'I', 108,		'J', 20,		'K', 110,		'L', 111,		'M', 112,		'N', 113,		'O', 114,		'P', 115,		'Q', 116,		'R', 117,		'S', 118,		'T', 119,		'U', 100,		'V', 20,		'W', 122,		'X', 123,		'Y', 124,		'Z', 125,		0, 0	};	int i;	for (i=0; drills[i]; i+=2)		if (c == drills[i])			return drills[i+1];	return 0;} static voiddorect(Rectangle r){	if (!bflag)		fprint(1, "line from %d,%d to %d,%d to %d,%d to %d,%d to %d,%d\n",		r.min.x, r.min.y, r.max.x, r.min.y,		r.max.x, r.max.y, r.min.x, r.max.y,		r.min.x, r.min.y);	else		fprint(1, "line from %d,%d to %d,%d to %d,%d to %d,%d to %d,%d\n",		-r.min.x, r.min.y, -r.max.x, r.min.y,		-r.max.x, r.max.y, -r.min.x, r.max.y,		-r.min.x, r.min.y);} static introundout(int n, int r){	int rn; 	rn = (n >= 0) ? n : -n;	rn += r-1;	rn /= r;	rn *= r;	return (n >= 0) ? rn : -rn;} static voiddogrid(Rectangle r){	int t; 	r.min.x = roundout(r.min.x, 100);	r.min.y = roundout(r.min.y, 100);	r.max.x = roundout(r.max.x, 100);	r.max.y = roundout(r.max.y, 100);	if(bflag){		r.min.x = -r.min.x;		r.max.x = -r.max.x;	}	if(r.min.x >= r.max.x){		t = r.min.x;		r.min.x = r.max.x;		r.max.x = t;	}	if(r.min.y >= r.max.y){		t = r.min.y;		r.min.y = r.max.y;		r.max.y = t;	}	for(t=r.min.x; t<=r.max.x; t+=100)		fprint(1, "line dotted 10 from %d,%d to %d,%d\n",			t, r.min.y, t, r.max.y);	for(t=r.min.y; t<=r.max.y; t+=100)		fprint(1, "line dotted 10 from %d,%d to %d,%d\n",			r.min.x, t, r.max.x, t);}