|
|
1.1 ! root 1: #include <stdio.h> ! 2: #include "pic.h" ! 3: #include "y.tab.h" ! 4: ! 5: #define NBRACK 20 /* depth of [...] */ ! 6: #define NBRACE 20 /* depth of {...} */ ! 7: ! 8: struct pushstack stack[NBRACK]; ! 9: int nstack = 0; ! 10: struct pushstack bracestack[NBRACE]; ! 11: int nbstack = 0; ! 12: ! 13: obj *leftthing(c) /* called for {... or [... */ ! 14: /* really ought to be separate functions */ ! 15: int c; ! 16: { ! 17: obj *p; ! 18: ! 19: if (c == '[') { ! 20: if (nstack >= NBRACK) ! 21: fatal("[...] nested too deep"); ! 22: stack[nstack].p_x = curx; ! 23: stack[nstack].p_y = cury; ! 24: stack[nstack].p_hvmode = hvmode; ! 25: curx = cury = 0; ! 26: stack[nstack].p_xmin = xmin; ! 27: stack[nstack].p_xmax = xmax; ! 28: stack[nstack].p_ymin = ymin; ! 29: stack[nstack].p_ymax = ymax; ! 30: nstack++; ! 31: xmin = ymin = 30000; ! 32: xmax = ymax = -30000; ! 33: p = makenode(BLOCK, 7); ! 34: p->o_val[4] = nobj; /* 1st item within [...] */ ! 35: if (p->o_nobj != nobj-1) ! 36: fprintf(stderr, "nobjs wrong%d %d\n", p->o_nobj, nobj); ! 37: } else { ! 38: if (nbstack >= NBRACK) ! 39: fatal("{...} nested too deep"); ! 40: bracestack[nbstack].p_x = curx; ! 41: bracestack[nbstack].p_y = cury; ! 42: bracestack[nbstack].p_hvmode = hvmode; ! 43: nbstack++; ! 44: p = NULL; ! 45: } ! 46: return(p); ! 47: } ! 48: ! 49: obj *rightthing(p, c) /* called for ... ] or ... } */ ! 50: obj *p; ! 51: { ! 52: obj *q; ! 53: ! 54: if (c == '}') { ! 55: nbstack--; ! 56: curx = bracestack[nbstack].p_x; ! 57: cury = bracestack[nbstack].p_y; ! 58: hvmode = bracestack[nbstack].p_hvmode; ! 59: q = makenode(MOVE, 0); ! 60: dprintf("M %g %g\n", curx, cury); ! 61: } else { ! 62: nstack--; ! 63: curx = stack[nstack].p_x; ! 64: cury = stack[nstack].p_y; ! 65: hvmode = stack[nstack].p_hvmode; ! 66: q = makenode(BLOCKEND, 7); ! 67: q->o_val[4] = p->o_nobj + 1; /* back pointer */ ! 68: p->o_val[5] = q->o_nobj - 1; /* forward pointer */ ! 69: p->o_val[0] = xmin; p->o_val[1] = ymin; ! 70: p->o_val[2] = xmax; p->o_val[3] = ymax; ! 71: p->o_symtab = q->o_symtab = stack[nstack+1].p_symtab; ! 72: xmin = stack[nstack].p_xmin; ! 73: ymin = stack[nstack].p_ymin; ! 74: xmax = stack[nstack].p_xmax; ! 75: ymax = stack[nstack].p_ymax; ! 76: } ! 77: return(q); ! 78: } ! 79: ! 80: obj *blockgen(p, type, q) /* handles [...] */ ! 81: obj *p, *q; ! 82: int type; ! 83: { ! 84: int i, invis, at, ddtype, with; ! 85: float ddval, h, w, xwith, ywith; ! 86: float x0, y0, x1, y1, cx, cy; ! 87: obj *ppos; ! 88: Attr *ap; ! 89: ! 90: invis = at = 0; ! 91: with = xwith = ywith = 0; ! 92: ddtype = ddval = 0; ! 93: w = p->o_val[2] - p->o_val[0]; ! 94: h = p->o_val[3] - p->o_val[1]; ! 95: cx = (p->o_val[2] + p->o_val[0]) / 2; /* geom ctr of [] wrt local orogin */ ! 96: cy = (p->o_val[3] + p->o_val[1]) / 2; ! 97: dprintf("cx,cy=%g,%g\n", cx, cy); ! 98: for (i = 0; i < nattr; i++) { ! 99: ap = &attr[i]; ! 100: switch (ap->a_type) { ! 101: case HEIGHT: ! 102: h = ap->a_val.f; ! 103: break; ! 104: case WIDTH: ! 105: w = ap->a_val.f; ! 106: break; ! 107: case WITH: ! 108: with = ap->a_val.i; /* corner */ ! 109: break; ! 110: case PLACE: /* actually with position ... */ ! 111: ppos = ap->a_val.o; ! 112: xwith = cx - ppos->o_x; ! 113: ywith = cy - ppos->o_y; ! 114: with = PLACE; ! 115: break; ! 116: case AT: ! 117: case FROM: ! 118: ppos = ap->a_val.o; ! 119: curx = ppos->o_x; ! 120: cury = ppos->o_y; ! 121: at++; ! 122: break; ! 123: case INVIS: ! 124: invis = INVIS; ! 125: break; ! 126: case TEXTATTR: ! 127: savetext(ap->a_sub, ap->a_val.p); ! 128: break; ! 129: } ! 130: } ! 131: if (with) { ! 132: switch (with) { ! 133: case NORTH: ywith = -h / 2; break; ! 134: case SOUTH: ywith = h / 2; break; ! 135: case EAST: xwith = -w / 2; break; ! 136: case WEST: xwith = w / 2; break; ! 137: case NE: xwith = -w / 2; ywith = -h / 2; break; ! 138: case SE: xwith = -w / 2; ywith = h / 2; break; ! 139: case NW: xwith = w / 2; ywith = -h / 2; break; ! 140: case SW: xwith = w / 2; ywith = h / 2; break; ! 141: } ! 142: curx += xwith; ! 143: cury += ywith; ! 144: } ! 145: if (!at) { ! 146: if (isright(hvmode)) ! 147: curx += w / 2; ! 148: else if (isleft(hvmode)) ! 149: curx -= w / 2; ! 150: else if (isup(hvmode)) ! 151: cury += h / 2; ! 152: else ! 153: cury -= h / 2; ! 154: } ! 155: x0 = curx - w / 2; ! 156: y0 = cury - h / 2; ! 157: x1 = curx + w / 2; ! 158: y1 = cury + h / 2; ! 159: extreme(x0, y0); ! 160: extreme(x1, y1); ! 161: p->o_x = curx; ! 162: p->o_y = cury; ! 163: p->o_nt1 = ntext1; ! 164: p->o_nt2 = ntext; ! 165: ntext1 = ntext; ! 166: p->o_val[0] = w; ! 167: p->o_val[1] = h; ! 168: p->o_val[2] = cx; ! 169: p->o_val[3] = cy; ! 170: p->o_val[5] = q->o_nobj - 1; /* last item in [...] */ ! 171: p->o_ddval = ddval; ! 172: p->o_attr = invis; ! 173: dprintf("[] %g %g %g %g at %g %g, h=%g, w=%g\n", x0, y0, x1, y1, curx, cury, h, w); ! 174: if (isright(hvmode)) ! 175: curx = x1; ! 176: else if (isleft(hvmode)) ! 177: curx = x0; ! 178: else if (isup(hvmode)) ! 179: cury = y1; ! 180: else ! 181: cury = y0; ! 182: for (i = 0; i <= 5; i++) ! 183: q->o_val[i] = p->o_val[i]; ! 184: stack[nstack+1].p_symtab = NULL; /* so won't be found again */ ! 185: blockadj(p); /* fix up coords for enclosed blocks */ ! 186: return(p); ! 187: } ! 188: ! 189: blockadj(p) /* adjust coords in block starting at p */ ! 190: obj *p; ! 191: { ! 192: obj *q; ! 193: float dx, dy; ! 194: int n, lev; ! 195: ! 196: dx = p->o_x - p->o_val[2]; ! 197: dy = p->o_y - p->o_val[3]; ! 198: n = p->o_nobj + 1; ! 199: q = objlist[n]; ! 200: dprintf("into blockadj: dx,dy=%g,%g\n", dx, dy); ! 201: for (lev = 1; lev > 0; n++) { ! 202: p = objlist[n]; ! 203: if (p->o_type == BLOCK) ! 204: lev++; ! 205: else if (p->o_type == BLOCKEND) ! 206: lev--; ! 207: dprintf("blockadj: type=%d o_x,y=%g,%g;", p->o_type, p->o_x, p->o_y); ! 208: p->o_x += dx; ! 209: p->o_y += dy; ! 210: dprintf(" becomes %g,%g\n", p->o_x, p->o_y); ! 211: switch (p->o_type) { /* other absolute coords */ ! 212: case LINE: ! 213: case ARROW: ! 214: case SPLINE: ! 215: p->o_val[0] += dx; ! 216: p->o_val[1] += dy; ! 217: break; ! 218: case ARC: ! 219: p->o_val[0] += dx; ! 220: p->o_val[1] += dy; ! 221: p->o_val[2] += dx; ! 222: p->o_val[3] += dy; ! 223: break; ! 224: } ! 225: } ! 226: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.