| #include	<stdio.h> | 
 | #include	"pic.h" | 
 | #include	"y.tab.h" | 
 |  | 
 | obj* | 
 | circgen(int type) | 
 | { | 
 | 	static double rad[2] = { HT2, WID2 }; | 
 | 	static double rad2[2] = { HT2, HT2 }; | 
 | 	int i, at, t, with, battr; | 
 | 	double xwith, ywith; | 
 | 	double r, r2, ddval, fillval; | 
 | 	obj *p, *ppos; | 
 | 	Attr *ap; | 
 |  | 
 | 	battr = at = 0; | 
 | 	with = xwith = ywith = fillval = 0; | 
 | 	t = (type == CIRCLE) ? 0 : 1; | 
 | 	r = 0; | 
 | 	r2 = 0; | 
 | 	ddval = 0; | 
 | 	if (type == CIRCLE) | 
 | 		r = r2 = getfval("circlerad"); | 
 | 	else if (type == ELLIPSE) { | 
 | 		r = getfval("ellipsewid") / 2; | 
 | 		r2 = getfval("ellipseht") / 2; | 
 | 	} | 
 | 	for (i = 0; i < nattr; i++) { | 
 | 		ap = &attr[i]; | 
 | 		switch (ap->a_type) { | 
 | 		case TEXTATTR: | 
 | 			savetext(ap->a_sub, ap->a_val.p); | 
 | 			break; | 
 | 		case RADIUS: | 
 | 			r = ap->a_val.f; | 
 | 			break; | 
 | 		case DIAMETER: | 
 | 		case WIDTH: | 
 | 			r = ap->a_val.f / 2; | 
 | 			break; | 
 | 		case HEIGHT: | 
 | 			r2 = ap->a_val.f / 2; | 
 | 			break; | 
 | 		case SAME: | 
 | 			r = rad[t]; | 
 | 			r2 = rad2[t]; | 
 | 			break; | 
 | 		case WITH: | 
 | 			with = ap->a_val.i; | 
 | 			break; | 
 | 		case AT: | 
 | 			ppos = ap->a_val.o; | 
 | 			curx = ppos->o_x; | 
 | 			cury = ppos->o_y; | 
 | 			at++; | 
 | 			break; | 
 | 		case INVIS: | 
 | 			battr |= INVIS; | 
 | 			break; | 
 | 		case DOT: | 
 | 		case DASH: | 
 | 			battr |= ap->a_type==DOT ? DOTBIT : DASHBIT; | 
 | 			if (ap->a_sub == DEFAULT) | 
 | 				ddval = getfval("dashwid"); | 
 | 			else | 
 | 				ddval = ap->a_val.f; | 
 | 			break; | 
 | 		case FILL: | 
 | 			battr |= FILLBIT; | 
 | 			if (ap->a_sub == DEFAULT) | 
 | 				fillval = getfval("fillval"); | 
 | 			else | 
 | 				fillval = ap->a_val.f; | 
 | 			break; | 
 | 		} | 
 | 	} | 
 | 	if (type == CIRCLE) | 
 | 		r2 = r;	/* probably superfluous */ | 
 | 	if (with) { | 
 | 		switch (with) { | 
 | 		case NORTH:	ywith = -r2; break; | 
 | 		case SOUTH:	ywith = r2; break; | 
 | 		case EAST:	xwith = -r; break; | 
 | 		case WEST:	xwith = r; break; | 
 | 		case NE:	xwith = -r * 0.707; ywith = -r2 * 0.707; break; | 
 | 		case SE:	xwith = -r * 0.707; ywith = r2 * 0.707; break; | 
 | 		case NW:	xwith = r * 0.707; ywith = -r2 * 0.707; break; | 
 | 		case SW:	xwith = r * 0.707; ywith = r2 * 0.707; break; | 
 | 		} | 
 | 		curx += xwith; | 
 | 		cury += ywith; | 
 | 	} | 
 | 	if (!at) { | 
 | 		if (isright(hvmode)) | 
 | 			curx += r; | 
 | 		else if (isleft(hvmode)) | 
 | 			curx -= r; | 
 | 		else if (isup(hvmode)) | 
 | 			cury += r2; | 
 | 		else | 
 | 			cury -= r2; | 
 | 	} | 
 | 	p = makenode(type, 2); | 
 | 	p->o_val[0] = rad[t] = r; | 
 | 	p->o_val[1] = rad2[t] = r2; | 
 | 	if (r <= 0 || r2 <= 0) { | 
 | 		ERROR "%s has invalid radius %g\n", (type==CIRCLE) ? "circle" : "ellipse", r<r2 ? r : r2 WARNING; | 
 | 	} | 
 | 	p->o_attr = battr; | 
 | 	p->o_ddval = ddval; | 
 | 	p->o_fillval = fillval; | 
 | 	extreme(curx+r, cury+r2); | 
 | 	extreme(curx-r, cury-r2); | 
 | 	if (type == CIRCLE) | 
 | 		dprintf("C %g %g %g\n", curx, cury, r); | 
 | 	if (type == ELLIPSE) | 
 | 		dprintf("E %g %g %g %g\n", curx, cury, r, r2); | 
 | 	if (isright(hvmode)) | 
 | 		curx += r; | 
 | 	else if (isleft(hvmode)) | 
 | 		curx -= r; | 
 | 	else if (isup(hvmode)) | 
 | 		cury += r2; | 
 | 	else | 
 | 		cury -= r2; | 
 | 	return(p); | 
 | } |