1 #ifndef lint
2 static char sccsid[] = "@(#)main.c 1.1 (CWI) 85/07/19";
3 #endif lint
4 #include <stdio.h>
5 #include <signal.h>
6 #include "grap.h"
7 #include "y.tab.h"
8
9 int dbg = 0;
10 char *lib_defines = "/usr/local/lib/grap/grap.defines";
11 int lib = 1; /* 1 to include lib_defines */
12 FILE *tfd = NULL;
13 /*
14 char *tempfile = NULL;
15 */
16 char *tempfile = "/tmp/XXXXXX";
17
18 int synerr = 0;
19 int codegen = 0; /* 1=>output for this picture; 0=>no output */
20 char *cmdname;
21
22 Obj *objlist = NULL; /* all names stored here */
23
24 Point ptmin = { NULL, -1.0e10, -1.0e10 };
25 Point ptmax = { NULL, 1.0e10, 1.0e10 };
26
main(argc,argv)27 main(argc, argv)
28 char **argv;
29 {
30 extern int onintr(), fpecatch();
31 char *p, *getenv();
32
33 if (signal(SIGINT, SIG_IGN) != SIG_IGN)
34 signal(SIGINT, onintr);
35 signal(SIGFPE, fpecatch);
36 tempfile = "/tmp/grap.XXXXXX";
37 cmdname = argv[0];
38 while (argc > 1 && *argv[1] == '-') {
39 switch (argv[1][1]) {
40 case 'd':
41 dbg = 1;
42 tfd = stdout;
43 tempfile = "grap.temp";
44 unlink(tempfile);
45 break;
46 case 'l': /* turn off /usr/lib inclusion */
47 lib = 0;
48 break;
49 }
50 argc--;
51 argv++;
52 }
53 setdefaults();
54 if (!dbg)
55 mktemp(tempfile);
56 curfile = infile;
57 pushsrc(File, curfile);
58 if (argc <= 1) {
59 curfile->fin = stdin;
60 curfile->fname = tostring("-");
61 getdata();
62 } else
63 while (argc-- > 1) {
64 if ((curfile->fin = fopen(*++argv, "r")) == NULL) {
65 fprintf(stderr, "grap: can't open %s\n", *argv);
66 onintr();
67 }
68 curfile->fname = tostring(*argv);
69 getdata();
70 fclose(curfile->fin);
71 free(curfile->fname);
72 }
73 if (!dbg)
74 unlink(tempfile);
75 exit(0);
76 }
77
onintr()78 onintr()
79 {
80 if (!dbg)
81 unlink(tempfile);
82 exit(1);
83 }
84
fpecatch()85 fpecatch()
86 {
87 yyerror("floating point exception");
88 onintr();
89 }
90
grow(ptr,name,num,size)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 double val;
109 } defaults[] ={
110 "frameht", FRAMEHT,
111 "framewid", FRAMEWID,
112 "ticklen", TICKLEN,
113 "slop", SLOP,
114 NULL, 0
115 };
116
setdefaults()117 setdefaults() /* set default sizes for variables */
118 {
119 int i;
120 Obj *p;
121
122 for (i = 0; defaults[i].name != NULL; i++) {
123 p = lookup(defaults[i].name, 1);
124 setvar(p, defaults[i].val);
125 }
126 }
127
getdata()128 getdata() /* read input */
129 {
130 register FILE *fin;
131 char buf[1000], buf1[100], *p;
132 int ln;
133
134 fin = curfile->fin;
135 curfile->lineno = 0;
136 printf(".lf 1 %s\n", curfile->fname);
137 while (fgets(buf, sizeof buf, fin) != NULL) {
138 curfile->lineno++;
139 if (*buf == '.' && *(buf+1) == 'G' && *(buf+2) == '1') {
140 setup();
141 fprintf(stdout, ".PS%s", &buf[3]); /* maps .G1 [w] to .PS w */
142 printf(".lf %d\n", curfile->lineno+1);
143 yyparse();
144 fprintf(stdout, ".PE\n");
145 printf(".lf %d\n", curfile->lineno+1);
146 fflush(stdout);
147 } else if (buf[0] == '.' && buf[1] == 'l' && buf[2] == 'f') {
148 if (sscanf(buf+3, "%d %s", &ln, buf1) == 2) {
149 free(curfile->fname);
150 printf(".lf %d %s\n", curfile->lineno = ln, curfile->fname = tostring(buf1));
151 } else
152 printf(".lf %d\n", curfile->lineno = ln);
153 } else
154 fputs(buf, stdout);
155 }
156 }
157