|
|
1.1 ! root 1: #include <stdio.h> ! 2: #include "pic.h" ! 3: #include "y.tab.h" ! 4: ! 5: struct obj *objlist[MAXOBJ]; /* store the elements here */ ! 6: int nobj = 0; ! 7: ! 8: struct attr attr[40]; /* attributes stored here as collected */ ! 9: int nattr = 0; /* number of entries in attr_list */ ! 10: ! 11: struct text text[MAXTEXT]; /* text strings stored here as collected */ ! 12: int ntext = 0; ! 13: int ntext1 = 0; /* record ntext here on entry to each figure */ ! 14: ! 15: coord curx = 0; ! 16: coord cury = 0; ! 17: ! 18: int hvmode = R_DIR; /* R => join left to right, D => top to bottom, etc. */ ! 19: ! 20: int codegen = 0; /* 1=>output for this picture; 0=>no output */ ! 21: ! 22: float deltx = 6; /* max x value in output, for scaling */ ! 23: float delty = 6; /* max y value in output, for scaling */ ! 24: float scale = 0; /* implies simply scaling by this value; no crop or shift */ ! 25: int dbg = 0; ! 26: extern FILE *yyin; /* input file pointer */ ! 27: extern int yylval; ! 28: int lineno = 0; ! 29: char *filename = "-"; ! 30: int synerr = 0; ! 31: char *cmdname; ! 32: int crop = 1; /* trim off exterior white space if non-zero */ ! 33: ! 34: /* You may want to change this if you don't have a 202... */ ! 35: ! 36: int devtype = DEV202; ! 37: int res = 972; /* default is 202 */ ! 38: int DX = 4; /* used only for old-style troff */ ! 39: int DY = 4; ! 40: ! 41: /* mandatory values for graphic systems CAT: */ ! 42: /* ! 43: int devtype = DEVCAT; ! 44: int res = 432; ! 45: int DX = 3; ! 46: int DY = 3; ! 47: */ ! 48: ! 49: float hshift = 0; /* move this far left for text (in em's) */ ! 50: float vshift = 0.2; /* this far down */ ! 51: ! 52: coord sxmin; /* lower limit from s command */ ! 53: coord symin; ! 54: coord sxmax = 4096; /* upper */ ! 55: coord symax = 4096; ! 56: ! 57: coord xmin = 30000; /* min values found in actual data */ ! 58: coord ymin = 30000; ! 59: coord xmax = -30000; /* max */ ! 60: coord ymax = -30000; ! 61: ! 62: main(argc, argv) ! 63: char **argv; ! 64: { ! 65: int casel, c; ! 66: ! 67: cmdname = argv[0]; ! 68: casel = 0; ! 69: while (argc > 1 && *argv[1] == '-') { ! 70: switch (c = argv[1][1]) { ! 71: case 'T': ! 72: if (strcmp(&argv[1][2], "aps") == 0) { ! 73: res = 720; ! 74: devtype = DEVAPS; ! 75: DX = DY = 1; ! 76: } else if (strcmp(&argv[1][2], "cat") == 0) { ! 77: res = 432; ! 78: devtype = DEVCAT; ! 79: DX = DY = 3; ! 80: } else if (strcmp(&argv[1][2], "450") == 0) { ! 81: res = 240; ! 82: devtype = DEV450; ! 83: } else { ! 84: res = atoi(&argv[1][2]); ! 85: } ! 86: break; ! 87: case 'c': ! 88: crop = 0; ! 89: break; ! 90: case 'l': ! 91: delty = atof(&argv[1][2]); ! 92: casel = 0; ! 93: break; ! 94: case 'w': ! 95: case 's': ! 96: if (argv[1][2] == 0) { ! 97: argv++; ! 98: argc--; ! 99: deltx = atof(&argv[1][0]); ! 100: } else ! 101: deltx = atof(&argv[1][2]); ! 102: if (c == 's') ! 103: scale = deltx; ! 104: break; ! 105: case 'd': ! 106: dbg = 1; ! 107: break; ! 108: } ! 109: argc--; ! 110: argv++; ! 111: } ! 112: if (!casel) ! 113: delty = deltx; ! 114: setdefaults(); ! 115: if (argc <= 1) { ! 116: yyin = stdin; ! 117: getdata(yyin); ! 118: } else ! 119: while (argc-- > 1) { ! 120: if ((yyin = fopen(*++argv, "r")) == NULL) { ! 121: fprintf(stderr, "pic: can't open %s\n", *argv); ! 122: exit(1); ! 123: } ! 124: filename = *argv; ! 125: getdata(yyin); ! 126: fclose(yyin); ! 127: } ! 128: exit(0); ! 129: } ! 130: ! 131: setdefaults() /* set default sizes for variables like boxht */ ! 132: { ! 133: static struct { ! 134: char *name; ! 135: int val; ! 136: } defaults[] ={ ! 137: "lineht", HT, ! 138: "linewid", HT, ! 139: "moveht", HT, ! 140: "movewid", HT, ! 141: "dashwid", HT/10, ! 142: "boxht", HT, ! 143: "boxwid", WID, ! 144: "circlerad", HT/2, ! 145: "arcrad", HT/2, ! 146: "ellipseht", HT, ! 147: "ellipsewid", WID, ! 148: "arrowht", HT/5, ! 149: "arrowwid", HT/10, ! 150: "textht", HT, ! 151: "textwid", WID, ! 152: "scale", SCALE, ! 153: NULL, 0 ! 154: }; ! 155: int i; ! 156: ! 157: for (i = 0; defaults[i].name != NULL; i++) ! 158: makevar(tostring(defaults[i].name), VARNAME, defaults[i].val); ! 159: } ! 160: ! 161: getdata(fin) ! 162: register FILE *fin; ! 163: { ! 164: char buf[1000], buf1[50]; ! 165: FILE *svyyin; ! 166: int svlineno; ! 167: char *svfilename, *p; ! 168: ! 169: lineno = 0; ! 170: while (fgets(buf, sizeof buf, fin) != NULL) { ! 171: lineno++; ! 172: if (*buf == '.' && *(buf+1) == 'P' && *(buf+2) == 'S') { ! 173: for (p = &buf[3]; *p == ' '; p++) ! 174: ; ! 175: if (*p++ == '<') { ! 176: svyyin = yyin; ! 177: svlineno = lineno; ! 178: svfilename = filename; ! 179: sscanf(p, "%s", buf1); ! 180: if ((yyin = fopen(buf1, "r")) == NULL) { ! 181: fprintf(stderr, "pic: can't open %s\n", buf1); ! 182: exit(1); ! 183: } ! 184: lineno = 0; ! 185: filename = p; ! 186: getdata(yyin); ! 187: fclose(yyin); ! 188: lineno = svlineno; ! 189: yyin = svyyin; ! 190: filename = svfilename; ! 191: continue; ! 192: } ! 193: reset(); ! 194: yyparse(); ! 195: /* yylval now contains 'E' or 'F' from .PE or .PF */ ! 196: if (buf[3] == ' ') /* assume next thing is width */ ! 197: deltx = delty = atof(&buf[4]); ! 198: else { /* use scale to determine size */ ! 199: int t; ! 200: t = xmax - xmin; ! 201: if (t == 0) ! 202: t = ymax - ymin; ! 203: deltx = delty = (float) t / (float)getvar("scale"); ! 204: } ! 205: dprintf("deltx = %.3f\n", deltx); ! 206: if (codegen && !synerr) { ! 207: openpl(&buf[3]); /* puts out .PS, with ht & wid stuck in */ ! 208: print(); /* assumes \n at end */ ! 209: closepl(yylval); /* does the .PE/F */ ! 210: } ! 211: fflush(stdout); ! 212: } ! 213: else ! 214: fputs(buf, stdout); ! 215: } ! 216: } ! 217: ! 218: reset() ! 219: { ! 220: struct obj *op; ! 221: int i; ! 222: struct symtab *p; ! 223: extern int nstack; ! 224: ! 225: for (i = 0; i < nobj; i++) { ! 226: op = objlist[i]; ! 227: if (op->o_type == BLOCK) ! 228: freesymtab(op->o_val[6]); ! 229: free(objlist[i]); ! 230: } ! 231: nobj = 0; ! 232: nattr = 0; ! 233: for (i = 0; i < ntext; i++) ! 234: free(text[i].t_val); ! 235: ntext = ntext1 = 0; ! 236: codegen = synerr = 0; ! 237: nstack = 0; ! 238: curx = cury = 0; ! 239: hvmode = R_DIR; ! 240: sxmin = symin = 0; ! 241: sxmax = symax = 4096; ! 242: xmin = ymin = 30000; ! 243: xmax = ymax = -30000; ! 244: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.