1 /* main.c (Berkeley) 1.3 83/08/15 */ 2 #include <stdio.h> 3 #include "pic.h" 4 #include "y.tab.h" 5 #include "dev.h" 6 7 8 #define DEVDIR "/usr/lib/font" /* place to look up device files */ 9 10 char *devdir = DEVDIR; 11 char *dev = "var"; /* default typesetter is varian */ 12 13 struct obj *objlist[MAXOBJ]; /* store the elements here */ 14 int nobj = 0; 15 16 struct attr attr[40]; /* attributes stored here as collected */ 17 int nattr = 0; /* number of entries in attr_list */ 18 19 struct text text[MAXTEXT]; /* text strings stored here as collected */ 20 int ntext = 0; 21 int ntext1 = 0; /* record ntext here on entry to each figure */ 22 23 float curx = 0; 24 float cury = 0; 25 26 int hvmode = R_DIR; /* R => join left to right, D => top to bottom, etc. */ 27 28 int codegen = 0; /* 1=>output for this picture; 0=>no output */ 29 30 float deltx = 6.0; /* max x value in output, for scaling */ 31 float delty = 6.0; /* max y value in output, for scaling */ 32 float xbound = 8.0; /* max allowed x value in output */ 33 float ybound = 10.0; /* max allowed y value in output */ 34 int dbg = 0; 35 extern FILE *yyin, /* input file pointer */ 36 *skeldb; /* output pointer for dbg messeges */ 37 int lineno = 0; 38 char *filename = "-"; 39 int synerr = 0; 40 char *cmdname; 41 int crop = 1; /* trim off exterior white space if non-zero */ 42 extern int useDline; /* if set, use \D for all lines */ 43 int res; /* resolution of output device (dots/inch) */ 44 int DX; /* smallest change in X, and Y for output device */ 45 int DY; 46 47 48 float hshift = 0; /* move this far left for text (in em's) */ 49 float vshift = 0.2; /* this far down */ 50 51 float sxmin; /* lower limit from s command */ 52 float symin; 53 float sxmax = 4096; /* upper */ 54 float symax = 4096; 55 56 float xmin = 30000; /* min values found in actual data */ 57 float ymin = 30000; 58 float xmax = -30000; /* max */ 59 float ymax = -30000; 60 61 main(argc, argv) 62 char **argv; 63 { 64 cmdname = argv[0]; 65 while (argc > 1 && *argv[1] == '-') { 66 switch (argv[1][1]) { 67 case 'F': 68 devdir = &argv[1][2]; 69 break; 70 case 'T': 71 dev = &argv[1][2]; 72 break; 73 case 'd': 74 dbg = 1; 75 break; 76 case 'D': 77 useDline = !useDline; 78 break; 79 case 'x': 80 xbound = atof(&argv[1][2]); 81 break; 82 case 'y': 83 ybound = atof(&argv[1][2]); 84 break; 85 } 86 argc--; 87 argv++; 88 } 89 90 fileinit(); 91 setdefaults(); 92 if (argc <= 1) { 93 yyin = stdin; 94 getdata(yyin); 95 } else 96 while (argc-- > 1) { 97 if ((yyin = fopen(*++argv, "r")) == NULL) { 98 fprintf(stderr, "pic: can't open %s\n", *argv); 99 exit(1); 100 } 101 filename = *argv; 102 getdata(yyin); 103 fclose(yyin); 104 } 105 exit(0); 106 } 107 108 109 fileinit() 110 { 111 int fin; 112 struct dev device; 113 char temp[100]; 114 115 sprintf(temp, "%s/dev%s/DESC.out", devdir, dev); 116 if ((fin = open(temp, 0)) < 0) { 117 fprintf(stderr, "can't open tables for %s\n", temp); 118 exit(1); 119 } 120 read(fin, &device, sizeof(struct dev)); 121 res = device.res; 122 DX = device.hor; 123 DY = device.vert; 124 close(fin); 125 } 126 127 128 static struct { 129 char *name; 130 float val; 131 } defaults[] ={ 132 "scale", SCALE, 133 "lineht", HT, 134 "linewid", HT, 135 "moveht", HT, 136 "movewid", HT, 137 "dashwid", HT10, 138 "boxht", HT, 139 "boxwid", WID, 140 "circlerad", HT2, 141 "arcrad", HT2, 142 "ellipseht", HT, 143 "ellipsewid", WID, 144 "arrowht", HT5, 145 "arrowwid", HT10, 146 "textht", HT, 147 "textwid", WID, 148 NULL, 0 149 }; 150 151 setdefaults() /* set default sizes for variables like boxht */ 152 { 153 int i; 154 YYSTYPE v; 155 156 for (i = 0; defaults[i].name != NULL; i++) { 157 v.f = defaults[i].val; 158 makevar(tostring(defaults[i].name), VARNAME, v); 159 } 160 } 161 162 163 checkscale(s) /* if s is "scale", adjust default variables */ 164 char *s; 165 { 166 int i; 167 float scale; 168 169 if (strcmp(s, "scale") == 0) { 170 scale = getfval("scale"); 171 for (i = 1; defaults[i].name != NULL; i++) 172 setfval(defaults[i].name, defaults[i].val * scale); 173 } 174 } 175 176 getdata(fin) 177 register FILE *fin; 178 { 179 char buf[1000], buf1[50]; 180 FILE *svyyin; 181 int svlineno; 182 char *svfilename, *p; 183 184 lineno = 0; 185 while (fgets(buf, sizeof buf, fin) != NULL) { 186 lineno++; 187 if (*buf == '.' && *(buf+1) == 'P' && *(buf+2) == 'S') { 188 for (p = &buf[3]; *p == ' '; p++) 189 ; 190 if (*p++ == '<') { 191 svyyin = yyin; 192 svlineno = lineno; 193 svfilename = filename; 194 sscanf(p, "%s", buf1); 195 if ((yyin = fopen(buf1, "r")) == NULL) { 196 fprintf(stderr, "pic: can't open %s\n", buf1); 197 exit(1); 198 } 199 lineno = 0; 200 filename = p; 201 getdata(yyin); 202 fclose(yyin); 203 lineno = svlineno; 204 yyin = svyyin; 205 filename = svfilename; 206 continue; 207 } 208 reset(); 209 yyparse(); 210 /* yylval now contains 'E' or 'F' from .PE or .PF */ 211 if (buf[3] == ' ') /* assume next thing is width */ 212 deltx = delty = atof(&buf[4]); 213 else { 214 deltx = xmax - xmin; 215 if (deltx <= 0) 216 deltx = ymax - ymin; 217 deltx /= getfval("scale"); 218 delty = deltx; 219 } 220 dprintf("deltx = %.3f\n", deltx); 221 if (codegen && !synerr) { 222 openpl(&buf[3]); /* puts out .PS, with ht & wid stuck in */ 223 print(); /* assumes \n at end */ 224 closepl(yylval.p); /* does the .PE/F */ 225 } 226 fflush(stdout); 227 } 228 else 229 fputs(buf, stdout); 230 } 231 } 232 233 reset() 234 { 235 struct obj *op; 236 int i; 237 struct symtab *p; 238 extern int nstack; 239 240 for (i = 0; i < nobj; i++) { 241 op = objlist[i]; 242 if (op->o_type == BLOCK) 243 freesymtab(op->o_dotdash); /* funny place */ 244 free(objlist[i]); 245 } 246 nobj = 0; 247 nattr = 0; 248 for (i = 0; i < ntext; i++) 249 free(text[i].t_val); 250 ntext = ntext1 = 0; 251 codegen = synerr = 0; 252 nstack = 0; 253 curx = cury = 0; 254 hvmode = R_DIR; 255 sxmin = symin = 0; 256 sxmax = symax = 4096; 257 xmin = ymin = 30000; 258 xmax = ymax = -30000; 259 } 260