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 float curx = 0; 16 float 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 int dbg = 0; 25 extern FILE *yyin, /* input file pointer */ 26 *skeldb; /* output pointer for dbg messeges */ 27 int lineno = 0; 28 char *filename = "-"; 29 int synerr = 0; 30 char *cmdname; 31 int crop = 1; /* trim off exterior white space if non-zero */ 32 extern int useDline; /* if set, use \D for all lines */ 33 34 /* You may want to change this if you don't have a 202... */ 35 36 #ifdef APS 37 int devtype = DEVAPS; 38 int res = 723; 39 int DX = 3; 40 int DY = 3; 41 #else 42 int devtype = DEVVER; 43 int res = 200; /* default is 202 */ 44 int DX = 1; /* used only for old-style troff */ 45 int DY = 1; 46 #endif 47 48 /* mandatory values for graphic systems CAT: */ 49 /* 50 int devtype = DEVCAT; 51 int res = 432; 52 int DX = 3; 53 int DY = 3; 54 */ 55 56 float hshift = 0; /* move this far left for text (in em's) */ 57 float vshift = 0.2; /* this far down */ 58 59 float sxmin; /* lower limit from s command */ 60 float symin; 61 float sxmax = 4096; /* upper */ 62 float symax = 4096; 63 64 float xmin = 30000; /* min values found in actual data */ 65 float ymin = 30000; 66 float xmax = -30000; /* max */ 67 float ymax = -30000; 68 69 main(argc, argv) 70 char **argv; 71 { 72 cmdname = argv[0]; 73 while (argc > 1 && *argv[1] == '-') { 74 switch (argv[1][1]) { 75 case 'T': 76 if (strcmp(&argv[1][2], "aps") == 0) { 77 res = 723; 78 devtype = DEVAPS; 79 DX = DY = 1; 80 } else if (strcmp(&argv[1][2], "cat") == 0) { 81 res = 432; 82 devtype = DEVCAT; 83 DX = DY = 3; 84 } else if (strcmp(&argv[1][2], "ver") == 0) { 85 res = 200; 86 devtype = DEVVER; 87 DX = DY = 1; 88 } else if (strcmp(&argv[1][2], "450") == 0) { 89 res = 240; 90 devtype = DEV450; 91 } else { 92 res = atoi(&argv[1][2]); 93 } 94 break; 95 case 'd': 96 dbg = 1; 97 break; 98 case 'D': 99 useDline = !useDline; 100 break; 101 } 102 argc--; 103 argv++; 104 } 105 setdefaults(); 106 if (argc <= 1) { 107 yyin = stdin; 108 getdata(yyin); 109 } else 110 while (argc-- > 1) { 111 if ((yyin = fopen(*++argv, "r")) == NULL) { 112 fprintf(stderr, "pic: can't open %s\n", *argv); 113 exit(1); 114 } 115 filename = *argv; 116 getdata(yyin); 117 fclose(yyin); 118 } 119 exit(0); 120 } 121 122 static struct { 123 char *name; 124 float val; 125 } defaults[] ={ 126 "scale", SCALE, 127 "lineht", HT, 128 "linewid", HT, 129 "moveht", HT, 130 "movewid", HT, 131 "dashwid", HT10, 132 "boxht", HT, 133 "boxwid", WID, 134 "circlerad", HT2, 135 "arcrad", HT2, 136 "ellipseht", HT, 137 "ellipsewid", WID, 138 "arrowht", HT5, 139 "arrowwid", HT10, 140 "textht", HT, 141 "textwid", WID, 142 NULL, 0 143 }; 144 145 setdefaults() /* set default sizes for variables like boxht */ 146 { 147 int i; 148 YYSTYPE v; 149 150 for (i = 0; defaults[i].name != NULL; i++) { 151 v.f = defaults[i].val; 152 makevar(tostring(defaults[i].name), VARNAME, v); 153 } 154 } 155 156 157 checkscale(s) /* if s is "scale", adjust default variables */ 158 char *s; 159 { 160 int i; 161 float scale; 162 163 if (strcmp(s, "scale") == 0) { 164 scale = getfval("scale"); 165 for (i = 1; defaults[i].name != NULL; i++) 166 setfval(defaults[i].name, defaults[i].val * scale); 167 } 168 } 169 170 getdata(fin) 171 register FILE *fin; 172 { 173 char buf[1000], buf1[50]; 174 FILE *svyyin; 175 int svlineno; 176 char *svfilename, *p; 177 178 lineno = 0; 179 while (fgets(buf, sizeof buf, fin) != NULL) { 180 lineno++; 181 if (*buf == '.' && *(buf+1) == 'P' && *(buf+2) == 'S') { 182 for (p = &buf[3]; *p == ' '; p++) 183 ; 184 if (*p++ == '<') { 185 svyyin = yyin; 186 svlineno = lineno; 187 svfilename = filename; 188 sscanf(p, "%s", buf1); 189 if ((yyin = fopen(buf1, "r")) == NULL) { 190 fprintf(stderr, "pic: can't open %s\n", buf1); 191 exit(1); 192 } 193 lineno = 0; 194 filename = p; 195 getdata(yyin); 196 fclose(yyin); 197 lineno = svlineno; 198 yyin = svyyin; 199 filename = svfilename; 200 continue; 201 } 202 reset(); 203 yyparse(); 204 /* yylval now contains 'E' or 'F' from .PE or .PF */ 205 if (buf[3] == ' ') /* assume next thing is width */ 206 deltx = delty = atof(&buf[4]); 207 else { 208 deltx = xmax - xmin; 209 if (deltx <= 0) 210 deltx = ymax - ymin; 211 deltx /= getfval("scale"); 212 delty = deltx; 213 } 214 dprintf("deltx = %.3f\n", deltx); 215 if (codegen && !synerr) { 216 openpl(&buf[3]); /* puts out .PS, with ht & wid stuck in */ 217 print(); /* assumes \n at end */ 218 closepl(yylval.p); /* does the .PE/F */ 219 } 220 fflush(stdout); 221 } 222 else 223 fputs(buf, stdout); 224 } 225 } 226 227 reset() 228 { 229 struct obj *op; 230 int i; 231 struct symtab *p; 232 extern int nstack; 233 234 for (i = 0; i < nobj; i++) { 235 op = objlist[i]; 236 if (op->o_type == BLOCK) 237 freesymtab(op->o_dotdash); /* funny place */ 238 free(objlist[i]); 239 } 240 nobj = 0; 241 nattr = 0; 242 for (i = 0; i < ntext; i++) 243 free(text[i].t_val); 244 ntext = ntext1 = 0; 245 codegen = synerr = 0; 246 nstack = 0; 247 curx = cury = 0; 248 hvmode = R_DIR; 249 sxmin = symin = 0; 250 sxmax = symax = 4096; 251 xmin = ymin = 30000; 252 xmax = ymax = -30000; 253 } 254