|
|
1.1 ! root 1: #include <stdio.h> ! 2: #include <string.h> ! 3: #include "grap.h" ! 4: #include "y.tab.h" ! 5: ! 6: int nnum = 0; /* number of saved numbers */ ! 7: double num[MAXNUM]; ! 8: ! 9: int just; /* current justification mode (RJUST, etc.) */ ! 10: int sizeop; /* current optional operator for size change */ ! 11: double sizexpr; /* current size change expression */ ! 12: ! 13: savenum(n, f) /* save f in num[n] */ ! 14: int n; ! 15: double f; ! 16: { ! 17: num[n] = f; ! 18: nnum = n+1; ! 19: if (nnum >= MAXNUM) ! 20: ERROR "too many numbers" WARNING; ! 21: } ! 22: ! 23: setjust(j) ! 24: { ! 25: just |= j; ! 26: } ! 27: ! 28: setsize(op, expr) ! 29: int op; ! 30: double expr; ! 31: { ! 32: sizeop = op; ! 33: sizexpr = expr; ! 34: } ! 35: ! 36: char *tostring(s) ! 37: register char *s; ! 38: { ! 39: register char *p; ! 40: ! 41: p = malloc(strlen(s)+1); ! 42: if (p == NULL) ! 43: ERROR "out of space in tostring on %s", s FATAL; ! 44: strcpy(p, s); ! 45: return(p); ! 46: } ! 47: ! 48: range(pt) /* update the range for point pt */ ! 49: Point pt; ! 50: { ! 51: Obj *p = pt.obj; ! 52: ! 53: if (!(p->coord & XFLAG)) { ! 54: if (pt.x > p->pt1.x) ! 55: p->pt1.x = pt.x; ! 56: if (pt.x < p->pt.x) ! 57: p->pt.x = pt.x; ! 58: } ! 59: if (!(p->coord & YFLAG)) { ! 60: if (pt.y > p->pt1.y) ! 61: p->pt1.y = pt.y; ! 62: if (pt.y < p->pt.y) ! 63: p->pt.y = pt.y; ! 64: } ! 65: } ! 66: ! 67: halfrange(p, side, val) /* record max and min for one direction */ ! 68: Obj *p; ! 69: int side; ! 70: double val; ! 71: { ! 72: if (!(p->coord&XFLAG) && (side == LEFT || side == RIGHT)) { ! 73: if (val < p->pt.y) ! 74: p->pt.y = val; ! 75: if (val > p->pt1.y) ! 76: p->pt1.y = val; ! 77: } else if (!(p->coord&YFLAG) && (side == TOP || side == BOT)) { ! 78: if (val < p->pt.x) ! 79: p->pt.x = val; ! 80: if (val > p->pt1.x) ! 81: p->pt1.x = val; ! 82: } ! 83: } ! 84: ! 85: ! 86: Obj *lookup(s, inst) /* find s in objlist, install if inst */ ! 87: char *s; ! 88: int inst; ! 89: { ! 90: Obj *p; ! 91: int found = 0; ! 92: ! 93: for (p = objlist; p; p = p->next) ! 94: if (strcmp(s, p->name) == 0) { ! 95: found = 1; ! 96: break; ! 97: } ! 98: if (p == NULL && inst != 0) { ! 99: p = (Obj *) calloc(1, sizeof(Obj)); ! 100: if (p == NULL) ! 101: ERROR "out of space in lookup" FATAL; ! 102: p->name = tostring(s); ! 103: p->type = NAME; ! 104: p->pt = ptmax; ! 105: p->pt1 = ptmin; ! 106: p->fval = 0.0; ! 107: p->next = objlist; ! 108: objlist = p; ! 109: } ! 110: dprintf("lookup(%s,%d) = %d\n", s, inst, found); ! 111: return p; ! 112: } ! 113: ! 114: double getvar(p) /* return value of variable */ ! 115: Obj *p; ! 116: { ! 117: return p->fval; ! 118: } ! 119: ! 120: double setvar(p, f) /* set value of variable to f */ ! 121: Obj *p; ! 122: double f; ! 123: { ! 124: if (strcmp(p->name, "pointsize") == 0) { /* kludge */ ! 125: pointsize = f; ! 126: ps_set = 1; ! 127: } ! 128: p->type = VARNAME; ! 129: return p->fval = f; ! 130: } ! 131: ! 132: Point makepoint(s, x, y) /* make a Point */ ! 133: Obj *s; ! 134: double x, y; ! 135: { ! 136: Point p; ! 137: ! 138: dprintf("makepoint: %s, %g,%g\n", s->name, x, y); ! 139: p.obj = s; ! 140: p.x = x; ! 141: p.y = y; ! 142: return p; ! 143: } ! 144: ! 145: Attr *makefattr(type, fval) /* set double in attribute */ ! 146: int type; ! 147: double fval; ! 148: { ! 149: return makeattr(type, fval, (char *) 0, 0, 0); ! 150: } ! 151: ! 152: Attr *makesattr(s) /* make an Attr cell containing s */ ! 153: char *s; ! 154: { ! 155: Attr *ap = makeattr(STRING, sizexpr, s, just, sizeop); ! 156: just = sizeop = 0; ! 157: sizexpr = 0.0; ! 158: return ap; ! 159: } ! 160: ! 161: Attr *makeattr(type, fval, sval, just, op) ! 162: int type; ! 163: double fval; ! 164: char *sval; ! 165: int just, op; ! 166: { ! 167: Attr *a; ! 168: ! 169: a = (Attr *) malloc(sizeof(Attr)); ! 170: if (a == NULL) ! 171: ERROR "out of space in makeattr" FATAL; ! 172: a->type = type; ! 173: a->fval = fval; ! 174: a->sval = sval; ! 175: a->just = just; ! 176: a->op = op; ! 177: a->next = NULL; ! 178: return a; ! 179: } ! 180: ! 181: Attr *addattr(a1, ap) /* add attr ap to end of list a1 */ ! 182: Attr *a1, *ap; ! 183: { ! 184: Attr *p; ! 185: ! 186: if (a1 == 0) ! 187: return ap; ! 188: if (ap == 0) ! 189: return a1; ! 190: for (p = a1; p->next; p = p->next) ! 191: ; ! 192: p->next = ap; ! 193: return a1; ! 194: } ! 195: ! 196: freeattr(ap) /* free an attribute list */ ! 197: Attr *ap; ! 198: { ! 199: Attr *p; ! 200: ! 201: while (ap) { ! 202: p = ap->next; /* save next */ ! 203: if (ap->sval) ! 204: free(ap->sval); ! 205: free((char *) ap); ! 206: ap = p; ! 207: } ! 208: } ! 209: ! 210: char *slprint(stringlist) /* print strings from stringlist */ ! 211: Attr *stringlist; ! 212: { ! 213: int ntext, n, last_op, last_just; ! 214: double last_fval; ! 215: static char buf[1000]; ! 216: Attr *ap; ! 217: ! 218: buf[0] = '\0'; ! 219: last_op = last_just = 0; ! 220: last_fval = 0.0; ! 221: for (ntext = 0, ap = stringlist; ap != NULL; ap = ap->next) ! 222: ntext++; ! 223: sprintf(buf, "box invis wid 0 ht %d*textht", ntext); ! 224: n = strlen(buf); ! 225: for (ap = stringlist; ap != NULL; ap = ap->next) { ! 226: if (ap->op == 0) { /* propagate last value */ ! 227: ap->op = last_op; ! 228: ap->fval = last_fval; ! 229: } else { ! 230: last_op = ap->op; ! 231: last_fval = ap->fval; ! 232: } ! 233: sprintf(buf+n, " \"%s\"", ps_set || ap->op ? sizeit(ap) : ap->sval); ! 234: if (ap->just) ! 235: last_just = ap->just; ! 236: if (last_just) ! 237: strcat(buf+n, juststr(last_just)); ! 238: n = strlen(buf); ! 239: } ! 240: return buf; /* watch it: static */ ! 241: } ! 242: ! 243: char *juststr(j) /* convert RJUST, etc., into string */ ! 244: int j; ! 245: { ! 246: static char buf[50]; ! 247: ! 248: buf[0] = '\0'; ! 249: if (j & RJUST) ! 250: strcat(buf, " rjust"); ! 251: if (j & LJUST) ! 252: strcat(buf, " ljust"); ! 253: if (j & ABOVE) ! 254: strcat(buf, " above"); ! 255: if (j & BELOW) ! 256: strcat(buf, " below"); ! 257: return buf; /* watch it: static */ ! 258: } ! 259: ! 260: char *sprntf(s, ap) /* sprintf(s, attrlist ap) */ ! 261: char *s; ! 262: Attr *ap; ! 263: { ! 264: char buf[500]; ! 265: int n; ! 266: Attr *p; ! 267: ! 268: for (n = 0, p = ap; p; p = p->next) ! 269: n++; ! 270: switch (n) { ! 271: case 0: ! 272: return s; ! 273: case 1: ! 274: sprintf(buf, s, ap->fval); ! 275: break; ! 276: case 2: ! 277: sprintf(buf, s, ap->fval, ap->next->fval); ! 278: break; ! 279: case 3: ! 280: sprintf(buf, s, ap->fval, ap->next->fval, ap->next->next->fval); ! 281: break; ! 282: case 5: ! 283: ERROR "too many expressions in sprintf" WARNING; ! 284: case 4: ! 285: sprintf(buf, s, ap->fval, ap->next->fval, ap->next->next->fval, ap->next->next->next->fval); ! 286: break; ! 287: } ! 288: free(s); ! 289: return tostring(buf); ! 290: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.