void scale_pic(void) /* for PIC compatibility--called at end of parse */ { double sc; obj *o; int i; float bnd[4]; if (picscale == 0.0) picscale = 1.0; if (picscale == 1.0) return; sc = 1.0 / picscale; for (o = objhead; o != objtail; o = o->o_next) { if (o->o_type == PLACE || o->o_type == TEXT || o->o_type == MOVE) { o->o_x *= sc; o->o_y *= sc; /* NOTE!! may need to adjust center offset of text */ } else if (o->o_type < TEXT) { /* PIC couldn't scale text */ for (i = 0; i < 6; i++) o->o_xform[i].f *= sc; } if (o->o_type == BLOCK) /* skip the contents */ o = o->o_val[N_VAL].o; } /* make arrowheads large to compensate for later shrinkage */ for (o = objhead; o != objtail; o = o->o_next) { if ((o->o_type == LINE || o->o_type == SPLINE || o->o_type == ARROW) && (o->o_attr & HEAD12) != 0) { o->o_val[N_VAL+1].f *= picscale; o->o_val[N_VAL+2].f *= picscale; } if (o->o_type == ARC && (o->o_attr & HEAD12) != 0) { o->o_val[N_VAL+8].f *= picscale; o->o_val[N_VAL+9].f *= picscale; } } picscale = 1.0; Gbox[2] = Gbox[3] = -(Gbox[0] = Gbox[1] = 32767); for (o = objhead->o_next; o != objtail; o = o->o_next) { get_bounds(o, bnd, 1); track_bounds (bnd[0], bnd[1], bnd[2], bnd[3]); if (o->o_type == BLOCK) o = o->o_val[N_VAL].o; } #if 0 cur_xform[0].f /= v; cur_xform[1].f /= v; cur_xform[2].f /= v; cur_xform[3].f /= v; checkscale(v); #endif }
static void apply(obj *p, double *M, double d) /* apply matrix M (determinant d) to object p */ { float bnd[4]; if (p->o_type == PLACE) { matmult (cur_xform, M); if (d != 1) checkscale(sqrt(d)); } else if (p->o_type <= TEXT) { matmult (p->o_xform, M); get_bounds(p, bnd, 0); track_bounds(bnd[0], bnd[1], bnd[2], bnd[3]); redo_gbox = 1; } }
int yyparse(void) { struct { YYSTYPE yyv; int yys; } yys[YYMAXDEPTH], *yyp, *yypt; short *yyxi; int yyj, yym, yystate, yyn, yyg; long yychar; YYSTYPE save1, save2; int save3, save4; save1 = yylval; save2 = yyval; save3 = yynerrs; save4 = yyerrflag; yystate = 0; yychar = -1; yynerrs = 0; yyerrflag = 0; yyp = &yys[-1]; goto yystack; ret0: yyn = 0; goto ret; ret1: yyn = 1; goto ret; ret: yylval = save1; yyval = save2; yynerrs = save3; yyerrflag = save4; return yyn; yystack: /* put a state and value onto the stack */ if(yydebug >= 4) fprint(2, "char %s in %s", yytokname(yychar), yystatname(yystate)); yyp++; if(yyp >= &yys[YYMAXDEPTH]) { yyerror("yacc stack overflow"); goto ret1; } yyp->yys = yystate; yyp->yyv = yyval; yynewstate: yyn = yypact[yystate]; if(yyn <= YYFLAG) goto yydefault; /* simple state */ if(yychar < 0) yychar = yylex1(); yyn += yychar; if(yyn < 0 || yyn >= YYLAST) goto yydefault; yyn = yyact[yyn]; if(yychk[yyn] == yychar) { /* valid shift */ yychar = -1; yyval = yylval; yystate = yyn; if(yyerrflag > 0) yyerrflag--; goto yystack; } yydefault: /* default state action */ yyn = yydef[yystate]; if(yyn == -2) { if(yychar < 0) yychar = yylex1(); /* look through exception table */ for(yyxi=yyexca;; yyxi+=2) if(yyxi[0] == -1 && yyxi[1] == yystate) break; for(yyxi += 2;; yyxi += 2) { yyn = yyxi[0]; if(yyn < 0 || yyn == yychar) break; } yyn = yyxi[1]; if(yyn < 0) goto ret0; } if(yyn == 0) { /* error ... attempt to resume parsing */ switch(yyerrflag) { case 0: /* brand new error */ yyerror("syntax error"); yynerrs++; if(yydebug >= 1) { fprint(2, "%s", yystatname(yystate)); fprint(2, "saw %s\n", yytokname(yychar)); } case 1: case 2: /* incompletely recovered error ... try again */ yyerrflag = 3; /* find a state where "error" is a legal shift action */ while(yyp >= yys) { yyn = yypact[yyp->yys] + YYERRCODE; if(yyn >= 0 && yyn < YYLAST) { yystate = yyact[yyn]; /* simulate a shift of "error" */ if(yychk[yystate] == YYERRCODE) goto yystack; } /* the current yyp has no shift onn "error", pop stack */ if(yydebug >= 2) fprint(2, "error recovery pops state %d, uncovers %d\n", yyp->yys, (yyp-1)->yys ); yyp--; } /* there is no state on the stack with an error shift ... abort */ goto ret1; case 3: /* no shift yet; clobber input char */ if(yydebug >= 2) fprint(2, "error recovery discards %s\n", yytokname(yychar)); if(yychar == YYEOFCODE) goto ret1; yychar = -1; goto yynewstate; /* try again in the same state */ } } /* reduction by production yyn */ if(yydebug >= 2) fprint(2, "reduce %d in:\n\t%s", yyn, yystatname(yystate)); yypt = yyp; yyp -= yyr2[yyn]; yyval = (yyp+1)->yyv; yym = yyn; /* consult goto table to find next state */ yyn = yyr1[yyn]; yyg = yypgo[yyn]; yyj = yyg + yyp->yys + 1; if(yyj >= YYLAST || yychk[yystate=yyact[yyj]] != -yyn) yystate = yyact[yyg]; switch(yym) { case 3: #line 40 "a.y" { if(yypt[-1].yyv.sym->value != pc) yyerror("redeclaration of %s", yypt[-1].yyv.sym->name); yypt[-1].yyv.sym->value = pc; } break; case 5: #line 47 "a.y" { yypt[-1].yyv.sym->type = LLAB; yypt[-1].yyv.sym->value = pc; } break; case 10: #line 58 "a.y" { yypt[-2].yyv.sym->type = LVAR; yypt[-2].yyv.sym->value = yypt[-0].yyv.lval; } break; case 11: #line 63 "a.y" { if(yypt[-2].yyv.sym->value != yypt[-0].yyv.lval) yyerror("redeclaration of %s", yypt[-2].yyv.sym->name); yypt[-2].yyv.sym->value = yypt[-0].yyv.lval; } break; case 12: #line 68 "a.y" { outcode(yypt[-1].yyv.lval, &yypt[-0].yyv.gen2); } break; case 13: #line 69 "a.y" { outcode(yypt[-1].yyv.lval, &yypt[-0].yyv.gen2); } break; case 14: #line 70 "a.y" { outcode(yypt[-1].yyv.lval, &yypt[-0].yyv.gen2); } break; case 15: #line 71 "a.y" { outcode(yypt[-1].yyv.lval, &yypt[-0].yyv.gen2); } break; case 16: #line 72 "a.y" { outcode(yypt[-1].yyv.lval, &yypt[-0].yyv.gen2); } break; case 17: #line 73 "a.y" { outcode(yypt[-1].yyv.lval, &yypt[-0].yyv.gen2); } break; case 18: #line 74 "a.y" { outcode(yypt[-1].yyv.lval, &yypt[-0].yyv.gen2); } break; case 19: #line 75 "a.y" { outcode(yypt[-1].yyv.lval, &yypt[-0].yyv.gen2); } break; case 20: #line 76 "a.y" { outcode(yypt[-1].yyv.lval, &yypt[-0].yyv.gen2); } break; case 21: #line 77 "a.y" { outcode(yypt[-1].yyv.lval, &yypt[-0].yyv.gen2); } break; case 22: #line 78 "a.y" { outcode(yypt[-1].yyv.lval, &yypt[-0].yyv.gen2); } break; case 23: #line 79 "a.y" { outcode(yypt[-1].yyv.lval, &yypt[-0].yyv.gen2); } break; case 24: #line 80 "a.y" { outcode(yypt[-1].yyv.lval, &yypt[-0].yyv.gen2); } break; case 25: #line 81 "a.y" { outcode(yypt[-1].yyv.lval, &yypt[-0].yyv.gen2); } break; case 26: #line 84 "a.y" { yyval.gen2.from = nullgen; yyval.gen2.to = nullgen; } break; case 27: #line 89 "a.y" { yyval.gen2.from = nullgen; yyval.gen2.to = nullgen; } break; case 28: #line 96 "a.y" { yyval.gen2.from = yypt[-2].yyv.gen; yyval.gen2.to = yypt[-0].yyv.gen; } break; case 29: #line 103 "a.y" { yyval.gen2.from = yypt[-2].yyv.gen; yyval.gen2.to = yypt[-0].yyv.gen; } break; case 30: #line 110 "a.y" { yyval.gen2.from = yypt[-1].yyv.gen; yyval.gen2.to = nullgen; } break; case 31: #line 115 "a.y" { yyval.gen2.from = yypt[-0].yyv.gen; yyval.gen2.to = nullgen; } break; case 32: #line 122 "a.y" { yyval.gen2.from = nullgen; yyval.gen2.to = yypt[-0].yyv.gen; } break; case 33: #line 127 "a.y" { yyval.gen2.from = nullgen; yyval.gen2.to = yypt[-0].yyv.gen; } break; case 34: #line 134 "a.y" { yyval.gen2.from = nullgen; yyval.gen2.to = yypt[-0].yyv.gen; } break; case 35: #line 139 "a.y" { yyval.gen2.from = nullgen; yyval.gen2.to = yypt[-0].yyv.gen; } break; case 36: #line 146 "a.y" { yyval.gen2.from = yypt[-4].yyv.gen; yyval.gen2.from.scale = yypt[-2].yyv.lval; yyval.gen2.to = yypt[-0].yyv.gen; } break; case 37: #line 154 "a.y" { yyval.gen2.from = yypt[-2].yyv.gen; yyval.gen2.to = yypt[-0].yyv.gen; } break; case 38: #line 159 "a.y" { yyval.gen2.from = yypt[-4].yyv.gen; yyval.gen2.from.scale = yypt[-2].yyv.lval; yyval.gen2.to = yypt[-0].yyv.gen; } break; case 39: #line 167 "a.y" { yyval.gen2.from = nullgen; yyval.gen2.to = yypt[-0].yyv.gen; } break; case 40: #line 172 "a.y" { yyval.gen2.from = nullgen; yyval.gen2.to = yypt[-0].yyv.gen; } break; case 43: #line 183 "a.y" { yyval.gen2.from = yypt[-2].yyv.gen; yyval.gen2.to = yypt[-0].yyv.gen; } break; case 44: #line 188 "a.y" { yyval.gen2.from = yypt[-4].yyv.gen; yyval.gen2.to = yypt[-2].yyv.gen; if(yyval.gen2.from.index != D_NONE) yyerror("dp shift with lhs index"); yyval.gen2.from.index = yypt[-0].yyv.lval; } break; case 45: #line 198 "a.y" { yyval.gen2.from = yypt[-2].yyv.gen; yyval.gen2.to = yypt[-0].yyv.gen; } break; case 46: #line 203 "a.y" { yyval.gen2.from = yypt[-4].yyv.gen; yyval.gen2.to = yypt[-2].yyv.gen; if(yyval.gen2.to.index != D_NONE) yyerror("dp move with lhs index"); yyval.gen2.to.index = yypt[-0].yyv.lval; } break; case 47: #line 213 "a.y" { yyval.gen2.from = yypt[-1].yyv.gen; yyval.gen2.to = nullgen; } break; case 48: #line 218 "a.y" { yyval.gen2.from = yypt[-0].yyv.gen; yyval.gen2.to = nullgen; } break; case 49: #line 223 "a.y" { yyval.gen2.from = yypt[-2].yyv.gen; yyval.gen2.to = yypt[-0].yyv.gen; } break; case 50: #line 230 "a.y" { yyval.gen2.from = yypt[-2].yyv.gen; yyval.gen2.to = yypt[-0].yyv.gen; } break; case 51: #line 235 "a.y" { yyval.gen2.from = yypt[-4].yyv.gen; yyval.gen2.from.scale = yypt[-2].yyv.lval; yyval.gen2.to = yypt[-0].yyv.gen; } break; case 56: #line 249 "a.y" { yyval.gen = yypt[-0].yyv.gen; } break; case 57: #line 253 "a.y" { yyval.gen = yypt[-0].yyv.gen; } break; case 63: #line 266 "a.y" { yyval.gen = nullgen; yyval.gen.type = D_BRANCH; yyval.gen.offset = yypt[-3].yyv.lval + pc; } break; case 64: #line 272 "a.y" { yyval.gen = nullgen; if(pass == 2) yyerror("undefined label: %s", yypt[-1].yyv.sym->name); yyval.gen.type = D_BRANCH; yyval.gen.sym = yypt[-1].yyv.sym; yyval.gen.offset = yypt[-0].yyv.lval; } break; case 65: #line 281 "a.y" { yyval.gen = nullgen; yyval.gen.type = D_BRANCH; yyval.gen.sym = yypt[-1].yyv.sym; yyval.gen.offset = yypt[-1].yyv.sym->value + yypt[-0].yyv.lval; } break; case 66: #line 290 "a.y" { yyval.gen = nullgen; yyval.gen.type = yypt[-0].yyv.lval; } break; case 67: #line 295 "a.y" { yyval.gen = nullgen; yyval.gen.type = yypt[-0].yyv.lval; } break; case 68: #line 300 "a.y" { yyval.gen = nullgen; yyval.gen.type = yypt[-0].yyv.lval; } break; case 69: #line 305 "a.y" { yyval.gen = nullgen; yyval.gen.type = D_SP; } break; case 70: #line 310 "a.y" { yyval.gen = nullgen; yyval.gen.type = yypt[-0].yyv.lval; } break; case 71: #line 317 "a.y" { yyval.gen = nullgen; yyval.gen.type = D_CONST; yyval.gen.offset = yypt[-0].yyv.lval; } break; case 72: #line 323 "a.y" { yyval.gen = yypt[-0].yyv.gen; yyval.gen.index = yypt[-0].yyv.gen.type; yyval.gen.type = D_ADDR; /* if($2.type == D_AUTO || $2.type == D_PARAM) yyerror("constant cannot be automatic: %s", $2.sym->name); */ } break; case 73: #line 334 "a.y" { yyval.gen = nullgen; yyval.gen.type = D_SCONST; memcpy(yyval.gen.sval, yypt[-0].yyv.sval, sizeof(yyval.gen.sval)); } break; case 74: #line 340 "a.y" { yyval.gen = nullgen; yyval.gen.type = D_FCONST; yyval.gen.dval = yypt[-0].yyv.dval; } break; case 75: #line 346 "a.y" { yyval.gen = nullgen; yyval.gen.type = D_FCONST; yyval.gen.dval = yypt[-1].yyv.dval; } break; case 76: #line 352 "a.y" { yyval.gen = nullgen; yyval.gen.type = D_FCONST; yyval.gen.dval = -yypt[-0].yyv.dval; } break; case 77: #line 360 "a.y" { yyval.gen = nullgen; yyval.gen.type = D_CONST2; yyval.gen.offset = yypt[-0].yyv.con2.v1; yyval.gen.offset2 = yypt[-0].yyv.con2.v2; } break; case 78: #line 369 "a.y" { yyval.con2.v1 = yypt[-0].yyv.lval; yyval.con2.v2 = 0; } break; case 79: #line 374 "a.y" { yyval.con2.v1 = -yypt[-0].yyv.lval; yyval.con2.v2 = 0; } break; case 80: #line 379 "a.y" { yyval.con2.v1 = yypt[-2].yyv.lval; yyval.con2.v2 = yypt[-0].yyv.lval; } break; case 81: #line 384 "a.y" { yyval.con2.v1 = -yypt[-2].yyv.lval; yyval.con2.v2 = yypt[-0].yyv.lval; } break; case 84: #line 395 "a.y" { yyval.gen = nullgen; yyval.gen.type = D_INDIR+D_NONE; yyval.gen.offset = yypt[-0].yyv.lval; } break; case 85: #line 401 "a.y" { yyval.gen = nullgen; yyval.gen.type = D_INDIR+yypt[-1].yyv.lval; yyval.gen.offset = yypt[-3].yyv.lval; } break; case 86: #line 407 "a.y" { yyval.gen = nullgen; yyval.gen.type = D_INDIR+D_SP; yyval.gen.offset = yypt[-3].yyv.lval; } break; case 87: #line 413 "a.y" { yyval.gen = nullgen; yyval.gen.type = D_INDIR+D_NONE; yyval.gen.offset = yypt[-5].yyv.lval; yyval.gen.index = yypt[-3].yyv.lval; yyval.gen.scale = yypt[-1].yyv.lval; checkscale(yyval.gen.scale); } break; case 88: #line 422 "a.y" { yyval.gen = nullgen; yyval.gen.type = D_INDIR+yypt[-6].yyv.lval; yyval.gen.offset = yypt[-8].yyv.lval; yyval.gen.index = yypt[-3].yyv.lval; yyval.gen.scale = yypt[-1].yyv.lval; checkscale(yyval.gen.scale); } break; case 89: #line 431 "a.y" { yyval.gen = nullgen; yyval.gen.type = D_INDIR+yypt[-1].yyv.lval; } break; case 90: #line 436 "a.y" { yyval.gen = nullgen; yyval.gen.type = D_INDIR+D_SP; } break; case 91: #line 441 "a.y" { yyval.gen = nullgen; yyval.gen.type = D_INDIR+yypt[-1].yyv.lval; yyval.gen.offset = yypt[-3].yyv.lval; } break; case 92: #line 447 "a.y" { yyval.gen = nullgen; yyval.gen.type = D_INDIR+D_NONE; yyval.gen.index = yypt[-3].yyv.lval; yyval.gen.scale = yypt[-1].yyv.lval; checkscale(yyval.gen.scale); } break; case 93: #line 455 "a.y" { yyval.gen = nullgen; yyval.gen.type = D_INDIR+yypt[-6].yyv.lval; yyval.gen.index = yypt[-3].yyv.lval; yyval.gen.scale = yypt[-1].yyv.lval; checkscale(yyval.gen.scale); } break; case 94: #line 465 "a.y" { yyval.gen = yypt[-0].yyv.gen; } break; case 95: #line 469 "a.y" { yyval.gen = yypt[-5].yyv.gen; yyval.gen.index = yypt[-3].yyv.lval; yyval.gen.scale = yypt[-1].yyv.lval; checkscale(yyval.gen.scale); } break; case 96: #line 478 "a.y" { yyval.gen = nullgen; yyval.gen.type = yypt[-1].yyv.lval; yyval.gen.sym = yypt[-4].yyv.sym; yyval.gen.offset = yypt[-3].yyv.lval; } break; case 97: #line 485 "a.y" { yyval.gen = nullgen; yyval.gen.type = D_STATIC; yyval.gen.sym = yypt[-6].yyv.sym; yyval.gen.offset = yypt[-3].yyv.lval; } break; case 98: #line 493 "a.y" { yyval.lval = 0; } break; case 99: #line 497 "a.y" { yyval.lval = yypt[-0].yyv.lval; } break; case 100: #line 501 "a.y" { yyval.lval = -yypt[-0].yyv.lval; } break; case 102: #line 508 "a.y" { yyval.lval = D_AUTO; } break; case 105: #line 516 "a.y" { yyval.lval = yypt[-0].yyv.sym->value; } break; case 106: #line 520 "a.y" { yyval.lval = -yypt[-0].yyv.lval; } break; case 107: #line 524 "a.y" { yyval.lval = yypt[-0].yyv.lval; } break; case 108: #line 528 "a.y" { yyval.lval = ~yypt[-0].yyv.lval; } break; case 109: #line 532 "a.y" { yyval.lval = yypt[-1].yyv.lval; } break; case 111: #line 539 "a.y" { yyval.lval = yypt[-2].yyv.lval + yypt[-0].yyv.lval; } break; case 112: #line 543 "a.y" { yyval.lval = yypt[-2].yyv.lval - yypt[-0].yyv.lval; } break; case 113: #line 547 "a.y" { yyval.lval = yypt[-2].yyv.lval * yypt[-0].yyv.lval; } break; case 114: #line 551 "a.y" { yyval.lval = yypt[-2].yyv.lval / yypt[-0].yyv.lval; } break; case 115: #line 555 "a.y" { yyval.lval = yypt[-2].yyv.lval % yypt[-0].yyv.lval; } break; case 116: #line 559 "a.y" { yyval.lval = yypt[-3].yyv.lval << yypt[-0].yyv.lval; } break; case 117: #line 563 "a.y" { yyval.lval = yypt[-3].yyv.lval >> yypt[-0].yyv.lval; } break; case 118: #line 567 "a.y" { yyval.lval = yypt[-2].yyv.lval & yypt[-0].yyv.lval; } break; case 119: #line 571 "a.y" { yyval.lval = yypt[-2].yyv.lval ^ yypt[-0].yyv.lval; } break; case 120: #line 575 "a.y" { yyval.lval = yypt[-2].yyv.lval | yypt[-0].yyv.lval; } break; } goto yystack; /* stack new state and value */ }