Blob


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