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