Blob


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