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