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