|
|
1.1 ! root 1: #include <stdio.h> ! 2: #include <signal.h> ! 3: #include "pic.h" ! 4: #include "y.tab.h" ! 5: ! 6: obj **objlist = 0; /* store the elements here */ ! 7: int nobjlist = 0; /* size of objlist array */ ! 8: int nobj = 0; ! 9: ! 10: Attr *attr; /* attributes stored here as collected */ ! 11: int nattrlist = 0; ! 12: int nattr = 0; /* number of entries in attr_list */ ! 13: ! 14: Text *text = 0; /* text strings stored here as collected */ ! 15: int ntextlist = 0; /* size of text[] array */ ! 16: int ntext = 0; ! 17: int ntext1 = 0; /* record ntext here on entry to each figure */ ! 18: ! 19: float curx = 0; ! 20: float cury = 0; ! 21: ! 22: int hvmode = R_DIR; /* R => join left to right, D => top to bottom, etc. */ ! 23: ! 24: int codegen = 0; /* 1=>output for this picture; 0=>no output */ ! 25: int PEseen = 0; /* 1=> PE seen during parsing */ ! 26: ! 27: float deltx = 6; /* max x value in output, for scaling */ ! 28: float delty = 6; /* max y value in output, for scaling */ ! 29: int dbg = 0; ! 30: int lineno = 0; ! 31: char *filename = "-"; ! 32: int synerr = 0; ! 33: int anyerr = 0; /* becomes 1 if synerr ever 1 */ ! 34: char *cmdname; ! 35: ! 36: float xmin = 30000; /* min values found in actual data */ ! 37: float ymin = 30000; ! 38: float xmax = -30000; /* max */ ! 39: float ymax = -30000; ! 40: ! 41: main(argc, argv) ! 42: char *argv[]; ! 43: { ! 44: char buf[20]; ! 45: extern int fpecatch(); ! 46: ! 47: signal(SIGFPE, fpecatch); ! 48: cmdname = argv[0]; ! 49: while (argc > 1 && *argv[1] == '-') { ! 50: switch (argv[1][1]) { ! 51: case 'd': ! 52: dbg = atoi(&argv[1][2]); ! 53: if (dbg == 0) ! 54: dbg = 1; ! 55: break; ! 56: } ! 57: argc--; ! 58: argv++; ! 59: } ! 60: setdefaults(); ! 61: objlist = (obj **) grow((char *)objlist, "objlist", nobjlist += 1000, sizeof(obj *)); ! 62: text = (Text *) grow((char *)text, "text", ntextlist += 1000, sizeof(Text)); ! 63: attr = (Attr *) grow((char *)attr, "attr", nattrlist += 100, sizeof(Attr)); ! 64: ! 65: sprintf(buf, "/%d/", getpid()); ! 66: pushsrc(String, buf); ! 67: definition("pid"); ! 68: ! 69: pushsrc(File, curfile = infile); ! 70: if (argc <= 1) { ! 71: curfile->fin = stdin; ! 72: curfile->fname = tostring("-"); ! 73: getdata(curfile); ! 74: } else ! 75: while (argc-- > 1) { ! 76: if ((curfile->fin = fopen(*++argv, "r")) == NULL) { ! 77: fprintf(stderr, "%s: can't open %s\n", cmdname, *argv); ! 78: exit(1); ! 79: } ! 80: curfile->fname = tostring(*argv); ! 81: getdata(curfile); ! 82: fclose(curfile->fin); ! 83: free(curfile->fname); ! 84: } ! 85: exit(anyerr); ! 86: } ! 87: ! 88: fpecatch() ! 89: { ! 90: fatal("floating point exception"); ! 91: } ! 92: ! 93: char *grow(ptr, name, num, size) /* make array bigger */ ! 94: char *ptr, *name; ! 95: int num, size; ! 96: { ! 97: char *p; ! 98: ! 99: if (ptr == NULL) ! 100: p = malloc(num * size); ! 101: else ! 102: p = realloc(ptr, num * size); ! 103: if (p == NULL) ! 104: fatal("can't grow %s to %d", name, num * size); ! 105: return p; ! 106: } ! 107: ! 108: static struct { ! 109: char *name; ! 110: float val; ! 111: short scalable; /* 1 => adjust when "scale" changes */ ! 112: } defaults[] ={ ! 113: "scale", SCALE, 1, ! 114: "lineht", HT, 1, ! 115: "linewid", HT, 1, ! 116: "moveht", HT, 1, ! 117: "movewid", HT, 1, ! 118: "dashwid", HT10, 1, ! 119: "boxht", HT, 1, ! 120: "boxwid", WID, 1, ! 121: "circlerad", HT2, 1, ! 122: "arcrad", HT2, 1, ! 123: "ellipseht", HT, 1, ! 124: "ellipsewid", WID, 1, ! 125: "arrowht", HT5, 1, ! 126: "arrowwid", HT10, 1, ! 127: "arrowhead", 2, 0, /* arrowhead style */ ! 128: "textht", 0.0, 1, /* 6 lines/inch is also a useful value */ ! 129: "textwid", 0.0, 1, ! 130: "maxpsht", MAXHT, 0, ! 131: "maxpswid", MAXWID, 0, ! 132: NULL, 0 ! 133: }; ! 134: ! 135: setdefaults() /* set default sizes for variables like boxht */ ! 136: { ! 137: int i; ! 138: YYSTYPE v; ! 139: ! 140: for (i = 0; defaults[i].name != NULL; i++) { ! 141: v.f = defaults[i].val; ! 142: makevar(tostring(defaults[i].name), VARNAME, v); ! 143: } ! 144: } ! 145: ! 146: resetvar() /* reset variables listed */ ! 147: { ! 148: int i, j; ! 149: ! 150: if (nattr == 0) { /* none listed, so do all */ ! 151: setdefaults(); ! 152: return; ! 153: } ! 154: for (i = 0; i < nattr; i++) { ! 155: for (j = 0; defaults[j].name != NULL; j++) ! 156: if (strcmp(defaults[j].name, attr[i].a_val.p) == 0) { ! 157: setfval(defaults[j].name, defaults[j].val); ! 158: free(attr[i].a_val.p); ! 159: break; ! 160: } ! 161: } ! 162: } ! 163: ! 164: checkscale(s) /* if s is "scale", adjust default variables */ ! 165: char *s; ! 166: { ! 167: int i; ! 168: float scale; ! 169: ! 170: if (strcmp(s, "scale") == 0) { ! 171: scale = getfval("scale"); ! 172: for (i = 1; defaults[i].name != NULL; i++) ! 173: if (defaults[i].scalable) ! 174: setfval(defaults[i].name, defaults[i].val * scale); ! 175: } ! 176: } ! 177: ! 178: getdata() ! 179: { ! 180: char *p, buf[1000], buf1[100]; ! 181: int ln; ! 182: ! 183: curfile->lineno = 0; ! 184: printf(".lf 1 %s\n", curfile->fname); ! 185: while (fgets(buf, sizeof buf, curfile->fin) != NULL) { ! 186: curfile->lineno++; ! 187: if (*buf == '.' && *(buf+1) == 'P' && *(buf+2) == 'S') { ! 188: for (p = &buf[3]; *p == ' '; p++) ! 189: ; ! 190: if (*p++ == '<') { ! 191: Infile svfile; ! 192: svfile = *curfile; ! 193: sscanf(p, "%s", buf1); ! 194: if ((curfile->fin=fopen(buf1, "r")) == NULL) ! 195: fatal("can't open %s", buf1); ! 196: curfile->fname = tostring(buf1); ! 197: getdata(); ! 198: fclose(curfile->fin); ! 199: free(curfile->fname); ! 200: *curfile = svfile; ! 201: printf(".lf %d %s\n", curfile->lineno, curfile->fname); ! 202: continue; ! 203: } ! 204: reset(); ! 205: yyparse(); ! 206: anyerr += synerr; ! 207: /* yylval.i now contains 'E' or 'F' from .PE or .PF */ ! 208: ! 209: deltx = (xmax - xmin) / getfval("scale"); ! 210: delty = (ymax - ymin) / getfval("scale"); ! 211: if (buf[3] == ' ') { /* next things are wid & ht */ ! 212: float xfac, yfac; ! 213: if (sscanf(&buf[4],"%f%f",&deltx,&delty) < 2) ! 214: delty = deltx * (ymax-ymin) / (xmax-xmin); ! 215: else { ! 216: xfac = deltx / (xmax-xmin); ! 217: yfac = delty / (ymax-ymin); ! 218: if (xfac <= yfac) ! 219: delty = xfac * (ymax-ymin); ! 220: else ! 221: deltx = yfac * (xmax-xmin); ! 222: } ! 223: } ! 224: dprintf("deltx = %g, delty = %g\n", deltx, delty); ! 225: if (codegen && !synerr) { ! 226: openpl(&buf[3]); /* puts out .PS, with ht & wid stuck in */ ! 227: printf(".lf %d\n", curfile->lineno+1); ! 228: print(); /* assumes \n at end */ ! 229: closepl(yylval.i); /* does the .PE/F */ ! 230: } ! 231: printf(".lf %d\n", curfile->lineno+1); ! 232: fflush(stdout); ! 233: } else if (buf[0] == '.' && buf[1] == 'l' && buf[2] == 'f') { ! 234: if (sscanf(buf+3, "%d %s", &ln, buf1) == 2) { ! 235: free(curfile->fname); ! 236: printf(".lf %d %s\n", curfile->lineno = ln, curfile->fname = tostring(buf1)); ! 237: } else ! 238: printf(".lf %d\n", curfile->lineno = ln); ! 239: } else ! 240: fputs(buf, stdout); ! 241: } ! 242: } ! 243: ! 244: reset() ! 245: { ! 246: obj *op; ! 247: int i; ! 248: extern int nstack; ! 249: ! 250: for (i = 0; i < nobj; i++) { ! 251: op = objlist[i]; ! 252: if (op->o_type == BLOCK) ! 253: freesymtab(op->o_symtab); ! 254: free(objlist[i]); ! 255: } ! 256: nobj = 0; ! 257: nattr = 0; ! 258: for (i = 0; i < ntext; i++) ! 259: if (text[i].t_val) ! 260: free(text[i].t_val); ! 261: ntext = ntext1 = 0; ! 262: codegen = synerr = 0; ! 263: nstack = 0; ! 264: curx = cury = 0; ! 265: PEseen = 0; ! 266: hvmode = R_DIR; ! 267: xmin = ymin = 30000; ! 268: xmax = ymax = -30000; ! 269: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.